浏览器竞争中的兼容需求

JScript是微软在1990年代中期开发的JavaScript语言实现。它的起点与Internet Explorer浏览器需要运行既有网页脚本密切相关:网页设计者已经使用网景浏览器中的JavaScript添加交互,如果同一页面换到另一款浏览器就无法工作,新浏览器的推广也会受到限制。

1996年5月29日,微软公布Internet Explorer 3.0测试版可供下载,明确列出对JavaScript与Visual Basic Script的支持。网页作者可以把脚本嵌入HTML,由浏览器响应用户操作,并把页面中的软件组件组织起来。JScript因此面对的首先是已有网页和浏览器环境,而不是另造一套与之隔绝的语法。

参考:[1] [2]

解释器、分析器与团队分工

罗伯特·韦兰德在1995年10月加入Internet Explorer团队,着手把脚本加入浏览器。他与萨姆·麦凯尔维试验过嵌入Visual Basic的方案,随后转向JavaScript字节码解释器。彼得·库科尔已有能够产生字节码的语法分析器,帕特里克·杜苏德的垃圾回收器也加入其中,构成早期JScript的基础。

1996年初,肖恩·卡岑伯格接手解释器工作,并在Visual Basic团队协助下让同一解释器支持其脚本子集。微软开发工具部门负责脚本语言,浏览器团队负责把脚本接入产品。这种安排把语言处理与浏览器功能的实现分开,同时需要双方保持接口和行为一致。

参考:[1]

可嵌入的脚本引擎

微软1996年7月18日的公告把JScript称为自己的JavaScript实现,并说明它和Visual Basic Script通过ActiveX Scripting接口接入Internet Explorer 3.0。脚本不只是计算一段文本,还能通过宿主所暴露的对象协调Java小程序和ActiveX控件。

这一区分使同一个脚本引擎有机会被不同应用使用。浏览器提供窗口、表单和页面事件;服务器环境则可以提供请求、文件等另一组对象。ECMA-262初版后来把语言核心与这些宿主设施分开规定,说明输入输出等能力由所在环境补足。语言规则相同,并不表示每个宿主提供的对象也相同。

7月公告确认JScript测试版本已经可下载,同时宣布将提供源代码参考实现。这里的测试版可获得与后续源代码交付属于不同承诺,公告中的计划尚需通过各次实际发布来落实。

参考:[3] [5]

一次加法怎样变成字符串连接

类型转换是脚本兼容性中的具体问题。以一个简化的计算片段为例:先把变量a设为数值2,再计算a+3,结果是数值5;若a保存的是文本“2”,相同的加号与数值3组合,就得到文本“23”。两个操作写法接近,实际含义却取决于值的类型。

1997年ECMA-262初版第11.6.1节用逐步算法明确了加号的处理顺序:先取得两侧的值并转换为原始值;只要有一侧是字符串,就进行字符串连接,否则按数值相加。这一规则解释了为什么表单输入等文本资料在计算前需要明确转换。

这个例子只涉及语言核心。把输入框内容取出来、在页面上显示结果或接收按钮点击,都还需要浏览器提供相应对象和事件接口。标准化因而既要规定运算结果,也要清楚划定哪些行为属于宿主。

参考:[5]

测试、正式发布与行为核对

1996年8月13日,微软宣布Internet Explorer 3.0正式发布并可通过互联网免费下载。计算史论文的版本时间表把JScript 1.0列为随该版浏览器交付。此前5月的浏览器测试版和7月的脚本公告,反映的是逐步对外提供实现的过程。

开发团队还用大量已有网站比较Internet Explorer与网景浏览器的执行结果。网页框架之间能否传递对象等差异,曾迫使微软调整实现。相同语法能够通过分析,并不意味着实际页面已经兼容;对象组织、隐式转换和边界行为同样影响结果。

参考:[1] [2] [4]

从实现差异走向共同规范

ECMA在1996年11月开始制定共同语言标准,1997年6月通过ECMA-262初版。标准前言明确列出网景JavaScript与微软JScript等技术来源。这发生在两家已有产品之后,目标是把可以共享的语言规则写成可核查文本。

卡岑伯格参与补充语言语义的伪代码算法,把实际实现中的行为转化为分步骤规范。JScript后来继续用于微软的浏览器和其他脚本宿主;初期形成的主要问题则一直贯穿其发展:既要与已有网页相容,又要让语言、组件接口和宿主功能之间的边界足够明确。

参考:[1] [5]