Lisp M式への回帰(スクリプト言語GavaOne)

Lisp言語の中間コード(プログラム)とデータ形式を、S式から、M式様の 二進木リスト構造に転換する可能性を論じ、それから得られた知見をベースに開発している 新しいスクリプト言語「GavaOne」を紹介します。

(目次)

===> Top Page

1.はじめに

システムエンジニアの世界に入って数十年、この間、いろいろなコンピュータ言語を 学んで、システム開発に携わってきました。
古くはパンチカード・システムのワイアリング・ボードから、その後、アセンブラー、FORTRAN、Lisp、 COBOL、PL/1、APL、PASCAL、BASIC、C、Javaなど、ひととおり理解できたつもりでいましたが、 Lisp(Scheme、Common Lisp)のみは、マニュアルを読むたびに、頭が痛くなり、初級編の段階で 理解を放棄せざるを得ない気持ちになります。
その原因を探ってみるに、それは、最初に、FORTRANというアルゴリズム表記に数学関数表記を持つ データ処理指示語を、最初に学んだからだと永く思っていました。 ところが、最近、Lispマニュアルを、あらためて読み直すと、それだけではないと感じはじめました。
それは、Lisp言語創始者たるマッカーシー(McCarthy)が、Lisp言語設計段階でM式にこだわったことと、 すべてのアルゴリズムをS式で表記することに躊躇した気持ちのベースにあるものと似ているかもしれません。

2.Lisp S式とM式

Lisp S式は、アルゴリズム表記とデータ表記を同一とし、それ故、プログラムによる プログラムの生成(リフレクションreflection)を容易にし、他言語にない優れた データ処理記述能力を持っていると思います(但し、人が記述内容を容易に理解できるかは別にして)。
Lisp初期での、M式(Meta Expression)とS式(Symbolic Expression)を列記してみると、
加法 1+2 は、

と表記します。
明らかに、M式が、S式に比べ、数学関数表記に近いことが分かります。
アルゴリズム思考段階では、数学関数表記に近いM式で処理ロジックを整理し、コンピュータ内の 処理ロジック指示データ(プログラム)は、処理対象データに合わせ、S式(二進木リスト形式)で 入力しました。(当時のコンピュータ能力では、データ構造として、S式以上のものは望めなかった?)
やがて、コンピュータメモリー上の二進木リスト構造にのみに注視する態度が大勢を占め、 S式で処理ロジックを考え、いつのまにか、M式は忘れ去られました。(これは、周知のことです)

3.Lisp言語を理解できない理由

筆者が、Lisp言語を理解できない理由を、単なる「慣れ」の問題にすり替えれば、簡単です。
しかし、如何に早く慣れ、受け入れることができるかは、大きな問題です(人によっては、感覚的に受け入れられないものもあります)。
言い訳になるかも知れませんが、敢えて、理解できない理由を掲げれば、次の二つに尽きると思っています。


プログラム構造と処理対象データの構造が同じであることは、まさに、「Lisp言語の特質であり、 Lisp言語が持つデータ処理能力の源泉である」と思います。
しかし、素人目で見れば、「どのような道具で、何を加工・処理するのか?」を、直観的に分かることが重要でしょう。
そこで、筆者は、プログラム表記上、処理関数と処理対象データを区分しながら、「コンピュータ内部データ構造において、 プログラム・データ(中間コード)と処理対象データの構造が同じ」であるM式様リストを考案いたしました。

4.M式様リスト

ここで、筆者が理解容易なリスト処理言語は、「M式で処理ロジックを考え、M式様のコンピュータ 内部データ構造を頭に描きながら、処理過程を追跡できるもの」と考えました。
「M式様のコンピュータ内部データ構造(以下、「M式様リスト」と言う)」とは、「S式の先頭から処理関数名を除き、 処理関数名に代わる「機能コード」を、S式のその他の要素(引数リスト)の左側に付けたもの」と定義し、次のとおりとします。

更に、上記の構造を拡張し、Lisp言語の単項(アトム)に、機能コード(単項演算子)を付けたものも「M式様リスト」に含めることにします。 従来のS式リストとM式様リストを、ボックス表記で図示すれば、次のとおりとなります。 <図1>
<図1>からも、Lisp言語M式から自然に導き出されるデータ構造は、S式ではなく、M式様リストであること、
そして、M式様リストでは、リストの各要素は「サブ・リストまたはリテラルに、機能コードを付加したもの」 であることが分かります。
(補足)
「機能コード」とは、別ページのGavaOne概説書で述べる「フレーム・テーブル(兼、処理関数名テーブル)のフレーム番号」そのものを、 コード化したものです。
===> 機能コードは、処理関数名(シンボル)と、一対一で対応しています。

5.Lisp言語の良いところ(継承すべきもの)

Lisp言語登場当時の、あまりに貧弱なハードウエア環境のもとで、次のような特長を持ち、 その後も、人工知能分野等、応用技術分野を支える言語として、存続し続けたことは、 驚異です。

今日の高性能なハードウエア環境のもとで、Lisp言語は、新しいデータ構造(M式様リスト)を受け入れ、 自ら革新していくことができると信じています。

6.新しいスクリプト言語「GavaOne」

「GavaOne」とは、筆者が、「Lisp言語の良いところ」に「M式様リスト」を取り入れ、 それらを「手続き型言語から拝借した糖衣表現(syntax suger)」で包み込んでできたスクリプト言語です。
その記述例(階乗計算)を、四つ掲げます。

・「再帰処理」に慣れている方には、次がおすすめ。

> fact[?x!]:=if[x!=0,1,mult[x!,fact[sub[x!,1]]]]; 仮引数x!の階乗を求める関数fact[]を定義・登録します。
> fact[10]; fact[10];と入力すれば、10の階乗を求めることができます。
(注)変数x!は局所変数で、?x!はx!を仮引数とすることを意味します。
関数mult[],sub[]は、それぞれ掛け算と引き算を表します。
・「手続き型プログラミング」オンリーの方には、次がおすすめ。

> fact[?x!]:=do[y!:x!,while[decr[x!]>0,y!:mult[y!,x!]],y!];
> fact[10];
(注)変数x!,y!は局所変数で、?x!はx!を仮引数とすることを意味します。
関数do[]は、引数を左から順に評価し、最終項の評価結果を返します。
y!:x!は、変数x!の値を変数y!に与えること(代入)を指示します。
関数decr[]は、変数x!から、1を差し引き、その結果を返します。
関数while[]は、第一引数の条件が成立する間、第二引数を繰返し評価します。
・「関数型プログラミング」に憧れている方には、次がおすすめ。

> fact[?x!]:=reduce['mult,iota[x!]];
> fact[10];
(注)変数x!は局所変数で、?x!はx!を仮引数とすることを意味します。
関数iota[]は、1から引数値までの整数値のリストを返します。
関数reduce[]については、別ページの解説をご覧ください。
・ 括弧の多さが気になる方には、次がおすすめ。

> fact[?x!]:='mult/'iota/x!;
> 'fact/10;
(注)変数x!は局所変数で、?x!はx!を仮引数とすることを意味します。
中置型演算子"/"については、関数apply[]の解説をご覧ください。
参考までに、Lisp(Scheme)による階乗計算定義文を、次に示します。
(define (fact n)
(if (= n 0)
1
(* n (fact (- n 1)))))

GavaOne言語にご関心を持たれた方は、次のホームページを参照くだされば、より理解が進むものと思います。
 概説書 ===> Lisp M式への回帰(スクリプト言語GavaOne概説書<体験版>)
 事例集 ===> Lisp M式への回帰(スクリプト言語GavaOne事例集<体験版>)
===> Top Page

7.おわりに

 筆者のようなオールド・システムエンジニアにとって、学び始めていた頃のソフトウエア開発に必要な最低限の マニュアルは、ほんの20〜30ページ程度で済んでいたものです。
 だが、最近のコンピュータ・ソフトウエア開発環境を見るに、分厚い解説書を読んだ上に、更に市販のノウハウ本を 読み、膨大なソース行数を費やさなければ、まともなソフトウエアが作れない現状は、処理ロジックの面白さに 傾倒し、自分の作ったソフトウエアに喜びを見出す、ソフトウエア・オタクには、耐えられないものがあります。
ソフトウエア開発の規模が、人月とソースコードの行数で計られるしろものになって来た、その頃、アイバーソンのAPL言語と バッカスのFP言語の登場は、筆者を目覚めさせてくれるに十分なインパクトを与えてくれました。
特に、APL言語は、その特異さ故に、ソフトウエア業界に十分受け入れられず、今日に至っていますが、その会話性と 面白さは、他に比類なきものと考えます。
また、すでに主要コンピュータ言語としての座を得ていたLisp言語については、本文中で述べたように、S式故に 遠巻きにしながら、勉学のチャンスを狙っていました。
筆者がGavaOne言語を開発するにあたって目指しているものは、Lisp言語とFP言語の持つリスト処理、APL言語と同様な 優れた会話性と処理ロジック表現の面白さを持ちながら、それらを手続き型言語の表記法で包み込んだ(糖衣表現した)言語を 開発することにあります。
これらの目標がどの程度実現しているかは、実際にGavaOne言語に触れていただくのが、いちばんと考え、 この度、「体験版」として、お披露目する次第です。
 

(参考文献)
 1) 「新しいプログラミング・パラダイム」井田哲雄編,共立出版,1989/11/10発行
 2) 「続新しいプログラミング・パラダイム」井田哲雄・田中二郎編,共立出版,1990/11/25発行
 3) 「APLイディオムライブラリー」IBM-APLユーザー研究会編,工学図書,1984/3/25発行
 4) 「記号処理」中西正和著,朝倉書店,1978/12/15発行
 5) 「Schemeによる記号処理入門」猪俣俊光・益崎真治共著,森北出版, 2003/5/15発行
 6) 「心の社会」マーヴィン・ミンスキー著,安西祐一郎訳,産業図書,1990/7/20発行
 7) 「コンピュータービジョンの心理」P.H.ウインストン編,白井良明・杉原厚吉訳,産業図書,1972/2発行
 8) 「1977 ACM Turing Award Lecture」John Backus,IBM Research Laboratory,San Jose

 Copyright(C) 2011  木村紀介. All rights reserved.