MCUを使用した関数型プログラミング


12

Haskell、LISP、Schemeなどの関数型言語を使用すると、プログラマは関数型プログラミングパラダイムを使用してすばやく作業できます。それらには非効率性がありますが、私のアプリケーションはプログラム自体の効率よりもプログラマーの効率性を重視しています。

マイクロコントローラーで関数型プログラミングを使用して、マシン制御などを行いたい

最小システムリソースなど、どのような制限がありますか?
これらの言語の実装例は何ですか?


1
あなたの質問がされている場合は、「それはプログラムに価値はありません任意の最も強力なプログラミング言語を機械にあなたは、上のあなたの手を得ることができ、」C ++Javaの質問は(OOPではなく、関数型プログラミングについて)読んで推奨されています。
ケビンフェルメール

1
あなたの最初の段落は議論の余地があり、それはあなたにいくつかの近い投票をもたらしました。より受動的な表現(「機械制御に関数型プログラミングを使用することに興味があります。組み込みシステム用のHaskell / LISP / Scheme実装の例」)または完全に削除することを検討してください。
ケビンフェルメール

2
私はあなたの「非効率的な」声明を買いません。あなたは愛好家/プロトタイプ側に極端な偏見を示しているようです-低ボリューム(別名:1)。C / C ++ / asmは、十分な速度とスペースでプロセッサを使用できる場合、数千倍または数百万倍に増幅される、より小さくて高速なコードをもたらします。埋め込みが埋め込まれています。汎用OSでプログラミングしているわけではありません。
ニックT

4
@Nick T-「C / C ++ / asmは、十分な速度とスペースでプロセッサを使用できる場合、数千または数百万倍に増幅される、より小さくて高速なコードをもたらします」-メンテナンスについてはどうですか?関数型言語は、Cプログラムが行うのに10秒を必要とすることを1行で頻繁に実行できるため、バグの余地が少なくなります。さらに、それらをコンパイル(つまりHaskell)し、ターゲット上で実行させることができます。これはインタープリターよりも高速です。コンパイルされたHaskellも同じくらい速いが、Cアプリを言うよりも開発が速いので、このトピックを少し探求したかった。現状について少し質問したかった。
J.ポルファー

1
@Sheepsimulator残念ながら、あなたの最後のコメントのようなコメントはこの議論のような質問をします。
ケレンブ

回答:


11

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などの言語に比べて非常に効率が悪い

高水準言語を使用すると、プログラマーの時間をより効率的に使用できますが、多くの場合、コンピューティングリソースを効率的に使用できなくなります。大量生産された組み込みシステムでは、多くの場合、コストとパフォーマンスが開発作業よりも優先されます。


7

また、http: //leepike.wordpress.com/2010/12/18/haskell-and-hardware-for-the-holidays/のように、Atom / Copilotを使用してHaskellでAVRコントローラーをプログラムすることもできます。


2
Haskellは本当に良いものです<3
TrygveLaugstøl12年

5

C、C ++、およびアセンブリは、すべて機械語に非常に近いものです。より高いレベルの言語を使用することにより、より迅速/簡単/などの開発と引き換えに追加のオーバーヘッドが追加されます。


3
-1:この答えに本当に同意しません。アセンブリに関するあなたの権利は機械語に近いものですが、CとC ++は非常に異なる高レベル言語です。
BG100

1
@ BG100、私は実際に「高レベル/低レベル」の線をCのどこかに描画するのではなく、単に高レベル言語と呼びます。算術演算、ポインター(文字列)操作、およびその他の一般的な基本タスクを実行する場合、コンパイラーが一般に生成する命令は、抽象化レイヤーなしでCPUがデータを直接操作します。
ニックT

@ニックT:あなたのポイントはわかりますが、これを考慮してください:一般的にできるだけ早く実行する必要がある割り込みルーチンを書くと、Cでは実行にどれくらい時間がかかるかわかりませんが、アセンブラではできます指示を数えるだけです。低レベルでは、プログラムでEXACTLYが実行されていることを知っていると思います。Cを使用している場合、これは確かではありません
。– BG100

@ BG100:同じアセンブラー命令は、オペランドとそれらのアドレス指定モードに基づいて実行するために異なるサイクル数を取ることができます。Cではありますが、コンパイルすると、変更されない(できない)静的コードが得られます。確かに、...これはやや希薄な引数ですが、私たちは大きな赤い線を描画しようとする特徴点を議論するつもりなら
ニック・T

3

私は最近PythonでARMボードをプログラミングしてきましたが、それは素晴らしいと思います。リアルタイム制御には向いていませんが、私はより多くのWeb関連のことをやっています。これは、Cよりも高級言語のほうがはるかに快適です。


3

マイクロコントローラーの大部分は、まだ8ビットおよび16ビットデバイスです(ただし、これは徐々に変化しています)。これまでに他の回答で言及されている高レベル言語の2つのインスタンス(SchemeとPython)は、どちらも32ビットARMコアで実行されています。小型の8ビットおよび16ビットデバイス(わずか数ドルの費用がかかる場合があります)には、言及されている言語をサポートするのに十分なRAMがありません。通常、数KBのRAMしかありません。

また、これらの高レベル言語は、低レイテンシの割り込みハンドラなどを作成するようには設計されていません。マイクロコントローラー割り込みハンドラーが毎秒数百または数千回呼び出され、そのたびに数十マイクロ秒以下でタスクを実行するのに必要なことは珍しくありません。


1
スキームは、70年代半ばから80年代初期に開発されました。Schemeは32ビットプロセッサまたはメガバイトのメモリを必要としません。Schemeは80年代半ばにATクラスのPCで利用できました。最近の実装は、よりリソースが豊富な環境向けに最適化される可能性がありますが、今日の「最小の」コンピューティングプラットフォームで実行されるスキームの明確な例があります。
ザフォトン

@ThePhoton私は立ち直った。数十KBのメモリ(ほとんどの小型マイクロコントローラーで利用可能なものを超える)を搭載したプロセッサーを対象とするBITプロジェクトを知っていましたが、モントリオール大学とラヴァル大学の学生が設計したPICBITを発見しました。実際のSchemeプログラムは、わずか2KのRAMでPICプロセッサ上で実行できます。すごい。
tcrosley

3

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は純粋に機能的な言語ではありませんが、多くの機能プログラミングを行うことができ、高速で小さく(他のスクリプト言語と比較して)、プログラムを試すためにデバイスを再フラッシュする必要はありません。インタラクティブな通訳さえあります!


1

「難しい問題を解決するために、MCUの関数型言語で関数型プログラミングを行う方法はありますか?」

はい、方法があります。ただし、欠点は、32ビットプロセッサ、MMU、128MB RAM、SSD、RTOS、および$$$が必要なことです。

マイクロコントローラーは、マイクロプロセッサーとは異なります。マイクロコントローラは8ビットCPU、1K RAM、8K ROMのみですが、UART、PWM、ADCなどが組み込まれています。価格はわずか1.30ドルです。

そのため、すべての高水準言語を実行することもできますが、作成にはさらに多くの費用がかかります。


2
マイクロコントローラの定義を再検討する必要があると思います。現在、多くのマイクロコントローラには128kB以上のFlashと64k​​B以上のRAMがあり、小さな言語のインタプリタを実行するのに十分なスペースがあります。組み込みLinuxデバイスの仕様を提供しているようです。OPは専用ポートを要求していたと思います。
ケビンフェルメール

1
8ビットMCUに$ 1.30を支払っている場合、より安価な32ビットMCUがいくつかあります。また、市場に出回っているほとんどの8ビットMCUは、80年代初期から継承された設計を備えた、ひどくコード効率の悪いアーキテクチャであることを考慮してください。
ランディン

0

この本は、FPの軽い感じでプログラミングを行う方法を提供します。 http://www.state-machine.com/psicc2/

しかし、実際のFPには、実行時に関数を構築し、プログラムに渡す機能が必要です。ここに問題があります:この構築された関数をどのように表現できますか?そして、どのようにこの機能を効果的に実行できますか 大規模なシステムでは、最初の関数アプリケーションで実際のマシンコードを生成する動的コンパイルを使用できます。MCUには、Forth言語コアのような非常に原始的なコンパイラを実装するためのRAMしかありません。

あなたがそれを好む場合は、FPまたはOOPを使用することができる唯一の方法は、メタプログラミング書き込み、複雑な機能/のOOPのMCU用のプログラムを生成するプログラム(例えばCのソースコード、またはLLVM IL)を。この変形では、パラダイムやプログラミング方法の複雑さに制限されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.