* KH-FDPL に関するメモ-0008 -(by [[K]], 2015.02.17) ** KH-FDPLの特徴(4) - 自己拡張可能型の文法 -(4-1) たとえばC言語で、Pythonみたいにインデントでループ範囲を指定できたらいいのにと誰かが考えたとします。もしくは反対にPythonでインデントによらず、中カッコでループ範囲が指定できたらいいのにと思ったとしましょう。そんなときに、オリジナルの文法を考えて、そのオリジナルのソースからC言語のソースを生成するソースコンバータ(コンパイラ?)を作るという方法があります。要するにいきなりアセンブラや機械語を出力するのではなくて、新言語を既知の言語に変換するだけでいいのです。 -(4-1) たとえばC言語で、Pythonみたいにインデントでループ範囲を指定できたらいいのにと誰かが考えたとします。もしくは反対にPythonで、インデントによらず中カッコでループ範囲が指定できたらいいのにと思ったとしましょう。そんなときに、オリジナルの文法を考えて、そのオリジナルのソースからC言語のソースを生成するソースコンバータ(コンパイラ?)を作るという方法があります。要するにいきなりアセンブラや機械語を出力するのではなくて、新言語を既知の言語に変換するだけでいいのです。 --この方法は、オリジナルのプログラミング言語を一から作るよりもずっと易しいです。 --この方法をKH-FDPLでは全面的に支援することにしました。つまり文法をどんどん改良していけるし、既存文法との併用も可能にしています。いわば、KH-FDPLはスクリプト言語を大量生産できる基盤になることを目指していて、とりあえず提供される基本の言語仕様についてはかなり気が抜けた便利ではない内容になっています。使いやすくなくても、とにかく一通りの機能があればよい、という感じです。 --この方式だと、実行時エラーの扱いが少し難しくなります。コンパイル時エラーならいいのです、どこが原因かを簡単に示せるので。しかし実行時エラーになるとそれが元のソースのどこに対応しているのかが分かりにくくなるのが普通です。・・・KH-FDPLではこの問題を解決するために、支援する機能を持っています。 --プログラミング言語は、もっとたくさん生まれるべきですし、もっとたくさん滅びるべきです。競争や淘汰が行われないといいものは残らないと思います。そして本当に良い言語仕様が生き残ってきたら、そのときにはそれをネイティブに実行できる高速な言語処理系を作ればいいいでしょう。それより前にがんばってもきっと空回りです。 --KH-FDPLは高速ではありませんし、メモリ効率もよくはありません。しかし文法拡張が多層になっても、あまり遅くならない仕組みを持っています(後述)。つまりこれは中速な言語処理系なのです。 -(4-2) KH-FDPLはcompile命令を持ちます。これはいわゆるeval命令に似ていますが、違うのは最下層処理系のバイトコードまでは変換するけれど、実行まではやらない、というところです。それを実行するのはexecute命令です。 --新しい言語を追加するときは、新しいcompile関数を書きます。この関数をとりあえず、lang.A.compile()とでもしましょう。これは受け取ったソースコードを変換して、langBの構文で書き直します。そして最後にlang.B.compile()を実行して、その戻り値をlang.A.compile()の戻り値とします。 lang.A.compile = function { x = arg[0]; xを解釈してlangBに翻訳し、その結果をyに入れる。 return lang.B.compile(y); } --これだと、コンパイルがどんなに入れ子になっていても実行速度には影響しません。遅いのはcompile関数の実行速度だけです。 --当然のことながら、このcompile関数自身もKH-FDPL内の好きな言語で記述できます。・・・ということでKH-FDPLが最初に目指すのは、「プログラミング言語を作りやすいプログラミング言語」の開発、になりそうな気がしています。 --KH-FDPLの処理系では、与えられたソースをどのcompile関数に渡せばよいかを設定などから判断して、使い分けます。 -(4-3) 一つのソース内で言語を切り替えて使うことはできるでしょうか。それはもちろんできると思います。イメージとしてはC言語のインラインアセンブラみたいな感じです。 --仮にもしこの機能が使いにくければ、使いやすくなるようなプログラミング言語を作ってしまえば解決です。 --もちろんcompile関数を記述する際にも複数の言語を切り替えて使えます。 -(4-4) KH-FDPLはcompile命令やexecute命令を持つので、「プログラムがプログラムを作る」みたいなことが簡単にできます。 --実行中のプログラムが、自分を構成する関数を再定義してしまうことも可能です。つまり自己書き換えみたいなこともできるわけです。これは何の役にも立たないかもしれませんが、もしかしたら新しいプログラミングテクニックが生まれるかもしれません。 * こめんと欄 #comment