作者: 阮一峰

日期: 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. XML学习总结(2)——XML简单介绍
  2. mysql组合索引的命中情况
  3. 详解spark任务提交至yarn的集群和客户端模式
  4. 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决
  5. 【Vegas原创】Mysql绿色版安装方法
  6. python enumerate_Python中enumerate用法详解
  7. Linux基础命令---ckconfig
  8. windows phone:使用sqlite-net
  9. matlab中函数imhist的用法
  10. K9G8G08U0A升级到K9GAG08U0D烧录NK要注意的地方
  11. 3种好用的可视化图表工具分享,快进来看!
  12. FTP协议是一种用于什么的协议
  13. benchmark在postgresql上的安装及使用
  14. lampp mysql未启动,lampp1.7中mysql无法启动问题
  15. PBID外部工具:Model Analyzer
  16. android打开图库,Android 7.0 以上通过系统图库打开图片的方法
  17. C++ 上机实验(二)【继承与多态】
  18. Mysql资料博文收藏
  19. SNA---主要统计指标解释(2)
  20. Python编程经常用到的英语及翻译

热门文章

  1. 基坑 matlab,基于目标函数MATLAB优化基坑降水的井群设计
  2. sql server锁机制
  3. 万人逐鹿、十强争霸,华为云GaussDB数据库两大重量级赛事圆满落幕
  4. Android爬虫之Jsoup
  5. RV1108 EMMC 程序下载失败原因分析
  6. [日推荐] 『忆年共享相册』-照片鉴证一起走过的哪些年
  7. 全国首个兼容多种底层链和云服务的区块链服务平台发布
  8. 电影院订票mysql_Ssh+Mysql实现的Java Web在线订电影票订票系统
  9. 这6个好用的图片素材网站,你一定要知道
  10. 「苏州SEO顾问」百度站长工具平台抓取异常的原因有哪些?