3 个版本

0.1.2 2023年11月9日
0.1.1 2023年11月9日
0.1.0 2023年11月9日

#610 in 编程语言

MIT/Apache

40KB
793

目录

  1. Merge
    1. TLDR
    2. 清单
      1. merge-lang
      2. 推理
      3. 文件结构
      4. 编译
      5. 调度执行
      6. 运行时
    3. 包管理器
  2. API

Merge

注意:任何功能尚未实现。计划实现。

TLDR

使用通用多语言通信系统的新编程语言方法,允许您在具有现代自动化界面的项目中使用多种编程语言进行编码。

清单

使用多种编程语言开发项目可能会变得复杂。尽管有一些更简单的解决方案,但它们通常缺乏可靠性、性能、稳定性等。

这是我们每个人都会遇到的一种常见情况。例如

编程语言X有一个库/框架,我无法用它来使用编程语言Y。

对于这个问题有一些解决方案,如

  • 转译器:自动将X语言转换为Y语言的转换器。(就像.png到.jpeg一样,但更复杂)
  • 重写:在X语言中重写程序。(例如,fish shell是用C++编写的,现在正在用rust重写)
  • FFI(外部函数接口)
  • ABI(应用程序二进制接口)
  • 语言通信协议(例如IPC、共享内存、服务器)
  • 包装器:使用语言通信协议围绕本地语言封装的定制库。

我刚才提到的解决方案中,有一些在一般情况下很难实现。其他的

  • 整体转译器:可能会生成错误的输出(有缺陷的转译器)
  • 重写:消耗大量时间和精力。因为人为因素。

由于这些艰难的多语言接口实现方式,我们向您介绍了 merge-lang

merge-lang

一种通用元编程语言,它自动化了项目中将编程语言组合的过程

Merge 采用了我提到的其他解决方案之外的方法。

  1. 初始算法

    • 推理(理解数据通信点:下一节将详细介绍)
    • 构建文件结构(通过最少的命令将代码分割成片段
    • 编译
    • 调度执行
    • 运行时

推理

这可能是 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。

调度执行

依赖项需要以线性方式评估,以便每种语言在运行时都能获得所需的值。(就像单线程与多线程应用程序一样)

把这想象成一次重大手术,你是医生,而克莱恩先生(护士)

  1. 如果克莱恩先生给你一把刀而不是一根针,病人可能就会死去。所以克莱恩先生必须给你做手术的正确工具。但事情还没结束。
  2. 如果克莱恩先生在你需要的时候(或之前)一分钟给你一根针。病人会再次因为出血而死。所以时间也很关键!

别忘了,我们通过说克莱恩先生会给我们东西,已经有一个先入为主的概念。

运行时

希望看到你使用的语言之间有一个好的执行顺序。

包管理器

merge包管理器目前还在等待中。

API

Merge-lang引入了一个API,以便能够使用更多语言。

脚注

编程语言之间的数据传输。

依赖项

~2.6–4MB
~75K SLoC