专 题 第 9 卷 第 4 期 2013 年 4 月 互 联 网 编 程 语 言 关 键 词 : 客 户 端 服 务 器 端 编 程 语 言 陈 雨 亭 周 憬 宇 赵 建 军 上 海 交 通 大 学 互 联 网 编 程 语 言 因 通 信 技 术 的 发 展 互 联 网 技 术 的 进 步 产 业 界 的 需 要 以 及 人 类 生 活 方 式 的 改 变 而 蓬 勃 发 展 诸 如 Java- Script, PHP, Ruby, Dart 和 Go 等 互 联 网 编 程 语 言 在 为 开 发 人 员 提 供 众 多 编 程 选 择 的 同 时, 也 为 其 开 发 富 互 联 网 应 用 (rich internet applications, RIA) 或 获 取 更 强 的 计 算 能 力 开 辟 了 途 径 与 此 同 时, 这 些 语 言 也 为 互 联 网 编 程 带 来 了 图 形 界 面 用 户 交 互 互 联 网 使 用 安 全 性 性 能 负 载 平 衡 资 源 等 方 面 的 挑 战 本 文 将 介 绍 一 些 常 见 的 互 联 网 编 程 语 言, 并 讨 论 其 潜 在 的 发 展 趋 势 互 联 网 编 程 模 型 互 联 网 编 程 模 型 主 要 包 括 客 户 端 / 服 务 器 端 (client/server, C/S) 架 构 和 浏 览 器 / 服 务 器 端 (browser/server, B/S) 架 构 [1] 客 户 端 / 服 务 器 端 架 构 是 一 种 通 用 网 络 编 程 模 型, 描 述 了 两 个 程 序 之 间 如 何 进 行 网 络 通 信 交 互 其 中, 客 户 端 程 序 是 指 发 送 请 求 的 程 序, 服 务 器 端 程 序 是 指 响 应 请 求 的 程 序 常 见 的 远 程 过 程 调 用 (remote procedure call, RPC) 采 用 的 就 是 客 户 端 / 服 务 器 端 架 构 对 等 网 络 (peer-to-peer, P2P) 则 是 客 户 端 / 服 务 器 端 架 构 的 进 一 步 (a)html 页 面 (b)html 页 面 +JavaScript 脚 本 1 图 1 HTTP 客 户 端 的 页 面 示 例 1 http://cscie12.dce.harvard.edu/lecture_notes/2012/ 24
第 9 卷 第 4 期 2013 年 4 月 2 表 1 Tiobe 编 程 语 言 排 名 Position Mar 2013 Position Mar 2012 Delta in Position Programming Language Ratings Mar 2013 Delta Mar 2012 1 1 Java 18.156% +1.05% A 2 2 C 17.141% +0.05% A 3 5 Objective-C 10.230% +2.49% A 4 4 C++ 9.115% +1.07% A 5 3 C# 6.597% -1.65% A 6 6 PHP 4.809% -0.75% A 7 7 (Visual) Basic 4.607% +0.24% A 8 9 Python 4.388% +1.10% A 9 13 Ruby 2.150% +0.74% A 10 10 Perl 1.959% -0.74% A 11 8 JavaScript 1.370% -2.02% A 12 48 Bash 1.009% +0.78% A- 13 15 Lisp 0.942% +0.02% A 14 12 PL/SQL 0.921% -0.50% A-- 15 11 Delphi/Object Pascal 0.889% -0.84% A 16 16 Visual Basic.NET 0.888% +0.10% A 17 14 Transact-SQL 0.836% -0.09% A- 18 17 Pascal 0.697% -0.07% A-- 19 21 Lua 0.697% +0.17% B 20 26 Assembly 0.633% +0.21% B Status 扩 充, 网 络 中 每 个 参 与 者 具 有 同 等 能 力, 既 可 作 为 客 户 端 发 出 请 求, 又 可 作 为 服 务 器 端 响 应 其 它 客 户 端 的 请 求 参 照 编 程 模 型, 可 以 将 相 关 编 程 语 言 简 单 地 分 为 超 文 本 传 输 协 议 (hypertext transfer protocol, HTTP) 客 户 端 语 言 和 HTTP 服 务 器 端 语 言 HTTP 客 户 端 语 言 主 要 用 于 客 户 端 页 面 设 计 与 功 能 扩 展 ( 如 嵌 入 图 像 视 频 等 ) 典 型 的 客 户 端 语 言 分 为 三 类 : 描 述 文 档 结 构 和 内 容 的 标 记 语 言 ( 如 超 文 本 标 记 语 言 (hypertext markup language, HTML) 和 可 扩 展 超 文 本 标 记 语 言 (extensible hypertext markup language,xhtml)) 样 式 语 言 ( 如 CSS 和 XSL) 以 及 客 户 端 脚 本 语 言 ( 如 JavaScript 和 VBScript) 这 三 类 语 言 相 互 补 充, 并 将 文 档 以 美 观 整 洁 的 形 式 呈 现 于 浏 览 器 中 图 1 的 例 子 说 明 了 HTML( 及 CSS) 和 JavaScript 生 成 页 面 的 效 果 图 1(a) 的 页 面 比 较 简 单, 只 包 括 顺 序 排 列 的 一 些 图 片 ; 图 1(b) 提 供 了 聚 焦 功 能, 使 用 户 可 以 缩 放 感 兴 趣 的 图 片 可 见,HTML 页 面 +JavaScript 的 展 现 方 式 比 纯 HTML 页 面 具 有 更 好 的 用 户 体 验, 也 提 供 更 丰 富 的 客 户 端 功 能 HTTP 服 务 器 端 语 言 用 于 服 务 器 端 功 能 应 用 的 设 计 与 开 发, 包 括 页 面 生 成 计 算 数 据 库 查 询 等 常 见 HTTP 服 务 器 包 括 Apache Server 和 IIS 等, 可 支 持 并 发 访 问 2 http://www.tiobe.com/ 25
专 题 第 9 卷 第 4 期 2013 年 4 月 页 面 生 成 和 应 用 调 用 等 功 能 典 型 的 服 务 器 端 语 言 有 PHP 和 Ruby 等 此 外, 用 于 数 据 库 访 问 的 SQL 语 言, 如 Oracle PL/SQL 等, 也 可 归 类 为 服 务 器 端 语 言 本 文 将 参 照 Tiobe 语 言 排 名 ( 如 表 1 所 示 ) 及 一 些 有 上 升 趋 势 的 语 言, 选 择 一 些 重 要 的 客 户 端 和 服 务 器 端 语 言 予 以 介 绍 客 户 端 语 言 客 户 端 的 主 要 脚 本 语 言 包 括 JavaScript 和 ActionScript JavaScript 在 浏 览 器 客 户 端, 得 到 最 广 泛 使 用 和 支 持 的 语 言 是 Java- Script 它 是 Netscape 公 司 1995 年 针 对 HTML 在 展 示 和 用 户 交 互 方 面 的 不 足, 在 浏 览 器 中 定 义 和 设 计 的 一 门 语 言 [2] 1996 年, 欧 洲 计 算 机 制 造 联 合 会 (European Computer Manufactures Association, ECMA) 对 JavaScript 实 施 了 标 准 化, 最 新 的 规 范 是 ECMA-262 [3] 除 了 规 范 中 定 义 的 基 本 语 法 和 对 象 外,JavaScript 还 可 以 引 用 文 档 对 象 模 型 (document object model, DOM) 和 浏 览 器 对 象 模 型 (browser object model, BOM), 并 与 其 交 互 以 实 现 对 页 面 事 件 的 响 应 和 页 面 内 容 的 更 改 例 如,HTML 页 面 使 用 了 一 段 JavaScript 代 码 ( 如 下 所 示 ), 当 用 户 点 击 Click Me 按 钮 后, 代 码 在 页 面 中 插 入 Hello World 这 里,JavaScript 代 码 使 用 了 DOM API 的 getelementbyid 来 获 取 文 档 对 象 模 型 对 象 的 一 个 节 点, 然 后 通 过 设 置 innerhtml 来 修 改 节 点 内 容 JavaScript 作 为 一 种 在 浏 览 器 中 运 行 的 轻 量 级 脚 本 语 言, 与 Java 语 言 的 区 别 包 括 :(1)JavaScript 程 序 由 浏 览 器 解 释 执 行, 不 需 要 事 先 编 译 ;(2)JavaScript 是 弱 类 型 的 语 言, 变 量 无 须 在 使 用 前 声 明, 解 释 器 会 根 据 变 量 的 使 用 情 况 隐 式 地 定 义 或 转 换 变 量 类 型 ;(3)JavaScript 采 用 基 于 函 数 原 型 的 继 承 方 式, 而 非 类 继 承 目 前,AJAX(asynchronous JavaScript and XML, 异 步 JavaS- <html><head><script> function myfunction() { document.getelementbyid("demo").innerhtml="hello World"; } </script></head> <body><p>click the button to trigger a function.</p> <button onclick="myfunction()">click me</button> <p id="demo"></p> </body></html> 客 户 端 浏 览 器 用 户 界 面 用 户 活 动 输 入 输 入 输 入 输 入 AJAX 引 擎 显 示 显 示 显 示 显 示 客 户 端 处 理 时 间 服 务 端 服 务 端 处 理 服 务 端 处 理 服 务 端 处 理 服 务 端 处 理 图 2 采 用 AJAX 的 Web 应 用 以 异 步 方 式 向 Web 服 务 器 发 送 请 求, 在 收 到 返 回 结 果 后 更 新 部 分 页 面 内 容, 无 须 刷 新 整 个 页 面 26
第 9 卷 第 4 期 2013 年 4 月 cript 和 XML) 技 术 成 为 创 建 反 应 更 快 用 户 交 互 友 好 的 互 联 网 应 用 程 序 的 基 础 它 允 许 万 维 网 (Web) 页 面 与 服 务 器 之 间 进 行 异 步, 而 不 需 要 刷 新 整 个 页 面 如 图 2 所 示, 页 面 无 需 重 新 加 载, 仅 通 过 局 部 动 态 刷 新, 就 可 以 给 用 户 提 供 反 馈 信 息, 从 而 使 用 户 与 页 面 的 交 互 过 程 更 加 平 滑 和 顺 畅 随 着 互 联 网 应 用 的 发 展 和 移 动 终 端 的 迅 速 普 及,JavaScript 语 言 也 不 再 仅 限 于 在 传 统 的 浏 览 器 中 使 用, 还 逐 渐 渗 透 到 桌 面 应 用 ( 即 富 互 联 网 应 用 ) 和 服 务 器 端 ( 如 NodeJS [4] ) 应 用 开 发 中 在 桌 面 应 用 和 移 动 设 备 上, JavaScript 和 HTML5 的 结 合 成 为 一 种 新 的 富 互 联 网 应 用 ( 如 地 理 定 位 音 视 频 播 放 动 画 三 维 显 示 等 [2] ) 的 编 程 模 式 JavaScript 也 逐 渐 成 为 服 务 器 端 的 开 发 语 言 NodeJS 是 一 个 基 于 谷 歌 Chrome 浏 览 器 V8 JavaScript 引 擎 开 发 的 应 用 平 台, 目 前 有 多 个 云 平 台 ( 如 Windows Azure 3, Heroku 4, 阿 里 云 5 ) 为 其 提 供 支 持 下 面 是 一 段 利 用 NodeJS 实 现 TCP Echo 服 务 的 一 个 代 码 示 例 var net = require('net'); var server = net.createserver(function (socket) { socket.write('echo server\r\n'); socket.pipe(socket); }); server.listen(3007, '127.0.0.1'); // 监 听 在 端 口 3007 上 因 此,JavaScript 语 言 正 逐 渐 成 为 一 种 通 用 的 编 程 语 言 编 写 一 次, 就 可 在 客 户 端 桌 面 和 服 务 器 端 运 行 相 同 的 代 码, 成 为 该 语 言 的 一 大 优 势 同 时,Java- Script 语 言 还 具 有 简 单 灵 活 的 特 性, 一 定 程 度 上 降 低 了 编 写 服 务 器 端 和 桌 面 应 用 的 难 度 ActionScript ActionScript 是 Adobe 公 司 Flash 平 台 的 主 要 编 程 语 言, 其 中 Flex 提 供 了 开 源 的 软 件 开 发 包,Adobe AIR 和 Flash 的 浏 览 器 插 件 提 供 了 运 行 环 境 在 ECMA-262 标 准 中, 对 Action- Script 3 和 JavaScript 都 有 定 义 从 语 法 上 看, 尽 管 两 者 有 很 多 相 似 点, 但 也 存 在 显 著 不 同 [5,6] : ActionScript 代 码 在 编 译 成 字 节 码 后 由 ActionScript 虚 拟 机 执 行, 而 JavaScript 代 码 通 常 由 浏 览 器 解 释 执 行 ;ActionScript 提 供 了 ECMA-262 中 没 有 的 类 型 ( 动 态 和 静 态 的 数 据 类 型 ) 安 全, 并 支 持 面 向 对 象 的 继 承 模 型 包 类 和 接 口, 不 仅 限 于 基 于 原 型 的 继 承 关 系 ;ActionScript 有 丰 富 的 标 准 库 ( 比 如 视 频 流 ), 而 JavaScript 语 言 仅 有 有 限 的 预 定 义 对 象 ;ActionScript 不 支 持 浏 览 器 对 象 ( 如 Document, Window 和 Anchor), 不 完 全 支 持 JavaScript 内 置 对 象, 对 eval() 函 数 仅 提 供 有 限 支 持 等 安 全 机 制 客 户 端 脚 本 程 序 是 在 客 户 端 ( 通 常 为 浏 览 器 ) 运 行, 因 此 编 程 语 言 必 须 考 虑 客 户 端 安 全 和 隐 私 很 多 语 言 采 用 了 沙 盒 机 制, 将 程 序 运 行 环 境 与 操 作 系 统 隔 离 开 :Java 语 言 通 过 虚 拟 机 来 控 制 Applet 的 权 限,JavaScript 和 ActionScript 通 过 解 释 器 完 成 安 全 控 制 微 软 的 ActiveX 控 件 也 是 在 浏 览 器 上 运 行 的 程 序 与 沙 盒 机 制 不 同,ActiveX 采 用 了 签 名 的 安 全 机 制, 即 由 用 户 决 定 是 否 信 任 软 件 开 发 者 ; 一 旦 用 户 同 意 ActiveX 控 件 运 行, 其 对 于 控 件 就 失 去 了 控 制 相 比 而 言, 采 用 沙 盒 机 制 的 语 言 更 安 全 服 务 器 端 脚 本 语 言 ASP.NET, JSP, Perl, PHP, Python 和 Ruby 是 六 种 可 以 在 服 务 器 端 使 用 的 语 言 这 些 编 程 语 言 都 是 在 HTML 中 嵌 入 程 序 片 段, 由 语 言 引 擎 解 释 执 行 程 序, 产 生 包 含 执 行 结 果 的 新 HTML 页 3 http://www.windowsazure.com/en-us/develop/nodejs/ 4 http://www.heroku.com/ 5 http://www.aliyun.com/product/ace/ 27
专 题 第 9 卷 第 4 期 2013 年 4 月 表 2 服 务 器 端 语 言 对 比 ASP.NET C# JSP PHP Python Ruby Perl 类 型 强 类 型 强 类 型 弱 类 型 弱 类 型 弱 类 型 弱 类 型 编 译 编 译 器 生 成 中 间 代 码 编 译 器 生 成 中 间 代 码 / / / / 执 行 方 式 解 释 执 行 中 间 代 码 解 释 执 行 中 间 代 码 解 释 执 行 解 释 执 行 解 释 执 行 解 释 执 行 多 继 承 否 否 否 是 否 是 允 许 重 载 运 算 符 是 否 否 * 是 是 是 大 小 写 敏 感 是 是 函 数 不 敏 感, 变 量 敏 感 是 是 是 参 数 传 递 值 或 引 用 值 或 引 用 值 或 引 用 引 用 引 用 引 用 (*PHP 重 载 指 动 态 创 建 属 性 和 方 法, 与 C++ 等 语 言 的 运 算 符 重 载 不 同 ) 面, 并 将 其 发 送 给 浏 览 器 等 客 户 端 程 序 ASP.NET 是 微 软 公 司 提 供 的 Web 应 用 编 程 解 决 方 案 ASP.NET 以 类 为 基 础, 内 置 Page,Response,Request,Session 和 Cookie 多 个 对 象 例 如, 表 单 网 页 在 执 行 时 会 被 编 译 成 为 一 个 Page 对 象, 并 通 过 Request 对 象 传 入 表 单 内 容, 页 面 输 出 对 象 是 Response 与 早 期 ASP 语 言 相 比,ASP.NET 运 行 更 快, 并 拥 有 丰 富 的 类 库 资 源 ASP 与 ASP.NET 的 主 要 区 别 在 于 : 前 者 只 能 使 用 脚 本 语 言 VBScript 和 JavaScript, 而 后 者 可 以 使 用.NET 框 架 支 持 的 编 程 语 言 ; 前 者 开 发 中 程 序 脚 本 和 HTML 代 码 没 有 分 离, 不 利 于 网 页 的 前 期 设 计 和 后 期 维 护, 而 后 者 提 供 大 量 控 件, 方 便 程 序 结 构 和 代 码 分 离, 使 得 网 页 设 计 和 脚 本 开 发 相 互 独 立, 便 于 各 自 的 开 发 此 外, 通 过 使 用 Visual Studio.NET, 网 站 开 发 人 员 可 以 方 便 地 使 用 图 形 化 工 具, 在 网 页 中 放 置 不 同 控 件, 并 设 置 事 件 触 发 代 码 JSP 是 基 于 Java 技 术 的 跨 平 台 的 Web 开 发 解 决 方 案 开 发 人 员 使 用 Bean 封 装 业 务 逻 辑, 并 使 用 XML 来 标 识 页 面 内 容 与 Java Bean 之 间 的 关 系, 实 现 表 现 层 与 内 容 的 分 离 JSP 的 缺 点 是 开 发 人 员 往 往 需 要 编 写 大 量 的 代 码 和 配 置 文 件, 而 采 用 解 释 型 语 言 ( 如 Ruby) 所 编 写 的 代 码 则 少 很 多 Perl 曾 是 Web 编 程 常 用 的 通 用 网 关 接 口 (common gateway interface, CGI) 语 言, 通 过 利 用 简 短 的 语 句 可 快 速 完 成 文 本 处 理 早 期 的 Perl 语 言 不 支 持 面 向 对 象 的 类, 从 Perl5 开 始 加 入 了 面 向 对 象 的 特 性 CPAN 6 上 提 供 的 大 量 Perl 程 序 库 也 极 大 地 方 便 了 Perl 编 程 但 是, 正 如 Perl 格 言 There s more than one way to do it ( 总 是 有 多 种 方 法 来 做 一 件 事 情 ) 所 述, 较 大 规 模 的 Perl 程 序 中, 往 往 存 在 风 格 不 统 一 维 护 困 难 等 问 题 PHP 是 专 门 针 对 Web 应 用 开 发 而 发 明 的 脚 本 语 言 PHP 的 优 势 包 括 简 洁 的 语 句 丰 富 的 内 置 函 数 执 行 效 率 高 支 持 多 平 台 并 兼 容 多 种 Web 服 务 器 通 过 模 板 化 实 现 程 序 逻 辑 与 用 户 界 面 的 分 离 等 很 多 小 型 网 站 开 发 都 从 静 态 HTML 出 发, 逐 渐 将 部 分 逻 辑 用 PHP 程 序 替 换 ( 例 如, 使 用 并 查 询 数 据 库 ), 达 到 快 速 开 发 的 目 的 Python 与 PHP 一 样,Python 的 使 用 难 度 低 于 Java C++ 等 语 言, 并 直 接 导 致 在 开 源 社 区 中 产 生 多 个 Web 应 用 框 架 Python 属 于 面 向 对 象 编 程 语 言, 类 在 标 准 库 中 得 到 广 泛 使 用, 数 据 以 引 用 方 式 传 递 Ruby 其 主 要 优 势 在 于 采 用 Rails 框 架 Rails 框 架 可 以 说 是 该 语 言 的 唯 一 Web 应 用 框 架 Rails 框 架 的 特 点 包 括 : 严 格 按 照 模 式 - 视 图 - 控 制 器 结 构 开 发, 强 调 不 要 重 复 你 自 己 (Don t 6 http://www.cpan.org/ 28
第 9 卷 第 4 期 2013 年 4 月 repeat yourself), 提 供 代 码 生 成 工 具, 减 少 实 际 应 用 开 发 的 代 码, 通 过 反 射 和 运 行 时 扩 展 以 减 少 对 配 置 文 件 的 依 赖 等 对 服 务 器 端 语 言 可 以 进 行 简 单 对 比 在 编 程 范 型 方 面, 六 种 语 言 都 支 持 面 向 对 象 编 程, 提 供 基 于 类 的 封 装 机 制, 支 持 继 承 和 多 态 如 表 2 所 示, 只 有 Python 和 Perl 支 持 类 的 多 继 承, 其 它 语 言 仅 支 持 单 继 承, 但 会 提 供 接 口 机 制 实 现 多 继 承 从 类 型 和 执 行 方 式 来 说, JSP 和 ASP.NET C# 属 于 强 类 型 语 言, 程 序 需 要 被 编 译 成 为 二 进 制 中 间 代 码, 并 由 虚 拟 机 解 释 执 行 用 户 第 一 次 访 问 页 面 时, 程 序 被 自 动 编 译, 再 次 访 问 时 用 户 可 使 用 已 编 译 好 的 中 间 代 码, 而 无 需 再 次 编 译 为 提 高 运 行 效 率, ASP.NET 也 允 许 程 序 在 网 站 部 署 前 进 行 编 译 PHP, Python, Perl 和 Ruby 是 弱 类 型 语 言, 变 量 可 以 在 运 行 中 动 态 改 变 类 型, 程 序 由 解 释 器 解 释 执 行 然 而, 随 着 PHP 和 Python 语 言 的 流 行, 为 提 高 程 序 运 行 效 率, 目 前 已 有 很 多 工 具 ( 比 如 FaceBook 的 Hiphop 等 ) 可 将 PHP 和 Python 程 序 编 译 成 C++ 程 序 从 内 存 管 理 方 面 来 说, 所 有 语 言 都 采 用 垃 圾 回 收 的 方 式, 避 免 了 C, C++ 等 语 言 中 程 序 员 管 理 内 存 的 现 象, 提 高 了 程 序 员 的 效 率, 付 出 的 代 价 是 可 能 会 多 占 用 一 些 内 存 和 CPU 时 间 从 编 程 框 架 来 说, 这 些 语 言 都 有 各 自 的 框 架 来 帮 助 实 现 表 现 层 与 应 用 逻 辑 分 离, 例 如 JSP 的 Struts 框 架 Ruby 的 Rails 框 架 PHP 的 Smarty 框 架 Python 的 Django 框 架 Perl 的 Catalyst 7 和 Mojolicious 8 等 从 平 台 上 来 说,ASP.NET 一 般 在 Windows 操 作 系 统 上 运 行, 跨 平 台 的 Mono 9 允 许.NET 程 序 在 非 Windows 操 作 系 统 上 运 行, 其 它 语 言 可 支 持 跨 平 台 运 行 新 兴 的 互 联 网 编 程 语 言 除 了 上 述 互 联 网 编 程 语 言, IBM 谷 歌 等 众 多 公 司 也 相 继 推 出 了 新 型 的 编 程 语 言, 包 括 Chapel, X10, Clojure, Fantom, Go, Zimbu, Dart 和 Opa 等 这 些 语 言 在 互 联 网 编 程 方 面 呈 现 出 新 的 特 征, 并 各 有 优 势 支 持 客 户 端 或 服 务 器 端 编 程 新 型 语 言 致 力 于 将 客 户 端 代 码 无 缝 运 行 在 多 个 客 户 端 设 备 上 例 如,Dart 是 谷 歌 开 发 的 开 源 Web 编 程 语 言, 其 目 标 是 取 代 JavaScript 成 为 Web 开 发 的 通 用 语 言 10 Dart 语 言 具 有 诸 多 特 点 ( 如 以 类 为 基 础, 单 继 承 面 向 对 象 类 似 C 的 语 法 对 接 口 与 抽 象 类 的 支 持 物 化 泛 型 可 选 类 型 静 态 类 型 注 释 等 ), 为 开 发 大 规 模 应 用 程 序 提 供 了 更 好 的 性 能 与 安 全 功 能 谷 歌 也 正 在 使 用 Dart 构 建 更 复 杂 的 功 能 更 全 面 的 客 户 端 应 用 程 序 此 外, Fantom 程 序 可 以 在 浏 览 器 虚 拟 机 ( 如 JVM,.NET CLR, JavaScript) 上 实 现 无 缝 迁 移 11 Clojure 是 一 种 表 处 理 (list processor, LISP) 风 格 的 语 言, 可 在 JVM 上 运 行, 12 能 提 供 JavaScript 的 替 代 方 案 此 外, 客 户 端 和 服 务 器 端 使 用 相 同 的 语 言, 也 为 互 联 网 编 程 提 供 了 特 有 的 优 势 Go 是 谷 歌 开 发 的 Web 编 程 语 言, 专 为 构 建 服 务 器 软 件 所 设 计, 但 也 可 应 用 到 其 他 领 域, 包 括 在 浏 览 器 内 执 行 软 件, 以 取 代 JavaScript 的 角 色 Opa 是 一 个 开 源 编 程 语 言, 用 来 开 发 可 扩 展 的 Web 应 用 程 序 13 用 户 先 用 其 编 写 客 户 端 和 服 务 器 端 脚 本, 这 些 程 序 随 后 会 被 编 译 为 服 务 器 端 的 本 地 代 码 和 客 户 端 的 JavaScript 脚 本, 再 由 编 译 器 7 http://www.catalystframework.org/ 8 http://mojolicio.us/ 9 http://www.mono-project.com/ 10 http://www.dartlang.org/ 11 http://fantom.org/ 12 http://clojure.org/ 13 http://opalang.org/ 29
专 题 第 9 卷 第 4 期 2013 年 4 月 自 动 实 现 二 者 的 通 信 此 外, 这 类 语 言 还 有 Zimbu 14 等 支 持 互 联 网 计 算 网 络 计 算, 如 云 计 算, 需 要 将 任 务 分 发 至 不 同 机 器 的 多 个 CPU 并 行 或 并 发 执 行, 因 此, 支 持 云 计 算 的 分 布 式 / 并 行 编 程 语 言 成 为 研 究 的 热 点 这 些 语 言 包 括 用 于 并 行 计 算 编 程 语 言 ( 比 如 Cray 的 Chapel IBM 的 X10) 并 发 编 程 语 言 ( 比 如 Clojure Fantom 和 Go) 等 例 如,X10 是 基 于 Java 的 扩 展 语 言, 具 有 诸 如 异 步 本 地 化 原 子 性 和 顺 序 性 等 并 行 特 征 15 这 些 特 性 为 X10 语 言 提 供 了 类 型 安 全 基 于 类 以 及 面 向 对 象 的 基 础 X10 语 言 支 持 细 粒 度 并 行 fork-join 编 程 阶 段 计 算 活 动 消 息 类 消 息 传 递 接 口 (message passing interface, MPI) 的 通 信 集 群 编 程 等 方 式 ; 基 于 Java 的 设 计 使 X10 程 序 可 以 运 行 在 Power 和 x86 集 群 上 Clojure 语 言 的 一 大 特 色 是 支 持 并 发 机 制, 例 如 : 不 可 变 数 据 结 构 用 于 支 持 多 线 程 共 享 数 据, 软 件 事 务 存 储 (software transactional memory, STM) 用 于 支 持 线 程 采 用 同 步 协 调 方 式 以 共 享 改 变 状 态, 代 理 系 统 用 于 支 持 线 程 采 用 异 步 独 立 方 式 共 享 改 变 状 态, 原 子 系 统 用 于 支 持 线 程 采 用 同 步 独 立 方 式 共 享 改 变 状 态, 动 态 变 量 系 统 用 于 支 持 线 程 隔 离 改 变 状 态 等 互 联 网 编 程 语 言 的 发 展 趋 势 随 着 HTML5 与 富 互 联 网 应 用 的 普 及,Web 应 用 程 序 将 逐 渐 走 向 成 熟, 并 会 大 范 围 地 替 代 传 统 的 桌 面 应 用 从 语 言 的 角 度 来 看, 未 来 的 互 联 网 应 用 需 要 丰 富 的 图 形 图 像 媒 体 等 多 方 面 的 技 术 以 及 像 Silverlight 和 Flex 这 样 的 编 程 工 具, 以 完 成 多 语 言 系 统 的 编 码 编 译 集 成 和 互 联 网 发 布 就 目 前 而 言, 还 没 有 哪 种 语 言 完 全 胜 出, 取 代 其 它 语 言 我 们 认 为 各 种 语 言 在 各 自 传 统 的 领 域 会 继 续 发 展, 并 会 不 断 汲 取 其 它 语 言 的 一 些 特 性, 简 化 开 发 人 员 的 工 作 下 面 列 出 一 些 互 联 网 编 程 语 言 的 发 展 趋 势 保 持 兼 容 性 跨 平 台 性 开 放 性 互 联 网 的 趋 势 是 无 处 不 联 网, 大 量 电 脑 手 机 甚 至 专 用 设 备 均 与 互 联 网 相 连 为 了 兼 容 这 些 设 备, 互 联 网 编 程 语 言 首 要 考 虑 的 因 素 是 兼 容 性 跨 平 台 性 及 开 放 性 语 言 特 征 实 现 融 合 各 种 语 言 会 继 续 发 展, 并 融 合 其 它 语 言 的 一 些 特 性, 以 便 最 大 程 度 地 提 高 开 发 效 率 PHP 已 经 开 始 像 Java 一 样, 支 持 类 反 射 ;Go Dart 等 新 兴 语 言 融 合 JavaScript 等 语 言 的 优 势 ; 多 范 型 ( 比 如 面 向 对 象 面 向 过 程 函 数 式 等 ) 编 程 语 言 将 在 互 联 网 上 流 行, 用 于 数 据 和 格 式 的 描 述 等 性 能 得 到 进 一 步 提 升 虽 然 许 多 网 站 使 用 异 步 JavaScript 和 XML/JSON 以 及 各 种 UI Widgets 来 实 现 仿 桌 面 的 网 络 应 用 程 序, 但 这 些 前 台 程 序 的 速 度 都 无 法 与 传 统 桌 面 的 程 序 相 媲 美 如 何 从 语 言 角 度 来 提 升 程 序 运 行 的 性 能 将 是 一 个 重 要 的 研 究 课 题 进 一 步 支 持 云 计 算 编 程 语 言 需 要 进 一 步 支 持 云 计 算, 既 可 满 足 客 户 对 于 高 性 能 计 算 的 需 求, 还 可 协 助 解 决 并 发 访 问 协 同 性 能 安 全 性 等 一 系 列 难 题 提 供 安 全 性 和 保 证 隐 私 互 联 网 未 来 的 趋 势 之 一 是 由 云 计 算 带 来 的 应 用 服 务 和 数 据 云 端 化, 如 何 获 得 安 全 和 隐 私 保 护 将 是 互 联 网 应 用 面 临 的 一 大 挑 战 编 程 语 言 在 这 方 面 的 设 计 也 将 更 为 严 格 此 外, 由 于 Web 程 序 经 常 需 要 被 解 释 执 行, 弱 类 型 会 继 续 成 为 很 多 语 言 ( 如 JavaScript) 的 主 要 特 征 尽 管 如 此, 为 确 保 安 全, 数 据 类 型 分 析 与 运 行 时 检 查 依 然 十 分 重 要 致 谢 : 本 项 研 究 得 到 国 家 自 然 科 学 基 金 ( 项 目 编 号 : 91118004, 61100051, 61003012) 的 资 助 14 http://www.zimbu.org/ 15 http://x10-lang.org/ 30
第 9 卷 第 4 期 2013 年 4 月 陈 雨 亭 CCF 会 员 上 海 交 通 大 学 讲 师 主 要 研 究 方 向 为 程 序 分 析 与 软 件 可 靠 性 chenyt@cs.sjtu.edu.cn 周 憬 宇 CCF 会 员 上 海 交 通 大 学 讲 师 主 要 研 究 方 向 为 分 布 式 系 统 和 信 息 检 索 zhou-jy@ cs.sjtu.edu.cn 参 考 文 献 赵 建 军 CCF 高 级 会 员 上 海 交 通 大 学 教 授 主 要 研 究 方 向 为 程 序 分 析 与 验 证 软 件 测 试 程 序 语 言 设 计 与 实 现 zhao-jj@cs.sjtu. edu.cn [1] Alex Berson, Client/server architecture. New York, NY: McGraw-Hill, Inc., 1996 [2] 刘 振 兴, JavaScript 或 成 为 主 导 的 编 程 语 言, 中 国 计 算 机 学 会 通 讯, vol. 8, 64~68, 2012 [3] ECMA International, Standard E C M A-262 E C M A S c r i p t Language Specification, http:// www.ecma-international.org/ publications/standards/ecma- 262.htm, 2011 [4] NodeJS, http://nodejs.org/, 2012 [5] Adobe, Differences between ActionScript and JavaScript, http://help.adobe.com/en_us/ A S2L C R/F l a s h_10.0/h e l p. html?content=00000064.html, 2008 [6] S t a c k O v e r f l o w, W h a t a r e the key differences between JavaScript and ActionScript 3?, http://stackoverflow.com/ questions/2268276/what-arethe-key-differences-betweenjavascript-and-actionscript-3, 2012 31