編程語言的進化
早上讀到了一篇文章《Lisp的永恒之道》 這一篇文章解決了我一直以來對Lisp編程語言的疑惑,加深了對DSL(領域編程語言),同時對編程語言的理解也越來越深入。寫一篇文章的目的就是從主要編程語言的進化來看看編程語言發展的過程以及背后的設計哲學,當然,這個只是我自己的認識,如果有不足之處,請博友指教。
機器語言
最早的編程語言是卡帶,也就是機器語言,這種語言沒有語義和語法,操作符和數據混合在一起,偏向于具體的設備,依賴覺得硬件。
匯編語言
隨后,匯編語言就出現了,匯編語言定義了基本的語法結構,定義了操作符和數據類型,但是匯編語言還是針對特定的硬件編程,比如cpu,我記得大學的時候學習的就是8086匯編語言程序設計,這個就是針對intel 8086cpu的編程語言而設計,如果cpu是80386,那么就必須在對80386的cpu進行編程,可移植性非常差。如果針對每一個cpu就要重新寫整一套代碼,那么將會是多么復雜的事情,困難度不可想象。
C語言
對于匯編語言的問題,主要要解決跨硬件平臺,那么怎么解決這個問題了,對啦,添加一個抽象層,這個就是硬件抽象層,它隱藏了特定平臺的硬件接口細節,為操作系統提供虛擬硬件平臺,使其具有硬件無關性,可在多種平臺上進行移植。相當于提供統一的api 比如C語言printf函數,打印字符串,由于每個終端設備的類型和型號都不一樣,需要在適配到每個終端設備上,那么通過一個終端虛擬硬件,由它進行各個終端差異的屏蔽,提供統一的對外接口,有點類似適配器模式。用C語言寫出來的程序。雖然這樣簡化了操作硬件的這種復雜行,但是直接寫操作虛擬硬件的代碼也是很苦逼的事情,這樣就出現了系統內核,用來提供更高一層的抽象,所以C語言操作硬件的函數都會調用系統內核,由系統內核再去調用具體的虛擬終端設備。這個就和特定的操作系統有關了,C語言編譯器編譯出來的代碼就和操作系統進行關聯。所以C語言程序很難做到跨操作系統平臺,因為每個操作系統都提供私有函數,并且編譯出來的二進制代碼也是不一樣的,跨平臺基本不可能。
高級語言:java,.net
為了解決C語言的跨平臺的問題,可以考慮再在操作系統這一層添加一個抽象。那么就出現了java和.net這樣的編程語言。java通過實現一個jvm虛擬機,屏蔽了各個操作系統的差異,同時定義了一個標準的目標代碼(class文件),只要class文件滿足jcp定義的規范,就可以被jvm執行。這就解決了兩個問題,目標代碼格式固定,這個平臺都一樣,函數調用都一樣,都和jvm打交道。這樣就實現了跨越操作系統平臺。但是還存在一個問題,jvm的實現只能夠獲取各個操作系統公共的部分進行抽象,但是有一些操作系統私有的個性化是無法屏蔽的,只能通過開通一個小后門,讓開發者能夠開發基于操作系統的native實現。
DSL領域編程語言
好了,編程語言發展到這一層,已經非常高級了,對于開發者來說,已經夠簡單了。不需要硬件只是,不需要懂操作系統知識。如果在繼續發展會怎么樣,對啦,是不是可以跨越編程語言。還有,編程語言一般都是語法和語義綁定在一起的,比如 int c = a + b 這一條賦值語句,我們知道要把 a 和 b相加 賦予 c ,相當于知道語法,就知道語義了,那么是不是可以把語義 和 語法 分開 ?
語義:
- define c = add(b,c)
或者
- <opteration name="add" result="c"><paramparam="a,b"/></opteration>
那么轉化為 java語言 就是 int c = a + b; 轉化為javasrpit var c = a + b 等等
相當于what 和 how 分開,就是說 我要做什么 和 我怎么做 這一層在區分開來。目前我們使用的比較多的就是maven
maven通過自己的一套語義,定義了整個構建的過程。我只定義了怎么做,通過xml這一套語法來定義,但是具體怎么做我通過一個解釋層來實現,同時也可以用不同的語言,可能在java平臺上,我用java語言來實現,在.net平臺,我用.net來實現。
其中大名頂頂的 facebook的 Thrift框架就是這種設計思想,通過自己定義的一套語言,定了一個分布式服務框架,通過自己的解釋器,把自己定義的解釋成為不同的語言實現。
但是由于領域語言的語義定義的規則和模式都不一樣,對于每個不同的領域,都有自己的DSL,比如是ant,我就必須學習一下整個ant的規則,比如maven也需要重新開始學習。
目前很多語言轉化服務,比如目前把java寫的語言轉化為obejct-c和windows的云服務,原理和上面類似,應該都是先轉化為一套中間語言,然后轉化成為各個實際的特性語言。
未來想象
隨著DSL語言的快速發展,我在想 未來是不是會把DSL也統一起來,定義一套通用的規則和規范,找出每個領域特性部分,進行抽象,形成一種統一的開發語言。比如web編程,只需要web方面的DSL語言就可以了,不需要在學習python,php,jsp,asp等等,在數據庫操作方面也一樣,不需要在了解各個平臺具體連接數據庫的方式以及代碼實現,用統一的數據操作DSL就可以了。這個想法比較大,也是扯扯淡的,不過還是希望未來的某一天,編程語言會統一,不過現在越來越有這個趨勢了,各個語言都在添加其他語言的特性,增強自己的特性,以后各個語言都變的越來越類似,功能也越來越雷同,***需要考慮的是語言性能問題,但是隨著硬件的發展,除非某一個特定的領域,大部分應用在語言層面的性能應該會忽略。
通過編程語言的進化,起始發現背后的思想都是一樣的,原話我忘記是怎么說的,大概意思是:任何兩個系統之間的復雜性,都可以通過添加一個抽象層要屏蔽。整個編程語言的進化也都說明了這個問題。
原文鏈接:http://www.cnblogs.com/aigongsi/archive/2012/09/28/2706604.html