見出し画像

【知ってる?】私が出会った変態プログラミング言語2選

プログラミング歴30年以上のムンペイです。
BASICに始まり、C++時代が長く続き、ここ10年はPythonはメインになっている、といった感じで言語を変遷させていますが、プログラム言語というものはどれでも究極的にはコンピュータを動かすためのものという点で共通しているので、ある言語の知識を応用すれば他の言語でも短期間でそこそこキャッチアップできるケースは多いのですが、苦労する場合ももちろんあります。苦労した言語を2つ挙げて、苦労した点とそれはなぜかをご紹介します。


1.Forth

この言語はかなりマイナーだと思います。
Open Firmwareというワークステーションやサーバーで多く採用されているファームウェア(PCのBIOSのようなもの)のシェル(コマンドライン操作のインターフェース)として使われているのが最も著名な利用先だと思われます。

私が触ったのはもう15年くらい前ですが、PowerPC系のマイクロプロセッサのファームウェアでした。おそらく現在もIBMのPowerプロセッサでは使われているんじゃないかと思います。AppleのMacも一時期PowerPC を採用していたため、Open Firmwareだった時期があります。

Forthは、スタックを操作して状態を変えていくという考え方でプログラミングをする言語です。インタプリタでもあり、(バイトコードへの)コンパイル言語としての側面もあります。ですので、インタプリタでいろいろと試行錯誤していき、これで完成と思ったらほぼそのままのコードを関数定義化すると言った使い方ができます。

空白区切りのワードを前から順に解析して処理していきます。
WikipediaのForthの記事から引用した、Hello Worldは下記です。

CR .( Hello, world)

CRで改行、.(で、終端の)までの文字列を画面表示する、という意味です。
また、インタプリタ上での四則演算は下記のように書けます。

25 10 * 50 + . ⏎
300 ok

25、10を順にスタックに積みます。
*でスタックから2つ取り出して乗算して結果をスタックに積みます。
50をスタックに積みます。
+でスタックから2つ取り出して加算して結果をスタックに積みます。
.でスタックから1つ取り出して画面に表示します。
最後のokはプロンプトです。

こんな感じであらゆる操作を行っていきます。
状態とは、スタックの状態だけでなく、先ほどの演算子やCRなどのような「ワード」も書き換えることができます。自分で言語も作っていくような感覚です。自由度が高すぎて、かなり困った記憶があります。

また、スタックの状態がどうだったすぐわからなくなるのが難点です。スタックから取り出すとその値が無くなってしまうので、プリントデバッグも一工夫必要です(複製してから取り出します)。

Forthは情報も少なく、周りに知っている人もいなかったので、自分で試行錯誤しながら理解を深めていきました。あまり実用で使いたいとは思わないですが、言語としてのルールは極力シンプルにとどめ、しかしできることはとても多い、という設計思想の幅を広げることができた経験でした。

2.JSX

2番目はそう、Webアプリ開発における一番人気フレームワークReactにおける、JavaScriptとマークアップを混在して書くための言語JSXです。えっ、と思われた方もいらっしゃると思いますが、JSXは個人的変態ランキングでは上位の常連です。

はじめて見たときは、JavaScriptのようで、でもHTMLのような部分があって、どう読めばいいかわかりませんでした。さらに、その時の私はReactも、リアクティブプログラミング(※1)という仕組みに触れるのもはじめてだったので、まったく手も足も出ませんでした。

※1:Reactがリアクティブプログラミングなのかという点は諸説あるようですが、ここでは変数に値を入れたら表示も反応する、くらいの意味です。

こんな感じですよね。(前述の公式サイトより引用)

export default function TodoList() {
  return (
    <>
      <h1>Hedy Lamarr's Todos</h1>
      <img 
        src="https://i.imgur.com/yXOvdOSs.jpg" 
        alt="Hedy Lamarr" 
        className="photo" 
      />
      <ul>
        <li>Invent new traffic lights</li>
        <li>Rehearse a movie scene</li>
        <li>Improve the spectrum technology</li>
      </ul>
    </>
  );
}

戸惑いポイントNo.1は、2つの言語が混在しているという点でした。Reactは基本的にHTMLを組み立てていくために使うものなので、HTMLのタグ(的なもの)がコンポーネントになっているのは極めて合理的な発想だと思います。しかし、当時の私はJavaScriptもHTMLも知識があっただけに、JavaScriptの戻り値がHTMLとはどういうこと?どうやって文法解析するの?という感じで、言語としてのルールが飲み込めませんでした。

しばらく格闘しましたが、その時はReactはやめてVue.jsにすることにしました。Vue.jsでもJavaScriptとHTMLの組を1つのコンポーネントとして扱う点は同様ですが、ファイルの前半、後半といった感じで別々に書く仕様でした(.vueファイル)。これは私の知識でも容易に理解できました。

その後数年Vue.jsを使い、リアクティブや、その他のモダンなウェブプログラミングの知識にもなじむことができた結果、現在はReact/JSXの方がコンポーネントとしてわかりやすいと思うようになりました。理由は前述の繰り返しですが、HTMLのタグ(的なもの)をコンポーネントとして戻り値にすることが管理しやすいと考えるからです。

自分で言語を作るのも面白い

あなたの苦労した言語は何ですか?

プログラマーをやっていると、段々自分でプログラミング言語を作りたいと思うようになってきます。(きますよね?)
何も、C++やPythonのような万人が多様なことに使うもののことを言っているわけではありません。自分のよく行う処理の繰り返しや共通部分を簡潔に書くためのオレオレ言語の作ってみましょう。このような特定用途の言語を、Domain Specific Language (DSL) と呼びます。

そういえば、以前、遺伝的プログラミングの研究を行っていた時は、遺伝子が表現するプログラムを記述するための言語を自分で定義して使っていましたLISPのように括弧でツリー構造を表すものでした(GitHub)。遺伝的アルゴリズム(プログラミング)は、大量のデータ処理を繰り返すため、様々な高速化テクニックを投入したものですが・・・、この話はまたの機会に。

これにて御免!


この記事が気に入ったらサポートをしてみませんか?