關鍵字:相容後端多語言體系,免binding一體化後端,llvm cling:全棧全範式語言系統
在程式設計語言選型上,初學者往往希望選到一門最熱門最簡單最全面最省事的語言。更并且,他們經常寄希望找到的學習項目恰好就是這門語言的,這樣他們可以堅守一門語言積累起自己的一套codebase,供學習也是以後工作上的開發而不用變動。—— 可是往往事與願違,于稍微進階一點的需求領域及現在web,mobile,native開發現狀和日益分裂的語言生态現狀,,這樣的“方案+學習項目”的組合,往往很難存在。于更全面的領域,這更是不可求得。
是以,人們很自然地會從C系轉到C++(或許會發現CPP有點複雜沒有動态消息轉QT式CPP),再轉到動态腳本如PY(發現編譯語言太複雜轉動态腳本),或py到C#,java(被宣稱是通用語言),最後又轉到js這種看似全棧的“大一統語言”,到最後,發展到發現每一種語言都其實需要學的境界 ——- 這絕不僅是語言各各内部文法的差別,更是語言間所處階層産生斷層導緻的。是業界不斷變動的開發方向帶來的自然結果:不斷提出的新項目/新語言/新開發體系都希望自治,以緻學習上的生态碎片化過大,交集衆多。
本文接下來的部分會展示出這些需求的出現的斷層變化部分和語言選型的殊途同歸大方向。
1,從孤立語言體系到統一後端免binding語言體系:學習曲線的斷層
大部分科班或自學的人都是從C系開始的,這個時候他們往往關注語言的寫法,學習的成本主要是文法即語言的前端應用部分。這個時候僅是一些結構文法,問題部分,就是資料結構這些簡單的封裝/實作手段,然後開發更複雜本地應用的時候,他們遇到了學習CPP和OO的情景,所幸,CPP和C共享很多文法和庫,且後端相容。換言之:C,CPP畢竟是同生态的語言。
情況開始變得很糟:雖然OO這些語言内手法是被标準化了,但他們開始需要學習一些非C的語言。比如新出現的web開發需求之于python,雖然python解決web問題良好,但當一旦涉及到C系/py互動時,需要做複雜的binding. —— 這隻能求助swig這樣的工具或boost.python這樣的庫,不再享有C系内部CPP對C,或C對CPP的調用方式。總結:這是後端帶來的斷層。而前端的差别實際上可以忍受(實際上強調多語言風格的開發反而正是好事):多語言結合開發才是主流。
後端帶來了巨大的斷層,使得維護一套共享 srclvl codebase的多語言項目成為不能實作的事情(無縫開發部署),這根本是因為新語言(他們往往是一些腳本語言)有自己的後端,不再屬于C系,除了文法前端上巨大的與C的不同的那些差别,後端帶來的巨大學習/開發溝壑開始變得尤其巨大。而且開始出現偏增強後端化的特點:VM式語言正是軟體後端,而動态文法是受這種後端支援下的新文法。比如後端與前端不再離線,在腳本上可以調用内省這樣的語言服務。— 這本質是內建而已。
情況開始變得稍微好了一點:從Cpython這樣的孤立後端,再後來他們發現了java,.net這種統一後端的語言和強大的統一類庫如j2se,j2ee,.netfx sdk。比如它甚至可以統一編譯式/動态式文法前端。如.net的DLR。這種統一後端畢竟無非就是VM式後端的極大化,這裡導緻的主要變化是:在統一後端語言下可發展多種語言前端。多語言在統一後端内可免binding互相調用,多個不同語言組成的demos或學習項目可以在統一後端下形成一套codebase。但與C系互相調用情況并沒有變化多少,是僞統一後端,因為它沒有從C系整合。沒有考慮進C系後端和沒有從C系要解決的那些native開發問題開始整合,在那裡看依舊是斷層的。
無論如何,在特定統一後端下,多語言開發成為主流,這可以分散CPP所謂的單語言多典範帶來的壓力。學習成本轉移到了後端。
其實,面對多種語言選型,人們大部分缺少和需要的僅是一種免binding的一體化後端方案。因為他們找到一些開源的學習品往往由多語言開發,需要做binding,這時出現一種免binding的方案可以迅速為他們積累起一套codebase. 一種相容後端,多種開發前端。并将他們做成一個體系。—– 這對學習上統一一套學習重點也是有幫助的,即:後端類型技術和庫才是他們要關注的程式設計學習重點。這樣可以結合程式設計教育不緻于太突出文法:可以任意選一門他們喜歡的更簡單的語言。
情況開始變得更好了一點:還提出了js這種“全棧”語言。這可以視作是從問題域整合BS/CS開發架構的一種努力。
然而這二種方向都沒有以解決最根本的問題為前提,即:也沒有統一起所有問題,是斷層的。遺留的問題依然巨大:js面對的問題依然不能統一起native開發的那些問題—隻要它是虛拟機後端實作的,且一門語言無clr,jvm這樣的大規範,根本上不能代表任何稍微大一點的完整生态。
2,更輕更好更全的整合方案:maybe llvm based clang/cling?
llvm可以發展包括c系,cpp在内的語言,其本身類.net cls的特點,使得任何現有語言前端可以将後端築在llvm上,并為之生成ir碼。可以說是類.net,jvm的不二代表。如果基于llvm的多語言成為現實,再加上一個統一API大類庫,可以完全實作類.net的寵大體系。
第二,clang/cling,cern的cling可以完全達成像js那樣的全問題棧用一種語言來開發的效果,且能達成保持C系文法和C系後端都不用改變的平滑程式設計學習曲線。root sdk内置sginal/slot可模拟qt動态OO效果。
(此處不設回複,掃碼到微信參與留言,或直接點選到原文)
