21

組み込み機器やロボットに最も求められるソフトウェア言語スキルはC、C++、LISPのようです。最近の言語がこれらのアプリケーションに浸透していないのはなぜですか?

たとえば、Erlangは並行プログラミングを容易にし、コードのホット スワップを可能にするため、ロボット アプリケーションに特に適しているように思われます。 Pythonは、複数のプログラミング パラダイムのサポート以外の理由がなければ、有用であるように思われます。Java が一般的なロボット プログラミングに進出していないことに、私はさらに驚いています。

「一部の新しい言語は解釈され、コンパイルされていない」という議論があると確信しています。これは、コンパイルされた言語の方が高速で、計算リソースの使用量が少ないことを意味します。Java 仮想マシンを携帯電話や SunSpot に搭載できる時代に、これはまだ当てはまるのでしょうか? (とにかく LISP は解釈されませんか?)

4

16 に答える 16

52

私はかつてJavaに基づいてロボットを構築しました。ガベージは壁に集められました。

細かく管理できないプロセス (Linux ベースのシステムなど) を実行する場合は、モーション コントロールなどの特定の優先度の高いプロセスに譲歩する必要があります。したがって、C などの低レベル言語で自分で行うか、RTOS を使用します。

于 2009-10-21T16:54:20.447 に答える
28
  • 他の人がすでに指摘しているように、C と C++ は低レベルであるため使用されます。C が人気を博しているもう 1 つの理由は、ほぼすべてのアーキテクチャが C コンパイラをターゲットにしていることです。多くの人にとってはこれで十分なので、他の言語に余分な労力が費やされることはあまりありません。これは、C が人​​気があるから C も人気があると言っているようなものですが、それが仕組みの仕組みです。

  • LISP の亜種がロボット工学で人気がある理由の 1 つは、LISP の亜種が歴史的に AI 研究で人気があるためです。AI はロボティクスの主要な焦点であるため、多くのものがその分野から引き継がれます。

  • LISP は長い間使用されてきました (ウィキペディアによると 1958 年)。他のほとんどの高水準言語よりも長い歴史があり、これには 2 つの重要な意味があります。1) LISP は他の高水準言語よりも (一般的に使用される分野で) しっかりと確立されていること、および 2) LISP インタープリターは既に作成されていることです。リソースが限られたあらゆる種類のハードウェアで実行できます (次の箇条書きを参照してください)。

  • インタプリタは、他の多くの高水準言語よりも LISP バリアントで実装する方が簡単で、適度に効率的にすることができます。たとえば、Scheme は、概念的にも CPU 負荷の点でも、非常に簡単に解析できる言語です。

他の言語が組み込みプログラミングに強い足場を持っていない理由を理解するには、C、C++、および LISP強い足場を持っている理由を逆に考えてみてください。

  • 彼らはこの分野ではまだ人気がないので、彼らをサポートする努力はされていません.

  • それらは前の世代では使用されていなかったので、初心者はそれらを使用するように教えられていません.

  • 彼らは(この分野では)あまり歴史がありません。それらは未知のものを表しています。未知は怖い(そして難しい)。

  • 彼らは限られたハードウェアに負担をかけています。

注:限られたハードウェアについて話すとき、これが私が言いたいことです: 組み込み作業の多くは、依然として 256バイトから 32 kB の RAM を持つシステムを必要とします。128 MiB の RAM を搭載したスマートフォンは、限られたシステムではありません。

于 2009-10-21T19:04:03.513 に答える
14

組み込みデバイスのほとんどのリソースは限られているため、自動ガベージ コレクターなどのぜいたく品は歓迎されません。C/C++ を使用すると、非常に低いレベルで作業し、マシンに近いプログラムを作成できるため、それらのデバイスで非常に必要とされる効果的なコードを取得できます。

Java や .NET などの高級言語がうまく機能しないもう 1 つの領域は、リアルタイム操作です。ガベージ コレクターが最悪のタイミングで起動したため、突然停止するわけにはいきません。

于 2009-10-21T16:12:50.097 に答える
12

組み込みシステムでの 20 年間 (商用ロボット プロジェクトでの 8 年間を含む) で、Lisp がどこでも使用されているのを見たことがなく、それが「普及している」とは考えていません。たとえば、私ははるかに多くのエイダを見ました。それはニッチだと思いますが、もしあなたがたまたまそのニッチで働いているなら、それはあなたに流行しているように見えるかもしれません.

C および C++ が使用されるのは、最小限のランタイム サポートを必要とするシステム レベル対応言語であるためです。たとえば、OS なしで実行できます。実際、オペレーティング システムの実装によく使用されます。

新しいプロセッサ アーキテクチャまたはデバイスが開発されると、通常は C および C++ がそのプラットフォームで利用できる最初の「高水準」言語ツールになります (多くの場合、利用可能な唯一の言語ツールのままです)。通常は初日から、ますます GNU GCC ベースになります。他の言語の可用性はまだらであるか、存在しません。C および C++ のスキルは、プロジェクトやアーキテクチャ全体で再利用できることがほぼ保証されているスキルです。

于 2009-10-22T17:17:42.037 に答える
11

マインドストーム ロボットで Java を使用してロボティクスを行うことができ、MS はロボティクスを行うことを推進していますが、リソースが限られているため C/C++ が大部分使用され、AI には長い間 LISP が使用されていました。 LISP の主なユーザーは研究者であり、彼らは自分が知っている言語を使用していました。

これは、FORTRAN が物理学で非常に普及しているのと同じ理由です。たとえば、人々は自分が知っている言語を使用し、プロジェクトが商用になると、ゼロから書き直したい場合を除き、元のコードを保持します。

于 2009-10-21T16:15:14.307 に答える
11

NASA での Lisp の使用に関する次の興味深いスニペットを見つけたことがあります: http://www.flownet.com/gat/jpl-lisp.html

1994 年に JPL は、自律的な宇宙船制御システムであるリモート エージェント (RA) の作業を開始しました。C++ への移行を求める絶え間ない政治的圧力にもかかわらず、RA は完全に Common Lisp で書かれました。ある時点で、システムの一部 (プランナー) を C++ に移植する試みが行われました。この試みは 1 年後に中止されなければなりませんでした。この経験に基づいて、Lisp がなければリモート エージェントは失敗していたと言っても過言ではありません。

于 2009-11-21T21:15:06.813 に答える
5

私の推測では、C/C++ が使用されているのは、ハードウェアに近く、リソースを意識したプログラミングが可能であるためです。これは一般的に、ロボット工学だけでなく、すべての組み込みプロジェクトに当てはまります。

それから、LISP が選ばれることが多いと思います。なぜなら、LISP は依然として人工知能の研究において優勢な言語のように思われるからです。LISP はおそらくロボットのより高度な動作に使用されているのではないでしょうか。

于 2009-10-21T16:36:55.227 に答える
2

C と C++ が普及している主な理由は、ガベージ コレクションの要件がないため、両方のランタイムが決定論的であることです。これは、実行時の保証を提供する必要がある場合に適しています。言うまでもなく、C は長年にわたって「高水準のアセンブリ言語」として選ばれてきました。

もう 1 つの興味深い観察結果は、ほとんどの組み込みデバイスは複雑な GUI レイヤーを必要としないか、アクセスすることすらできないということです。携帯電話は明らかな例外です。私が専門的に行ってきた組み込み作業のほとんどは、ケーブル セットトップ ボックスの分野で行われてきたため、物事を斜めに見ている可能性があります。そして「いいえ」、私はセットトップ ボックスがハード エンベデッド環境であるとは考えていません。私たちは、「画面上」にあるものの生のメモリ マップしか持たず、リソースをほとんど持たない状態から成長しました。簡単に言うと、オンスクリーン グラフィックスは、固定ビット幅でのビット操作の演習です。これは、C のポインタが真価を発揮するもう 1 つの場所です。

私は、Java がまだより「最低限の」市場に進出していないことに、あまり驚かない。Java MEがこれを解決するはずだったにもかかわらず、インタプリタは重すぎます。携帯電話 ( BREWなど) ではかなり普及しており、セットトップや TV 市場 ( <tru2way>GEMなど)にも徐々に浸透していますが、まだ普及していません。それは今までにないでしょう。

他の人が述べたように、FORTH「解釈された」言語であり、多くの組み込み環境やかなりの数のブートローダーで使用されています。解釈された言語は、リアルタイム環境で確実に使用できます。ただし、FORTH のすべての実装が解釈されるわけではありません。LISP も組み込まれています。

埋め込み可能な言語の主な基準は次のとおりだと思います。

  1. 決定論的メモリ管理
  2. 明確に定義されたビット サイズへのアクセス (LISP がここにどのように適合するかはまだわかりません)
  3. シンプルな実行環境
  4. 完全に機能的または汎用
  5. フラットメモリモデル

最後の点は、私の意見では最も興味深い点です。これが、多くの言語が組み込み市場で問題を抱えていると私が考える理由でもあります。純粋な関数型言語は並行性に自然に適合し、通常はフラット メモリ モデルで動作します。汎用言語は、通常、RTOS ランタイムの実装者に多くの柔軟性を与える特定のスレッド モデルを禁止しないため、うまく機能します。仮想メモリ環境は、決定論的で高速であるため、実装がほぼ不可能です。これにより、仮想メモリのサポートを必要とする言語が実際に正しく機能することが非常に困難になります。

于 2009-10-21T17:40:51.383 に答える
2

Lisp は、一部の研究や一部の商用ロボットで使用されている/使用されていました。たとえば、iRobot はそれを使用します。これはL (<- Link)と呼ばれる Common Lisp バリアントに関する古い記事です。

Lisp は、複雑な計画操作など、特別な高レベル ライブラリが必要な場合に使用されます。アクションの計画や自律システムの移動など、さまざまな計画操作のために時間をかけて書かれた多くのライブラリがあります。

于 2009-10-21T23:30:30.310 に答える
1

Erlang の入門資料を読んだところ、彼らが最初に言ったことの 1 つは、Erlang は「ソフト」なリアルタイム制御に適しているということでした。これは、私の近くにあるどのロボットにも望んでいないことです。

さらに、ロボット (産業用) は現在、ホットスワップされたコードを実際に必要としていないと言えます。それらは部分的に作業しており、適切なタイミングでコードをリロードするためのダウンタイムが常にスケジュールされています。これはもちろん、オフライン ユニットで十分にテストされています。

于 2009-10-26T11:52:27.103 に答える
1

組み込み機器やロボットに最も求められるソフトウェア言語スキルはC、C++、LISPのようです。最近の言語がこれらのアプリケーションに浸透していないのはなぜですか?

スペース要件、パフォーマンス、および信頼性に関するものだと思います。

たとえば、Erlang は、並行プログラミングを容易にし、コードのホット スワップを可能にするため、ロボット アプリケーションに特に適しているように思われます。Python は、複数のプログラミング パラダイムのサポート以外の理由がなければ、有用であるように思われます。Java が一般的なロボット プログラミングに進出していないことに、私はさらに驚いています。

実装者が実行時の制約を処理する努力を引き受けた場合、これらのプラットフォームでおそらくはるかに多くの言語を使用できるでしょう。これはあまり当てはまりません。意図的にリソースを減らす努力をしないと、手元にあるリソースを吸収してしまう傾向が常にあります。

「一部の新しい言語は解釈され、コンパイルされていない」という議論があると確信しています。これは、コンパイルされた言語の方が高速で、計算リソースの使用量が少ないことを意味します。

For は解釈されますが、小さくて高速であることで定評があり、そのため組み込みデバイスでよく使用されていました。Factor のようなフォローアップもおそらく良い候補になるでしょうが、私はこの方向への取り組みについて聞いたことがありません - 上記を参照してください。

Java 仮想マシンを携帯電話や SunSpot に搭載できる時代に、これはまだ当てはまるのでしょうか?

私は組み込みの人間ではありませんが、携帯電話は、車のコントローラーや 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 を介したライブコーディングにより、作業中のロボットのチェックアウトがさらに便利になります。

さらに、Common Lisp アプリケーションを C バイナリに埋め込むことができる Embeddable Common-Lisp があります。これは、共有ライブラリにコンパイルされた実装です。

于 2016-11-15T07:53:50.000 に答える
0

ロボット工学を扱ってきた私の答えは効率です。はい、携帯電話で Java 仮想マシンを実行できます。しかし、それはどれほど効率的でしょうか?私は、ロボット上の完全な Windows XP マシンで Java 仮想マシンを実行したいチームに所属し、Matlab で複数のリアルタイム監視アプリケーションを実行していました。言うまでもなく、私たちは誰の仕事でもないかのようにフレームを落としていました。話の教訓として、コンピューティングを理解していない人をオーバーライドすることです。

はい、Python を実行できます。複数の C プロセスを管理するために Python が実行されるのを見てきました。しかし、結局のところ、C を実行すると、いくつかの上位レベルのコードよりもはるかに簡単かつ確実に接続を直接操作できるため、推奨されます。

于 2009-10-21T18:11:58.293 に答える
0

ほとんどの商用および産業用ロボットは、C または C++ でプログラムされています。ユーザーが対話する別の言語が存在する可能性があります。たとえば、私が働いている産業用ロボットの会社では、VxWork OS で実行される C を使用していますが、私のようなアプリケーション プログラマーは、ロボットに命令するために独自の言語を使用しています。C と C++ の両方で、ハードウェアに対する大量のアクセスと制御が可能です。高出力サーボ制御モーター用の商用ドライバーはあまり多くありません。複雑ではありますが、これらのロボットは基本的なルーチンに従うだけです。

LISP は主に、DARPA チャレンジに参加したような研究用ロボットで使用されています。これらのタイプのロボットには、産業用または商用ロボットよりも多くの「知性」が必要です。

于 2009-10-21T17:35:45.683 に答える
0
  • ほとんどのOSは「C」であるため、組み込みシステムには最小限のOSと単純な(常にではない)アプリケーションが必要です。これは当然の選択です。

  • 処理/メモリ リソースの不足を非常に低レベルから強制的に最適化します。C (C++ よりも優れている) には最適化の範囲が広い

于 2009-10-22T17:24:27.903 に答える
0

Java は今年、FIRST ロボティクス コンペティションのプログラミング オプションとして採用され、新たなマイルストーンを達成しました。FRC は、世界中の 77,000 人を超える高校生、メンター、ボランティアが参加する印象的なコンテストで、6 週間で 120 ポンドのロボットを構築します。これに関するいくつかの結果をブログに投稿しました。

奇妙な偶然 (またはそうでない) により、元の質問で言及された Sun SPOT と同じ Java VM を使用します。

于 2010-05-07T18:44:43.233 に答える