【问题标题】:Why are C, C++, and LISP so prevalent in embedded devices and robots?为什么 C、C++ 和 LISP 在嵌入式设备和机器人中如此流行?
【发布时间】:2010-12-08 18:47:42
【问题描述】:

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

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

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

【问题讨论】:

  • 哇...我不敢相信“让这个社区维基”警察没有停下来。我先说一下 - 请将此作为社区 wiki,因为它没有“正确”的答案。
  • 现在是 Lisp,不是 LISP。
  • Lisp 不一定要被解释。 Steel Bank Common Lisp (sbcl.org) 有一个优化的本地代码编译器。
  • 虽然您可能会在嵌入式开发中看到这些语言,也可能在教育机器人中看到这些语言。大多数工业自动化都是在梯形逻辑中完成的。我知道一些使用 C 的商店,但它们很少。
  • @stonemetal:使用梯形逻辑的地方越来越少。实现梯形语言的 PLC 已失宠,主要由不想或无法学习新系统的老工程师保留。

标签: python embedded erlang lisp robotics


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      1994 年,JPL 开始研究 远程代理 (RA),一个自治的 航天器控制系统。 RA是 完全用 Common Lisp 编写 尽管有无情的政治压力 转移到 C++。在某一时刻 试图移植一部分 系统(计划者)到 C++。这 尝试后必须放弃 年。基于这个经验,我认为 可以肯定地说,如果不是 Lisp 远程代理会失败。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 只是关于 Erlang 的一点,它主要是为解决电信问题而设计的。然而,它是极少数提供any时间保证的主流(即非纯学术)语言之一。在许多情况下,如果没有非常专业且昂贵的工具,硬时序保证是不切实际的。其次,工业机器人并不是唯一存在的机器人类型,在许多替代应用中,热交换代码的能力是必不可少的。
        【解决方案5】:

        Lisp 已经/曾经用于一些研究和一些商业机器人。例如,iRobot 使用它。这是一篇关于他们的 Common Lisp 变体的旧文章,名为 L (

        当需要特殊的高级库时使用 Lisp,例如复杂的计划操作。随着时间的推移,有许多用于各种规划操作的库,包括自主系统的行动和运动规划。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

          • 商用机器人一般不是人工智能试验台。让它们变得可靠比尝试先进的启发式方法更重要。学术机器人更有可能以某种方式运行 Lisp。
          • 我开发的产品比 iRobots 的笨拙地毯清扫机(前面提到的嵌入式应用程序中的 Lisp 示例)具有更多的“智能”。我知道 Lisp 常用于学术研究,但这与“在嵌入式设备中流行”不同,因为大多数嵌入式设备都不是学术研究项目。
          【解决方案7】:
          • 嵌入式系统需要最低限度的操作系统和简单(并非总是)应用程序,因为大多数操作系统都是“C”,这是自然的选择

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

          【讨论】:

          • 啊 - 使用 C++ 的成本神话! ;-) 在 C++ 中,您只需为使用的内容付费,其中一些是免费的。使用 C++ 的 C 子集的 C++ 代码与编译为 C 的相同代码一样可优化,并且与仅使用 C 的实现相比,大部分 C++ 其余部分的运行时开销可以忽略不计或没有。
          【解决方案8】:
          • 正如其他人已经指出的那样,使用 C 和 C++ 是因为它们是低级的。 C 语言流行的另一个原因是几乎每个架构都有一个针对它的 C 编译器。这对很多人来说已经足够好了,因此通常不会在其他语言上投入额外的精力。这有点像说 C 受欢迎是因为 C 受欢迎,但是嘿,事情就是这样运作的。

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

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

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

          要了解为什么其他语言在嵌入式编程中没有稳固的立足点,只需将 C、C++ 和 LISP 有稳固立足点的原因反过来。

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

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

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

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

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

          【讨论】:

          • +1 现货。正如您所说,C 在嵌入式系统中如此广泛使用的一个重要原因仅仅是因为它已在该行业中使用了很长时间。考虑到 C 赋予嵌入式程序员的所有权力和控制力,这似乎有点弱的理由,有可能编写完全危险的代码!
          • @Steve,在 C 语言中,您可以编写可以在该空间中运行的程序。如果替代方案是原始汇编,C 就很好。
          • 您无法在我们使用的某些微控制器中安装一些其他语言的解释器。实时控制系统中的时间限制排除了任何形式的动态内存分配。它仍然是位旋转性能优化和定点数学的世界。与其说“C”是因为“C”很受欢迎,不如说是“C”,因为它是唯一能胜任这项工作的东西。
          • @phkahler 我发现 C++ 和 C 在性能方面非常相似,而且大多数时候 C++ 代码往往比 C 对应的代码更短且更易于维护:)
          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

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

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

            对于 Java 还没有进入更“简陋”的市场,我真的并不感到惊讶。即使 Java ME 应该解决这个问题,解释器也太重了。它在手机中非常普遍(例如,BREW),并且正在慢慢进入机顶盒和电视市场(例如,<tru2way>GEM)但it isn't there yet 我真的不确定它将永远是。

            正如其他人所提到的,FORTH 是一种“解释型”语言,已在许多嵌入式环境以及quite a few bootloaders 中使用。解释性语言绝对可以在实时环境中使用。不过,并非所有 FORTH 的实现都被解释。 LISP 也已嵌入。

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

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

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

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

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

                如果您要运行无法进行微观管理的进程(例如,基于 Linux 的系统),那么他们必须知道要让步于某些高优先级进程,例如运动控制。因此,要么您使用 C 等低级语言自己完成,要么使用 RTOS。

                【讨论】:

                • +1 表示“将垃圾收集到墙上”。让我笑出声来! :-)
                • 我有一次计算机崩溃了,因为我在其传感器使用的坐标系上被误导了。书柜没有受伤,机器人上有几道划痕。
                • 您应该已经阅读了许可协议 (java.com/en/download/license.jsp),尤其是这一部分:“您承认许可软件并非旨在或打算用于任何核设施的设计、建造、操作或维护。”如果对核设施不利,对我的机器人不利:p
                • @James:这不是开玩笑。它实际上发生在我身上,这是我在使用任何在移动机器人上至少不具备软实时能力的控制器之前三思而后行的一个非常严重的原因。至于为什么 Java 不像您所建议的那样经常与 RTOS 一起使用,根据我的经验,机器人没有很多空闲的 CPU 周期,所以语言的逻辑选择是增加开销最小的语言。 (我指的是专业制造的机器人;爱好者通常拥有更强大的 CPU——这就是为什么 LEGO 可以用 Java 编程的原因。)
                • 我记得在 National Instruments cRIO、vxWorks、Java 上编程。绝对可怕的响应时间。但我不会说永远不要使用解释性或非确定性系统,只是你需要定义良好的代码域。 Python 是一件幸事,因为我们可以实时加载控制逻辑。但是我们在较低级别的代码中保留了任何重要的东西(电机换向、通信)。
                【解决方案13】:

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

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

                【讨论】:

                • 猜猜看?大概?你猜?
                • “怀疑是一种不舒服的状态,但确定性是一种荒谬的状态。” ~ 伏尔泰
                【解决方案14】:

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

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

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

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

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

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

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

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

                (难道 LISP 不解释吗?)

                不,专业的实现编译,AFAIKT。

                【讨论】:

                • Lisp 可以被解释或编译。这是 Lisp 的优势之一。
                • Forth 会很有用,但还没有真正成立。不过,编程很有趣。
                【解决方案15】:

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

                Java 和 .NET 等高级语言表现不佳的另一个领域是实时操作。你不能因为垃圾收集器刚刚在最糟糕的时刻启动而突然停滞不前。

                【讨论】:

                • LISP 允许低级工作?我一直认为 LISP 是一种高级语言。
                • 并且 LISP 有垃圾收集功能!
                • LISP 将用于 AI 部分,尽管 AI 研究人员不会使用 C/C++。
                • 我的 Lisp 机器使用 SCSI、以太网等标准芯片。驱动程序都是用 Lisp 编写的。 Lisp 用于所有网络代码,包括 IP 堆栈、DECNet、RPC 和 NFS 等协议。 Lisp 在那里是一种低级系统编程语言——它具有系统编程的所有功能。 CPU 稍微适应了 Lisp,但其余的硬件没有那么多。例如,总线是标准的 VMEBus、Nubus 或类似的。磁盘是标准的,磁带驱动器、CDROM、激光打印机等都是标准的东西。仍然都是从 Lisp 访问的。
                • Geo:我认为 C 是低级的,Haskell 是高级的,而 Lisp 是可跨所有级别扩展的。我经常拆解我对性能敏感的 Lisp 代码,以确保内部循环尽可能紧密,这是我使用过的其他 HLL 很少支持的。
                【解决方案16】:

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

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

                【讨论】:

                • Fortran也非常擅长数值计算,比C好。
                • Lisp 也恰好是最强大的语言——在一些小的方面非常方便。
                • @Thorbjørn Ravn Andersen - LISP 是一种强大的语言,但我不知道它是否是最强大的,这取决于你在做什么,你要解决的问题是什么。
                • LEGO Mindstorms 可以与 lejos(Java 平台)、MATLAB、Ocaml ... 和许多其他语言进行交互 .... en.wikipedia.org/wiki/Lego_mindstorms
                • @Arkapravo - 我以它为例,因此我没有谈论 iRobot 的开发平台,但感谢您提供的链接。
                猜你喜欢
                • 2017-10-08
                • 1970-01-01
                • 2018-09-04
                • 1970-01-01
                • 2012-05-12
                • 1970-01-01
                • 1970-01-01
                • 2011-04-05
                • 2020-09-25
                相关资源
                最近更新 更多