6
2

日本語プログラミング言語MindをAndroidに移植した時の記録(ステップ1/9)

Last updated at Posted at 2024-02-19

はじめに

 この記事はだいぶ前(2012年)にココログの「キリーの日本語プログラミング」に掲載したコラムですが、再編集してこちらにも投稿します。今となっては古い話ではありますが、OSによってプログラム言語(AndroidではJava)が決め打ちされている環境で規定と異なるもの(Mind)を走らせたことの記録としてお読みください。

AndroidでMindを動かす最初のステップ

 AndroidでMindを動かしたいと思ってからもう1年半ほど経ってしまった(編集注:この時点で2012年)がようやく最初のステップまで来た。
 本当に文字通り「動いた」だけで まだほんの序の口に過ぎない(^^;

s41hwscreenshotmindok20120417_2.png

↓ソースコード

メインとは
    「こんにちは。Mindです。」を  簡易メッセージ表示する。

 実は「簡易メッセージ表示」の中でセンタリングやら色付けやらやっていてその値も固定なので、あくまで「とりあえず」のもの。本当はもう少し長いコードになるはず。

開発環境

 開発環境は2012年設置。当初はWindows環境で始めたが将来のオンラインでの開発サービスを考え、Linuxに切り換えた。

標準ツール

OS: Red Hat Enterprise Linux 5.2
(注:OSは64bit走行, Mindの開発ツールは32bit走行)

Java: JDK 6 (javacのバージョン 1.6.0_31)

Android SDK: r18 (注:Eclipseは使わずコンソールベースで行う)

Android NDK(Native Development Kit): r8b
(Native開発環境 C言語で記述できるように)

ant: 1.8.4
(NDKをコンソールベースで行うのに必要)

自作ツール

Linux版Mindで作成(コンソールでの開発を容易にする)

createavd/deleteavd avdの作成/削除を容易にする
createproj プロジェクトの作成を容易にする
genjnicode/genjnihead Cのスケルトンやヘッダを出力
installcur/uninstallcur パッケージのインストール・アンインストールを容易にする
makecur パッケージのmakeを容易にする

AndroidでMindをどうやって動かすか(1)

 Mindは(Windows,Linuxとも)だいぶ以前から、コンパイラが「Mコード」と呼ぶ中間コードを生成し、(Mindで言う)「カーネル」の中にある「ディスパッチャ」と呼ぶごく小さなルーチンがそれを逐次実行する方式になっている。

 たとえばMindのオブジェクトコードは拡張子が .mco というバイナリファイルになっていおり、OSから見ると単なるデータファイルのように見えるがこれがプログラムの本体である。
 検討初期からAndroidでも基本的にこの機構のまま行けるだろうと思った。
 ちなみに現段階ではコンパイラはAndroid向けを別途作ったわけではなく、LinuxのMindコンパイラをそのまま使っている。
 MコードがOS非依存になっているおかげである。(将来的には内部の文字コードの関係から別開発の必要が生じるかも知れないが)

 Androidではプログラム記述がJava必須となっている。しかし JNIという機構があり部分的に C, C++ で記述できることになっている。一方、現行のMindは「カーネル」(ディスパッチャやプリミティブな機能の定義部分)が C記述であるため、C を媒介にすることで間接的にMindを動かすことができるだろうと考えた。

 Java, C, Mind の処理分担を図で示すと以下のようになる。

001_3_cut_3.png

 図では三つが同じ分量のように見えるが、当然ながらユーザが記述したプログラムはMindのコードとなるため、プログラム規模が一定以上あればMindのコードが多くを占めることになる。
 これは重要な点だが、MindのソースコードをCやJavaに変換するわけではない。 CやJavaのプログラムも使うのは確かだが、それらはMindの実行時、最下位レベルではCPUやOSを駆動する必要からそこを経由するに過ぎない。

文字コードについて

 今のところ内部処理はLinux版のMindを(コンパイラ、ランタイムライブラリとも)そのままEUCコードで走らせており、Android側との境界でUTF-8に変換している。
 本来であればMindの内部処理もUnicodeにしておけば良いのだが、Mindの利点である高度な文字列操作を行うには同じUnicodeでも固定幅コード(Mindの実績ではUCS2)を使う必要があるため、Androidとの境界でコード変換が必要(たとえば UTF-8 ←→ UCS2)という点では変わりない。

つづく

 Mindユーザーの@mylifewithviolinさんがMindコンパイラの内部に興味を持たれているようなので参考情報として投稿してみました。本記事はしばらくつづきます。次は(ステップ2/9)。

6
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2