下一代編程范型主要原則
發表于:2008-10-06來源:作者:點擊數:
標簽:下一代范型原則
關鍵字:下一代編程范型主要原則 LOP:TheNextProgrammingParadig LanguageOrientedProgramming:TheNextProgrammingParadigm SergeyDmitriev,JetBrains 現在是軟件 開發 中開始下一次技術革命的時候了,而這次革命的輪廓正變得越來越清晰。下一代編程范型也在
關鍵字:下一代編程范型主要原則
LOP : The Next Programming Paradig
Language Oriented Programming : The Next Programming Paradigm
Sergey Dmitriev, JetBrains
現在是軟件
開發中開始下一次技術革命的時候了,而這次革命的輪廓正變得越來越清晰。下一代編程范型也在接近我們,但仍然沒有完全成形--不同的部分有不同的名稱:Intentional programming,
MDA, generative programming, 等等;我建議把把所有這些新方法歸并為一個名字: ‘language-oriented programming’(面向語言的編程), 而本文將闡述這種新的編程范型的主要原則
今天主流的編程方法有一些內在的假定像脖子上的繩索一樣桎梏著我們,盡管大部分程序員還沒有意識到它;即使算上在編程領域取得的所有進步,我們也仍然處于石器時代;我們有我們信賴的石斧(
面向對象編程),能夠滿足我們的需要,但是當用它來對付最困難的問題時,它會裂成碎屑;為了超越石器前進,我們必須馴服烈火,只有這樣,我們才能鑄造出新的工具,激發一個創作的新時代,和新技術的爆發
我將討論編程的局限,它強迫程序員像計算機一樣思考,而不是令計算機像程序員一樣思考;這是嚴重的,根深蒂固的局限,需要花費巨大的努力去克服它;當我說這將是編程中下一個大的范型轉換時我并沒有自命不凡;我們需要徹底重新定義我們編寫程序的方法
本文中,我表述了我的觀點和我當前在Language Oriented Programming (LOP)上的工作;首先我將展示目前主流編程方法的錯誤,然后我會使用示例來解釋LOP的概念,它們基于我已有的一個LOP的實現:the Meta Programming System (MPS). 本文有意只是給你一個對LOP的驚鴻一瞥,目的是激發你對這個思想的興趣,并希望能夠得到反饋和討論
Part I. LANGUAGE ORIENTED PROGRAM
MING OVERVIEW
Language Oriented Programming and the Meta Programming System
理想的,做一個程序員意味著我可以對計算機做任何事情,我有完全的自由,完全的控制;但實際上,今天的程序員只有非常受限的自由;當然,我確實可以在計算機上做任何事情,但其中一些事情花費了我許多年的努力,而它們實際上只需要少的多的時間;一定有什么事情不對勁
程序員被限制是因為他們深深依賴于那些他們不能輕易改變的編程基礎設施:編程語言和開發環境;如果我需要一些語言的擴展,我只能等待語言的設計者去更新它;如果我需要我的IDE有一些額外的強大功能,我只能等待供應商來添加新特性;就是這些依賴限制了我完全的自由;當然,我可以寫我自己的編譯器和IDE,實際上,這也是我啟動了IntelliJ IDEA的原因,因為我厭倦了依賴現有的弱弱的
Java IDE;但是,這會花費大量的時間和努力,并且顯而易見,對大部分程序員來說是不可行的;理論上的自由和實際的自由之間存在巨大的差異;下文中當我談到自由時,我指的是實際的自由
獲得自由的途徑是減少我們的依賴層次;例如,Java的一個主要目標是減少對操作系統的依賴,給開發者在不同操作系統上部署的自由;因此,為了在語言和環境之上獲得自由,我們需要減少對它們的依賴
為什么這是一個問題呢?任何general-purpose的語言,像Java和C++,給了我們用計算機做任何事情的能力;這是事實,至少理論上是這樣,但是,general-purpose的語言趨向于如同后面我將講到的般生產效率低下;作為一種替代,我們可以使用domain-specific languages(DSLs,aka ‘little languages’),它們被精心設計成在特定問題域具有高度生產率,比如用
SQL編寫
數據庫查詢;DSLs的強大之處,領域相關,也正是它們的弱處,因為任何真實世界中的程序都會包括許多不同的領域
general-purpose 和 domainspecific 之間,并不是對立的;我需要所有的自由,我希望能夠做任何事情,同時有很高的生產效率;目前為止還沒有什么好方法能夠做到這點;理想情況下,我能夠為程序的各個特定部分使用不同的語言,而它們能夠融洽的一起工作,并且開發環境會完全支持這些語言,包括重構,代碼補全,導航,以及主流語言具有的所有其它生產力工具
為了獲得這種獨立性,我需要有創建、重用、修改語言和環境的自由;為了使這種自由是可行的,它需要很容易的被獲得;如果我們解決了易于進行語言和環境的開發的問題,對程序員來說將是一個巨大的進步;這就是Language Oriented Programming的切入點
要理解Language Oriented Programming是什么,讓我們首先看一下今天的主流編程方法,它基本上是這樣:
思考: 你需要編程解決一個問題,因此你在你的頭腦里形成了如何解決這個問題的概念模型
選擇: 你選擇了某種general-purpose的語言來編寫
解決方案 編程: 你通過將你的概念模型艱難的映射到編程語言來編寫解決方案
編程這一步是瓶頸所在,因為大部分情況映射不是容易的和自然的;這種方法在程序員表達復雜的設計方面已經被證明是低效的;相對的,下面是LOP的工作方式:
思考: 你需要編程解決一個問題,因此你在你的頭腦里形成了如何解決這個問題的概念模型
選擇: 你選擇了某些特定的DSLs來編寫解決方案
創建: 如果沒有合適的DSL適合你的問題,你便創建一種DSL來適應你的問題
編程: 你通過將你的概念模型相對直接的映射到DSLs來編寫解決方案
現在,編程這一步is much less of a 瓶頸了,因為DSLs大大簡化了如何將問題翻譯成某種計算機能夠理解的東西;看起來困難已經簡單的轉移到了“創建”這一步,然而,通過聯合使用工具支持和將LOP應用到自身,將使這一步更加簡單
LOP 背后的動機基本是這樣的:我想用我正試圖解決的問題相關的概念和意圖的詞匯來工作,而不是被迫將我的思想翻譯成某種general-purpose的語言所能理解的概念(比如:類,方法,循環,條件,等等...);為了達到這個目標,我需要使用domain-specific languages;怎樣得到它們呢?創建它們;
我已經開始開發一個通用的平臺(the Meta Programming System)來設計domainspecific languages,帶有工具支持和開發環境;它將允許程序員像現在編寫程序一樣容易的來定義語言;這個平臺將完全支持LOP,給程序員為程序的每一部分選擇使用最合適的語言的自由,而不是將他們綁在某種固定的general-purpose的編程語言上
MPS 只是Language Oriented Programming的一個示例,盡管我在這里使用MPS來做示例,而實際上LOP可以用許多不同的方法來實現,你自己就可能知道一些替代方法;LOP 的概念不等同于它的實現,就像OOP的概念不等同于Java或C++或Smalltalk一樣
What Is Wrong with Mainstream Programming
你知道這則古老的諺語:"If it ain’t broke, don’t fix it". 主流編程方法很明顯不完整,我見過它帶來的很多問題,而大部分滋生于這樣一個事實:general-purpose的語言沒有一種方法來完全支持任意的領域,同樣也沒有一種統一的domain-specific language;下面是將被LOP解決的主流編程中三個最糟糕的問題:
Time Delay to Implement Ideas
對我來說,最嚴重的問題是,在我確切的知道如何解決一個問題,和我通過一個程序成功的向計算機傳達解決方案之間,有一個很長的時間差;我可以用幾個小時的時間向另外的程序員解釋問題和解決方案,而將解決方案編碼到計算機中將花費長的多的時間;這是因為對另外的程序員,我可以使用表達能力非常豐富的自然語言,而對計算機,我只能使用某種表達能力差很多的general-purpose的編程語言;今天的編程語言只能表達幾十種概念,而自然語言能夠簡潔的表達千萬種概念;因此,向另外的程序員解釋問題,我可以表達很高層的思想,而對計算機,我必須表達每一步的每一個細節
在主流編程中,大部分花在“編程”上的時間,實際上是在尋找用編程層次的抽象的術語來表達自然語言的概念的方法,而這是很困難的,沒多少創造性的,或多或少是一種時間的浪費
舉個例子,今天大量的開發時間花費在
面向對象的設計(OOD)上,在程序員表達類、繼承、關聯等方面這確實是一種還算有創造性的過程;這項實踐的目的是用面向對象的術語,如類和方法,來表達程序;OOD的過程是必要的,因為諸如類和方法等是面向對象語言能夠理解的僅有的抽象,它看起來是必要和有創造性的,但是使用Language Oriented Programming,OOD根本就不需要
Understanding and Maintaining Existing Code
下一個問題是理解和維護現存代碼;不管它是另一個程序員寫的還是我寫的,問題都一樣;因為general-purpose的語言需要我把高層的領域概念翻譯為低層的編程語言特性,在最終的程序中,很多高度概括的視角、藍圖都丟失了;當我在以后重新翻閱程序時,我不得不通過逆向工程來了解我最初的意圖是什么,我頭腦中的模型是什么;至少,我必須在腦海中重新建造最初在翻譯到general-purpose的編程語言的過程中丟失的信息
原文轉自:http://www.kjueaiud.com