自制編程語(yǔ)言有什么好處?
編程語(yǔ)言是程序員每天都要使用的工具。深刻地理解這個(gè)工具,對(duì)程序員來(lái)說(shuō)非常重要。
一般來(lái)說(shuō),重新編寫一個(gè)與已有程序相似的程序會(huì)被說(shuō)成是“重復(fù)發(fā)明輪子”,這在行業(yè)內(nèi)是不被認(rèn)同的。但本書中想要實(shí)現(xiàn)的,偏偏是在眾多語(yǔ)言存在的前提下再制作一門新的語(yǔ)言,正是“重復(fù)發(fā)明輪子”。這是深刻理解編程語(yǔ)言的***途徑(缺點(diǎn)是要花很多時(shí)間)。
2. 能制作領(lǐng)域?qū)S谜Z(yǔ)言
比如在Unix的世界中,有sed和awk兩種歷史悠久的專為文本處理定制的語(yǔ)言(后來(lái)在此方向上發(fā)展出了Perl語(yǔ)言)。PHP則是專門面向 Web程序開(kāi)發(fā)的語(yǔ)言。如果掌握了制作編程語(yǔ)言的技術(shù),就可以在必要的情況下制作出領(lǐng)域?qū)S谜Z(yǔ)言(DSL,Domain Specific Language)。
領(lǐng)域?qū)S谜Z(yǔ)言不一定會(huì)像Perl與PHP那么復(fù)雜,在很多情況下,如果能書寫條件分支或者簡(jiǎn)單語(yǔ)句的話會(huì)方便許多,這也可以看作是一種專用領(lǐng)域。
比如在業(yè)務(wù)流程處理等軟件中,很多時(shí)候?yàn)榱饲袚Q測(cè)試環(huán)境與生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù),需要重寫配置文件,而這一操作經(jīng)常會(huì)引發(fā)問(wèn)題(比如由于版本升級(jí)需要增加配置文件項(xiàng)目,此時(shí)必須與舊版本配置合并)。這時(shí)候我們可能就會(huì)想,如果能直接在配置文件中寫if語(yǔ)句將其按域名分開(kāi)就好了。
除此以外,我們?cè)谔顚憯?shù)據(jù)時(shí)可能希望能支持類似Excel的簡(jiǎn)單計(jì)算公式,在玩游戲時(shí)希望能把游戲中的臺(tái)詞導(dǎo)出到一個(gè)外部文件中,等等。這些都可以看作專用領(lǐng)域并制作對(duì)應(yīng)的DSL。
3. 可以用編程語(yǔ)言擴(kuò)展應(yīng)用程序
將以上兩方面的考量進(jìn)一步延伸,我們就會(huì)得到以通用語(yǔ)言擴(kuò)展某個(gè)應(yīng)用程序的構(gòu)想。Emacs這個(gè)編輯器就內(nèi)置了Emacs Lisp這種Lisp方言,從而為Emacs的自定義提供了無(wú)限的可能性。同理,Microsoft Office也可以使用VBA進(jìn)行擴(kuò)展。
對(duì)于這類應(yīng)用程序擴(kuò)展語(yǔ)言,當(dāng)然完全可以使用某種已有的編程語(yǔ)言(Lua等就在向這個(gè)方向發(fā)展),也可以在編寫應(yīng)用程序時(shí)從底層到擴(kuò)展全部自己實(shí)現(xiàn)。這樣就無(wú)需擔(dān)心使用其他編程語(yǔ)言在版本升級(jí)時(shí)引起的兼容性問(wèn)題了。
4. 說(shuō)不定還會(huì)變成名人
如果自制的編程語(yǔ)言能在世界范圍內(nèi)得到廣泛使用,那就太棒了。比如Ruby之父松本行弘先生就是世界名人。
不過(guò)坦白講,通過(guò)自制編程語(yǔ)言來(lái)獲得成功實(shí)在是太難了。即便語(yǔ)言被創(chuàng)造出來(lái),如果沒(méi)人用的話就不會(huì)產(chǎn)生相應(yīng)的軟件,這樣就更不會(huì)有人用了。況且,即 便真的因?yàn)榘l(fā)明了新的語(yǔ)言而變成了名人,通過(guò)這個(gè)賺到錢的希望也十分渺茫啊。其實(shí)我自己最近寫的語(yǔ)法處理器都是免費(fèi)發(fā)布的(不這樣的話,語(yǔ)言沒(méi)法普及 呀)。
5. 自制編程語(yǔ)言非常有趣
啰嗦了這么多,說(shuō)到底其實(shí)是因?yàn)樽灾凭幊陶Z(yǔ)言非常有趣。
自制一門編程語(yǔ)言確實(shí)是一件非常有意思的事。有人說(shuō)過(guò)“想寫出***程序的程序員,最終都去寫操作系統(tǒng)或者編程語(yǔ)言了”,你可以通過(guò)自制編程語(yǔ)言感受到接觸最核心技術(shù)的樂(lè)趣。
希望更多的人投入到自制編程語(yǔ)言中來(lái)。
原文鏈接:http://www.ituring.com.cn/article/56295






















