terracling:前端metalangsys后端uniform backend免编程binding生成式语言系统设想

简介: 本文关键字: 用terra打造更科学的js,cpp,用lua+c分离式模拟JS。terra真正的终身语言,terra最接近编译原理的元语言,cling based terra:前后端都可免编程binding生成的元语言体系

本文关键字: 用terra打造更科学的js,cpp,用lua+c分离式模拟JS。terra真正的终身语言,terra最接近编译原理的元语言,cling based terra:前后端都可免编程binding生成的元语言体系

在前面《语言终极选型》《实践终极选型》系列中我们谈过"one for all",即一体化,终身语言的概念,联系到在《编程新手真言》第一部分我们一直在寻找某种lddlang,,比如在整书第二部分我们谈到过最熟悉的CPP,它本身就是一门多范式语言。甚至针对于那些要求更具动态性的类型系统,qt也通过扩展库和工具moc的方式组成了一门qtcpp langsys的小语言。在《JS完全》中我们那里我们谈到过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饰符)能在这个原始层次加以扩展的接口,且能在本语言内完成,形成一对多的,最好一主多宿(相对于主,宿可以动态拔插以扩展)的解决方案。

而以上所有这些语言,这些所有的特点,不能按常规方法,支持真正的元编程和代码自动生成。那么,用现有的方案改造/整合行不行?如果单语言的缺陷总是那么明显,那么或许至少二门语言组成的混合语言是另外一种出路(当然它也要以合理的方式支持尽可能多的扩展支持我上面讲到的合理,最小免修正整合)。

从1ddlang到anylang,从single lang到DSL mixed langsys

归纳一下:一种更为颇为科学的设想要求 --- 我们需要一种真正纳入到支持用户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

terracling,架构更科学,前端改造为CLING based,后端保持llvm based的terra

那么能不能将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一样产生各种封装的变体/新语言系统。且易定制/易自然定制。


(此处不设回复,扫码到微信参与留言,或直接点击到原文)

qrcode.png

相关文章
|
24天前
|
JavaScript 前端开发 开发者
Vue.js 框架大揭秘:响应式系统、组件化与路由管理,震撼你的前端世界!
【8月更文挑战第27天】Vue.js是一款备受欢迎的前端JavaScript框架,以简洁、灵活和高效著称。本文将从三个方面深入探讨Vue.js:响应式系统、组件化及路由管理。响应式系统为Vue.js的核心特性,能自动追踪数据变动并更新视图。例如,通过简单示例代码展示其响应式特性:`{{ message }}`,当`message`值改变,页面随之自动更新。此外,Vue.js支持组件化设计,允许将复杂界面拆分为独立且可复用的组件,提高代码可维护性和扩展性。如创建一个包含标题与内容的简单组件,并在其他页面中重复利用。
46 3
|
24天前
|
前端开发 JavaScript API
解锁高效应用构建:Vuex与后端交互的前端状态同步策略,让数据流动如行云流水,紧跟前端开发的热点趋势
【8月更文挑战第27天】本文深入探讨了Vue框架下的前端状态管理库Vuex与后端服务交互时的状态同步策略。通过剖析Vuex的核心机制——状态(State)、变异(Mutation)、动作(Action)及模块(Module),文章展示了如何优雅地将后端数据加载并更新至前端状态中。特别地,借助示例代码解释了Action处理API调用、Mutation更新状态的过程,并介绍了如何通过模块化和命名空间提高状态管理的准确性和时效性。此外,还讨论了组件如何利用`mapState`和`mapActions`简化状态访问与操作的方法。遵循这些策略,开发者可以在构建复杂应用时显著提升性能与用户体验。
31 0
|
1天前
|
缓存 NoSQL 安全
构建高效后端系统的关键步骤
本文将探讨如何设计和实现一个高效的后端系统。我们将从系统架构、数据库设计、缓存策略、安全性以及性能优化等多个方面进行详细讲解。通过遵循这些指导原则,你可以构建出一个既灵活又高性能的后端系统,满足现代应用程序的需求。
|
2天前
|
JavaScript 前端开发 数据库
优化后端性能:如何使用异步编程提升系统响应速度
异步编程已成为现代后端系统性能优化的重要策略。通过避免阻塞操作,异步编程可以显著提高系统的响应速度和并发处理能力。本文章深入探讨了异步编程的基本概念,比较了常见的异步编程模型,并通过实际案例演示如何在Node.js和Python中实现异步操作,以提升系统性能。
|
7天前
|
前端开发 JavaScript Java
编程入门之前端和后端开发
前端开发就是开发网页上的内容展示与用户的交互,一部分后端开发工作就是开发数据访问服务,使前端可以通过后端服务对数据进行增删改查,也就是Crud,对前端用户的请求进行相应。
28 8
|
1天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
2天前
|
存储 前端开发 API
探索后端技术:构建高效系统的关键路径
在数字化时代,后端技术作为软件架构的核心支柱,承载着处理数据逻辑、服务前端应用和确保系统稳定运行的重要职责。本文将深入浅出地介绍后端技术的基础知识、关键组件以及在实际项目中的应用实践,旨在为开发者提供一条清晰的学习路径,助力其构建高效、可扩展的后端系统。通过案例分析和最佳实践的分享,我们将揭示如何运用现代后端技术解决复杂业务问题,提升用户体验,并推动企业的数字化转型进程。
|
1天前
|
存储 缓存 安全
构建高效后端系统的关键要素
本文将探讨后端开发中的一些关键概念和技术,包括系统架构设计、性能优化以及安全性保障。通过实例分析,帮助读者理解如何构建一个高效且可靠的后端系统。无论是新手还是经验丰富的开发者,都能从中获得启发和实用建议。
7 0
|
19天前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
52 0
|
19天前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
34 0

热门文章

最新文章