3 个版本
0.1.2 | 2023年11月9日 |
---|---|
0.1.1 | 2023年11月9日 |
0.1.0 | 2023年11月9日 |
#610 in 编程语言
40KB
793 行
目录
Merge
注意:任何功能尚未实现。计划实现。
TLDR
使用通用多语言通信系统的新编程语言方法,允许您在具有现代自动化界面的项目中使用多种编程语言进行编码。
清单
使用多种编程语言开发项目可能会变得复杂。尽管有一些更简单的解决方案,但它们通常缺乏可靠性、性能、稳定性等。
这是我们每个人都会遇到的一种常见情况。例如
编程语言X有一个库/框架,我无法用它来使用编程语言Y。
对于这个问题有一些解决方案,如
- 转译器:自动将X语言转换为Y语言的转换器。(就像.png到.jpeg一样,但更复杂)
- 重写:在X语言中重写程序。(例如,fish shell是用C++编写的,现在正在用rust重写)
- FFI(外部函数接口)
- ABI(应用程序二进制接口)
- 语言通信协议(例如IPC、共享内存、服务器)
- 包装器:使用语言通信协议围绕本地语言封装的定制库。
我刚才提到的解决方案中,有一些在一般情况下很难实现。其他的
- 整体转译器:可能会生成错误的输出(有缺陷的转译器)
- 重写:消耗大量时间和精力。因为人为因素。
由于这些艰难的多语言接口实现方式,我们向您介绍了 merge-lang
merge-lang
一种通用元编程语言,它自动化了项目中将编程语言组合的过程
Merge 采用了我提到的其他解决方案之外的方法。
-
初始算法
- 推理(理解数据通信点:下一节将详细介绍)
- 构建文件结构(通过最少的命令将代码分割成片段)
- 编译
- 调度执行
- 运行时
推理
这可能是 merge-lang 最复杂的一部分。(也是最具创新性的方式)看看以下例子
#[python]
use *;
fn main() {
python::print("hello, world");
#[python]
{
a = "world"
print(f"hello {a}")
}
python!{
a = "hello"
print(f"{a} world!")
import a from b
a.hello()
def python_fn():
return 5
};
let val_py = python!(python_fn());
let val_py = python::python_fn();
println!("from rust: {val_py}");
}
文件结构
为支持的所有语言编写自己的编译器是不可能的。因此,merge 编译器将您的代码分割成外部语言可以理解的部分。
使用这种技术,您可以通过 它的API 将任何编程语言集成到 merge-lang 中。
编译
将语言编译成Rust代码,然后生成LLVM IR和ASM。
调度执行
依赖项需要以线性方式评估,以便每种语言在运行时都能获得所需的值。(就像单线程与多线程应用程序一样)
把这想象成一次重大手术,你是医生,而克莱恩先生(护士)
- 如果克莱恩先生给你一把刀而不是一根针,病人可能就会死去。所以克莱恩先生必须给你做手术的正确工具。但事情还没结束。
- 如果克莱恩先生在你需要的时候(或之前)一分钟给你一根针。病人会再次因为出血而死。所以时间也很关键!
别忘了,我们通过说克莱恩先生会给我们东西,已经有一个先入为主的概念。
运行时
希望看到你使用的语言之间有一个好的执行顺序。
包管理器
merge包管理器目前还在等待中。
API
Merge-lang引入了一个API,以便能够使用更多语言。
脚注
编程语言之间的数据传输。
依赖项
~2.6–4MB
~75K SLoC