はじめに


逐次拡張型インタラクティブ開発環境を作成しました。iMops (アイ・モップス)という名前です。無料ソフトウェアです。
ここからダウンロードできます。現在のバージョンは2.23です(2022/2/5)。
Macintoshコンピュータ(MacOS[X])専用ですが、相当程度最適化されたx86-64マシンコードを生成します。インタラクティブに一語一語(=各関数毎に)コンパイル-解釈実行できます。JITコンパイラとかいうものになるのでしょうか。Cocoaなど一般の動的フレームワークにリンクできます。単独で起動可能なアプリケーションを作ることもできます。64ビットのみですが動的ライブラリも生成できます。最新のmacOS上でも稼働するようです(確認済)。(なお、Apple社が、Macの全CPUを二年でARM仕様に変更すると宣言したことに対応して、ARM64ビットネイティブのMopsの開発計画が進行中です。)

専門家でも技術者でも学生でもプログラミング言語オタクでもないもの(自分)がそんなことをするのは、ひょっとしたら珍しいことなのかも知れないと思い、何かの役に立つかも知れないと考えて、ここにアレコレ書き留めることにしました。コンパイラは特に専門家でなくても1人でつくれるのだよ、と。(いずれ、iPadやWindows、Linux機にもポートしたいです。ARM型のCPU(Apple Silicon)へのネイティブ化はMichealさんが進めています。新しい理論で効率化されたコンパイラなので、かなりの高性能が期待できます。当面はRosettaで動くかも知れませんが、iMopsは一応の役割を終えることとなります。)

言語はForth(フォース)を基盤としたオブジェクト指向言語Mops(モップス)です。自前で設計した言語ではありません
Forth言語(Fortranではありません)はご存知ない方も多いかも知れません — ウン十年前はかなり有名だったようなのですが — が、かなり特殊な言語で、標準的なプログラミング言語理論で当然の前提とされている事柄から離れてみないと、なかなかその特性は理解しにくいようです。ですが一旦わかってしまえば、これほど単純明快で簡単な言語も少ないのではないかと思います。知識豊富な方はアレコレ喧伝されている特徴をご存知かもしれませんが、ここで対象とするものは汎用開発環境で、上でも触れたようにマシンコードコンパイラ方式であって、GUIアプリケーションでも、他言語のインタープリタ/コンパイラでも、コンピュータソフトウェアなら基本的に何でもつくることができます。実際、iMopsもPowerMops(PowerPCネイティブのMops)上で構築されました(他にコンパイラは使っていません)。クロスコンパイルなどとも呼ばれるようです。現在はiMopsの核部分はiMops自身で構築されています。セルフコンパイルということになります。そのようなわけで、実装に利用する言語も実装される言語もMopsということになります。

Mops言語はそれ自体で成熟した言語であってforthのオブジェクト指向拡張とは最早いえません。forthの完備なスーパーセットとなることを意図したものでもありません。ですが、Mops開発環境はforthのごく基本的な部分であればそのままコンパイル・実行することができます(コア、およびコア エクステンションに属するワードは完備)。インタラクティブ開発環境であるため、簡単なテキストエディタは組み込まれていますが、ある程度長いプログラムを書いて保存するにはテキストエディタが必要です。普通のテキストエディターがあればソースコードを書くことはできます(UTF-8推奨)が、iMops上で構築された簡単なテキストエディタ(iBucket)も付属しています。Apple Eventよる通信機能もついているので、ごく単純なIDEとなっています。文字コードは、英語アルファベットの互換性を考慮して、内部的にはUTF-8で動作するようになっています。漢字ひらがなの文字列もワード名も可能です。(日本語入力を受け付けるforth系環境はあまりないらしいので、ちょっと宣伝。)

Mopsのオブジェクトは、グローバルデータ域(辞書)にも、スタックフレーム内にも、ヒープブロックにも生成することができます。ヒープオブジェクトに対応してガーベージ・コレクター機能もついています。Mopsのオブジェクト指向システムで最も特徴的なのは、メッセージのバインド方法が、静的束縛、動的束縛1(VTable)、動的束縛2(キャッシュ付き検索)の三つの中から、呼び出しの形式で任意に選択できることです。加えて、インスタンス変数のそれぞれが一個のクラスの機能を完全に備えており、静的束縛でもメッセージを送ることができるため、クラスの中に別のクラスを埋め込むかのような働きが得られます。そして、インスタンス変数間相互のメッセージの交換も実行速度のペナルティー無しで行うことができます。こういった特徴を利用して、Mopsでは非常に柔軟で軽快高速なオブジェクト指向プログラムを作成することができるのです。また、単独実行可能なアプリケーションを構築する機能もついています。実際、付属のiBucketはその方法でビルドされました。

なお、コンピュータ科学界隈でMOPsというと、メタオブジェクトプロトコルズ(Metaobject Protocols)ということになるようです。ですが、こちらの"Mops"という名前は、開発者であるMichael Horeさんによれば、Mike's object-oriented programming system から採ったとされています。 そのように命名についてはメタオブジェクト・プロトコルと相互関連はないとされていますが、実は内容的には奇しくも深く関連しているようです(私見)。メタナントカに言及するときはMOPと全部大文字にして、こちらの言語の方はMopsと、最初だけ大文字で書くということにします。

ともあれ、Forth言語の基本なども含めて、だらだら書き足していくこととします。

追記:
Forth言語の入門書は、日本語のものは全て絶版で古書も高価なようで、また、ネットをみても、Forth言語に関して日本語の概説的なものは、ちょっと手薄なのではないかという気がしました。(いや、結構あるな。まあ、いいか。)
そこで、僭越ながら、Forth言語の概説のようなものを書くということをここで試みてみようと思います。というより、中心をそちらにシフトしようかな、と。
最新の規格候補(Forth200x)を基としつつ、Mops(原型はForth83に準拠)の変異を混ぜるという方式でいきたいと思います。実装法についても書きます。
Forthは仕様が簡単な言語だから、、、とか思って始めたけれども、書いてみると長くなってしまうのである。ふむ。それより誰か見る人いるんですかね..
Forth解説の本を出してみたいなあ。需要は無いでしょうけど。

さらに追記:
Mopsの紹介をしているホームページのサービスが終了してしまうそうなので、ここの姉妹サイトとして作り始めました。
Nao's Mops Page @wikiとなります。有用と思われるものは一応すべて移動しました(2019/1/17)。



最終更新:2022年02月05日 23:12