Почему C, C ++ и LISP так распространены во встроенных устройствах и роботах? - PullRequest
19 голосов
/ 21 октября 2009

Похоже, что наиболее востребованными языками программного обеспечения для встраиваемых устройств и роботов являются C, C ++ и LISP. Почему более поздние языки не проникли в эти приложения?

Например, Erlang может показаться особенно подходящим для роботизированных приложений, поскольку он облегчает параллельное программирование и позволяет выполнять горячую замену кода. Python может показаться полезным, если только по какой-либо другой причине, кроме поддержки нескольких парадигм программирования. Я даже удивлен, что Java не сделала набег в общее роботизированное программирование.

Я уверен, что одним из аргументов было бы: «Некоторые новые языки интерпретируются, а не компилируются», подразумевая, что скомпилированные языки быстрее и используют меньше вычислительных ресурсов. Это все еще тот случай, когда мы можем разместить виртуальную машину Java на сотовом телефоне или SunSpot? (и разве LISP не интерпретируется в любом случае?)

Ответы [ 16 ]

48 голосов
/ 21 октября 2009

Я однажды построил робота на основе Java. Это мусор, собранный прямо в стену.

Если у вас будут запущенные процессы, которые вы не можете микроуправлять (например, система на основе Linux), то они должны знать, что уступают некоторым высокоприоритетным процессам, таким как управление движением. Так что либо вы делаете это на языке низкого уровня, таком как C, либо используете RTOS.

27 голосов
/ 21 октября 2009
  • Как уже указывали другие, C и C ++ используются потому, что они низкоуровневые. Другая причина популярности C состоит в том, что почти каждая архитектура получает компилятор C, предназначенный для этого. Это достаточно хорошо для многих людей, поэтому дополнительные усилия не часто вкладываются в другие языки. Это все равно, что сказать, что C популярен, потому что C популярен, но эй, вот как все работает.

  • Варианты LISP популярны в робототехнике отчасти потому, что варианты LISP исторически были популярны в исследованиях ИИ. ИИ является основным направлением в робототехнике, поэтому многие вещи переносятся с этой области.

  • LISP существует уже давно - 1958 г., согласно Википедии. У него больше истории, чем у большинства других языков высокого уровня, и это имеет два существенных значения: 1) LISP более прочно установлен (в тех областях, где он обычно используется), чем другие языки высокого уровня, и 2) уже созданы переводчики LISP. работать на всех видах аппаратных средств с ограниченными ресурсами (см. следующий пункт).

  • Интерпретаторы легче реализовать для вариантов LISP, чем для многих других языков высокого уровня, и их можно сделать достаточно эффективными. Схема, например, является действительно простым для анализа языком, как концептуально, так и при нагрузке на процессор.

Чтобы понять, почему другие языки не имеют прочной опоры во встроенном программировании, просто рассмотрим причины, по которым C, C ++ и LISP do имеют сильную опору.

  • Они еще не популярны в этой области, поэтому не нужно прилагать усилия для их поддержки.

  • Они не использовались предыдущими поколениями, поэтому новичков не учат их использовать.

  • У них немного истории (в этой области). Они представляют неизвестное. Неизвестное страшно (и тяжело).

  • Они облагаются налогом на ограниченное оборудование.

ПРИМЕЧАНИЕ: Когда я говорю об ограниченном оборудовании, это то, что я имею в виду: большая часть встроенной работы по-прежнему включает системы с 256 байтами и 32 КБ ОЗУ. Смартфон с 128 МБ ОЗУ не является ограниченной системой.

14 голосов
/ 21 октября 2009

Потому что встраиваемые устройства в основном имеют ограниченные ресурсы, где не может быть роскоши, такие как автоматический сборщик мусора. C / C ++ позволяет вам работать на достаточно низких уровнях и программировать близко к машине, чтобы вы получили эффективный код, который очень необходим для этих устройств.

Еще одна область, в которой языки высокого уровня, такие как Java и .NET, не играют хорошо, - это работа в режиме реального времени. Вы не можете позволить себе внезапно застопориться, потому что сборщик мусора только что включился в самый неподходящий момент.

12 голосов
/ 22 октября 2009

За 20 лет во встроенных системах (включая 8 лет в коммерческом проекте по робототехнике) я никогда не видел, чтобы Лисп использовался где-либо, и не расценил бы его как «распространенный». Я видел намного больше Ады, например. Я бы сказал, что это ниша, но если вы работаете в этой нише, она может выглядеть преобладающей для вас.

C и C ++ используются потому, что они являются языками, поддерживающими системный уровень, которые требуют минимальной поддержки во время выполнения. Например, они могут работать без ОС - и действительно широко используются для реализации операционных систем.

Когда разрабатывается новая архитектура процессора или устройства, C и C ++ обычно являются первыми «высокоуровневыми» языковыми инструментами, доступными для платформы (и часто остаются единственными доступными) - обычно с первого дня, и все чаще и чаще GNU. На основе GCC. Доступность других языков неоднородна или не существует. Навыки C и C ++ гарантированно могут быть использованы в разных проектах и ​​архитектурах.

11 голосов
/ 22 ноября 2009

Я однажды упал из-за этого интересного фрагмента при использовании Lisp в NASA: http://www.flownet.com/gat/jpl-lisp.html

В 1994 году JPL начала работать над Удаленный агент (RA), автономный система управления космическим кораблем. РА был полностью написан на Common Lisp несмотря на непрекращающееся политическое давление перейти на C ++. В какой-то момент была сделана попытка перенести одну часть система (планировщик) до C ++. это попытка должна была быть прекращена после год. Основываясь на этом опыте, я думаю, можно с уверенностью сказать, что если бы не Лисп удаленный агент не удалось бы.

11 голосов
/ 21 октября 2009

Вы можете заниматься робототехникой с Java на роботах Mindstorm, и у MS есть толчок к созданию робототехники, но в значительной степени C / C ++ используется из-за ограниченных ресурсов, а LISP используется для AI, потому что долгое время это было область исследований и исследователи были основными пользователями LISP, поэтому они использовали язык, который они знали.

Это та же самая причина, почему FORTRAN настолько распространен в физике, например, люди используют язык, который они знают, и когда проект становится коммерческим, если вы не хотите переписывать его с нуля, вы сохраняете оригинальный код.

5 голосов
/ 21 октября 2009

Я предполагаю, что C / C ++ используются, потому что они ближе к оборудованию и позволяют программирование с учетом ресурсов. Как правило, это относится ко всем встраиваемым проектам, а не только к робототехнике.

Тогда я думаю, что LISP часто выбирают, потому что он все еще кажется преобладающим языком в исследованиях искусственного интеллекта. Я полагаю, что LISP используется для работы робота на более высоком уровне.

2 голосов
/ 22 октября 2009

Lisp использовался / использовался в некоторых исследованиях и некоторых коммерческих роботах. iRobot, например, использует его. Вот старая статья об их варианте Common Lisp под названием L (<- Link). </p>

Lisp используется, когда есть необходимость в специальных библиотеках более высокого уровня, например, для сложных операций планирования. Со временем написано множество библиотек для различных операций планирования, включая планирование действий и перемещений автономных систем.

2 голосов
/ 21 октября 2009

Основная причина преобладания C и C ++ заключается в том, что среда выполнения является детерминированной для обоих из-за отсутствия требований по сбору мусора. Это делает его хорошим выбором, когда вы должны предоставить гарантии времени выполнения. Не стоит также упоминать, что C многие годы считался «языком ассемблера более высокого уровня».

Еще одним интересным наблюдением является то, что большинству встроенных устройств не требуется или даже нет доступа к сложному уровню графического интерфейса - сотовые телефоны являются очевидным исключением. Большая часть встроенной работы, которую я сделал профессионально, была на арене кабельной приставки, поэтому я могу иметь наклонный взгляд на вещи. И "Нет" , я не считаю приставку жесткой встроенной средой. Мы выросли из-за того, что у нас не было ничего, кроме простой карты памяти того, что «на экране», и очень мало ресурсов. Короче говоря, экранная графика - это упражнение в перевороте с фиксированной шириной в битах - это еще одно место, где указатели в C действительно сияют.

Я действительно не слишком удивлен тем, что Java еще не продвинулась на более «чистый» рынок. Интерпретатор слишком тяжел, хотя Java ME должен был решить эту проблему. Он довольно распространен в мобильных телефонах (например, BREW ) и медленно продвигается на телевизионные и телевизионные рынки (например, и GEM ) но его еще нет и я действительно не уверен, что когда-нибудь будет.

Как уже упоминалось, FORTH является "интерпретируемым" языком, который использовался во многих встроенных средах, а также в довольно многих загрузчиках . Интерпретированные языки могут определенно использоваться в средах реального времени. Хотя не все реализации FORTH интерпретируются. LISP также встроен.

Я думаю, что основными критериями для встраиваемого языка являются:

  1. детерминированное управление памятью
  2. доступ к четко определенным размерам битов (все еще не уверен, как LISP вписывается сюда)
  3. простая среда исполнения
  4. полностью функциональный или общего назначения
  5. модель с плоской памятью

Последний пункт, на мой взгляд, наиболее интересен, поэтому я также считаю, что многие языки будут иметь проблемы на рынке встраиваемых систем. Чистые функциональные языки естественным образом подходят для параллелизма и обычно работают в плоской модели памяти. Языки общего назначения работают хорошо, потому что они обычно не запрещают какую-либо конкретную модель потоков, что дает большую гибкость для разработчиков среды выполнения RTOS. Среды виртуальной памяти практически невозможно реализовать, поэтому они являются детерминированными и быстрыми. Это очень затрудняет правильное функционирование языков, для которых требуется поддержка виртуальной памяти.

1 голос
/ 15 ноября 2016

C и C ++ - это языки с очень эффективными компиляторами (что приводит к эффективности, очень важной для встраиваемых систем с низким уровнем ресурсов).

Что касается Лиспа, возникло некоторое недопонимание. Common Lisp (то, что в основном используется сейчас - потомок LISP 1.5) компилируется (не интерпретируется) и очень эффективен с широким спектром реализаций и FFI (т. Е. Ваше приложение Common Lisp может взаимодействовать с библиотеками C) и некоторыми очень хорошими многоуровневые конструкции. Живое кодирование через REPL делает его еще более удобным для проверки работающего робота.

Кроме того, имеется Embeddable Common-Lisp, который позволяет встраивать приложение Common Lisp в двоичный файл C - его реализация компилируется в разделяемую библиотеку.

...