Commonhistoryforlangsys
语言选型通史:快速整合产生的断层
关键字:兼容后端多语言体系,免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效果。
(此处不设回复,扫码到微信参与留言,或直接点击到原文)
minlearn.org,tg: minlearn_1keydd,本人长期接有偿付费dd。不会D的,和要定制镜像的都可以t我