從過(guò)去5年編程語(yǔ)言的演化看未來(lái)趨勢(shì)
Fogus在這篇帖子里介紹了過(guò)去5年間涌現(xiàn)出來(lái)的一些新的編程語(yǔ)言,就如作者本人所說(shuō),你并不需要也不可能掌握所有這些語(yǔ)言,但是花點(diǎn)時(shí)間了解下它們,或許你就會(huì)從中發(fā)現(xiàn)未來(lái)編程語(yǔ)言的演進(jìn)趨勢(shì),原文介紹了14種語(yǔ)言(當(dāng)然不止這些),由于篇幅太長(zhǎng),我將分兩部分發(fā)布這篇文章:
前些天我編譯了一個(gè)Perlis(譯者注:Alan Perlis,第一屆圖靈獎(jiǎng)得主)語(yǔ)言列表,目的就是為了向大家展示主流編程語(yǔ)言之外的廣闊天地,這些語(yǔ)言只是為了拓展你的視野,就藝術(shù)性和實(shí)現(xiàn)上的技巧性而言,并沒(méi)有什么過(guò)人之處。在今天這篇帖子里,我會(huì)向大家介紹一些相對(duì)較新的編程語(yǔ)言(讓我們限定在過(guò)去5年之內(nèi)),主要目的是展示這些語(yǔ)言中的一些有趣的特性,以及當(dāng)前人們對(duì)舊有編程語(yǔ)言的認(rèn)識(shí),和對(duì)下一代語(yǔ)言發(fā)展方向的思考和探索,下面所列的這些語(yǔ)言有些可能已經(jīng)停止開(kāi)發(fā)了,但是在某種程度上它們依然代表了人們對(duì)于“新一代編程語(yǔ)言”的思考與探索,記住,這有時(shí)候并不意味著就是“創(chuàng)新”。
同我的Perlis列表不同,下面所列的這些語(yǔ)言我并沒(méi)有花太多的時(shí)間去了解,所以,如果有錯(cuò)誤還希望大家能夠批評(píng)指正,另外,以下排名不分先后。
Shen
發(fā)布時(shí)間: 2011, 作者: Dr. Mark Tarver
在我的Perlis列表里,我介紹了Qi這門(mén)語(yǔ)言,所以在這里介紹它的繼承者Shen就是理所當(dāng)然的事情了,事實(shí)上,Shen和Qi的大部分(或者全部?)的特性都差不多:
* Lisp方言
* 可選靜態(tài)類型
* 帶保護(hù)的模式匹配
* 宏
* 交互式執(zhí)行(Partial application)
* 函數(shù)回溯(backtracking)
* 內(nèi)置Prolog
* 內(nèi)置編譯器
盡管如此,Shen實(shí)際上是Qi的進(jìn)化版,Shen的很多點(diǎn)子都是繼承自Qi,但是同Qi不同,它最主要的目標(biāo)是靶向性(targetability),這是什么意思呢?Qi主要是以Common Lisp作為它的宿主語(yǔ)言,并在這方面花了大量精力,盡管如此,Qi的實(shí)現(xiàn)實(shí)際上只使用了Common Lisp的一個(gè)非常小的子集,因此,Tarver博士決定繼承這個(gè)點(diǎn)子,并限定Shen只依賴一個(gè)叫做KI的最小化的Lisp語(yǔ)言核心,因此在理論上, 這讓Shen可以更容易的移植到其它宿主語(yǔ)言上,比如Javascript,Python,Clojure以及Common Lisp等等,“kernel Lisps”曾經(jīng)激起過(guò)我的無(wú)限遐想,Shen算是在這方面的一個(gè)比較成熟的實(shí)踐。
下面是一個(gè)簡(jiǎn)單的使用了嵌入Prolog的member函數(shù):
- (defprolog member
- X [X | _] <--;
- X [_ | Y] <-- (member X Y);)
- (prolog? (member 1 [1 2 3]))
- /*=> true */
交互式執(zhí)行(Partial application):
- (* 2)
- /*=> #
- ((* 2) 54)
- /*=> 108 */
下面這個(gè)函數(shù)用于計(jì)算第N個(gè)三角形數(shù):
- (define triangle
- 0 -> 0
- N -> (+ N (triangle (- N 1))))
- (triangle 100)
- /*=> 5050 */
這是上面那個(gè)函數(shù)的帶類型限定的版本:
- (tc +) /* turn on type-checking */
- (define triangle
- {number --> number}
- 0 -> 0
- N -> (+ N (triangle (- N 1))))
- (triangle 5)
- /*=> 15 : number */
- (triangle a)
- /* type error */
我們可以將Shen看作是Lisp漫長(zhǎng),蜿蜒的歷史中的一個(gè)自然的進(jìn)化,實(shí)際上許多現(xiàn)代語(yǔ)言只不過(guò)是從Lisp語(yǔ)言中吸收了其早在很多年之前就已經(jīng)提出過(guò)的理念而已,因此,要說(shuō)最令人激動(dòng)語(yǔ)言,那仍然是Lisp本身。
更多資源:
* 源碼
#p#
Agda 2
發(fā)布日期:2009,作者: Ulf Norel
我曾試著想要全身心的投入到Agda語(yǔ)言中,但是關(guān)于它,我卻不知從何說(shuō)起,首先,Agda是一門(mén)純函數(shù)式,模式匹配,獨(dú)立類型的編程語(yǔ)言,并且,它還嘗試實(shí)現(xiàn)輔助證明(proof assistants)。在獨(dú)立類型的語(yǔ)言中,類型表達(dá)式可以包含一個(gè)程序表達(dá)式,因此,對(duì)類型的限定就只能通過(guò)函數(shù)語(yǔ)句或是值預(yù)測(cè)來(lái)解決,就實(shí)在是再遭不過(guò)了,Agda的類型語(yǔ)句和值語(yǔ)句是等價(jià)的(就是編程語(yǔ)句本身),這就意味著Agda的類型系統(tǒng)可以支持遠(yuǎn)比靜態(tài)語(yǔ)言復(fù)雜的多的數(shù)據(jù)類型,比如,我們可以說(shuō)這個(gè)函數(shù)只接受已經(jīng)經(jīng)過(guò)排序的列表類型(PDF),恩,讓我們看個(gè)例子吧:
下面是一個(gè)Agda類型系統(tǒng)的奇偶數(shù)編碼程序
- data Nat : Set where
- zero : Nat
- suc : Nat -> Nat
- fortyTwo : Nat
- fortyTwo = 42
- plus : Nat -> Nat -> Nat
- plus zero mm = m
- plus (suc n) m = suc (plus n m)
- mutual
- even : Nat -> Bool
- even zero = true
- even (suc n) = odd n
- odd : Nat -> Bool
- odd zero = false
- odd (suc n) = even n
上面的代碼定義了兩個(gè)數(shù)據(jù)類型 1) 自然數(shù) 2)偶數(shù),當(dāng)然,你也可以定義類型函數(shù)作為前置操作符:
- _+_ : Nat -> Nat -> Nat
- zero + mm = m
- suc n + m = suc (n + m)
目前為止我對(duì)Agda的了解也就這些了,但是如果有時(shí)間,我希望可以對(duì)它做進(jìn)一步的了解。
更多資源:
* 介紹資源
* 源碼
#p#
Ioke
發(fā)布日期:2008,作者:Ola Bini
Ola Bini的Ioke語(yǔ)言就是為了回答這樣一個(gè)很簡(jiǎn)單的問(wèn)題:如果完全不用考慮性能,而只專注于表達(dá)性(expressivity),那么你會(huì)創(chuàng)造怎樣的一門(mén)語(yǔ)言出來(lái)?事實(shí)證明從Bini的PPT里你可以看到這門(mén)語(yǔ)言具有難以置信的可表達(dá)性(見(jiàn)下面鏈接),Ioke最有趣的一個(gè)特性就是它是一個(gè)支持宏的homoiconic語(yǔ)言(homoiconic指程序本身可以作為語(yǔ)言的一種數(shù)據(jù)結(jié)構(gòu)來(lái)表示)。
- myfor = dsyntax(
- "takes a name, an enumerable, and a transforming expr
- and returns the result of transforming each entry in
- expression, with the current value of the enumerable
- bound to the name given as the first argument",
- [argName, enumerable, argCode]
- ''(`enumerable map(`argName, `argCode))
- )
- myfor(x, 1..5, x*2)
- ;=> [2,4,6,8,10]
另一個(gè)促使我學(xué)習(xí)Ioke的動(dòng)力就是:
牛逼的人創(chuàng)造的東西總是值得學(xué)習(xí)的。
不斷將我們的能力推向邊緣是作為程序員的職責(zé)所在,而學(xué)習(xí)聰明人的創(chuàng)造則是做到這點(diǎn)最有效的方式。
更多資源:
* Ioke
* Ioke: a Folding Language (視頻)
* 源碼
* Macro types in Ioke – or: What is a dmacro?
#p#
Pure
發(fā)布日起: 2008, 作者: Albert Gräf
Pure也是一個(gè)基于term rewriting構(gòu)建的函數(shù)式編程語(yǔ)言,Term rewriting有點(diǎn)像是我們?cè)诟咧写鷶?shù)里用到的FOIL(一種拆解多項(xiàng)式的方法)方法:
- (x1 + y1) * (x2 + y2) =
- (x1 * x2) + // First
- (x1 * y2) + // Outer
- (y1 * x2) + // Inner
- (y1 * y2); // Last
上面的代碼展示了如何使用FOIL方法來(lái)對(duì)兩個(gè)多項(xiàng)式相乘進(jìn)行變換,讓我們來(lái)看看Pure可以做什么:
- (x + 3) * (x + 5);
- //=> x*x+x*5+3*x+15
或許你認(rèn)為答案應(yīng)該是x^2 + 8*x + 15,但是因?yàn)槲覀儧](méi)有定義消除冗余的操作,所以結(jié)果會(huì)是下面的樣子:
- x*xx = x^2;
- (x + 3) * (x + 5);
- //=> x^2+x*5+3*x+15
這已經(jīng)很接近了。
另一個(gè)更復(fù)雜的例子就是求解一個(gè)數(shù)的質(zhì)因子:
- factor n = factor 2 n with
- factor k n = k : factor k (n div k) if n mod k == 0;
- = if n>1 then [n] else [] if k*k>n;
- = factor (k+1) n if k==2;
- = factor (k+2) n otherwise;
- end;
- factor 138;
- //=> [2,3,23]
要說(shuō)在這篇帖子里最讓我佩服語(yǔ)言,就是屬Pure了。
更多資源
* 源碼
#p#
Go
發(fā)布時(shí)間: 2009,作者: Robert Griesemer, Rob Pike, and Ken Thompson
對(duì)于是否要在這篇貼子里介紹Go讓我糾結(jié)了很久,到目前為止,我對(duì)Go都有非常強(qiáng)的抵觸情緒,盡管如此,但是人們似乎覺(jué)得多一種系統(tǒng)級(jí)的編程語(yǔ)言選擇是件好事情,所以最終我還是決定拋棄個(gè)人偏見(jiàn),將Go包含在內(nèi)。
下面是一段用Go編寫(xiě)的游程編碼(run-length encoding)程序:
- package main
- import (
- "fmt"
- "strings"
- )
- var order = 4
- var grain = "*"
- func main() {
- t := []string{grain + strings.Repeat(" ", len([]int(grain)))}
- for ; order > 0; order-- {
- sp := strings.Repeat(" ", len([]int(t[0]))/2)
- top := make([]string, len(t))
- for i, s := range t {
- top[i] = sp + s + sp
- t[i] += s
- }
- t = append(top, t...)
- }
- for _, r := range t {
- fmt.Println(r)
- }
- }
對(duì)于系統(tǒng)級(jí)編程,這個(gè)世界需要更多的選擇,而Go正是針對(duì)這個(gè)目標(biāo)設(shè)計(jì)的。
更多資源
* 源碼
* 指南
#p#
Arc
發(fā)布日起:2008,作者:Paul Graham以及Robert Morris
很難相信Arc居然只是一個(gè)3年前才誕生的語(yǔ)言(根據(jù)發(fā)布日期),當(dāng)然,我之所以覺(jué)得它古老,這和我花了無(wú)數(shù)時(shí)間閱讀Graham介紹Arc的帖子有關(guān),在Arc發(fā)布之前,它曾讓人無(wú)比激動(dòng),但不幸的是,在它真正發(fā)布之后,對(duì)這個(gè)語(yǔ)言的評(píng)價(jià)基本上都處于失望和生氣之間,我也非常想要喜歡它,但是找來(lái)找去我還是沒(méi)能找到充足的理由說(shuō)服自己,我覺(jué)得如果沒(méi)有Clojure,Racket或是Qi這樣的語(yǔ)言,那么我或許會(huì)愿意去嘗試下Arc,不過(guò)我必須得承認(rèn),Arc的核心理念“簡(jiǎn)明就是力量”仍然深深的打動(dòng)了我,除了語(yǔ)言本身(它的實(shí)現(xiàn)只部分遵從了這一原則),它的核心哲學(xué)依然足夠強(qiáng)壯,讓我們來(lái)看看Paul Graham在“Arc challenge”里的這段話吧:
假設(shè)要寫(xiě)一個(gè)程序讓某個(gè)URL(比如,http://localhost:port/said)產(chǎn)生一個(gè)帶有輸入框和提交按鈕的頁(yè)面,然后當(dāng)提交按鈕被按下時(shí),這時(shí)應(yīng)該有第二個(gè)頁(yè)面,這個(gè)頁(yè)面只包含一個(gè)簡(jiǎn)單的鏈接“點(diǎn)這里”,當(dāng)你點(diǎn)了這個(gè)鏈接之后,會(huì)出現(xiàn)第三個(gè)頁(yè)面,在這個(gè)頁(yè)面你會(huì)看到“你剛剛說(shuō)的是:……”,這里的省略號(hào)就是你在第一個(gè)頁(yè)面所輸入的內(nèi)容。
要實(shí)現(xiàn)上面描述的功能,下面是Arc的解決方式:
- (defop said req
- (aform [w/link (pr "you said: " (arg _ "foo"))
- (pr "click here")]
- (input "foo")
- (submit)))
學(xué)習(xí)Arc的一個(gè)額外的好處就是你可以順帶了解到Racket語(yǔ)言的神奇,好吧,我承認(rèn)我作弊幫Racket做宣傳了。
更多資源
* Arc指南
* Arc核心
* Arc論壇
* Arc源碼
#p#
CoffeeScript
發(fā)布日期:2009,作者:Jeremy Ashkenas
我發(fā)現(xiàn)Jeremy Ashkenas絕對(duì)是個(gè)超級(jí)聰明的程序員,他的一些哲學(xué)與我不謀而合,另外值得注意的是,CoffeeScript是這篇帖子里介紹的這些語(yǔ)言中唯一一個(gè)我會(huì)在實(shí)際工作中使用的語(yǔ)言,它的語(yǔ)法實(shí)在是太干凈自由了,但是它最牛的地方(也有些人說(shuō)這是最弱的)就是它只是對(duì)JS的非常淺的封裝,CoffeeScript實(shí)際上是對(duì)于Crockford(譯者注:JavaScript社區(qū)最知名的權(quán)威之一,JSON、JSLint、JSMin和ADSafe之父)的“Javascript: The Good Parts”一書(shū)的最好詮釋,并且還是以更優(yōu)美的語(yǔ)法實(shí)現(xiàn)的。
CoffeeScript最有趣的一個(gè)特性就是它提供了一種非常輕量級(jí)的JSON語(yǔ)法:
- jsn =
- foo: 'a'
- bar: 'b'
- jsn.bar
- #=> 'b'
這讓下面這樣的對(duì)象語(yǔ)法變得更加容易:
- sanders =
- speed: 8
- juke: 10
- report: -> "#{@speed} and #{@juke}"
- sanders.report();
- #=> '8 and 10'
還有列表的實(shí)現(xiàn):
- transpose = (matrix) ->
- (t[i] for t in matrix) for i of matrix[0]
- transpose [[1,2,3],[4,5,6]]
- //=> [[1,4],[2,5],[3,6]]
下面這點(diǎn)不知道該說(shuō)好還是壞,CoffeeScript還提供了基于類支持:
- class Animal
- constructor: (voice) ->
- @voicevoice = voice
- speak: =>
- "#{@voice}!!"
- class Dog extends Animal
- constructor: ->
- super("ruff")
- d = new Dog
- d.speak()
- #=> 'ruff!!'
CoffeeScript并不是第一個(gè)基于Javascript的語(yǔ)言,但是它對(duì)JS的適配和支持是最完美的,并且實(shí)踐證明大多數(shù)人都可以接受這種方式,而同樣重要的是Coffeescript還解決了寄生語(yǔ)言如何與現(xiàn)有的JS庫(kù)和框架共存的問(wèn)題。
更多資源:
* 源碼
#p#
Potion
發(fā)布日期: 2009, 作者: _why the Lucky Stiff
曾經(jīng)有個(gè)叫_why的家伙在ruby圈子里引起了一場(chǎng)不小的風(fēng)波,作為一個(gè)神秘人,他對(duì)Ruby和編程的一些見(jiàn)解為他在ruby以及ruby之外的世界贏得了很高的聲譽(yù),_why就是這樣一個(gè)神奇的開(kāi)源貢獻(xiàn)者,在他的眾多開(kāi)源項(xiàng)目中,有一個(gè)叫做Potion的項(xiàng)目,這個(gè)項(xiàng)目的目標(biāo)是創(chuàng)造一個(gè)小巧且強(qiáng)大的新編程語(yǔ)言,Potion繼承了很多Io,Lua,OCaml以及Ruby的想法,并將它們匯集于一身:
- Person = class: /name, /age, /sex.
- Policeman = Person class (rank): /rankrank = rank.
- Policeman print = ():
- ("My name is ", /name, " and I'm a ", /rank, ".")
- join print.
- Policeman ("Constable") print
- # My name is nil and I'm a Constable.
不過(guò)讓我最感興趣的就是,Potion分離了數(shù)據(jù)和表達(dá)式的符號(hào)系統(tǒng),當(dāng)然我必須得承認(rèn)這個(gè)語(yǔ)言并不是很富有創(chuàng)造性,這是因?yàn)樽髡邔⒋蟛糠志Χ纪度氲搅藢?shí)現(xiàn)上,它的實(shí)現(xiàn)非常簡(jiǎn)潔,只有大約6000行代碼,也就是說(shuō)一般公司的年輕程序員(或者是像我這樣的老家伙)都可以在幾周之內(nèi)完全理解整個(gè)語(yǔ)言的實(shí)現(xiàn),閱讀代碼是個(gè)很好的學(xué)習(xí)方式,尤其是閱讀這樣出色的的代碼。
繼續(xù)了解
* 源代碼
Mirah
發(fā)布日期: 2008, 作者: Charles Nutter
JRuby算是一個(gè)非常不錯(cuò)的在JVM之上構(gòu)建的語(yǔ)言了,但是就像其它許多的Java.next語(yǔ)言一樣,它也受到運(yùn)行時(shí)問(wèn)題的困擾,作為一個(gè)共生語(yǔ)言,要想提供一個(gè)強(qiáng)大且高效的開(kāi)發(fā)和運(yùn)行時(shí)體驗(yàn),共生語(yǔ)言需要提供一個(gè)可以在任何java運(yùn)行時(shí)上部署的核心庫(kù)。如果我們將這個(gè)運(yùn)行時(shí)限定在只支持一個(gè)輕量級(jí)的運(yùn)行環(huán)境,那么這在實(shí)踐中就不是什么大問(wèn)題。讓我們來(lái)看看Mirah,Mirah的目標(biāo)(這是個(gè)很靠譜的目標(biāo))就是創(chuàng)造一個(gè)新的基于JVM的語(yǔ)言(語(yǔ)法主要借鑒Ruby),讓你可以得到動(dòng)態(tài)語(yǔ)言的體驗(yàn),但又不需要增加任何額外的運(yùn)行時(shí)庫(kù)。
- def reverse(s:string)
- StringBuilder.new(s).reverse
- end
- puts reverse('reversed')
初看起來(lái),Mirah就是一個(gè)增加了類型聲明支持的JRuby,如果我不是這樣喜歡JRuby,或許我會(huì)希望Charles Nutter把他所有的時(shí)間都花在Mirah上。
繼續(xù)了解
* 初始聲明
* 源碼
#p#
Scratch
發(fā)布日期: 2007, 作者: Mitchel Resnick
當(dāng)我看到我5歲的兒子毫不費(fèi)力的完成了對(duì)這些樂(lè)高機(jī)器人的編程時(shí),我就在想著,或許應(yīng)該有一種提供圖形化IDE的通用語(yǔ)言,當(dāng)我發(fā)現(xiàn)Scratch時(shí),我大吃了一驚,這個(gè)圖形化的語(yǔ)言居然和我想的如此接近,并且它和上面講的樂(lè)高機(jī)器人都是由MIT的一個(gè)小組開(kāi)發(fā)的。
下面是Scratch版的“Hello,World”:

Scratch算是Smalltalk的一個(gè)近親,但是它的目標(biāo)是以“玩樂(lè)式的體驗(yàn)”幫助孩子學(xué)習(xí)必要的數(shù)學(xué)和編程技能——我非常贊同這個(gè)目標(biāo),Scratch雖然看起來(lái)和微軟的Kodu有點(diǎn)像,但是基于我玩樂(lè)高的體驗(yàn),我更喜歡Scratch一些。
更多資源
* 源碼
ClojureScript
發(fā)布日期: 2011, 作者: Rich Hickey
ClojureScript是一個(gè)基于JavaScript之上的語(yǔ)言,它采用了大部分Clojure的語(yǔ)法,然后被編譯成Javascript,因?yàn)槲冶救司褪荂lojureScript的開(kāi)發(fā)者,我對(duì)它的看法難免會(huì)有偏見(jiàn),所以還是讓Brenton Ashworth來(lái)告訴你ClojureScript到底有多酷吧:
ClojureScript browser-connected REPL from Brenton Ashworth
這是個(gè)連我都被震住了的視頻。
繼續(xù)了解
* ClojureScript聲明
* 源碼
Clojure
發(fā)布日期: 2007, 作者: Rich Hickey
同上面一樣,我對(duì)Clojure的喜愛(ài)也不可避免的帶有偏見(jiàn),所以我盡量少說(shuō)一些,下面就是我對(duì)它的簡(jiǎn)短評(píng)價(jià):
不變性(Immutability)將會(huì)成為游戲規(guī)則的顛覆者
另外,下面是一個(gè)由Christophe Grand實(shí)現(xiàn)的生命游戲的Clojure版本:
- (defn neighbours [[x y]]
- (for [dx [-1 0 1] dy (if (zero? dx) [-1 1] [-1 0 1])]
- [(+ dx x) (+ dy y)]))
- (defn step [cells]
- (set (for [[loc n] (frequencies (mapcat neighbours cells))
- :when (or (= n 3) (and (= n 2) (cells loc)))]
- loc)))
- (def board #{[2 1] [2 2] [2 3]})
- (defn print-board [board w h]
- (doseq [x (range (inc w)) y (range (inc h))]
- (if (= y 0) (print "\n"))
- (print (if (board [x y]) "[X]" " . "))))
- (defn display-grids [grids w h]
- (doseq [board grids]
- (print-board board w h)
- (print "\n")))
再就是,我寫(xiě)過(guò)一本關(guān)于Clojure的書(shū)。
更多資源
* 源碼
#p#
OMeta
發(fā)布日期: 2009 (?), 作者: Alessandro Warth
最近幾年關(guān)于DSL的討論越來(lái)越多,大家的很大一部分注意力都被轉(zhuǎn)移到了這個(gè)話題上,盡管如此,如果有人曾經(jīng)參與過(guò)DSL的設(shè)計(jì)或者實(shí)現(xiàn),那么他應(yīng)該會(huì)發(fā)現(xiàn),現(xiàn)在的情況遠(yuǎn)不能讓人滿意,問(wèn)題就是你很難用一個(gè)通用語(yǔ)言實(shí)現(xiàn)一個(gè)既強(qiáng)大又健壯的DSL,造成這個(gè)問(wèn)題的原因有很多,但最主要的問(wèn)題就是,即使是使用那些具有很大的語(yǔ)法靈活性的語(yǔ)言,你也仍然很難保證你實(shí)現(xiàn)出來(lái)的DSL不會(huì)太過(guò)丑陋,當(dāng)然,你可以做到,但是如果你想要實(shí)現(xiàn)一個(gè)理想的DSL,你會(huì)發(fā)現(xiàn),你真的需要一套簡(jiǎn)單的工具來(lái)幫你構(gòu)建一個(gè)完整的語(yǔ)言解析器和運(yùn)行時(shí),關(guān)于這個(gè),我都可以花上一天再寫(xiě)個(gè)新帖了,但我還是先省省吧,讓我們回到主題,真的,DSL的世界需要這樣一種語(yǔ)言,它只是為你提供一套工具,讓你可以編寫(xiě)?yīng)毩⒌腄SL解析器,或是嵌入式的變體,沒(méi)錯(cuò),那就是OMeta。
就像JetBrain的元編程系統(tǒng)提供的那種非常容易理解且強(qiáng)大的工具集一樣,OMeta最大的優(yōu)勢(shì)就在于它非常簡(jiǎn)單,OMeta是基于語(yǔ)法表達(dá)式解析器(PEG)構(gòu)建的,你可以輕松對(duì)它進(jìn)行擴(kuò)展來(lái)支持通用的數(shù)據(jù)結(jié)構(gòu)。
更多資源
Fortress
Fortress有點(diǎn)超出了這個(gè)貼的時(shí)間限制,因?yàn)樵谒_(kāi)發(fā)布之前,它已經(jīng)在Sun內(nèi)部被使用了多年,F(xiàn)ortress之所以引起我的關(guān)注,只是因?yàn)镚uy Steele參與了這個(gè)項(xiàng)目,除了這一點(diǎn),F(xiàn)ortress引人注目之處還在于它將精力放在了并行計(jì)算上,它的語(yǔ)法看起來(lái)更像是數(shù)學(xué)符號(hào),并且支持對(duì)象-函數(shù)范式,comprehensions,traits, contracts以及靜態(tài)計(jì)量單位解析和分布式數(shù)據(jù)結(jié)構(gòu)。
- for i←seq(1:m) do
- for j←seq(1:n) do
- print a[i,j]
- end
- end
上面的這個(gè)簡(jiǎn)單的嵌套循環(huán)展示了Fortress的一個(gè)非常有趣的特性,那就是循環(huán)中的語(yǔ)句是并行執(zhí)行的,F(xiàn)ortress對(duì)于并行采用了一個(gè)很堅(jiān)決的做法,它沒(méi)有將并行作為語(yǔ)言的一個(gè)可選項(xiàng),而是將它和語(yǔ)言本身緊密的結(jié)合在了一起,當(dāng)然,除了這種隱式的并行,F(xiàn)ortress也支持顯式的并行計(jì)算。
更多資源
* 源碼
接下來(lái)?
最近又涌現(xiàn)了許多新的編程語(yǔ)言,但是我對(duì)這些語(yǔ)言的了解僅限于一條Tweet的長(zhǎng)度:
* Dart
51CTO推薦專題:Google Dart新結(jié)構(gòu)化編程語(yǔ)言
第一定理(譯者注:這里指作者前面說(shuō)的一句話:當(dāng)牛逼的人創(chuàng)造了某個(gè)東西,你應(yīng)該學(xué)習(xí)之)
看起來(lái)為適配更多的運(yùn)行時(shí)做了均衡
* Rust
看起來(lái)像是D語(yǔ)言的繼承者
第一定理
* Ceylon,不確定對(duì)于一個(gè)堅(jiān)持追隨Java約定的團(tuán)隊(duì),這個(gè)語(yǔ)言為他們提供了什么
* Kotlin,基于IDE打造
* Newspeak,smalltalk+: FloatD的簡(jiǎn)化版
* Perl6,鑒于我不是Perl程序員,所以我可以等
* Magpie
或許是最好的關(guān)于編程語(yǔ)言開(kāi)發(fā)的“Blog"了
很不幸沒(méi)時(shí)間去看它的源代碼
由Dart團(tuán)隊(duì)的一員開(kāi)發(fā)
感謝Tracy Harms提醒
更少人知道的
下面這些語(yǔ)言是其他人推薦給我的,我對(duì)它們基本上一無(wú)所知:
* Felix 屬于ML系
* Wheeler 看起來(lái)真的很獨(dú)特,我會(huì)花點(diǎn)時(shí)間探索下
* Opa 下一代的Web語(yǔ)言
* Frege 又一個(gè)Java.next語(yǔ)言,Haskell系
* Cobra 帶給我合同
* Clay 另一個(gè)系統(tǒng)級(jí)編程語(yǔ)言,在我看來(lái)很干凈
寫(xiě)完這篇文章,一個(gè)讓我驚奇的發(fā)現(xiàn)是,過(guò)去5年間我們對(duì)于數(shù)組編程【6】幾乎沒(méi)有取得什么進(jìn)展,盡管如此,我懷疑可能還有有一些私有的項(xiàng)目沒(méi)被我發(fā)現(xiàn),隨著時(shí)間的推移,我的感受就是,編程語(yǔ)言正在朝著衍生和進(jìn)化的方向發(fā)展,而不是再?gòu)念^重新發(fā)明一種革命性的新語(yǔ)言,這并不一定就是件壞事情,因?yàn)橛?jì)算機(jī)史上還有很多隱藏的很深的好點(diǎn)子等著我們?nèi)グl(fā)掘。
本文是“Programming language development: the past 5 years”一文的上半部分,作者:Fogus,翻譯:yuanyiz
原文:http://heikezhi.com/2011/11/06/programming-language-development-the-past-5-years-part-1/
【編輯推薦】