概要


 マイクロコントローラを用いた小規模のシステムを開発する際に、大掛かりな開発環境の扱いに難儀することがあります。また、数年後にプログラムをコンパイルしてみると、その間の開発環境の更新によって以前とは異なる実行コードが生成され、僅かな修正にも関わらず検証に悩まされます。
 かねてより、数十~数百ステップの処理のために複雑巨大なコンパイラや開発環境に依存し、プログラム記述との対応が難しい機械語コードを生成する開発スタイルに疑問を感じていました。

 ここで紹介する技術は、高級言語によるプログラム記述の構造を維持したままハードウェア実行する簡素な処理系です。後置記法で記された各語を1~3バイトの機械語命令に同順置換し、リターンスタックを強化したスタックマシンで実行します。
 プログラミング言語は FORTH を進化させたものですが、再帰処理の最適化は Postscript を参考に実装しました。コンパイラで構文解析を行わず、すべてのフロー制御を実行系のリターンスタック操作に委ねるところが特徴です。実装は軽量ですが、C言語での制御構文の goto を除くすべてを備えています。
 既存プロセッサ上ではコンパイラに2Kバイト、仮想スタックマシンに2~3Kバイトを要しインタープリタ実行も低速ですが、FPGAであれば16ビットの専用スタックマシンと内部ブロックRAMのみで言語処理系も含めた環境が揃い、高速実行が可能です。



 言語環境をシステムに内蔵することで、長期的な保守や運用現場でのカスタマイズが容易になるとともに、多数のプロセッサからなる分散システムをスクリプト記述のみで制御するなどの応用も考えられます。

 当初、ソフトウェアからハードウェアへのシームレスな移行方法としてアカデミアの方々に問うてみたところ、さんざん酷評されたので、手軽なマイコン学習教材として開発を進めました(平成17年度の未踏ソフトウェア創造事業)。
 これまでに学校、企業に数百台納入しましたが、逆ポーランド表記への違和感のためか、記述から実行に至る見通しのよさがほとんど評価されていないようです。。

 経緯


 手始めに、マイクロチップ社のマイコン PIC16F88(ROM 4K語,RAM 368バイト)に実装しました。コンパイル時に RAM に辞書を置くため、大きなプログラムは扱えません。また、RAM 領域が分断されている上に間接参照の効率が悪く、かなりのオーバーヘッドがあります。8王妃問題や円周率計算(約100桁)などが動きます。某大学の授業で1時間ほどさまざまな制御のデモを行いました。書き込み器も要らず、メモ帳で書いたプログラムをハイパーターミナルで転送、実行する流れで、スムーズに実演できました。



 また、ルネサステクノロジ社の R8C/Tiny に移植しました。これらの実装は、CQ出版の第一回ワンチップ・マイコン・デザインコンテストに入賞しました(2006年1月号)。2007年4月号CDに収録されています。学会でも発表しましたが、長期的な保守性の確保に問題意識を持たれる方は少ないようでした。



 その後、Atmel 社の ATmega88 で評価基板を製作し配布しました。8ビットマイコンとしては最も洗練されたアーキテクチャのひとつで、極めて高い実行性能が得られます。基板は RS-232C 接続としたため昨今のPCでは扱いづらいと不評でした。



 他に、ルネサステクノロジの 32ビットプロセッサ M32R にも実装しました。プロセッサ自体はすっきりした命令体系で実行性能も高いのですが、仮想スタックマシンでは細粒度のスレッドが多発するためパイプライン崩れのペナルティが大きく、期待したほどの結果は得られませんでした。R8C/Tiny も含め、分岐コストが高めのアーキテクチャには向かないようです。



 ATmega88 の評価基板にマトリクスLEDなどを拡張し、USB インターフェースを装備した基板を作成しました。USB 接続を安上がりに済ませようと汎用プロセッサ(ATtiny45)を使いましたが、安定させるまでにその後の数年を要しました。この技術(AVR-CDC)は海外で広く使われています。基板は修正を重ね、製品化(ForCy-USB)しました。下の写真は Circuit Cellar 社のデザインコンテストに出品したモデルですが、メールトラブルで選考に間に合わず、選外扱いで特別賞(参加賞?)と寸志をいただきました。



 中間コードを仮想マシンで動かすのでなく、ネイティブコードとして実行できるプロセッサをFPGAに搭載しました。Spartan-II に実装しましたが、基本設計が未熟なため命令デコーダが複雑かつ非効率になり、デバッグに手間取りました(ET2007出展)。その後、Spartan-3E に再実装し、ブロックRAM のひとつ(2KB)にコンパイラを置いて動かしました(IPAX2008出展)。クロックは 33MHz ですが、シミュレーションでは倍ぐらいは問題なさそうです。インタープリタ実行に比べ10倍ほど高速化しました(AVR 上の仮想マシンとの同クロック換算比)。

   


 現在は、言語処理系の見直しを進めています。規模の大きな開発に向けてコードをモジュール化し易いよう、変数・関数のスコープ制御を含め、辞書管理の拡張などを行っています。

※旧いページを整理中です。しばらくお待ちください。