1. 程式人生 > >Javascript誕生記:C語言和Self語言一夜情的產物

Javascript誕生記:C語言和Self語言一夜情的產物

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()返回的應該是年份的最後兩位:

JavaScript
12345 vardate1=newDate(1999,0,1);varyear1=date1.getYear();alert(year1);// 99

但是實際上,對於2000年,它返回的是100!

JavaScript
12345 vardate2=newDate(2000,0,1);varyear2=date2.getYear();alert(year2);// 100

如果用這個函式生成年份,某些網頁可能出現”19100″這樣的結果。這個問題完全來源於Java,因為Javascript的日期類直接採用了java.util.Date函式庫。Brendan Eich顯然很不滿意這個結果,這導致後來不得不添加了一個返回四位數年份的Date.getFullYear()函式。

如果不是公司的決策,Brendan Eich絕不可能把Java作為Javascript設計的原型。作為設計者,他一點也不喜歡自己的這個作品:

“與其說我愛Javascript,不如說我恨它。它是C語言和Self語言一夜情的產物。十八世紀英國文學家約翰遜博士說得好:’它的優秀之處並非原創,它的原創之處並不優秀。’(the part that is good is not original, and the part that is original is not good.)”

相關推薦

Javascript誕生C言和Self語言產物

1. 二週前,我談了一點Javascript的歷史。 今天把這部分補全,從歷史的角度,說明Javascript到底是如何設計出來的。 只有瞭解這段歷史,才能明白Javascript為什麼是現在的樣子。我依據的資料,主要是Brendan Eich的自述。 2. 上一篇

字節序的理解----C言和Python語言

code n) name mes net oid unsigned import 應該 字節序是指多字節數據在計算機內存中存儲或者網絡傳輸時各字節的存儲順序。常見的主要有以下2種: 小端序(Little-Endian):低位字節排放在內存的低地址端即該值的起始地址,高位字

歌德巴赫猜想的C言和Java語言版源程式(給出任何一個大於6的偶數寫出兩個素數之和)

C語言版 #include<stdio.h> int isPrime(int n) { int j,x; for(j=2;j<n;j++) if(n%j==0) {

使用C言和i2c-dev驅動

ati 感謝 none 末尾 當前 lose error 寄存器 但是 原文地址:blog.csdn.NET/wyt2013/article/details/20740659 感謝作者分享。在本博客的《使用Beaglebone Black的I2C(一)》中,介紹了BBB上無

使用C言和Java分別實現冒泡排序和選擇排序

都沒有 img 容易 n) 不穩定排序 實現 imp 結果 輸出 經典排序算法——冒泡和選擇排序法 Java實現冒泡排序 基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素放到頂端,最終達到完全有序,首先看個動圖: 我們要清楚一點,

C言和DOTA

doc scp cow auc http app shu style cst 5嘆衣8顏2靨s裁試phttp://weibo.com/u/6378954492 16v2i8H6b0hx諼http://shequ.docin.com/fqxod352 舉ENh淹境06盎r

聊聊C言和ABAP

這個公眾號之前的文章,分享的都是Jerry和SAP成都研究院的同事在工作中學到的一些知識和感受。而今天這篇文章,寫作的由來是因為最近我又參與了SAP成都數字創新空間應聘者的面試,和一些朋友聊了一些關於用不同的程式語言寫Hello World程式的話題,突然才發現,自己從2007年畢業之後,再沒有使用過C語言進

C言和cuda C實現的程式碼(教科書上的格式)

一般教科書都這麼寫,感覺不如STL的好。記下以便查閱。 #include <cuda_runtime.h> #include <iostream> #include <stdio.h> __global__ void vector_add_gpu_2(fl

[原始碼分享]自己使用C言和easyX實現的小藍鯨跑酷遊戲^_^

《Crazy Whale》是以“小藍鯨”為主角的跑酷遊戲。本遊戲通過操作“w”“s”或“↑”“↓”控制小藍鯨上浮下潛以躲避海底障礙物,在水面上時按“空格鍵”可以讓小藍鯨跳躍以越過島嶼,遊戲過程中小藍鯨存活時間越久得分越高。與此同時,小藍鯨吃到魚可以獲得加分或者無敵的獎勵。難度方面共設計了四個

C#言和SQL Server資料庫技術_My Bank銀行系統

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace  My Bank { class Bank { Pe

C#言和SQL Server資料庫技術_前四章錯題

  1。在C#中,如果讓某個方法只能被它所在的程式集內的其他方法訪問,可使用(C)修飾這個方法。 (選擇一項) A:private B:protected C:internal D:以上都不對 2.下列關於String.Format()用法不正確的是(B)

為什麼說C言和linux是分不開的?

在很多人的眼裡,C語言和linux常常是分不開的。這其中的原因很多,其中最重要的一部分是linux本身就是C語言的傑出作品。當然,linux作業系統本身對C語言的支援也是相當到位的。作為一個真正的程式設計師來說,如果沒有在linux下面用C語言編寫過完整的程式,那麼只能說他對C語言本身的理解

c#言和SQL Server資料庫技術_用表組織資料

一.四種完整性約束1.實體完整性約束:不允許出現相同記錄的資料2.域完整性約束:對欄位進行限定,不得插入不符合限定的資料3.引用完整性:表與表之間的關係4.自定義完整性約束:開發人員自己設定對欄位的約束,不允許出現不符合約束的資料二.資料型別 二進位制資料型別 儲存非字元和文字的資料 image 可用來

c#言和SQL Server數據庫技術_用表組織數據

text 表達式 主鍵 gpo 默認值 展開 數據包 mage 找到 一.四種完整性約束1.實體完整性約束:不允許出現相同記錄的數據2.域完整性約束:對字段進行限定,不得插入不符合限定的數據3.引用完整性:表與表之間的關系4.自定義完整性約束:開發人員自己設定對字段的約束

c言和c++字串操作對比

C語言字串操作 #include <stdio.h> #include <string.h> int main() { //字元陣列 char str1[20] = "abc

淺談C言和C++中的記憶體管理

面試題 記憶體管理了解多少,說出你知道的 C語言記憶體分配佈局 程序在記憶體中的佈局 最高記憶體地址       棧區(函式內部的區域性變數,自動釋放 )   堆疊增長區       堆區(動態記憶體分配,由程式設計師申請釋放)     其他段  

學習程式設計有沒有必要從C言和C++學起?應該怎麼學?

軟體行業經過幾十年的發展,程式語言的種類已經越來越多了,而且很多新的程式語言已經在這個領域從開始的默默無聞到如今風風火火,整個程式語言朝著整合化方向發展,這樣會導致很多的初學者選擇上不像以前那麼單一了,而且隨著整個軟體行業應用方面開發剛需增加,高階程式語言市場進一步得到擴張,

[原始碼和文件分享]基於C言和SQL SERVER資料庫實現的圖書管理系統

摘 要 本文根據《資料庫應用系統設計》課程要求而做。選擇圖書館管理系統設計與開發是因為覺得圖書館管理系統對我們的幫助很大,並且經常去圖書館,對圖書館的大部分功能及流程還是比較瞭解,而且現在有些地方可能還不夠完善。這次課程設計目標是建立一個比較好的圖書館管理系統,方便學生查詢,方便管理員管理,節省

詳解C言和C++中的main()函式返回值

返回值main應指示程式如何退出。返回值為0表示正常退出main。異常退出通常通過非零返回來表示,但是關於非零程式碼沒有明確的標準。另外,void main()在C ++標準庫明確被禁止,不應該被使用。在C++中合法的main函式使用方法如下: int main() 以及: int

C#言和SQL Server資料庫技術_用SQL語句操作資料

第8章 用SQL語句操作資料 一.SQL簡介1.SQL能做什麼SQL語句是針對資料庫而言的一門語言,它可以建立資料庫,資料表,可以針對資料庫的資料進行增,刪,改,查等操作,可以建立檢視,儲存過程,可以賦予使用者許可權等。2.SQL和T-SQLSQL的全程是“結構化查詢語言(Structured Query L