微小的碎皮转运器

2020-12-28 07:27:03

蜡是一种极小的语言,旨在轻松转换为其他语言。当前支持的后端:C,C ++,Java,TypeScript,Python,C#,Swift,Lua以及直接到WebAssembly的后端。

蜡的目标是成为"常见子集"大多数主要的命令式编程语言。由于每种语言都缺乏独特的花哨功能,并且尽可能无聊,因此将所有代码无缝转换成蜡,从而产生以下输出:

可编辑:即使原始蜡源不可用,程序员也应该能够从输出进行工作。

可集成:输出代码可以作为库导入,以与其他目标语言一起使用(除了可以单独运行之外)。

这些当然是来自程序员的因此,以牺牲其他语言提供的一些有趣功能为代价。但是,蜡保留了使编程语言具有生产力的关键要素。

Wax的语法受WebAssembly文本格式(wat)的启发,因此得名。尽管它使用的S表达式让人联想到Lisp家族,但实际上它在设计中非常必要,并且与C非常相似。转译为多种语言的想法是受Haxe启发的。

目前,蜡是试验性的,因此可能存在错误以及需要改进的方面,在这种情况下,非常感谢PR和问题。

换行符和缩进完全是修饰。您可以在(()[] {})的任何位置使用任何类型的括号。如果您愿意,可以混合使用不同类型的括号。

[func main [result int] [打印世界您好! "] [返回0]] {func main {result int} {打印世界! "} {返回0}} {func main [结果int](打印" hello world!")(返回0)}

;;索引范围为[lo,hi]包含在内的就地排序数组(func qksort_inplace(param A(arr float))(param lo int)(param hi int)(if(> = lo hi)(then(return)) )(让Pivot浮动(get A lo))(让left int lo)(让right int hi)(while(< =左右)(do(while(<(Get A left)枢轴))(do(set左(+左1)))))(同时(>(获取A右)枢轴)(做(设置右(-右1)))))(如果(< =左右)(然后(让tmp浮动(左移A))(左移A(右移))(右A集Tmp)(左移(+左1))(右移(-右1))))))))(调用qksort_inplace A右移) (调用qksort_inplace A左hi))(func qksort(参数A(arr float))(if(!(#A))(then(return)))(调用qksort_inplace A 0(-(#A)1)))

您可能已经注意到,用蜡写非常类似于直接编写抽象语法树!

Wax支持类似于C的宏,允许为每个编译目标指定不同的行为/分支,以及直接嵌入目标代码。

语法很简单:表达式始终是用括号()括起来的标记的列表,第一个标记始终是关键字/运算符。总共有50个关键字。

Wax不支持OOP(意味着您可以将数据打包在一起的结构,但是不能将方法混合到结构中),也不支持函数式编程。

蜡没有被垃圾收集。但是,它确实具有促进内存管理的结构,并减少了发生漏洞的可能性。在确实支持垃圾回收的编译目标上(例如Java,JS),不需要显式释放资源,并且从理论上讲,如果仅打算编译到这些目标,则可以完全忽略内存管理。请查看快速入门中的“数组/向量/结构”部分以获取详细信息。

此存储库包含一个称为蜡的参考实现,该蜡由C99从头开始编写。

看来挺快的。在Macbook Pro 2015上,编译700行文件需要花费0.015秒。比较:输出的TypeScript也是700行,花费了tsc 1.5秒来编译。

此外,它可以以JSON格式发出非常详细的低级语法树。 (如果您尚不支持您喜欢的语言,那么从该文件中编写代码生成器就不太困难了:)

_____ |||' | |'' | | _WAX_ |编译器于2020年10月27日建成用法:waxc [options] code.wax选项:--c path / out.c转换为c --java path / out.java转换为java --ts path / out.ts转换为打字稿- -py path / out.py转换为python --cs path / out.cs转换为c#--cpp路径/out.cpp转换为c ++ --swift路径/out.swift转换为swift --lua路径/ out。 lua转换为lua --wat path / out.wat转换为webassembly --json path / out.json语法树到JSON文件-令牌打印标记化--ast打印抽象语法树-静默不打印信息--help打印此消息

要将示例文件夹中包含的fib.wax示例编译为C,并将抽象语法树打印到终端:

编译为所有目标并使用目标语言编译所有输出。编译器并运行目标语言的所有输出。编译器:

./waxc示例/fib.wax \-c fib.c --java fib.java --ts fib.ts --py fib.py --cs fib.cs --swift fib.swift --lua fib lua; gcc fib.c; javac fib.java; tsc fib.ts; csc fib.cs; swiftc fib.swift; ./ a.out; java fib;节点fib.js; python fib.py;单fib.exe; ./fib; lua fib.lua;

waxc还支持编译为WebAssembly文本格式(.wat)。由于需要将输出进一步转换为二进制(.wasm)并用JS包装以便进行调用,因此需要执行以下两个步骤:

3.可选:由于(当前)waxc并不是一个优化的编译器,因此使用来自binaryen的wasm-opt进行优化以实现大幅度的加速。

4.现在wasm已经准备好了,您可能需要一些JS来调用它,这基本上涉及WebAssembly.instantiate(bytes,imports)与console.log(如果使用了@,则使用Math)作为导入。幸运的是,您可以在tools / waxwasmwrap.js中找到现成的包装器。使用方法:

使他们。使用emscripten作为node.js应用程序进行编译。 (您可能需要根据安装脚本的方式/时间/位置来编辑规则。)

使emlib。将其编译为带有emscripten的javascript库,而无需依赖文件系统。这就是在线游乐场的动力。

既然编译器已经编译好了,请前往QUICKSTART.md来浏览语言功能!