[Javascript]诞生记
作者: 阮一峰
日期: 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]诞生记相关推荐
- 今天讲个小故事,Javascript诞生记
JavScript是Brendan Eich仅花了十天时间就设计出来的!!! 今天讲个小故事. 布兰登·艾克(英语:Brendan Eich) 美国程序技术专家与企业家,JavaScript主要创造者 ...
- JavaScript诞生记
1995年布兰登.艾克进入网景公司,为其浏览器开发了JS功能 临危受命 公司要求给浏览器添加一个脚本功能 公司要求这个功能要蹭Java的流量 布莱登花10天时间设计了JS的最初版本 1996年,网景向 ...
- 谷歌Gmail诞生记:十年回首
美国<时代>周刊网络版今天刊登题为<Gmail诞生记:10年前鲜为人知的故事>(How Gmail Happened: The Inside Story of Its Laun ...
- bug诞生记——临时变量、栈变量导致的双杀
这是<bug诞生记>的第一篇文章.本来想起个文艺点的名字,比如<Satan(撒旦)来了>,但是最后还是想让这系列的重心放在"bug的产生过程"和" ...
- 大V诞生记 —— 谁是VMware?
大V诞生记 -- 谁是VMware? (点击阅读原文,一键收听微电台"大V科技谈") https://mp.weixin.qq.com/s/QtPrki9V7BNFOx53_3gW ...
- mapbox 导航_寻宝风格导航地图 Treasure 诞生记 | Mapbox 地图设计思路
Designing the Treasure map style 不久前,我们为大家介绍了霓虹灯风格地图 80's 8-bit 的设计思路,这篇文章我们继续分享一个有趣的地图设计 -- 寻宝风格地图 ...
- 阿里 AI「一对多」挑战人类律师;谷歌或将推出自研手机和电脑芯片;JavaScript诞生25周年|极客头条...
整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「 ...
- 2019领克车展 Max Co币机诞生记
领克车展 Max Co币机诞生记 网上拿张现场图 先引用一篇时下2019上海车展文章的段落 上海车展新车满满,领克展台玩起了"骚操作" https://chejiahao.auto ...
- “爱运动管理系统”诞生记(4)
"爱运动管理系统"诞生记(4) 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 照着<21天学通C语言>,把C语言粗 ...
最新文章
- XML学习总结(2)——XML简单介绍
- mysql组合索引的命中情况
- 详解spark任务提交至yarn的集群和客户端模式
- 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决
- 【Vegas原创】Mysql绿色版安装方法
- python enumerate_Python中enumerate用法详解
- Linux基础命令---ckconfig
- windows phone:使用sqlite-net
- matlab中函数imhist的用法
- K9G8G08U0A升级到K9GAG08U0D烧录NK要注意的地方
- 3种好用的可视化图表工具分享,快进来看!
- FTP协议是一种用于什么的协议
- benchmark在postgresql上的安装及使用
- lampp mysql未启动,lampp1.7中mysql无法启动问题
- PBID外部工具:Model Analyzer
- android打开图库,Android 7.0 以上通过系统图库打开图片的方法
- C++ 上机实验(二)【继承与多态】
- Mysql资料博文收藏
- SNA---主要统计指标解释(2)
- Python编程经常用到的英语及翻译
热门文章
- 基坑 matlab,基于目标函数MATLAB优化基坑降水的井群设计
- sql server锁机制
- 万人逐鹿、十强争霸,华为云GaussDB数据库两大重量级赛事圆满落幕
- Android爬虫之Jsoup
- RV1108 EMMC 程序下载失败原因分析
- [日推荐] 『忆年共享相册』-照片鉴证一起走过的哪些年
- 全国首个兼容多种底层链和云服务的区块链服务平台发布
- 电影院订票mysql_Ssh+Mysql实现的Java Web在线订电影票订票系统
- 这6个好用的图片素材网站,你一定要知道
- 「苏州SEO顾问」百度站长工具平台抓取异常的原因有哪些?