Cmod A7ボード(FPGA)を使って開発しているオリジナル16ビットCPUコアMoscoviumの開発環境は、アセンブラです。筆者の実力では、GCCやClang(LLVM)等への適応は困難だったから、ですm(1__;)m。
止む無く、別な解も探っていました。今回、一筋の光が見えたので、GCCやClang等のC言語コンパイラ適応は諦めて、別な解を模索して行きたいと思います。
アセンブラは、言語としての抽象度が低いため、全ての処理を一々人間が頭で考えてプログラムしなくてはなりません。
MoscoviumシリーズCPUコアで言えば、8個しかないCPU汎用レジスタ(汎用レジスタバンクは除外)を使って、全てのデータを転送・演算しなくてはならず、数10個の変数を駆使して作成する複雑なプログラムの場合:
全て人間が、具体的に管理しなくては、なりません。
具体的 ⇔ 抽象的
アセンブラは、具体的に細かな処理を記述しなくては、ならないので、一般に「抽象度が低い」と言われます。逆の言い方をすると、「具体度が高い」と、なるのですが、あまり、こちらの表現は聞いたことが無いので、本ページでは「抽象度」で統一します。
では、「抽象度が高い」とは?どういう言語を指すのでしょうか?
抽象度が高い言語:
等が挙げられます。C言語などの高級言語を指して、「抽象度の高い言語処理系」等と呼びます。
アセンブラという言語に戻ると、抽象度の低い言語であるが故、何をするにも面倒なのです。
ちょっと複雑なプログラムを組もうとすると、
こんなことの連続です……。
アセンブラを使ったプログラミングに於いて良い事と言えば、全てを人間が考えて最適な割り当てでプログラムできるので、実行速度を高速にできたり、コードサイズを最小化できたりする事を挙げることができます。
ただし、プログラム単位が小さい事が条件と、なります。
プログラム単位が大きくなってくると、人間では、プログラム全体を見てコードを最適化することが困難となるため、GCCやClangなどのコンパイラに及ばなくなってしまう為です。
例えば、
そういう、プログラム単位の小さな、ライブラリ関数等を記述する場合に有効なのが、アセンブラ言語なのです。
Moscoviumシリーズには、強力なマクロアセンブラが存在しているので、抽象度の低い、アセンブラでの開発環境に関しては、憂いなしです。
※スクリプト(インタープリタ)処理のため、アセンブル時間が長いことは、短所ではありますが……。
今回のテーマは、Moscoviumに於いて、抽象度の高い開発環境を立ち上げる事なのです。まず考えたのは、GCCやClangなどのコンパイラに対応させる事だったのですが、これは、筆者の実力では無理、でした……。
これまで、何度かトライしては見たのですが、まず、最初の取っ掛かりが見つかりません……。一体、どこから手を付けて良いものか?トライする度に跳ね返されて、ホトホト疲れました。
そうこうしている内に、とても面白く、興味深い開発環境に出会ったのです。それは、Blocklyと言う開発環境です。
Google Blockly公式HP(別ウインドウが開きます)
Blocklyは、Google社が提供する、グラフィカルにブロック🧩を組み上げることでプログラムを開発できる、ビジュアルプログラミング開発環境です。
Blockly開発環境は、ウェブブラウザ上でJava Scriptを使って記述されており、オープンソースでフリーに使用することができます。比較的緩い条件(Apache License 2.0)で、メーカ毎にカスタマイズして提供する事が可能なため、色々な開発環境に展開されている様です。
展開されている多くの開発環境では、Blocklyで開発したプログラムをJava ScriptやPython等のスクリプト言語に変換する物が多い様です。
筆者がBlocklyと出会うきっかけとなった、M5StickC Plusの開発環境がUIFlowです。ブロックを使ったプログラミングは兎に角、楽しくて嵌まってしまいました(1^^;)っ。
UIFlowでは、プログラムがPythonと言うスクリプト言語に変換されるので、M5StickC Plus側では、恐らく、Python処理系(ファームウェア)がFlashメモリに書き込まれており、変換されたPythonプログラムを実行しているのだと考えられます。
ここで、BlocklyからPythonへの変換は、ほぼ一対一に変換されている事に注目しました。所謂、「コード最適化」というものは一切実行されていない、ということです。
上図左側がUIFlowによるフィボナッチ数列計算プログラム、上図右側はPythonソースリストに変換して表示した物です。
上の例だと、プログラムが単純すぎて、「最適化」しようにも、する場所が無い」のだけど、ブロックで記述した通りの順番で、記述した通りのコードが一対一に出力されているイメージを掴むことは容易でしょう。
もし皆様がUIFlowをお使いなら、実際にプログラムを変更して、試してみてください。
でもUIFlowでは、愚直に「numc=100+20」というPythonコードに変換されます。
Blocklyは、アセンブラと比べると、ずっと抽象度の高い開発環境なので、今回のテーマに沿っています。
残念ながら、コード最適化には未対応なため、処理速度やコードサイズの点では、褒められたコードを出力できません。
だけど、そこが良いのです!
最適化という処理は、とても高度で、とても複雑なので、そこに切り込んでいくと、果てしなく沼に嵌まり、良くても抜け出せなくなります。悪くすると足を取られて、そのまま泥の中に沈み、命を落としかねません……。
筆者が何度か、GCCやClangに挑んで生還できなかったのも、そういう所であろうと考察しています。
その点、最適化を実行しないBlocklyであれば、愚直に、1個1個のブロックをアセンブラに変換して行けば良いのですから、「プログラム単位の小さな」ライブラリ関数等をアセンブラで記述するのと同じレベルに踏みとどまることができます。
アセンブラと比べると:
命令コードの最適化は実行しないため、サイズや実行速度優先なプログラムであれば、ゴリゴリとアセンブラで組めば宜しい。
今回のテーマ・目的には合致する訳です。
では、ここからは、BlocklyからMoscoviumアセンブラソースリストへ変換する方法について考察して行きたいと思います。
正道としては、GoogleのBlockly環境をローカルディスク上に複製してきて、必要なコード変換処理関数などをMoscoviumアセンブラ用に追加、もしくは修正して行くのでありましょう。
しかし、これは一筋縄では行きません。
前節で例として示した「沼」と同じです。大規模なBlockly処理系全体を、今から読み解いて理解していたのでは、時間がいくら有っても足りません。
この方法は効率が悪すぎます。却下!
基本的にBlocklyの開発環境は、インターネットのクラウド上に展開され、プログラム自体をローカルディスクに保存する事は意識されていません。
しかし、Blocklyの内部表現としては、XML(Extensible Markup Language)という形式で、ブロックのプログラム情報を保持しているみたいです
サードパーティが展開するBlockly系開発環境では、XML形式でプログラムをローカルディスクへ保存できるようになっている物を多く見かけます。
XMLについて検索する(別ウインドウが開きます)
今回は、このXMLに着目して、XML → Moscoviumアセンブラ変換ソフトウェアを作成しようと思います。XMLは基本的にテキストベースの記録方式であるため、取り扱い易いことも肯定的に働きます。
ただ、困った事に、Blocklyの内部形式であるXMLは、明確な定義(仕様)か存在しないため、展開する各サードパーティ毎に、方言が存在します。全ての方言に対応するのはAIにでも学習させない限り、無理です。
このため、Moscovium用としては、ターゲットとするBlockly開発環境を固定しなくてはなりません。
================================ BlocklyDuinoページで作成したXMLファイルの対応は、廃止しました。 ================================ |
現在、Google Blocklyデモ環境のエディタを使用可能ですので、こちらの記事「#31-6 Moscoviumの開発環境(カスカス)」をご確認ください。 |
Blocklyに関して色々と検索している内に、BlocklyDuinoという環境を見つけました(以下リンク)。
BlocklyDuinoへのリンク(別ウインドウが開きます)
Blocklyを使って作成したプログラムを、Arduino IDEのプログラム(INO)ファイル(C言語)に変換してくれるサイトです。上のリンク先がほぼ、トップページなのですが、Blocklyのエディタだけが稼働しており、誰がどんな目的で作ったサイトなのか?等、定かではありません……。
Blocklyで作成したプログラムをArduino IDEでコンパイルして、Arduino UNOやDUEをはじめ、Arduino IDEに対応した多くのマイコンボードへコンパイル&書き込みすることができるようになります。今回はそれが目的ではなく、Moscoviumアセンブラへ変換することが目的です。
作成したプログラムは、ArduinoのINOファイル形式に変換できる他、XML形式でローカルディスクへ保存/読み出しができる様になっています。右上の「雲↓」アイコンをクリックして、作成したプログラムをXML形式で保存しましょう。ファイル名は指定できない様なので、保存した後で、リネームすれば良いでしょう。
以上で、BlocklyDuinoが出力するXMLファイルを読み込んで、Moscoviumアセンブラソースリストへ変換するプログラムを作成する事に帰着できました。
M5StickC PlusでUIFlowを使う度に書いているのですが、ブロックを使ったプログラミングは、すごく楽しいのです。もう少しで、オリジナル16ビットCPUコアMoscoviumでもBlocklyを使ってプログラミングできるようになると思うと、ワクワクしています。次回に乞うご期待です。