21

嵌入式设备和机器人最需要的软件语言技能似乎是 C、C++ 和 LISP。为什么没有更新的语言进入这些应用程序?

例如,Erlang似乎特别适合机器人应用程序,因为它使并发编程更容易并允许代码热交换。 Python似乎很有用,如果不是因为它支持多种编程范式的话。我什至对 Java 没有涉足一般机器人编程感到惊讶。

我确信一个论点是,“一些较新的语言是解释的,而不是编译的”——这意味着编译语言更快并且使用更少的计算资源。在我们可以在手机或 SunSpot 上安装 Java 虚拟机的时代,情况仍然如此吗?(而且不是 LISP 还是被解释了吗?)

4

16 回答 16

52

我曾经构建了一个基于 Java 的机器人。它把垃圾收集到墙上。

如果您要运行您无法进行微观管理的进程(例如,基于 Linux 的系统),那么它们必须知道让步于某些高优先级进程,例如运动控制。所以要么你自己用像 C 这样的低级语言来做,要么你使用 RTOS。

于 2009-10-21T16:54:20.447 回答
28
  • 正如其他人已经指出的那样,使用 C 和 C++ 是因为它们是低级的。C 语言流行的另一个原因是几乎每个架构都有一个针对它的 C 编译器。这对很多人来说已经足够好了,因此通常不会在其他语言上投入额外的精力。这有点像说 C 很受欢迎,因为 C 很受欢迎,但是嘿,事情就是这样运作的。

  • LISP 变体在机器人技术中很受欢迎,部分原因是 LISP 变体历来在人工智能研究中很流行。人工智能是机器人技术的主要焦点,所以很多东西都是从那个领域继承下来的。

  • LISP 已经存在了很长时间——根据维基百科,1958 年。它比大多数其他高级语言具有更多的历史,这有两个重要的含义:1)LISP 比其他高级语言更稳固(在它常用的领域);2)LISP 解释器已经出现在各种资源有限的硬件上运行(请参阅下一个要点)。

  • 与许多其他高级语言相比,LISP 变体的解释器更容易实现,并且它们可以相当高效。例如,Scheme 是一种非常容易解析的语言,无论是在概念上还是在 CPU 使用方面。

要了解为什么其他语言在嵌入式编程中没有强大的立足点,只需与 C、C++ 和 LISP确实拥有强大立足点的原因相反。

  • 他们在这个领域还没有流行,所以没有努力支持他们。

  • 前几代人没有使用它们,因此不教新手使用它们。

  • 他们没有太多的历史(在这个领域)。他们代表着未知。未知是可怕的(也很难)。

  • 他们对有限的硬件征税。

注意:当我谈到有限的硬件时,我的意思是:许多嵌入式工作仍然涉及具有 256字节和 32 kiB 内存的系统。具有 128 MiB RAM 的智能手机不是受限系统。

于 2009-10-21T19:04:03.513 回答
14

因为嵌入式设备大多资源有限,不欢迎拥有诸如自动垃圾收集器之类的奢侈品。C/C++ 允许您在非常低的级别上工作并在机器附近进行编程,以便您在这些设备上获得非常需要的有效代码。

像 Java 和 .NET 这样的高级语言不能很好地发挥作用的另一个领域是实时操作。你不能因为垃圾收集器在最糟糕的时刻启动而突然停滞不前。

于 2009-10-21T16:12:50.097 回答
12

在嵌入式系统领域工作了 20 年(包括在商业机器人项目上工作了 8 年),我从未见过 Lisp 在任何地方使用过,也不会认为它是“流行的”。例如,我看到了更多的 Ada。我会说这是一个利基市场,但如果你碰巧在那个利基市场工作,它可能看起来很流行。

使用 C 和 C++ 是因为它们是系统级语言,需要最少的运行时支持。例如,它们可以在没有操作系统的情况下运行——实际上通常用于实现操作系统。

当开发新的处理器架构或设备时,C 和 C++ 通常是该平台可用的第一个“高级”语言工具(并且通常仍然是唯一可用的)——通常从第一天开始,并且越来越多地基于 GNU GCC。其他语言的可用性不完整或不存在。C 和 C++ 技能几乎可以保证可以跨项目和架构重用。

于 2009-10-22T17:17:42.037 回答
11

你可以在 Mindstorm 机器人上用 Java 做机器人,MS 推动做机器人,但很大程度上由于资源有限,使用 C/C++,而 LISP 用于 AI,因为长期以来这是一个领域研究人员和研究人员是 LISP 的主要用户,因此他们使用自己熟悉的语言。

这与 FORTRAN 在物理学中如此流行的原因相同,例如,人们使用他们知道的语言,当项目商业化时,除非你想从头开始重写它,否则你保留原始代码。

于 2009-10-21T16:15:14.307 回答
11

我曾经在 NASA 使用 Lisp 时遇到过这个有趣的片段:http: //www.flownet.com/gat/jpl-lisp.html

1994 年,JPL 开始研究远程代理 (RA),这是一种自主航天器控制系统。RA 完全用 Common Lisp 编写,尽管面临着转向 C++ 的政治压力。有一次尝试将系统的一部分(规划器)移植到 C++。这一尝试在一年后不得不放弃。基于这个经验,我认为可以肯定地说,如果不是 Lisp,Remote Agent 就会失败。

于 2009-11-21T21:15:06.813 回答
5

我的猜测是使用 C/C++ 是因为它们更接近硬件并允许资源感知编程。这通常适用于所有嵌入式项目,而不仅仅是机器人。

然后我猜想经常选择 LISP,因为它似乎仍然是人工智能研究中的主要语言。我想 LISP 可能用于机器人的更高级别的工作。

于 2009-10-21T16:36:55.227 回答
2

Lisp is/was used in some research and some commercial robots. iRobot for example uses it. Here is an older article about their Common Lisp variant called L (<- Link).

Lisp is used when there is need for special higher level libraries, for example for complex planning operations. There are lots of libraries written over time for various planning operations, including planning of actions and movements of autonomous systems.

于 2009-10-21T23:30:30.310 回答
2

C 和 C++ 流行的主要原因是,由于缺乏垃圾收集要求,运行时对于两者都是确定性的。当您必须提供运行时保证时,这使其成为一个不错的选择。更不用说多年来 C 一直被认为是首选的“高级汇编语言”。

另一个有趣的观察是大多数嵌入式设备不需要甚至无法访问复杂的 GUI 层——手机是一个明显的例外。我专业从事的大部分嵌入式工作都在有线电视机顶盒领域,所以我可能对事物有一个倾斜的看法。而“不”,我不认为机顶盒是硬嵌入式环境。我们成长过程中只有一张“屏幕上”的原始内存映射,而且资源很少。长话短说,屏幕上的图形是一种固定位宽的位旋转练习——这是 C 语言中指针真正闪耀的另一个地方。

Java 还没有进入更“简单”的市场,我真的一点也不惊讶。尽管Java ME应该解决这个问题,但解释器还是太重了。它在手机(例如BREW)中非常普遍,并且正在慢慢进入机顶盒和电视市场(例如<tru2way>GEM),但它还没有出现,我真的不确定永远都是。

正如其他人所提到的,FORTH是一种“解释型”语言,已在许多嵌入式环境以及相当多的引导加载程序中使用。解释语言绝对可以在实时环境中使用。不过,并非所有 FORTH 的实现都被解释。LISP 也已嵌入。

我认为可嵌入语言的主要标准是:

  1. 确定性内存管理
  2. 访问明确定义的位大小(仍然不确定 LISP 如何适合这里)
  3. 简单的执行环境
  4. 完全功能或通用
  5. 平面内存模型

最后一点在我看来是最有趣的——这也是为什么我相信很多语言在嵌入式市场都会遇到麻烦的原因。纯函数式语言很适合并发,通常在平面内存模型中工作。通用语言运行良好,因为它们通常不禁止任何特定的线程模型,这为 RTOS 运行时实现者提供了很大的灵活性。虚拟内存环境几乎不可能实现,因此它们具有确定性和快速性。这使得需要虚拟内存支持的语言很难真正正常运行。

于 2009-10-21T17:40:51.383 回答
1

我刚刚阅读了一些介绍性的 Erlang 材料,他们说的第一件事就是 Erlang 适合“软”实时控制。这不是我想要在我附近的任何机器人身上看到的东西。

此外,我想说机器人(如工业)目前并不真正需要热交换代码。他们是按件工作的,总是会安排停机时间在适当的时候重新加载代码——当然,这在离线单元中经过了很好的测试。

于 2009-10-26T11:52:27.103 回答
1

嵌入式设备和机器人最需要的软件语言技能似乎是 C、C++ 和 LISP。为什么没有更新的语言进入这些应用程序?

我认为这与空间要求、性能和可靠性有关。

例如,Erlang 似乎特别适合机器人应用程序,因为它使并发编程更容易并允许代码热交换。Python 似乎很有用,如果不是因为它支持多种编程范式的话。我什至对 Java 没有涉足一般机器人编程感到惊讶。

如果实现者努力处理运行时约束,可能会在这些平台上使用更多的语言。这并不常见。如果你不刻意争取更少,总有一种趋势会吸收你手头的资源。

我确信一个论点是,“一些较新的语言是解释的,而不是编译的”——这意味着编译语言更快并且使用更少的计算资源。

Forth 以易于解释而著称,但体积小且速度快,因此经常用于嵌入式设备。像Factor这样的后续项目也可能是很好的候选人,但我还没有听说在这个方向上有任何努力——见上文。

在我们可以在手机或 SunSpot 上安装 Java 虚拟机的时代,情况仍然如此吗?

我不是嵌入式的人,但与汽车中的控制器、speklets asf 相比,手机是一个相当豪华的平台。但是 Java 始终牢记嵌入式设备,因此它们的嵌入式实现甚至可能会进一步降低功率谱。

(而且不是 LISP 还是被解释了吗?)

不,专业实现编译,AFAIKT。

于 2009-10-21T16:27:48.037 回答
1

C 和 C++ 是具有非常有效的编译器的语言(这导致效率在资源匮乏的嵌入式系统中非常重要)。

关于 Lisp,产生了一些误解。Common Lisp(现在最常用的东西 - LISP 1.5 的后代)被编译(而不是解释)并且对于广泛的实现和 FFI(即您的 Common Lisp 应用程序可能与 C 库互操作)和一些非常好的高效率级构造。通过 REPL 进行实时编码使检查工作机器人上的东西变得更加方便。

此外还有 Embeddable Common-Lisp,它允许在 C 二进制文件中嵌入 Common Lisp 应用程序——它是编译到共享库的实现。

于 2016-11-15T07:53:50.000 回答
0
  • 嵌入式系统需要一个最低限度的操作系统和简单的(并非总是)应用程序,因为大多数操作系统都是“C”,这是一个自然的选择

  • 来自非常低级别的处理/内存资源强制优化的稀缺性。C (edge over C++) 有很大的优化范围

于 2009-10-22T17:24:27.903 回答
0

大多数商业和工业机器人都是用 C 或 C++ 编程的。用户可能与之交互的另一种语言。例如,我工作的工业机器人公司使用在 VxWork 操作系统中运行的 C,但像我这样的应用程序程序员使用专有语言来控制机器人。C 和 C++ 都为您提供了对硬件的大量访问和控制。您找不到太多用于大功率伺服控制电机的商业驱动程序。虽然复杂,但这些机器人只是遵循基本的程序。

LISP 主要用于研究机器人,例如参加 DARPA 挑战赛的机器人。这些类型的机器人比工业或商业机器人需要更多的“智能”。

于 2009-10-21T17:35:45.683 回答
0

使用过机器人技术,我的答案是效率。是的,您可以在手机上运行 Java 虚拟机。但它的效率如何?我所在的团队希望在机器人上的完整 Windows XP 机器上运行 Java 虚拟机,在 Matlab 中运行多个实时监控应用程序。不用说,我们丢帧就像不关任何人的事一样。故事的寓意是,即使你需要推翻你的主管,如果它会让你的运营陷入困境,也要推翻那些不懂计算的人。

是的,您可以运行 Python,而且我已经看到它可以管理多个 C 进程。但归根结底,运行 C 允许您直接操作连接,比一些更高级别的代码更容易和更可靠,因此是首选。

于 2009-10-21T18:11:58.293 回答
0

Java 在今年成为FIRST 机器人竞赛的编程选项时取得了另一个里程碑。FRC 是一项令人印象深刻的比赛,涉及来自世界各地的 77,000 多名高中生、导师和志愿者,他们在六周内建造了 120 磅重的机器人。我刚刚在我的博客上发布了一些关于此的结果。

奇怪的巧合(或不是),它使用与原始问题中提到的 Sun SPOT 相同的 Java VM。

于 2010-05-07T18:44:43.233 回答