Haskell、LISP、Schemeなどの関数型言語を使用すると、プログラマは関数型プログラミングパラダイムを使用してすばやく作業できます。それらには非効率性がありますが、私のアプリケーションはプログラム自体の効率よりもプログラマーの効率性を重視しています。
マイクロコントローラーで関数型プログラミングを使用して、マシン制御などを行いたい
最小システムリソースなど、どのような制限がありますか?
これらの言語の実装例は何ですか?
Haskell、LISP、Schemeなどの関数型言語を使用すると、プログラマは関数型プログラミングパラダイムを使用してすばやく作業できます。それらには非効率性がありますが、私のアプリケーションはプログラム自体の効率よりもプログラマーの効率性を重視しています。
マイクロコントローラーで関数型プログラミングを使用して、マシン制御などを行いたい
最小システムリソースなど、どのような制限がありますか?
これらの言語の実装例は何ですか?
回答:
ARMPIT SCHEMEは、ARMコアを備えたRISCマイクロコントローラーで実行されるScheme言語(Lispの字句スコープの方言)のインタープリターです。これは、アルゴリズム言語スキームに関する改訂レポート(r5rs)の説明に基づいており、一部の拡張(I / O用)と一部の省略(MCUメモリ内に収まるように)が含まれています。さらに、マルチタスクとマルチプロセッシングをサポートするように設計されています。脇の下スキームは、制御と計測のコースでの学生プロジェクト、またはマイクロコントローラが必要なキャップストーン設計コースを含む教育の設定に適していると予想されます。MCU(例:BASICおよびFORTH)で利用可能な解釈言語の範囲を充実させることを意図しており、MCUベースのバイトコードインタープリター(例:SchemeまたはJava)およびコンパイル言語(例:C)の代替となります。
http://armpit.sourceforge.net/
あなたは言う:
C、C ++、アセンブリなどの使用は、Haskell、LISP、Schemeなどの言語に比べて非常に効率が悪い
高水準言語を使用すると、プログラマーの時間をより効率的に使用できますが、多くの場合、コンピューティングリソースを効率的に使用できなくなります。大量生産された組み込みシステムでは、多くの場合、コストとパフォーマンスが開発作業よりも優先されます。
また、http: //leepike.wordpress.com/2010/12/18/haskell-and-hardware-for-the-holidays/のように、Atom / Copilotを使用してHaskellでAVRコントローラーをプログラムすることもできます。
C、C ++、およびアセンブリは、すべて機械語に非常に近いものです。より高いレベルの言語を使用することにより、より迅速/簡単/などの開発と引き換えに追加のオーバーヘッドが追加されます。
マイクロコントローラーの大部分は、まだ8ビットおよび16ビットデバイスです(ただし、これは徐々に変化しています)。これまでに他の回答で言及されている高レベル言語の2つのインスタンス(SchemeとPython)は、どちらも32ビットARMコアで実行されています。小型の8ビットおよび16ビットデバイス(わずか数ドルの費用がかかる場合があります)には、言及されている言語をサポートするのに十分なRAMがありません。通常、数KBのRAMしかありません。
また、これらの高レベル言語は、低レイテンシの割り込みハンドラなどを作成するようには設計されていません。マイクロコントローラー割り込みハンドラーが毎秒数百または数千回呼び出され、そのたびに数十マイクロ秒以下でタスクを実行するのに必要なことは珍しくありません。
Lua言語で機能的なプログラミングを行うことは可能です。実際、Luaはマルチパラダイム言語です。ウィキペディアは、それが「スクリプト、命令型、機能的、オブジェクト指向、プロトタイプベース」の言語であると主張しています。この言語は単一のパラダイムを強制するのではなく、状況に応じてどのようなパラダイムでも適用できるようにプログラマーが実装できるほど柔軟です。Schemeの影響を受けています。
Luaの機能には 、関数型プログラミングに役立つ一流の関数、レキシカルスコープ、クロージャ、コルーチンが含まれます。これらの機能がどのように使用されているかは、関数型プログラミング専用のページがある Luaユーザーwikiで確認できます。また、このGoogle Codeプロジェクトに出くわしましたが、使用していません(あなたが言及した別の言語であるHaskellの影響を受けていると主張しています)。
eLuaは、ARM7TMDI、Cortex-M3、ARM966E-S、およびAVR32アーキテクチャ向けの多数の開発ボード用に構成された実装であり、独自のプラットフォーム用に構成できるようにオープンソースです。LuaはANSI Cで実装されており、ソース全体の重量は200kB未満なので、ほとんどのプラットフォーム向けにCコンパイラを使用してビルドできるはずです。少なくとも128kのフラッシュと32kのRAMが推奨されます。現時点では、PIC32ポートの作業を行っています(ただし、「Get the PIC32 board」の段階です)。
Luaの素晴らしい点は、グルー言語として設計されているため、高速である必要のあるもの(割り込みなど)のC拡張を非常に簡単に記述でき、言語の動的な解釈された機能を使用して迅速に処理できることですプログラムロジックの開発。
Luaは純粋に機能的な言語ではありませんが、多くの機能プログラミングを行うことができ、高速で小さく(他のスクリプト言語と比較して)、プログラムを試すためにデバイスを再フラッシュする必要はありません。インタラクティブな通訳さえあります!
「難しい問題を解決するために、MCUの関数型言語で関数型プログラミングを行う方法はありますか?」
はい、方法があります。ただし、欠点は、32ビットプロセッサ、MMU、128MB RAM、SSD、RTOS、および$$$が必要なことです。
マイクロコントローラーは、マイクロプロセッサーとは異なります。マイクロコントローラは8ビットCPU、1K RAM、8K ROMのみですが、UART、PWM、ADCなどが組み込まれています。価格はわずか1.30ドルです。
そのため、すべての高水準言語を実行することもできますが、作成にはさらに多くの費用がかかります。
この本は、FPの軽い感じでプログラミングを行う方法を提供します。 http://www.state-machine.com/psicc2/
しかし、実際のFPには、実行時に関数を構築し、プログラムに渡す機能が必要です。ここに問題があります:この構築された関数をどのように表現できますか?そして、どのようにこの機能を効果的に実行できますか 大規模なシステムでは、最初の関数アプリケーションで実際のマシンコードを生成する動的コンパイルを使用できます。MCUには、Forth言語コアのような非常に原始的なコンパイラを実装するためのRAMしかありません。
あなたがそれを好む場合は、FPまたはOOPを使用することができる唯一の方法は、メタプログラミング:書き込み、複雑な機能/のOOPのMCU用のプログラムを生成するプログラム(例えばCのソースコード、またはLLVM IL)を。この変形では、パラダイムやプログラミング方法の複雑さに制限されません。