自編譯語言的功能及其編譯程式是可以像滾雪球一樣,一級一級她擴充。它可以對編譯程式作修改並且描述其他語言的編譯程式。它的編譯程式在一台機器上建立以後,就有可能產生其他計算機上的各種語言的編譯程式,從而縮短了編譯程式的研製過程。它對於促進計算機的推廣套用,其作用是顯著的。
基本介紹
- 中文名:自編譯語言
- 外文名:self-compiling language
- 定義:編譯程式可直接用這種語言寫
- 作用:促進計算機的推廣套用
- 系統:計算機
- 套用學科:計算機原理
技術簡介,自展,移植,自動生成,
技術簡介
在早期,人們是使用機器語言或彙編語言並用手工方式來編寫編譯程式的。採用這兩種語言來編寫編譯程式的主要缺點是生產效率低,從編寫到調試出一個中等複雜的程式語言(如ALGOL、FORTRAN)的編譯程式,一般需要幾個到十幾個人年,並且編寫出來的程式不便於閱讀、修改和移植。用彙編語言手工編寫編譯程式的主要優點是:能夠根據具體機器做針對性較強的處理,可以發揮具體計算機的系統功能;可以滿足各種具體要求;編程可精雕細刻,所生成的程式效率高。但是隨著計算機技術的發展,軟體的生產率、可靠性、可移植性及可維護性等已成為當前軟體生產和發展的主要矛盾,因此,越來越多的人使用高級語言來構造編譯程式。這樣做除了可以節省大量的程式設計時間外(實踐表明,與手編程式相比,一般可節省四分之三的時間),而且所構造出來的程式易於閱讀和修改,還可以用自展方式(自編譯方式)來生成編譯程式和進行編譯程式的移植。所有這些都在一定程度上滿足了軟體工程化方面的要求。所以,已發展了多種適用於進行系統程式設計的高級語言,其中較著名的有Pascal、MODULA一2、C、Ada、C++和Java語言等。
用高級語言來書寫編譯程式是建立在高級語言的自編譯性的基礎之上的。
高級語言的自編譯性是指,如果一個高級語言能用來書寫它自己的編譯程式,則該語言稱為自編譯語言。上述語言都是自編譯語言。一般說來,自編譯語言不但可以用來書寫其自身的編譯程式,而且也能用來書寫其他語言的編譯程式。所以,如果某台計算機上已配備有某種自編譯語言(具備該語言的編譯系統),就可以利用這種語言為本台機器配置其他高級語言(用該語言編寫並生成其他高級語言的編譯系統)。
自展
設有自編譯語言L,可以通過自展的方法為機器A生成該語言的編譯程式L.Ao。首先,將語言L劃分為核心部分和擴充部分,其核心部分為L1,其擴充部分分別為L2、L3、…、Ln,即
L=L1+L2+L3+…+Ln
先用A機的機器語言或彙編語言編寫核心語言L1的編譯程式L1.Ao,然後用語言L1編寫語言(L1+L2)的編譯程式(L1+L2).L1。由於(L1+L2)語言僅是在核心語言L1的基礎上稍加擴充,所以,其編譯程式一般能夠用核心語言編寫出來。利用語言的自編譯性,語言(L1+L2)的編譯程式(L1+L2).L1經L1.Ao編譯以後,則可生成(L1+L2).Ao。然後用語言(L1+L2)編寫語言(L1+L2+L3)的編譯程式(L1+L2+L3).(L1+L2),該編譯程式經(L1+L2).Ao編譯以後,生成語言(L1+L2+L3)的編譯程式(L1+L2+L3).Ao,……,如此重複下去,其過程就像滾雪球一樣直到生成整個語言L的編譯程式L.Ao為止。
由於開始通過低級語言建立的編譯程式可做得比較小而簡單,因而可以在較少的人力和時間的情況下建立起來,以後都是用高級語言本身來編寫較大語言的編譯程式。由於有用高級語言進行程式設計的優點,所以這樣做的結果是比用低級語言直接一次生成一個完整的編譯程式要快,而且在程式的可靠性方面也更能得到保證。![自編譯語言 自編譯語言](/img/3/a6f/QMwQTY0MTOyEmM0QGZyYmMllDZ4cDZwgTOmlDZmBTM1MGNhFDOmFWZvMWaw9SbvNmLz9mYlNmYu4GZj5yZtl2ai9yL6MHc0RHa.jpg)
![自編譯語言 自編譯語言](/img/3/a6f/QMwQTY0MTOyEmM0QGZyYmMllDZ4cDZwgTOmlDZmBTM1MGNhFDOmFWZvMWaw9SbvNmLz9mYlNmYu4GZj5yZtl2ai9yL6MHc0RHa.jpg)
移植
有的編譯程式可以通過移植得到。所謂移植就是將某台機器(稱宿主機)上現成的軟體移植到另一台機器(稱目標機)上。
如果使用高級語言來編寫編譯程式,並且這個語言具有自編譯功能,則移植將是比較方便的。
例如,設宿主機A上具有高級語言L(該語言具有自編譯功能)所寫的L語言的編譯程式L.L,以及用該機的機器語言表示的L語言的編譯程式L.Ao,則就有可能將宿主機A上的語言L的編譯程式移植到目標機B上。
任何一個編譯程式從邏輯上都可分成兩部分:一部分所做的工作與具體機器無關,用F.L表示(稱為編譯程式的前端);另一部分(主要是生成目標代碼部分,即編譯程式的後端)則是與具體機器有關的,對A機用A.L表示。即有:
L.L=F.L+A.L
將宿主機A上的語言L的編譯程式移植到目標機B上的做法是:首先用L語言把A.L改寫為B.L,使之產生目標機B上的目標代碼,這樣可得到用A機L語言所寫的可生成B機的目標代碼的語言L的編譯程式I.L(即交叉編譯程式),
I.L=F.L+B.L
I.L在A機上經過L.Ao編譯得到一個I.Ao,它是能在宿主機A上運行的L的編譯程式,但是其代碼生成部分是生成目標機B上的目標代碼。因此,再把I.L由I.Ao進行一次編譯,就得到可在目標機B上運行的生成目標機目標代碼的語言L的編譯程式L.Bo。
![自編譯語言 自編譯語言](/img/d/569/AMmFWY5AjZiZWMyYmN0ADMjBjN5YTYllzMmNGMlBjM3IjM4kjM1ETOvMWaw9SbvNmLz9mYlNmYu4GZj5yZtl2ai9yL6MHc0RHa.jpg)
自動生成
編譯程式是一個相當複雜的系統軟體,一般有數萬條指令,為了縮短研製時間,保證代碼編制的正確性,人們希望儘可能地把工作交給計算機去完成,從而提出了“編譯自動化”的課題。由於高級語言具有自編譯性,即可以用這個語言來編寫自己的編譯程式,同時一個具有自編譯性的高級語言也可用於編寫其他高級語言的編譯程式。這樣使得人們可以通過使用高級語言實現編譯程式各遍的算法的方法,來解決“編譯自動化”的問題。這種方法有利於減少錯誤並加快研發的速度。
在編譯程式自動化進程中,開發較早且套用廣泛的是詞法分析程式生成器和語法分析程式生成器。
YACC(Yet Another Compiler Compiler)一種基於LALR(1)文法的語法分析程式生成器。它接受LALR(1)文法,生成一個相應的LALR(1)分析表以及一個LALR(1)分析器,而且,YACC生成的語法分析器可以和掃描器連線。
LEX和YACC是關於編譯程式前端的生成器,而關於編譯程式後端(目標代碼生成、目的代碼最佳化)的生成器仍不多見。
理想化的編譯程式生成器以源語言的規格說明、語義描述和目標機的規格說明作為輸入,而輸出的則是編譯程式。但編譯程式生成器還僅僅只是某部分編譯程式的生成器,如詞法分析程式生成器、語法分析程式生成器或代碼生成程式生成器。![自編譯語言 自編譯語言](/img/0/74a/gMwgzYjJjN1MDZyYWOkhjNiFjYjZGMjJDOwIDMidTYwUTOkFjNwYmNvMWaw9SbvNmLz9mYlNmYu4GZj5yZtl2ai9yL6MHc0RHa.jpg)
![自編譯語言 自編譯語言](/img/0/74a/gMwgzYjJjN1MDZyYWOkhjNiFjYjZGMjJDOwIDMidTYwUTOkFjNwYmNvMWaw9SbvNmLz9mYlNmYu4GZj5yZtl2ai9yL6MHc0RHa.jpg)