「咱們應該學習那些科學家發現和解決問題的思惟過程,而不該該直接灌輸理論知識。」
「大學精神的本質,並非爲了讓咱們變得深奧,而偏偏是恢復人類的天真".----劉瑜
」一我的的語言的世界,既是這我的的世界";
------------------------引子
數學家萊布尼茨提出瞭如下問題:
1) 建立一種能夠描述全部問題的」通用「語言;
2)找出一種可定義的方法去解決用這種」通用「語言描述的全部問題(算法);
簡單來講,萊布尼茨的問題是:是否存在一種」通用「語言描述來解決全部問題?
1936年,阿蘭·圖靈引入的圖靈機和阿隆佐·邱奇的lambda演算論文幾乎同時證實了算法的「可計算性」;即任何計算或算法均可以用一臺圖靈機來執行。而如今的基於馮·洛依曼機器模型既是一個帶寄存器狀態機的圖靈機器。從對問題領域的分析,到對所研究問題的恰當表述的過程既是DSL思想;而最終對於「可計算性」這個問題用計算機機器表述出來。能夠說計算機的發明就是一個針對」可計算性問題「的一個偉大DSL;爲計算機產生奠基了理論基礎。
圖靈機的描述更偏重硬件層面的表述,而lambda演算更偏重軟件層面的表述。
構築於「圖靈機」理論上的馮·洛依曼思想衍生出許多命令式程序設計語言:彙編語言,Fortran,c,java等等。
lambda演算理論衍生出了lisp系列的函數式程序設計語言:scheme,common-lisp;elisp等。
言歸正傳,開始講DSL(domain specific language),比較官方的定義爲:側重特定領域的表達有限的計算機編程語言。咱們平常接觸的各個方面的編程語言既是DSL,好比sql語句就是數據庫查詢的DSL, shell語言是與操做系統交互的DSL,java,ruby使程序員在更高的抽象層面專一業務邏輯編碼;等等。
DSL的特色,在所關注的領域易於閱讀,理解的語言。由於封裝了domain細節,屏蔽複雜性,提供上層操做方法,因此更易於表述人對這個業務的的理解的語言。
DSL的實現:
1. 利用現有語言進行元編程;(好比:咱們web開發經常使用的一些ssh框架,而語言層面,lisp,ruby這些語言的宏編程直接提供元編程能力)
2. 使用編譯工具;可使用lex,yacc,或者javacc,antlr等幫助咱們創建新語言的描述和解釋。好比antlr提供了詞法描述,語法描述,各類目標語言(java,c,c++)的詞法分析器,語法分析器生成。利用他你能夠實現一個完整的語言。在各類建模工具逆向工程,好比經過代碼生成圖表描述的工具uml,powerdesign)等均可以看到他的身影;
3. 本身設計語言的規範並實現編譯器;
--- 老徐 (轉載請註明出處)java