您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何分析terracling中前端metalangsys后端uniform backend免編程binding生成式語言系統設想,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
js一門可用于web棧全棧開發的語言甚至進化到H5和mobile,desktop native,通常被稱為某種一體化web,mobile,native語言的代表,而且它用函數模擬過程式和OO的方式也是某種“語法”一體化的表現,這此都是語言內部層次的極大化。
而后來我們跳出了單語言單生態的考慮著眼于一些綜合語言系統,又有了新的發現,比如在《發布qtcling》時我們提到cling和rootsys,它是llvm based,整合了cpp,c scripting且免binding的一支,是真正實現全C系中一體化的,,在《發布monosys》中我們提到過java,net等統一后端語言,顧名思議它帶有一體化語言后端的特征,還有一些利用translator compiler而非獨立編譯器實現的統一后端往往是針對具體語言的,,像vala這種,還有綜合類型像zephir,rust這些,動靜態結合帶let等,他們都帶有超越它們固有領域的極大化整合和改造傾向。
可是細細分析就會發現任何語言體系的極大化(通用化)其實正是它們企圖在其內包含各種DSL的過程,在bcxszy part2中提到,發明各種DSL是軟件模式之一,自古以來,DSL就是如上提出各種語言內機制或各種腳本語言、新語言/語言體系來完成的,即它們都是DSL技術的子集。
且它們統統都有局限。
比如,CPP是語言內的范型整合,且面向C系單生態的。而QT面向CPP也未免太單生態,其利用pme和type reflection擴展類型系統也隱喻著對它其它的擴展是secondary的事情。而js雖然在語法和問題域都有不俗的整合度,然而它終究是構筑于ECMA單標準和單語言實現上的,qtcling非免沒有包括非C系,而直接rootsys也是單生態的,它binding庫組成新cling語言體系的能力是巨大的,因為它是先庫后binding出來的pyroot等,llvm也有免后端特點,然而cling/rootsys前端只有clang系,monosys它不是免虛擬機的,C#只能統一后端不能有真正的免binding前端生成器。C#有語言內編譯服務然而缺少真正的語言內支持本語言開發生成器的特點。轉換器往往固定而混合動靜態類型語言往往擴展不到其它前端和后端的組合。
總之,他們共同的特征:離一門更合理的語言構造和使用方法的跨度始終跨越太大,或缺陷太明顯了,這種“更合理,更整合”的設想就是接下來我希望得到的,我希望有一種 : 不致于破壞現有事實語言多生態的既有事實,又能巧妙地整合這些,還要能以傳統發明語言的方式(而普通的像語言內提供類型修飾的機制終究有點捉襟見肘,比如py飾符)能在這個原始層次加以擴展的接口,且能在本語言內完成,形成一對多的,最好一主多宿(相對于主,宿可以動態拔插以擴展)的解決方案。
而以上所有這些語言,這些所有的特點,不能按常規方法,支持真正的元編程和代碼自動生成。那么,用現有的方案改造/整合行不行?如果單語言的缺陷總是那么明顯,那么或許至少二門語言組成的混合語言是另外一種出路(當然它也要以合理的方式支持盡可能多的擴展支持我上面講到的合理,最小免修正整合)。
歸納一下:一種更為頗為科學的設想要求 --- 我們需要一種真正納入到支持用戶DSL創造的一體化語言體系。。最科學的,我們要保留現有的各種不同運行時,再促成一個真正的可用的統一后端,如colinux as xaas的東西,這里是onelang as langsys。
它至少要是某種統一后端或前端的東西,用戶可以以優雅自然的方式來產生新語言,新語言作為這個新語言體系的可拔插部件, 真正允許用戶用這二門元語言(as host)整合自己需要的語言作為guest language as language comopent or lib plugin
比如我們的目標至少要是:能用這種語言開發任意zend php等的邏輯,使得一種語言,任意既有無修改后端。能粘起來工作,比如我可使用cling寫php的wp程序。
目前最大的整合方案如monosys和llvm based langsys like cling/rootsys是最接近我想法的東西,然而它們往往足夠強大沒有太多圍繞它們的項目,最后我找到了terra:
可以說,在terra下,llvm回歸了底層虛擬機的原來意味。它是這些語言的統一后端。
它的3個類比物:用function發明DSL,類js用function創造OO體系,用codegen生成代碼,類CPP的模板。vala等等
在我強化過后的terra設想中,利用cling作統一metalang替換lua,負責生成各種具體前端語言。可以使得,lua是host,terra是guest,guest可以擴展的方式meta programming變身多種語言或某語言的復合體。,存在一主一guest二門體系,主可用來metaprogramming,客用來兼容后端,就如colinux一樣。下面詳述:
terra:a multiple stage langsys that can micic js,cpp,etc..
terra的基本描述:
Terra is a low-level system programming language that is embedded in and meta-programmed by the Lua programming language: We use LLVM to compile Terra code since it can JIT-compile its intermediate representation directly to machine code. To implement backwards compatibility with C, we use Clang,a C front-end that is part of LLVM. Clang is used to compile the C code into LLVM and generate Terra function wrappers that will invoke the C code when called.
最基本的考究,就是lua作為轉換器前端,將代碼轉成terra表示,然后運行terra,因為terra是llvm based的,而轉換器是lua based的,所以前后端一個主轉換一個主運行,兼有寫法上的高效和運行時的效率,
理解路徑1):a dynamic language for controlling the LLVM
整個langys,它利用動態語言的頭,本地語言的尾,組成一個混合前后端(初看它比較像c preprocesser+vala translator這樣的東西),其實像llvm這種帶了jit又帶了中間碼,又帶了native code gen的東西,可以做到混合前后端部件,這樣可以免VM且達到本地碼的效率,借且llvm,達到與cling與C模塊abi linking的效果(Terra code is JIT compiled to machine code when the function is first called)。terra其實是另外一種cling+clang
理解路徑2):a dynamic language for controlling the LLVM -> using a dynamic language to control code generation of static one
multiple stage programming,它是metaprogramming中code generate中的技術。它在一些數值編程領域非常流行。其本質:
Multi-stage programming (MSP) is a variety of metaprogramming in which compilation is divided into a series of intermediate phases, allowing typesafe run-time code generation.Statically defined types are used to verify that dynamically constructed types are valid and do not violate the type system.
A multi-stage program is one that involves the generation, compilation, and execution of code, all inside the same process
The staged programming of Terra from Lua,,,注意是從terra到lua的staging,這二者的相互欠入性來說,分清二種語言,terra core和full terra langsys,一份具體的用該語言寫的代碼是terra-lua代碼。
因為事實上lua跟C是完全不同的二種語言,它們的interportable終究只是他們的外在屬性,內在它們是不可交流的,那么這二者是如何聯接起來的呢?技術本質和過程到底如何?這二門語言有共同詞法作用域所以就保證了這二門語言無縫交互性(interpreter),極力使得他們像一門語言(中的變量作用域處理部分),除此之外,其它二門語言不同的部分,依然是原本二門獨立語言該有的(c/terra和lua有著極廣泛的互融合性interopable)。基本上平時你用lua編程(lua),涉及到control terra to codegen的那部分用c(terra)/lua
理解路徑3):a dynamic language for controlling the LLVM -> using a dynamic language to control code generation of static one -> a low-level system programming language embedded in and meta-programmed by Lua
統一后的terra langsys其實本質只是:它們在metaprogramming這個層次上是結合且統一的。
an important application for MSP is the implementation of domain-specific languages,languages can be implemented in a variety of ways,for examples,a language can be implemented by an interpreter or by a compiler.
we think that having DSLs share the same lexical environment during compilation will open up more opportunities for interoperability between different languages
那么,terra是如何利用lua+c作為元,來生成其它任意中高級語言支持的呢?這是因為lua的數據結構恰好支持重造一門語言所需的那些metaprogramming特性,比如一級類型有function支持,有table支持AST表示,等等,在前面說到js是一種直接可在AST上寫程序的語言。
最好的舉例是先說js再說CPP
js:
在以前介紹js的時候,我們就談過functional language就是AST語言,因為它可以直接在語法樹上寫程序,現在terra,進一步把它清希化了,結合type reflection這一切做到了極限。它可以用函數推導產生各種過程式和OO,從lua模擬C/cpp
cpp:
其實,它也是某種預處理器的極大化,如針對CPP的。完全可以用lua本身來模擬生成更好更統一的預處理,它很像用C寫編譯器時,這個C是動態的而已。用本語言在本語言的一個實現內寫擴展,且加載為庫。當然在terra中是lua代碼。
還比如,用來實現類CPP的類型系統。
Objectoriented frameworks usually offer a type introspection or reflection capability to discover information about types at run-time. Metaphor allows this reflection system to be incorporated into the language’s staging constructs, thus allowing the generation of code based on the structure of types – a common application for code generation in these environments.
這也是為什么僅需c+lua,而不是需要是c/cpp+lua,因為CPP整個都可以是被擴展出來的。這比直接在llvm上構筑clang++好,因為我們可以用c+lua的terra來打造架構更科學的terra版cpp
那么能不能將terra改造成cling based 呢?即用cling+c替換lua+terra,因為C是支持函數指針為一級類型的。這樣做的好處是:直接用C系作metalang控制語言,生成擴展的cpp,py,php等等。
加了metaprogramming特性的cling+llvm,它的前后端都可以免額外編程工作自動生成。比如語言前端的parse等可以binding c dll生成,再對接到后端,庫也可以C模塊方式集進來,可以直接用zend php或是llvm上的php實現如roadsend php等等
意義:
cling作為腳本語言對生成C代碼自動化生成過程非常好,且擴展出來的CPP同屬C系,因此metaprogramming可以分散 CPP式將所有范式集中一門語言的特點(比如把c++ template弄成簡單的一種語言特性Terra’s type reflection allows the creation of class-systems as libraries.),這樣可以避免QT將PME支持聚集到另外一個QTcpp中去。也可以將CPP預處理以更科學的架構導入,而且可以通過編程和程序內的方法引入,而不是預作為庫服務如reflection,也不是作為基礎件如編譯前端等,而不是像CPP一樣雜合到一門復合語言內。
可以直接binding已有程序語言實現,無論是llvm based或llvm non based都可以,只要以c dll存在即可。
還有,其實lua與openresty,gbc這些我前面提出的東西結合緊。整個lua+c揭示了幾乎二門必學語言的事實,terra像極了linux的架構,可以類linux一樣產生各種封裝的變體/新語言系統。且易定制/易自然定制。
關于如何分析terracling中前端metalangsys后端uniform backend免編程binding生成式語言系統設想就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。