作者: 阮一峰

日期: 2011年6月24日

1.

二周前,我谈了一点Javascript的历史。

今天把这部分补全,从历史的角度,说明Javascript到底是如何设计出来的。

只有了解这段历史,才能明白Javascript为什么是现在的样子。我依据的资料,主要是Brendan Eich的自述。

2.

上一篇文章写道:

"1994年,网景公司(Netscape)发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器,轰动一时。但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。......网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。"

网页脚本语言到底是什么语言?网景公司当时有两个选择:一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页;另一个是发明一种全新的语言。

这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。

到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。

3.

就在这时,发生了另外一件大事:1995年Sun公司将Oak语言改名为Java,正式向市场推出。

Sun公司大肆宣传,许诺这种语言可以"一次编写,到处运行"(Write Once, Run Anywhere),它看上去很可能成为未来的主宰。

网景公司动了心,决定与Sun公司结成联盟。它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。

总之,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网页脚本语言的决策。因此,Javascript后来就是网景和Sun两家公司一起携手推向市场的,这种语言被命名为"Java+script"并不是偶然的。

4.

此时,34岁的系统程序员Brendan Eich登场了。1995年4月,网景公司录用了他。

Brendan Eich的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。Brendan Eich本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。

仅仅一个月之后,1995年5月,网景公司做出决策,未来的网页脚本语言必须"看上去与Java足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。这个决策实际上将Perl、Python、Tcl、Scheme等非面向对象编程的语言都排除在外了。

Brendan Eich被指定为这种"简化版Java语言"的设计师。

5.

但是,他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把Javascript设计出来了。

由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,Javascript写出来的程序混乱不堪。如果Brendan Eich预见到,未来这种语言会成为互联网第一大语言,全世界有几百万学习者,他会不会多花一点时间呢?

总的来说,他的设计思路是这样的:

  (1)借鉴C语言的基本语法;

  (2)借鉴Java语言的数据类型和内存管理;

  (3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;

  (4)借鉴Self语言,使用基于原型(prototype)的继承机制。

所以,Javascript语言实际上是两种语言风格的混合产物----(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。

6.

多年以后,Brendan Eich还是看不起Java。

他说:

"Java(对Javascript)的影响,主要是把数据分成基本类型(primitive)和对象类型(object)两种,比如字符串和字符串对象,以及引入了Y2K问题。这真是不幸啊。"

把基本数据类型包装成对象,这样做是否可取,这里暂且不论。Y2K问题则是直接与Java有关。根据设想,Date.getYear()返回的应该是年份的最后两位:

  var date1 = new Date(1999,0,1);

  var year1 = date1.getYear();

  alert(year1); // 99

但是实际上,对于2000年,它返回的是100!

  var date2 = new Date(2000,0,1);

  var year2 = date2.getYear();

  alert(year2); // 100

如果用这个函数生成年份,某些网页可能出现"19100"这样的结果。这个问题完全来源于Java,因为Javascript的日期类直接采用了java.util.Date函数库。Brendan Eich显然很不满意这个结果,这导致后来不得不添加了一个返回四位数年份的Date.getFullYear()函数。

如果不是公司的决策,Brendan Eich绝不可能把Java作为Javascript设计的原型。作为设计者,他一点也不喜欢自己的这个作品:

"与其说我爱Javascript,不如说我恨它。它是C语言和Self语言yiyeqing的产物。十八世纪英国文学家约翰逊博士说得好:'它的优秀之处并非原创,它的原创之处并不优秀。'(the part that is good is not original, and the part that is original is not good.)"

(完)

转载于:https://my.oschina.net/tingzi/blog/81122

[Javascript]诞生记相关推荐

  1. 今天讲个小故事,Javascript诞生记

    JavScript是Brendan Eich仅花了十天时间就设计出来的!!! 今天讲个小故事. 布兰登·艾克(英语:Brendan Eich) 美国程序技术专家与企业家,JavaScript主要创造者 ...

  2. JavaScript诞生记

    1995年布兰登.艾克进入网景公司,为其浏览器开发了JS功能 临危受命 公司要求给浏览器添加一个脚本功能 公司要求这个功能要蹭Java的流量 布莱登花10天时间设计了JS的最初版本 1996年,网景向 ...

  3. 谷歌Gmail诞生记:十年回首

    美国<时代>周刊网络版今天刊登题为<Gmail诞生记:10年前鲜为人知的故事>(How Gmail Happened: The Inside Story of Its Laun ...

  4. bug诞生记——临时变量、栈变量导致的双杀

    这是<bug诞生记>的第一篇文章.本来想起个文艺点的名字,比如<Satan(撒旦)来了>,但是最后还是想让这系列的重心放在"bug的产生过程"和" ...

  5. 大V诞生记 —— 谁是VMware?

    大V诞生记 -- 谁是VMware? (点击阅读原文,一键收听微电台"大V科技谈") https://mp.weixin.qq.com/s/QtPrki9V7BNFOx53_3gW ...

  6. mapbox 导航_寻宝风格导航地图 Treasure 诞生记 | Mapbox 地图设计思路

    Designing the Treasure map style 不久前,我们为大家介绍了霓虹灯风格地图 80's 8-bit 的设计思路,这篇文章我们继续分享一个有趣的地图设计 -- 寻宝风格地图 ...

  7. 阿里 AI「一对多」挑战人类律师;谷歌或将推出自研手机和电脑芯片;JavaScript诞生25周年|极客头条...

    整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「 ...

  8. 2019领克车展 Max Co币机诞生记

    领克车展 Max Co币机诞生记 网上拿张现场图 先引用一篇时下2019上海车展文章的段落 上海车展新车满满,领克展台玩起了"骚操作" https://chejiahao.auto ...

  9. “爱运动管理系统”诞生记(4)

    "爱运动管理系统"诞生记(4) 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 照着<21天学通C语言>,把C语言粗 ...

最新文章

  1. 用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)C语言程序设计在线作业-1辅导资料.docx-资源下载在线文库www.lddoc.cn...
  2. 通过QML定义对象类型
  3. css响应式布局_Web前端新手怎么入门 如何用CSS做响应式布局
  4. iOS之深入解析分类Category的底层原理
  5. Bridge(桥接)--对象结构模式
  6. 人工智能进行时:人类的未来与未来的人类
  7. Jquery通过append新元素之后事件绑定问题的解决方案
  8. 区块链技术可简化房地产交易流程
  9. 读书笔记-可靠性工程师前言
  10. 8g内存学习计算机专业够吗,电脑8g内存够用吗 内存多大才够
  11. 14届蓝桥杯Python总结
  12. 单精度浮点数转化为十进制数的原理
  13. 详解EBS接口开发之采购订单导入(转载)
  14. 0.60.0以上ract-native tab 报错: RNCViewPager was not found in the UIManager?
  15. 微型计算机最核心的补件,春季高考试卷-天津市2016年春季高考计算机模拟试卷B【精】.doc...
  16. 智慧水务解决方案实现了水质实时监控
  17. BAD PASSWORD: it is too simplistic/systematic
  18. php解:2007百度之星5月27号初赛题---------2实习生小胖的百度网页过滤器
  19. java获取文件时路径斜杆问题
  20. 微信小程序for实现九九乘法表

热门文章

  1. Ansible架构介绍与安装
  2. 区块链系统面临哪些风险以及有哪些防范措施
  3. 平台优势突出!科东软件被评定为广州开发区2020年工业互联网服务商
  4. 2018-2021国内网站数量直线下降,2021年仅剩422万个
  5. C/C++ 控制台输出彩色文本(改变局部字体的颜色)
  6. 90后已三十而立!一张照片用GAN生成70岁的你
  7. 202209-GitModel Task01-数据可视化
  8. 微信小程序表格列冻结功能的实现
  9. GAMES104-如何构建游戏世界
  10. 转:国内外著名开源b2c电子商务系统比较包括asp.net和php