Lua作为嵌入式语言的替代品?

bas*_*ibe 53 embedded scripting lua programming-languages

我正在研究在DSP上运行Linux的嵌入式系统.现在我们想让它的一些部分可编写脚本,我们正在寻找一种很好的可嵌入脚本语言.这些脚本应该与我们现有的C++代码库很好地集成,小而快.

我知道Lua是这类问题的行业选择.我们可能会选择Lua,因为它是经过验证的,并且被证明是稳定的等等.然而,作为一种编程语言,它有一些相当古怪的角落.

那么,可嵌入语言有哪些替代方案?

编辑:

这是大约一年之后.

我们实际上在我们的嵌入式系统上使用了Lua,它表现非常出色.随着时间的推移,我们为项目的越来越多的部分添加了越来越多的脚本支持,这确实有助于实现它.

性能非常出色,真的.即使是相当复杂的操作,涉及搜索长数组或奇特的字符串操作也表现得非常好.我们基本上从未遇到过与Lua相关的性能问题.

与C函数的接口非常简单,并且工作得非常好.这使我们可以轻松地扩展脚本系统.

最后,我们对Lua的灵活性感到震惊.我们的Lua解释器必须在具有非标准内存分配器的系统上运行,并且不支持双数据类型.在一个头文件中有两个记录良好的位置我们必须修改以使Lua在该系统上工作.它非常适合嵌入!

And*_*rsH 37

既然你说"嵌入式系统","小而快"和"很好地整合",我会说你是正确的,如果不是唯一的选择Lua是第一.但我不再同意编程语言有"古怪的角落".首先,"Lua编程"这本书非常精彩,是我读过的最好的书之一.其次,一些"古怪的角落"来自这样一个事实,即语言是非常正交和干净的,从长远来看这是一种资产,而不是缺点.我发现JavaScript更糟糕.如果您阅读"Javascript the good parts",作者会详细解释为什么语言中的某些结构是设计错误以及为什么应该避免使用new运算符.在Lua中不是这样,坏的部分已被删除,例如,古怪的upvalue内容被版本5.x中的标准语法范围所取代.

我的观点实际上是Lua是一种远比其他语言少得离奇的语言!我们在商业项目中使用它,我们对它非常满意.

  • Lua中的一些怪癖导致我寻找替代语言:基于1的数组,缺乏Unicode支持,无法使用nil作为表键,#(长度)运算符的未指定行为因为它*可能*停止当它找到一个nil时计数(因此在数组中插入一个nil会产生不确定的结果),`ipairs`可能产生比#更少的结果这一事实,无法分辨表中的键数(#只适用于数组) ,极弱的打字("abc"+"456"是一个错误,"123"+"456"是579).在Lua旁边,Python是一个梦想(但不幸的是,它不是真正可嵌入的). (20认同)
  • 我会指出Lua仍有一些怪癖 - 但我确实认为它比大多数都要少.+1 (6认同)

Jud*_*den 12

我全心全意地推荐Lua用于你的用例.然而,Forth是一种替代方案 - 特别是对于资源受限的嵌入式设备 - 尚未被提及.


Mud*_*Mud 12

总有Lisp.:)但这强调了事实上Lua实际上不像大多数语言那样"古怪".它是为非程序员设计的,读取像伪代码.它具有干净,统一的语义(具有词法作用域的第一类嵌套函数;多个赋值;多个返回值;具有干净构造函数语法的单个,灵活的数据结构机制;等等),使其易于学习,读取,写入等它也恰好具有强大的意义和强大的表现力(适当的尾调用,延续,元编程等)

Lua唯一真正"古怪"的方面是数组从1开始索引,而且它并没有像其他人那样借用C的约定(~=而不是!=,--而不是//等等),但这些大多是古怪的.程序员习惯于类C语言.

另一种选择可能是松鼠,它受Lua的启发,有类似的目标,但是类C语法.我没有使用过它,所以我不太清楚它是否符合它的目标.

  • 国际海事组织你提到的怪癖是相当肤浅的怪癖.Lua字符串可以保存任意数据,我已经将Unicode用于需要它的外部库而没有问题.#*是*明确指定; 你只是不想将它与稀疏数组一起使用.将字符串强制转换为数字算术表达式是许多动态语言的(错误)特征,但它在Lua中不是一个问题,因为Lua不使用+进行连接(更不用说重载其他运算符,如*,如Ruby).Lua在其重要性方面不那么古怪,例如范围的统一处理,表格的通用性等. (7认同)
  • (1)似乎你不知道Unicode支持需要什么和/或Lua的设计目标是什么.Lua字符串可以包含任意数据,包括Unicode,并且可以通过元表扩展.如果您需要支持,可以获得支持.开箱即用的标准库是有目的的超小**.(2)你说#has*unspecified*behavior,然后引用*specification*.\*lol\*行为**未定义的情况**很好指定**,很多[如C](http://en.wikipedia.org/wiki/Undefined_behavior).(3)在更重要的领域,Python比Lua更奇怪. (5认同)
  • 请参阅上面的评论(关于接受的答案)关于Lua的许多怪癖.Lisp有许多不同的方言有各种各样的问题,但Scheme(可能是第二个最流行的Lisp方言)是关于我所知道的最干净的语言.我同意具有词法作用域的一流嵌套函数在Lua中是理想的,但对于Scheme和Python以及许多其他函数也是如此. (2认同)
  • 缺少 Unicode 并不是一个“怪癖”,但它的抽象性很差。# 在某些情况下*显式*指定为具有未定义的结果(“表 t 的长度被定义为任何整数索引 n,使得 t[n] 不为 nil 并且 t[n+1] 为 nil”)。从任何定义来看,这都是一个怪癖。我同意 Lua 有一个单独的串联运算符真是太好了。我知道其他动态语言也有相同的“(错误)功能”,但从 Python 背景来看,这似乎非常落后。我同意,除了我提到的之外,Lua 的语义非常好。 (2认同)
  • (2)我没有看到引用规范的讽刺意味.规范没有在特定情况下指定行为.这是未指定行为的定义.是的,有明确的情况可以使用,但也有其他情况没有说明.大多数高级语言没有未指定的行为 - C确实如此,但那是因为它是一种非常低级的语言.(3)你会说Python的怪癖是什么?当然它是一种比Lua更复杂的*语言(并不适合嵌入),但我不会说更古怪. (2认同)

Rea*_*eal 5

最近的替代方案是wren

Wren 是一种小型、快速、基于类的并发脚本语言

Wren 是一种脚本语言。Wren 旨在嵌入到应用程序中。它没有依赖项、一个小型标准库和一个易于使用的 C API。它可以干净地编译为 C99、C++98 或更高版本。