<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      解釋Intentional Programming

      ——三種視角的視圖

      作者:taowenmo2mo@163.com

      摘要

      本文的目的是用盡可能簡明的語言記錄下筆者對于Intentional Programming的初級認識,以把這激動人心的技術傳播給更多人。但是限于理論發展的現狀,資料的完備情況,以及最重要的,筆者的認知程度,并不能保證文中所記內容的準確性。

      概覽

      Intentional Programming是對傳統編程語言的一種顛覆,因而是對編譯原理,程序語言設計理論的一種顛覆,是管理復雜度技術的一種遠景技術,對程序員乃至普通個人的編程體驗的一種全新模式。

      這就是我能給出的無內容概要。循此概要而去,我將從這三個角度來記錄一些理解:

      1、  編譯原理和程序語言設計理論

      2、  管理復雜度的實踐技術

      3、  編程體驗

      意圖編程的理論實質

      意圖編程對于傳統的編譯原理和程序語言的設計理論是一種顛覆。

       

      從編譯原理來說:

      首先要聲明的是,筆者是一個數學系的學生,并沒有正統地學習過編譯原理,所以對于具體地細節極可能似是而非,或者干脆是謬誤。

      傳統的編譯過程是這樣的:


      而意圖編程是這樣的


      從圖中可以看到,
      GUI的交互代替了文法解析。而我用藍色標注意圖編程的“代碼生成”的目的是把它與上面的代碼生成區別開來,因為兩者的實現手段是完全不同的。因為在解析和代碼生成兩個階段的巨大差異,所以我說意圖編程對于傳統的編譯理論是一種顛覆。

      具體來看一個例子就能說明兩種過程之間的區別了,先來看傳統的語言:

      int x;

      x = 1;

       

      從程序語言設計理論來說:

      傳統的編程語言大致可以分為:面向過程,面向對象,泛函式,邏輯式等。各自的代表有Fortran,SimulaLisp,Prolog。但是這幾種編程范型彼此之間為什么不同呢?我想大致因為它們彼此之間擁有不相交的語言特征。

      從語法的層面來看語言的特征,列舉一二:

      1、  C

      int x = 1;

      以及

      int myproc(int x, int y) {

              return x + y;

      }

      變量和過程代表了其最明顯的語言特征

      2、  Java

      class myClass extends baseClass implements someInterface {

              private int x;

              public void setX(int x) {

                     this.x = x;

              }

      }

      以及

      myClass o = new myClass()

      類和對象代表了其最明顯的語言特征

      3、  Scheme

      (define (max x y) (if (> x y) x y) )

      以及

      (max 2 3)

      表結構代表了其最明顯的語言特征

      4、  Prolog

      Seq(Env, num(Val), Val).

      Factterm,rule等代表了其最明顯的語言特征

      從語法層次來看,這些語言特征的體現在AST(抽象語法樹)的一些節點上。不同語言對于這些節點的語義解釋構成了其獨特的語言特征。


      本質上說,語言的特性,就是給
      AST的節點賦上的語義,而這種語義體現又完全體現在代碼生成之中。

      在意圖編程中,這個過程是:


      這里所說的意圖庫具體是什么在下面描述,這里所提供的語義是抽象意義上的,具體的實際表現就是意圖庫完全操控了從抽象語法樹到目標代碼的代碼生成過程,在這個代碼生成過程中體現了其語義,從而體現了一定的語言特征。

      如此定義語義,定義語言特征,如此根據語言特征劃分程序語言,可以得出一個意圖編程包含面向過程∪面向對象∪泛函∪邏輯∪……的結論。

       

      綜述了兩個方面的突破之后,留下了一大堆的問號:通過GUI來操作AST,怎么弄?意圖庫是什么?意圖是什么?它怎么控制代碼生成的?更重要的,這些“突破”帶來了什么樣的直接價值?下面就具體回答一下這幾個問題:

       

      1、  怎么通過GUI來操作AST?

      在這個問題上,有一個實際可用的實現。這個實現是易語言的集成開發環境,它就是通過GUI來操作AST,實現了無語法無文本源代碼無解析的編程。

      這是一段C的代碼

      void someproc(int x) {

             if (x==0) {

                    //do something

      }

      }

      這是同樣功能的易代碼在GUI上的呈現


      這段代碼的輸入過程是這樣的:

      Ctrl+N


      修改子程序名


      修改返回值類型


      添加函數參數——在
      someproc上按回車


      和前面一樣的方法,修改參數名和類型

      然后添加一條語句


      按回車之后,易語言的
      IDE就能自動把輸入轉化為最前面的那個形式。至于添加注釋就屬于細枝末節了。

      而兩者對應的AST,可能是一樣的:


      這里的
      GUI表現,讓人的印象并不深刻。而且,我也不能說這里用GUI來表示和輸入代碼了,就完全沒有語法了。因為數學表達式還是存在的。所以在局部還是需要語法解析的,不過這只是一種實現策略,如果比較極端一些,通過GUI的代碼輸入可以完全和文法無關。

      無論易語言的IDEGUI如何,至少通過這么一個實際例子證明了,AST的生成不是華山一條路。通過對具有文法結構的源代碼文本進行解析(parse)是一條路,直接用GUI的方式讓程序員操作,也是一條路。

       

      2、  什么是意圖?

      意圖是意圖編程的核心,所以要一次性的給意圖下一個定義,將會是一個非常費解而復雜的定義,所以我將從實例來引出意圖的一些側面,讓你在多個方面有了一些印象之后,自然就明白了什么是意圖編程中的意圖了。

      從這么一棵AST開始吧:


      這是對應的代碼:

      int x;

      x=3;

      while(x<5) {

      }

      在傳統的編譯過程中,編譯器的代碼生成部分會對這顆語法樹進行解釋。解釋的實際行為就是把這顆代碼樹轉換為目標代碼。在這種轉換的過程中,體現出了這顆樹的程序語義。在編譯器內部可能就有這么一個switch語句

      switch(node) {

      case “while”:…

      case “if” ..

      case …

      } (僅僅表意)

      編譯器對于AST的節點可能有哪幾種,每一種具體的節點類型的語義有著非常清楚的認識。而在意圖編程中,就不是這樣了。AST變成了這樣的一種形式,AST就不再是AST了,應該叫IPTIntentional Programming Tree)了。


      這里我們可以看到,我們寫的語句成了意圖的實例,而這實例又鏈接到了庫中的意圖。在代碼生成的時候,
      IP系統會詢問每個Intention,怎么來處理這顆用戶寫的樹。Intention能夠對這樣的問題做答,并且知道IP系統對樹進行轉換(transform)。把樹轉換成只具有原語的形式??梢赃@么來理解原語,匯編中的指令,或者HTML中的標簽。

      這種轉換是從樹到樹的轉換,可以把Intention的轉換類比于XSL,而源代碼的樹就是XML。但是在具體的轉換過程中(IP把這種轉換稱為reduce),有很多的規則和限制,這是一個非常復雜的過程。能夠找到的文獻中,對于這種形式的代碼生成,也是著墨不多,筆者也沒有足夠的計算機和數學方面的能力,能夠給出一個完整的生成過程的理論來。

      這樣一來,代碼生成的具體行為權利就從寫死的編譯器中下放到了庫中,只是這種庫是一種很特殊的庫,意圖庫。意圖不但要負責其實例的轉換,也就是代碼生成。而且要負責相關的調試支持,也就是從目標代碼到源代碼的對應,相當于代碼生成的反向工程。還有就是意圖實例的GUI顯示和輸入,以及代碼控制(版本合并等)等操作。

      總體的思想就是把以前編譯器中的抽象提出來,并統一于Intention之下。從而把以前編譯器的權利下放到庫中。達到的效果是語言特征的無限擴充。相應的難點是編譯器對于AST的內容一無所知,而具體的代碼生成過程將不容易。在具體的實施過程中就會發現前面提到的轉換過程并不是一件容易的事情。不但是指導生成不容易,就是知道GUI的呈現和編輯也不容易,試想操作系統的差異和IDE的差異,怎樣的一種機制能夠足夠靈活呢?還有目標代碼的機器模型的差異,等等。

      意圖編程對于管理復雜度實踐的意義

      意圖編程成為管理復雜度方面的先驅理念的理想載體。(no promise

      現今管理復雜度方面的各項技術似乎都有一個共識,那就是領域工程。而意圖編程就是實現DSL的理想載體。而且更重要的,IP提供了一種從現狀到極樂世界的漸進路線。從用現在技術表示的意圖,到用高層抽象的DSL表示的意圖之間的一種漸進轉換的可能。

       

      DSL的例子可以是:我吃飯。這樣的高層的抽象語言,可以通過IP表達出來,然后有具體的Intention庫進行實現。IP在實現DSL方面的意義是降低了從頭設計和實現推廣一種專有語言的負擔。我們不需要自己寫新的解析器了,不用管語言的完備性了,甚至不用花大把的銀子來推廣了,我們可以很容易的交付給最終用戶。

       

      漸進演化,其實原理很簡單。因為現有語言都是有AST的,我們只需要針對具體的語言提供不同的Intention,比如給C建一套意圖。然后AST就能轉換為IPT了。這樣用C寫的遺產代碼就進入了IP的體系了。然后我們可以通過添加新的高層意圖,部分重寫改進精化原來的代碼結構,逐漸把以前埋藏在實現細節中的意圖用直接的Intention凸現出來。這一點是非常誘人的。

      意圖編程在編程體驗方面的意義

      意圖編程帶來全新的編程體驗從而達到人人都能寫程序的理想世界。(no promise)

       

      因為是通過GUI來輸入和輸出代碼的,這樣代碼的就能有非常豐富的直觀表現,能夠讓代碼具有更好的親和力。比如說,能夠用中文來顯示代碼。比如說,能夠直接顯示出代碼的流程。

       

      又由于語言是無限擴充的,實現領域專有的語言和語義是可行的。這樣就有可能給矩陣計算實現一套DSL,并用GUI的豐富表現來表達。這樣一來,數學家就能在不了解下層實現的基礎上,通過和紙上運算類似的表現和記法進行算法意圖表達,直接表達為矩陣運算的DSL。然后再有具體的意圖庫做出具體的實現。

       

      試想如果有了各行各業的意圖庫,那么就能讓行業的專家來描述業務邏輯,讓計算機從業人員把行業的意圖表達為計算機的實現。而時下的編程體驗,阻礙了行業專家的直接意圖表達。而且,我們要看到,僅僅有GUI表現,面向AST編程是達不到上面所說的理想景象的。易語言的目標大抵類似,但是它僅僅實現了意圖的編程的前端部分,缺少了后端的最核心的意圖庫這樣的東西,易語言對于行業專家來說,仍然是天書,仍然是一門難語言。

      posted on 2004-10-02 03:35  taowen  閱讀(1406)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲中文字幕国产综合| 亚洲中文字幕国产精品| 亚洲狠狠狠一区二区三区| 国产成人精品久久一区二| 精品成人免费自拍视频| 中文字幕理伦午夜福利片| 国产精品高清视亚洲乱码| 亚洲精品tv久久久久久久| 成人3d动漫一区二区三区| 亚洲一区二区三区| 国产精品爱久久久久久久| 国内少妇偷人精品免费| 开心五月激情五月俺亚洲| 亚洲av片在线免费观看| 成人精品视频一区二区三区| 亚洲女人天堂成人av在线| 欧美福利在线| 国产男女猛烈无遮挡免费视频| 国产精品色内内在线观看| 亚洲国产精品久久久久婷婷图片| 亚洲精品tv久久久久久久久久| 国产精品区一区第一页| 久热在线中文字幕色999舞| 精品国产乱码久久久久app下载 | 丰满岳妇乱一区二区三区| 欧美一区二区三区成人久久片| 人妻蜜臀久久av不卡| 天门市| 成人网站国产在线视频内射视频| 精品国产中文字幕在线| 老湿机69福利区无码| 亚洲人成网站在线无码| 国产美女被遭强高潮免费一视频| 邹平县| 在线精品视频一区二区| 精品无码国产污污污免费| 激情偷乱人成视频在线观看| 国产成人A在线视频免费| 元氏县| 成年午夜免费韩国做受视频| 国产偷国产偷亚洲清高|