本連載ではいろいろなプログラミング言語を紹介します。今回は移植性が高くCADや様々なシステムで採用されたプログラミング言語Forthを取り上げます。半世紀の歴史を持つForthの歩みを確かめた上で実際に簡単なプログラムを作ってみましょう。
Forthの歴史
Forthは1970年前後に登場したプログラミング言語です。開発者はチャールズ・ムーア氏です。彼はカーペット製造会社やアメリカの国立電波天文台で電波望遠鏡などの制御のために、Forthを開発しました。その後、FORTH, inc.を創業し、Forthを様々なプラットフォームに移植しました。半世紀経過した現在もFORTH, Incは存在し、Windows, macOS, Linux向けのForthなどを提供しています。
Forthは開発当初より移植性が高いのが特徴です。1976年にはIntel 8086チップ、Motorola 6800、Zilong Z80マイクロプロセッサに対応し、1978年には6502に対応し、その後、様々なプロセッサに対応しました。
なお、1980年代はForthの黄金期となりました。移植性が高いことに加えて当時のスペックの低いマイクロコンピューターでも快適に動いたからです。ホームコンピューターのJupiter ACEのOSなどにForthが搭載されていたのをはじめ、多くのホビーユーザーに愛されました。
Forth言語は積極的に標準化も行われました。1979年にFORTH-79、1983年にFORTH-83の標準が制定され、1994年には標準化団体のANSIにより「ANS Forth」が制定されました。(「ANSI Forth」ではなく「ANS Forth」です。)Gforthをはじめ、多くのForth言語がこのANS Forth標準に準拠しています。
率直に言うと計算機資源に余裕ができた現在では、Forthはそれほど人気のあるプログラミング言語ではありません。それでも、現在でもブートローダーのOpen Firmware、宇宙開発や組み込みシステム、ロボット制御などいろいろな分野で利用されています。加えて、オープンソースで、GNUプロジェクトの一つである「Gforth」は活発にメンテナンスされています。
Forth言語を試してみよう
それでは、実際にForth言語を試してみましょう。今回はブラウザ上で気軽にForthを実行できる「jsForth」を利用して、Forthを体験してみましょう。
Forthの特徴は「スタック指向」であることです。Forthでは逆ポーランド記法(後置記法)を用いて計算式を記述します。逆ポーランド記法とは「3 + 5」のような計算式を「3 5 +」のように記述する方式です。演算子を値の後ろに記述するため後置記法と呼ばれます。
なお、逆ポーランド記法は日本語と相性の良い記法です。と言うのも、逆ポーランド記法は計算式を日本語式に記述するものであるからです。例えば「(3 + 5) × 2」を逆ポーランド記法にすると、「3 5 + 2 *」となりますが、これは日本語で「3に 5を 足して 2を 掛ける」と言い換えることができるからです。
jsForthをブラウザで開いて、試しに次のように入力してみましょう。
3 5 + .
すると、すぐに計算が行われて「8」が表示されます。
Forthでは入力値や計算結果をスタックに保存していきます。3や5を読むとスタックに値を積み、+を読むとスタックの値を2つ下ろして、計算結果の8をスタックに積みます。最後に、ドット「.」を記述すると、スタックから値を下ろして画面に出力します。
サブルーチンの定義とHello, World!
なお、Forthではサブルーチンに名前を付けて記述できます。「: 名前 定義 ;」のような書式で記述できます。say-helloというサブルーチンを定義して、実行するには、次のように入力します。
: say-hello ." Hello, World! " CR ;
say-hello
これを、jsForthで実行してみましょう。次のように実行されます。
「." 文字列 "」と記述することで文字列を表示し、CRで改行を出力します。なお、文字列を表示する場合、ダブルクォートの後ろに1つスペースを入れる必要があります。
ForthでFizzBuzz問題を解いてみよう
次に、FizzBuzz問題をForthで解いてみましょう。本連載で恒例のFizzBuzz問題を解いてみましょう。FizzBuzz問題とは次のようなものです。
1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。
ForthでFizzBuzzを解くプログラムは次のようになります。分かりやすく改行とインデントを入れています。