本連載ではいろいろなプログラミング言語を紹介します。今回は移植性が高くCADや様々なシステムで採用されたプログラミング言語Forthを取り上げます。半世紀の歴史を持つForthの歩みを確かめた上で実際に簡単なプログラムを作ってみましょう。

  • ForthでFizzBuzzを実行したところ

    ForthでFizzBuzzを実行したところ

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」が表示されます。

  • jsForthで簡単な計算を試したところ

    jsForthで簡単な計算を試したところ

Forthでは入力値や計算結果をスタックに保存していきます。3や5を読むとスタックに値を積み、+を読むとスタックの値を2つ下ろして、計算結果の8をスタックに積みます。最後に、ドット「.」を記述すると、スタックから値を下ろして画面に出力します。

サブルーチンの定義とHello, World!

なお、Forthではサブルーチンに名前を付けて記述できます。「: 名前 定義 ;」のような書式で記述できます。say-helloというサブルーチンを定義して、実行するには、次のように入力します。

: say-hello ." Hello, World! " CR ;
say-hello

これを、jsForthで実行してみましょう。次のように実行されます。

  • say-helloサブルーチンを定義して呼び出したところ

    say-helloサブルーチンを定義して呼び出したところ

「." 文字列 "」と記述することで文字列を表示し、CRで改行を出力します。なお、文字列を表示する場合、ダブルクォートの後ろに1つスペースを入れる必要があります。

ForthでFizzBuzz問題を解いてみよう

次に、FizzBuzz問題をForthで解いてみましょう。本連載で恒例のFizzBuzz問題を解いてみましょう。FizzBuzz問題とは次のようなものです。

1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。

ForthでFizzBuzzを解くプログラムは次のようになります。分かりやすく改行とインデントを入れています。

: fizzbuzz
  101 1 do
    i 15 mod 0 =
    if ." FizzBuzz " 
    else
      i 3 mod 0 =
      if ." Fizz "
      else
        i 5 mod 0 =
        if ." Buzz "
        else i . then
      then
    then
  cr
  loop ;

fizzbuzz

上記のプログラムをjsForthに入力して実行してみましょう。次のように表示されます。

  • FizzBuzzを実行したところ

    FizzBuzzを実行したところ

なお、Forthでif文も後置記法のように記述します。if文は「(式) if (真の処理) else (偽の処理) then」と記述します。また、繰り返しを行うdo ... loop文は「(開始値) (終了値) do (処理) loop」のように記述します。

ちなみに、オープンソースのGforthを使っても同じプログラムを動かすことができます。

  • GforthでFizzBuzzを実行したところ

    GforthでFizzBuzzを実行したところ

まとめ

以上、今回はForthについて紹介しました。Forthの移植性の高さ言語仕様が単純であることも関係しています。Forthはメモリ効率もよく移植性や拡張性が高いことから、幅広く使われてきました。

さすがに、これからForthを使って新しいプロジェクトをはじめる機会は少ないと思いますが、Forthに触れることで新たな視点を持つことができるでしょう。jsForthのようにブラウザ上で動かすことができる処理系も存在するので、気軽に簡単なプログラムを作ってみると良いでしょう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。