深度开源社区公布其自研编程语言Unilang,目前处于起步阶段

感谢本站网友对半条命nh和孤独蜗牛的线索传递!

有IT朋友发现,深度开源社区此前在Github和gitee上发布了其自研的编程语言——Unilang,还收录了相关解释器,讲解了Unilang文档和参考实现。

官方库中的描述是新编程语言,是为适应更有效,更灵活地开发桌面应用而提出的通用编程语言项目,旨在更好地帮助当前的桌面应用开发者主机环境是MSYS2 MinGW32和Linux

根据介绍,因为一些最流行的标准化语言,如C/C++和ECMAScript,历史包袱很重,他们没有足够的能力扩展语言本身来满足他们的需求,Dart和其他专门为类似方案设计的语言的一些基本设计决策,使其无法完全适用于一些重要场景,其他一些通用语言,如Rust和Go,也没有提出GUI解决方案。

因此,他们希望在满足需求的基础上带来一种新的语言,使其真正以更深层次的方式实现通用性——通过减少为个别问题领域准备的原生特设特性,用一组更通用的基本特性来替代。

Unilang是从整体上解决现有问题的新方案的语言部分。其主要特点是:

作为一种动态语言,它提供了比其他语言更强的语言可扩展性。

通过定制语言的功能,用户可以有效限制意想不到的动态特性,最终获得接近大多数静态语言的开发体验优势,同时避免静态语言核心规则带来的不便。

允许通过在部署了Unilang程序的环境中添加库来补充现有的语言功能,而无需重新部署toolchain的实现。

提供一个基础语言,以库的形式扩展这个语言,得到一个实用的特性集该库预计将由该项目和用户提供

在大多数语言中,有必要修改语言的核心规则所提供的特性在Unilang中,预计只有用户用Unilang语言编写的库才能解决这个问题例如,静态类型检查可以由用户程序提供

与C和C++类似,但与Java不同,它不明确要求或假定翻译和执行的特定形式诸如实现编译,解释和加载哪种图像格式等实现细节对于核心语言规则是透明的

预设一个不像C和C++那么清晰的翻译阶段不需要在单独的阶段扩展的宏——它们可以被支持一流环境的函数所替代

支持同构,允许代码作为数据进行编程。

函数是一级对象。

环境变量绑定的所有权把一流的环境当做一流的对象来支持

支持类似C++的对象模型和不安全的所有权语义。

与C#或Rust不同,它没有提供专门的unsafe关键字来标记不安全的代码段落,最基本的特性是默认不安全。

安全性不是由语言唯一定义的,允许用户通过扩展类型系统来实现不同种类和程度的自定义安全性。

不需要全局GC,语言子集允许与C++相同级别的不安全资源分配,但可以确保确定性。

没有针对不安全操作的本机静态检查,但该语言的可扩展性允许直接实现类型系统或自动证明更强的内存安全性将来可能会作为一个库提供

语言规则仍然允许引入依赖GC的互操作性特别是,允许引入多个非全局GC示例

支持形式意义上的PTC,不需要在用户程序中修改栈溢出等未定义的行为。

在主流语言中,不依赖全局GC的语言实现不提供类似的保证。

使用隐式潜在类型,而不是显式显式类型。

在扩展之前,作为一个实现细节,隐式类型推断已经被允许在不影响程序语义的情况下消除一些类型检查。

允许用户程序扩展类型注释的语法和相关检查。

这自然避免了用户的扩展类型系统和本机规则之间的冲突,同时保持了可扩展性。

与C++类似但略有不同的值类型,但与C++不同的是,它不是静态确定的表达式的属性,而是跟随对象的动态元数据。

类似于C++的const类型限定符,左边值引用的对象允许标记为不可修改,而不是Rust等语言默认为不可修改。

类似于C++的消光值,左边值引用的对象允许标记唯一,而里面的资源允许被转移。

在上述具有代表性的选择决策中,一种常见的方法是比较不同方向扩张的技术可行性——并选择易于扩张的选项否则,即使可行,也有很多本该避免的无效工作

因此,该语言首先要求PTC以使其足够可用,但不鼓励嵌套的不可靠实现。

注意,PTC的不可靠实现在其他方面可能仍然是成功的所以其他大部分特性都不具备PTC需要基本规则明确保障的地位

因此,语言首先排除了对全局GC的依赖。

例如,在用unsafe等特殊语法标记为unsafe的语言中,该语言定义的任何安全保证通常都会被放弃,其中有些是无法保留的即使忽略这个问题,该语言也缺乏一种机制来允许用户提供更严格的保证

再比如,虽然默认的不可变数据结构可以保证const correctness的正确性),但是它忽略了不可变的定义不能被用户程序扩展的问题——很多情况下,不可变只需要是等价关系,而不是不可变。

因此,basic语言在默认情况下是不安全的。

如果语言允许用户表达一些不同表示的值被认为是等价的,优化的适应性自然会扩大。

不可变性只有一种,除非修改类型系统设计,放弃原来的不可变定义,重新引入类似C++const的限定符机制。

在这里,用const_cast这样的不安全转换取消const引入的类型安全保证,并假设它不会破坏不变性,是一种无奈的选择。

这可能导致特定不变性的滥用例如,C++标准库关联容器的键类型实际上并不需要符合C++的const,因为键的不变性正是由比较关系导出的等价关系定义的,但类型系统无法区分这两种情况这过度地限制了键上应该允许的操作

默认的不可变类型系统,比如Rust的设计,从根本上阻止了类型组合构造中的扩展方向。

这也限制了现有实现的常数传播的优化范围,因为原则上这里的常数只关心变换前后替换的语义保持,并不关心具体值是否相等。

因此,默认情况下,基础语言中的对象是可变的。

因此,basic语言首先被设计成一种动态语言。

设计一个静态语言,然后添加一些规则伪装成一个动态语言,有足够的动态特性,远不是给动态语言添加规则就能得到静态语言的特征集那么简单。

添加证书以从标记为放弃某个保证的上下文中恢复某个保证比添加来自已知没有保证的上下文的证书以确保该保证更困难。

将GC排除在已经需要全局GC的语言之外,在不依赖GC的语言规则基础上增加与GC交互的能力远非易事。

在没有PTC保证的情况下,给一个语言实现添加扩展基本上是不可能的,除非重新实现包括求值规则在内的核心逻辑。

和C++有很好的互操作性。

当前的解释器是用C++实现的。

结合对象模型,可以保证Unilang对象和C++对象的对应。

语言绑定主要关注已知ABI的C/C++ API。

为了保持通用性,Unilang内部不提供GUI功能,而是通过库提供相关的API目前,在计划中,Unilang将支持基于Qt的绑定库,以便连接和过渡一些现有的桌面应用程序项目Unilang的语言设计保持了足够的抽象性和扩展性,允许GUI框架在未来直接实现

声明:本网转发此文章,旨在为读者提供更多信息资讯,所涉内容不构成投资、消费建议。文章事实如有疑问,请与有关方核实,文章观点非本网观点,仅供读者参考。