コマンドライン、コンソール


現在でも、Forth開発環境の多くは、テキストベースのコマンドラインから操作するものがほとんどである。MacだとTerminal.appから操作することになるし、WindowsだとDOS窓である(近年はなかなか優秀なシェルウィンドウが付いている)。他のLinux等のUNIX系でウィンドウシステムがある場合も、具体的には知らないが、同じようなことになるであろう。要するにシェル内でコマンド操作を実行するのである。
大抵のものは、オプションフラグを許すであろうし、起動時に特定のソースコードを同時にロードする方法もあるであろう。
それぞれの環境にマニュアルがあるはずである。通常は英語と思われるが、それぐらいは自分でドキュメントを探して読むべきである。オープンソースの場合、ソースコードから分ることもある。記憶では、gforthでは、予めコマンドパスを通してgforth(改行)と打ち込むか、実行ファイルまでのファイルパスを全部書いて改行すれば、メッセージとともに起動したと思う。(もっとも、起動する前に、ソースコードからコンパイルしなければいけないものもありますが、ここに汎用マニュアルはかけないので、そこは各自調べてやってください。)

Forthを起動すると、メッセージなどが出た後、コマンドラインにforthのプロンプトが出て、入力待ち状態になる。そこでまず、普通にキーボードからforthのワードを文字入力していくことになる。

そして、改行キーを押すと、その時点で、そのコード行がforthに入力され、解釈実行される。つまり、改行が解釈実行のトリガーになっている。

これに対して、Mopsは初めからMacintoshアプリケーションで、古典的Macにはコマンドラインが無かった。そのため、Mopsでは、テキストエディットフィールドが貼り付いているウィンドウが、コンソールと呼ばれて、基本的なコマンド入力画面となる。
ただし、Mopsでは改行キーは普通に改行するだけで、解釈実行を引き起さない。その代わりにエンター(enter)が解釈実行キーとされている。このように設定された理由は、コンソールにもテキスト編集のときのように改行してコードが書ける方が便利だから、とのことである。
ところが、通常のキーボード操作で改行(return)とエンター(enter)が区別されることは滅多に無く、近年のMacキーボードにはenterキーが無い。
とはいえ、使えなくなったわけではない。fnというキーがあると思うが、そのキーと同時に改行キーを押すとエンターと同値になる。Mopsでは解釈実行には、このfn+returnを使えば良い。

慣れの問題かも知れないが、普通のforthのコマンドラインは、やはりコマンドラインでしかなく、
そこであれこれコードをいじって実行を試すことができるほどの、編集の自由度は感じられない。
いきおい、別途のテキストエディターでソーステキストファイルを編集してロードしつつ試すことになると思われる。
これに対して、Mopsでは、コンソール上でかなり自由にあれこれとコードを編集して試してみるのが普通である。
一行単位で解釈実行することも、テキスト選択して、選択部分だけ解釈実行することもできる。
また、Mopsにはテキストエディターアプリケーションが付属しており、イベントを飛ばして、ワードの実行、コンパイル、ファイルのロード
もできるようになっている。

このサイトのforth解説でコードの解釈実行例がある場合は、各行末に、forthではリターン、Mopsではエンターキーを押していると考えれば良い。

ソースファイルのロード


ある程度長いコードは、テキストエディターでファイルに書いてロードすることになる。
ソースファイルをロードするワードは、INCLUDEである。

INCLUDE  [ファイルパス]

をコマンドラインから入力すればよい。標準forthでは改行、Mopsではエンター(fn+return)である。

ただし、iMopsでは現状(vers. 1.x)、ソースファイルは、iMops配布フォルダ中の"source"というフォルダー内にあることが想定されている(PowerMopsには同種の制限はない)。"source"フォルダ内にサブフォルダをつくって、ファイル検索パスに加えることができる。例えば、Project1というサブフォルダを作って、そこに自分のソースファイルを保存するとする。そこで、

" Project1" ADD-Project

と実行すれば、ファイル名だけでINCLUDEできるようになる。PowerMopsではPreferenceから検索パスを設定できる。

なお、MopsではINCLUDEの同義語としてNEEDがあり、こちらの方が古典的である。また、簡略ワードとして、// も定義されている。フォルダが上のようにしてプロジェクトに加えられていれば、

// [ファイル名]

で、ソースファイルをロードできる。ただし、iMopsでは、このワードは二重ロードを回避する仕組みを省略しているので注意が必要である(NEEDかINCLUDEを使うほうがよい)。

ファイル名やファイルパスは空白を含むこともあり得る。そのため、ロードの命令は、ファイル名を、ワードではなく行単位で識別する。したがって、INCLUDEによるロードの命令は一行毎に行わなければならない。ソースファイル内から別のソースファイルをロードするときにも、1ロードを1行で書かなければならない。途中で改行することも、二つのファイルロードを一行に書くこともできない。

Mopsには無いが、forthには INCLUDE" あるいは、INCLUDEDというワードが定義されているものが多い。これらは、

INCLUDE" [ファイルパス]"

S" [ファイルパス]" INCLUDED

のように使う。二重引用符内をファイルパスとして解釈するので、上のような行の制限は無い。他方、これらのワードを用いる場合は、ディレクトリ名やファイル名が二重引用符を含むことはできない。

スタック状態


開発環境によっては、データスタックの現状がどうなっているのか、コマンドラインからは分からないものもある。そのような場合には、 .S というワードを実行すると良い。スタックの状態を維持したまま、その現状を表示してくれるはずである。

.S   ( -- )   \ スタック状態の表示


なお、ドット . はforthでは印字系のワードによく使う。. が付いていたら、何かを印字するワードだと考えれば、ほぼ間違いない。

ソースコードコメント


ソースコード内にコメントを付ける方法は、丸括弧以外にもある。バックスラッシュ \ は、一行コメントを開始するワードで、バックスラッシュの後、ひとつ空白を空ければ、そこから改行まではコメントになる。

ファイル内の複数行に渡る長いコメントに関しては、環境毎に非常に区々である。おそらくもっとも確実なのは、コンパイラに対する命令である、[IF] , [THEN]を用いる方法であろう。[IF]は、スタックから一つ値を取り、その値が0かどうかを確かめる。0でなければ、解釈実行はそのまま続行される。0であったときには次にある[THEN]までソースコードは読み飛ばされる。したがって、

0 [IF]
<コメント>
<コメント>
<コメント>
[THEN]

とすれば、コメントの部分は解釈実行に影響を与えない。

Forthでは一般に、THENという言葉の使い方が標準的なプログラミング言語と、また英語とも異なっている。
普通は、thenは、ifの条件が成り立ったときに実行すべき部分の前にあるものだが、forthでは、thenというとif-else構文の最後を記すワードである。
これは他言語でのプログラミングに慣れた人にとっては苦痛であるらしいので、注意を要する。
Ifを「括弧開く」として、 then は「括弧閉じ」に当たるのである。

Mopsでは、長いコメントには、(* , *)の対が利用できる。つまり、

(*
<コメント>
<コメント>
<コメント>
*)

のようにすれば、コメント部分は解釈実行上、無視される。この(* *)は入れ子にもできる。

ちなみに、上で説明した[IF]、[THEN]には、[ELSE]もある。[IF] [ELSE] [THEN] の順で使う。
[IF]の前が0であったときは、[ELSE]まで飛ばし、それ以降は解釈実行される。
[IF]の前が0でなかったときは、解釈実行はそのまま続行され、[ELSE]まできたとき、[THEN]までは飛ばされる。

Forth環境の終了


標準的な終了ワードはBYEである。
BYE
これを入力すれば、大抵のforth開発環境は直ちに終了する。

MopsでもBYEは定義されているが、普通にメニューから終了する方が良い。というのは、BYEによる終了は、それまでにコンソールに書き込んだコードを保存せず、直ちに終了してしまうからである。

有名なforth開発環境、いくつか


何でも良いので、forth系の環境をインストールして、実際に試して見た方が習得し易い。Forthはどれも、それほどサイズが大きなシステムではないので、是非、何かインストールすることをお勧めしたい。何かで頭が凝り固まっている人でもなければ、すぐに慣れるし、使い易いことがわかってくると思う。Forthはコード書法がともかく自由なのである。

Gnuプロジェクトに含まれている代表的なforth環境であるGforthは、オープンソースで無料であり、大抵の環境に対応している。ただ、原則、GCCを使って自分でコンパイルしないといけない。
Windows環境であれば、Win32Forthがあり、これも無料である。
Linux環境であれば、bigForthというネイティブ型のforthがある。Windows版もあると思う。

有料でも良ければ、イギリスのMPEという会社のVFXForthというのが、最高性能の最適化コンパイラを備えているらしい。ただし、プロ用なので、それなりの値段はするだろう(その割には安いとの話もあるが、具体的な値段は知らない)し、イギリスに自分で直接注文しないといけない。WindowsとLinuxには試用版があるようだ。他には、アメリカのForth Inc.という会社のSwiftForthというのがある。これもプロ用だが、Windows環境用には無料お試し版があり(最近は、LinuxとMac OS X用の無料試用版もあるようだ)、英語のforth入門書が付いてくる。この入門書を手に入れるだけでも、お試し版の価値はあるともいわれる。(自分はもらったことはないが。)
他には、オランダのMarcel Hendrixさんという人が多分個人で開発しているiForthというのがある。これもかなり高性能のコンパイラを備えている。

他にも、個人が開発したフリーのforthはたくさんあって、ネットで探せると思う。見たことがある名前だと、pForth, RetroForth, RevaForth, kForth, 4tHぐらいか(特有の"方言"に依っているものもあるかも知れない)。(pforthの関しては、昔、PPC MacOS 9だったとき、無料配布されていたMPWを使ってビルドしたことがある記憶がある。比較的簡単だったし、ちゃんと動作したように思う。)

Win32Forth以外は、β版だったり、制限があったりはするものの、Macintosh版もあると思う。
とはいえ、Macであれば、PPCならPowerMops、x86ならiMopsをダウンロードすることをお勧めする。クラシックでも68kMopsもある。
個人的には、OSのライブラリ関数が、宣言一つで大抵何でも呼び出せるようになることが驚異だった。
Forth系は、スイッチ一つで自動で動くパッケージをたくさん備えた今風の開発環境ではないが、コンピュータプログラムで可能なことは基本的には全て可能である。
ともかく、さわってみれば分る。(多分)






最終更新:2020年04月18日 20:01