可执行文件中按大小比较嵌入式语言

作为我的SDK项目之一,我们需要添加对最终二进制文件的大小影响最小的脚本,但仍提供良好的功能。这引起了该项目,本文将对此进行介绍。请注意,由于 在SDK中我们有一定的要求,它们被部分地转移到脚本语言,因此一些相当知名的嵌入式编程语言没有参与该项目(但是为了比较而包含了Lua)。



该项目的网站可在此处找到我马上要说,《 Chibi-Scheme》目前是我的赢家。有兴趣者请详谈。



要求如下:



  • 最大的可移植性(仅限C / C ++)。
  • 足够强的键入(不允许添加桔子和苹果),因此未考虑ECMAScript实现。
  • 分别将脚本本身最小化的方便性(例如,以便可以安全地删除所有换行符),没有考虑Forth,Lua和Python的实现。
  • 商业友好许可证。


初始列表来自他们试图将所有可能的嵌入式脚本都考虑在内的项目:https : //github.com/dbohdan/embedded-scripting-languages列表可能不完整,并且不包含可以满足上述要求的其他脚本... 如果您知道这些,请通过PM或通过评论让我知道。



所有编程语言的测试代码包括创建和调用添加了``Hello''的函数,以及调用返回``世界''的外部(C / C ++)函数的结果。表中以示例语法的形式显示了功能代码。最终的可执行文件经过大小优化,并删除了所有不必要的符号(GCC -s)。



我还要注意,尽管最初的列表很大,但最终只有8个PL满足了上述要求(Lua仅在列表中供比较):



雅普 大小(字节) 样例脚本
小计划 86824 (define fn(lambda () (string-append "Hello, " (read))))
a 252880 function fn() return "Hello, " .. read() end
赤壁计划 261480 (define fn(lambda () (string-append "Hello, " (read))))
松鼠 277008 function fn() { return "Hello, " + read(); }
ArkScript 449792 (let fn(fun() (+ "Hello, " (read))))
重力 507896 extern var read; func fn() { return "Hello, " + read(); }
珍妮特 537560 (defn fn[] (string "Hello, " (read)))
ChaiScript 1374976 def fn() { return "Hello, " + read(); }
天使脚本 1923960 string fn() { return 'Hello, ' + read(); }


在GitLab项目中提供了这些语言的描述和文档,在这里我想分享一下我的印象:



  • TinyScheme仅实现GIMP使用的R5RS的子集。如果不是Chibi-Scheme拥有完整的R7RS支持,它可能是赢家。使用仅具有一个主干分支的SVN存储库在SourceForge上托管也有些混乱。
  • ChaiScript — , . , , , ( Dell XPS 13 2-3 ). , .
  • Gravity Swift. , , . .
  • Squirrel , ( — ).


Chibi-Scheme , .. Scheme (R7RS) ( Scheme ). , , ( init-7.scm , string-append).



( , Chibi-Scheme C):



res = sexp_define_foreign(*ctx, sexp_context_env(*ctx), "read", 0,
                          [](sexp ctx, sexp self, sexp_sint_t n) -> sexp {
                            return sexp_c_string(ctx, "world", -1);
                          });


:





不幸的是,文档并不丰富,但是可以通过访问所有源代码得到补偿。另外,《 K.O。小拳王》-Scheme在自己的圈子里广为人知,不会像其他潜在候选人那样被抛弃或提供最少的支持。






我很高兴听到所有评论,并在上述要求的框架内考虑其他YP。研究仍在进行中,也许获胜者会改变,但这已经取决于您。




All Articles