如今,一个网页由许多相互作用的组件构成,例如层叠样式表、XML 代码、临时数据库查询和 JavaScript 函数。除最简单的网站外,跟踪这些不同元素如何交互、相互引用以及来回传递数据,可能是一项耗时的工作。
在一篇将在计算机协会编程语言原理研讨会上发表的论文中,软件技术 Douglas Ross 职业发展教授 Adam Chlipala 介绍了一种名为 Ur/Web 的新编程语言。它让开发者能够将 Web 应用编写为自包含程序。随后,该语言的编译器——即将高级指令转换为机器可执行代码的程序——会自动生成相应的 XML 代码和样式表规范,并将 JavaScript 和数据库代码嵌入适当位置。
除了让 Web 应用更易编写,Ur/Web 还能提升其安全性。Chlipala 说:“假设你想在网页上放一个日历组件,并打算使用一个提供该组件的库;同一页面上还有一个广告框,它基于广告网络提供的代码。”他说:“你不希望广告网络能够改变日历的运行方式,也不希望日历代码的作者干扰广告投放。”Ur/Web 会自动禁止页面元素之间发生此类未经授权的访问。
类型与作用域
Ur/Web 既能提供安全保护,又能协调彼此不同的 Web 技术,这源于它与 C++ 或 Java 等大多数完整编程语言共有的两个特性。其中之一是“强类型”。这意味着程序员在 Ur/Web 中定义的任何新变量都受限于特定的数据类型。同样,任何新函数的定义都必须包含该函数所处理的数据类型及其返回的数据类型。
在计算要返回的值时,函数可能需要创建新变量。(例如,一个用于返回数据库中数值平均值的函数,首先需要计算这些数值的总和。)但程序的其他部分无法访问这些变量。这就是第二个特性,称为“变量作用域”,因为它限制了函数内定义变量的作用范围,也就是这些变量可被访问的范围。
Chlipala 说:“你可能想编写一个库,将记录用户名和密码的数据库表作为库内部的私有状态。你不希望应用程序的其他部分能够随意读取和覆盖密码。大多数 Web 框架不支持这种做法。它们假定程序的每个部分都能完全访问数据库。”
类型机制也有助于安全。许多 Web 开发框架生成数据库查询的方式,使得某人表面上是在登录网站,实际上却可以在用户名字段中输入代码,覆盖数据库中的数据。在 Ur/Web 中,用户名将属于独立的数据类型,其处理方式与数据库查询截然不同。
满足预期
类型机制也使不同 Web 技术之间的协调成为可能。假设一段 JavaScript 代码要处理从数据库中提取的数据,并将结果显示在网页上由某段 XML 代码确定的位置。如果 Ur/Web 程序员编写的数据库查询提取了 JavaScript 未预期的数据类型,或者 JavaScript 生成了 XML 页面未预期的输出类型,编译器就会发现这种不一致,并标记代码存在错误。
通常,即使代码没有明确标注类型,也仍然存在隐含的一致性规则。例如,如果你用 SQL 数据库语言编写查询,要求计算一组文本字段的数值平均值,数据库服务器会告知你无法处理该请求。为了让 Ur/Web 能够协调 Web 技术之间的数据流,Chlipala 必须为 SQL、XML 和层叠样式表(CSS)创建包含这些规则的新数据类型库。
Ur/Web 编译器的当前版本确实会生成 XML、JavaScript 和 SQL 代码,但不会自动生成样式表。不过,Chlipala 说:“编译器可以做的一件事是分析你的整个程序,并指出:‘以下是所有可能被提及的 CSS 类的完整清单,以及每个类可能使用场景的说明;这些信息可以告诉你哪些属性值得设置。’例如,某个特定类可能从不会用于表格属性有意义的位置,因此你就不必费心设置这些属性。”
本文由 MIT News 合作发布。 MIT News。合作发布并不意味着世界经济论坛认同其中的观点。
要及时了解论坛动态: 订阅我们的每周简报。
作者:Larry Hardesty 是 MIT News 的特约撰稿人。
图片:一名男子在华沙的电脑键盘上打字,摄于 2013 年 2 月 28 日的资料图片。一场规模空前的网络攻击正拖慢全球互联网服务;一家屏蔽“垃圾邮件”内容的机构成为攻击目标,一些专家称,服务中断情况可能会进一步恶化。配合报道 INTERNET-ATTACK。路透社/Kacper Pempel。

