1. 什么是Lingua Franca
Lingua Franca(LF)是有UC Berkeley及TU Dresden(也是题主目前正在赌博的Chair)等多个盟友开发的一种多语言协调(polygot coordination)语言,旨在丰富主流目标编程语言(目前支持的语言有 C、C++、Python、TypeScript 和 Rust),使其具有确定性反应并发性和指定定时行为的能力。LF 由运行时(Runtime)系统提供支持,该系统能够并发和分布式执行反应式程序,这些程序可部署在云端、边缘甚至裸机嵌入式平台上。
Lingua Franca 程序规定了称为反应器(reactor)的组件之间的交互。每个反应器的逻辑都用纯目标代码编写,比如target C时便是用C语言语法进行编写。代码生成器用目标语言合成一个或多个程序,然后使用标准工具链进行编译,例如target C默认使用gcc,也可以选择clang。如果应用程序具有可利用的并行性,那么它就可以在多个内核上透明(transparent)地执行,而不会影响确定性(determinacy)。分布式应用程序可转化为多个程序和脚本,以便在分布式机器上启动这些程序(federate的具体用法后续会详细解读)。连接组件的通信结构是作为程序的一部分进行综合(synthesis)的。
2. 面向反应器的编程(Reactor-Oriented Programming)
Lingua Franca 程序是反应器的组合,反应器是有状态组件(stateful component),具有事件触发(event-triggered)的例程,可以读取输入、写入输出、操作反应器的状态并安排未来事件。反应器类似于其他MoC(Module of Computations)中常用的概念actor,即相互发送信息的软件组件,但与actor不同的是,信息是有时间戳(timestamp)的,而且反应器的并发组合默认是确定的。当可以容忍或需要非确定性交互时,必须对其进行显式编码。LF 本身是一种多语言合成语言,而非完整的编程语言。LF 描述了反应器的接口和组成。想要仔细了解的可以移步:Welcome | Lingua Franca
3. Lingua Franca的安装与使用
Lingua Franca的安装非常简单,开发人员提供了多个可以快速上手的方案,比如在VS Code的插件市场中安装,或者使用LF开发者提供的Epoch IDE,可以根据个人喜好进行相应的配置(详情请参考官网Handbook或者GitHub),笔者在后续的文章中将使用VS Code。
另外需要注意的是如果想使用CLI(Command Line Interface)对LF程序进行编译需要安装额外的lfc,可以使用脚本进行安装,例如笔者这里在Ubuntu中进行安装:
curl -Ls https://install.lf-lang.org | bash -s cli
另外在后续的文章中用到federeate execution的时候需要安装额外的运行时来进行支持:
git clone https://github.com/lf-lang/reactor-c.git
cd reactor-c/core/federated/RTI/
mkdir build && cd build
cmake ../
make
sudo make install
4. Hello World!
如果一切安排妥当怎么能忘记经典的Hello World呢 :D
target C
main reactor {
reaction(startup) {=
printf("Hello World.\n");
=}
}
首先在文件头我们需要定义target语言,在后续的文章中笔者将一直使用C语言,有喜欢其他语言的小伙伴可以自己试试,但是有些特定的执行方式比如federeate并没有很好的支持。
在这个minimal的样例中,我们只定义一个主反应器,主反应器的名字与文件名相同。在其中我们定义了一个反应(reaction),这个反应会在程序开始(startup)时执行下面的C语言代码,也就是大家在各大语言中都熟练掌握的Hello World了!
另外需要提一嘴的是,在编写LF程序时,在旁边的窗口会显示目前已有的结构图,笔者在这里使用VS Code。
最后我们执行一下在命令行中得到以下结果: