日本語思考のプログラミング

慶応義塾大学

政策・メディア研究科

中鉢 欣秀

技術者を説得するのが最も困難

 「日本語でプログラムを書く」というテーマは、過去に多くの先人達が挑戦してきたものである。しかしながら、現在に至るまで、一般に普及することはなかった。普及していない理由はさまざま考えられようが、「多くの技術者は日本語でプログラミングすることに不安」なのではないか、という理由があると思われる。特に、一般的に「日本語という言語は曖昧である」と思われていることが、「プログラムを日本語で記述する」という行為を不安にさせるのではないだろうか。

 フランス語という言語は、論理的な言語だそうだ。筆者はフランス語を学んではいないが、「明晰ならざればフランス語にあらず」というフレーズを聞いたことがある。しかし、この言葉は「フランス語=明晰」という事実ではなく「フランス語は明晰でなくてはならない」というポリシーを示しているように聞こえる。どんな言語であっても、人間が使うのだから、すべてに白黒をつけられるわけがなく、いかようにでも曖昧にできるはずだ、というのが根拠である。

 さて、「一般的にいって日本語は曖昧だから」という理由で、日本語プログラミングに懐疑的な向きに対して、最近よく用いる説得例がある。それは、「法律の条文はシステムを明確に記述している」というものである。我が国の法律は、当然日本語で記述されている。そして、この記述された法律をもとに、日本の司法というシステムは機能している。

 筆者は、フランス語同様、法律も専門に学んだわけではないが、最近、ある事情から民法・商法をながめる機会があった。その条文を読み、「法律はプログラムみたいなものだな」という感想を持ち、なおかつ、「日本の民法・商法はもしかしたらオブジェクト指向で作られているのでは」、と考えるようになった。

民法、商法に見るオブジェクト指向

 筆者が法律の条文を読んだきっかけは、97年の暮れに、自分で会社を設立してみたことである。日本には、商法で規定されている会社が3種類(合名会社、合資会社、株式会社)と、有限会社法で規定されている会社が1種類(有限会社)がある。このうち、株式会社と有限会社がもっとも多いのだが、設立には一定額以上の(有限で300万)資本金が必要などと、簡単に設立できるものではない。しかし、合名会社と合資会社については、このような資本金の規定が一切なく、1円以上の資本金があれば設立できる。このような手軽さから、「合資会社」を設立した。

 この合資会社は、最近のベンチャーブームで、手軽に設立できる会社として、多少知る人も多くなったようだ。しかし、設立について解説してある書籍も少なく、実際の運営の方法となると、よく分からないことが多かったのである。ならば、と、学部1年の時に購入した「六法全書」をひも解くことにした。

 さて、この時読んだのは、民法と商法である。民法は、明治39427日、商法は明治3939日に施行されたもので、どちらも旧仮名遣いのままだ。この中で、それぞれの「会社」というものがどのように定義されているか見てみたい。

 

<合資会社クラス>

商147

 合資会社には本章に別段の定ある場合を除くの外合名会社に関する規定を準用す

 

 合資会社について調べると、まず、この条文にあたる。これは、「合資会社は合名会社を継承」することと意味的に等しい。

 

<合名会社クラス>

商62

 合名会社を設立するには定款を作ることを要す

 

 合名会社の定義の先頭は、定款についての記述である。定款には、商号(社名)や、会社の目的などが記される。ここで、定款というクラスを導入すると、この条文は、合名会社と定款との関連をしめす。または、定款は合名会社の属性とみることもできる。

 

<会社クラス>

商53
 会社は合名会社、合資会社及株式会社の三種とす

 

 ここは、合名会社、合資会社、株式会社の親クラスとしての「会社クラス」を定義していると考えられる。

 

<法人>

商54
 会社はこれを法人とす

 

 ここで、会社はは法人クラスを継承することを示している。ここで、「法人」については民法で規定されている。「商法」、「民法」はクラスを定義したパッケージであると考えると、以下のような継承関係になる。(矢印の先が親クラス)

 

商法.合資会社→商法.合名会社→商法.会社→民法.法人

 

 以上を考えると、日本語であっても論理的な構造は記述できるし、「曖昧な日本語」が存在するのは、「日本語を曖昧に使っているから」なのである。

日本語を使うことの利点とは?

 プログラマの多くは、日本語でプログラムを記述したことはない。その利点を述べても、「私は日本語でプログラムを書いたことがないから分からない」と、いうことになるし、利点を主張するならば、「日本語でプログラムを書く」、あるいは、「日本語でプログラムを読む」経験が必要である。

 日本語プログラミング言語として、パソコンユーザを中心に普及している言語に「日本語Mind」がある。これは、リギーコーポレーション社の片桐明が開発したものである。このコンパイラそのものもMindで記述されているが、このソースコードを読ませて頂いたことがある。

 日本語で書かれたソースコードには、以下のような明らかな利点があった。

l         変数名や、手続名が日本語で明確に示されている

l         コードとドキュメントが分離していない

 以上のようなメリットから、200ページ近いソースコードを僅か10時間程度で読み合わせることができた。

スタック式と日本語

 日本語Mindは逆ポーランド記法が日本語の文法と非常に似ていることに着目し開発された。しかし、

しかし、これだけでは、日本語Mindが優れた言語である理由を説明していない

n     Mindのスタックは単なるデータの受け渡しの仕組みではなく、あれと、これと、それをつかってどうして、その結果がどうで、という作業の流れの過程そのものである」

  リギーコーポレーション 片桐 明氏

抽象文法と日本語

n     抽象文法で考えると、キーワードは単なる「おまけ」

  if文は「条件、成立時実行文、不成立時実行文(オプション)」がある分岐である

n     抽象文法と具象文法

  コードのパース

   具象文法から構文木を形成

  構造エディタによる入力

   構造エディタから構文木を入力。

JV-Talkの開発

 JV-Talkは、「オンライン配信を目的とした小規模なアプリケーション開発のためのプログラミング言語」として設計された。アクセス社と共同で98年3月から開発をしている。この言語は、アクセス社が開発した軽量のJavaヴァーチャルマシンで動作するが、JDKでの実行も可能となっている。将来的に日本語プログラミング言語とすることを見据えて言語設計と検証のための実装を行っている段階である。

JV-Talkの特徴

 JV-Talkは、演算スタックにオブジェクトを積むことを特徴とする。このことにより、スタック上のオブジェクトへの演算の実行時チェックが可能になる。

n     オブジェクトスタック式

n     ターゲットと呼ばれるコンポーネントを駆動するスクリプト言語

n     Beansのイベントモデルに準拠し、ポータビリティを確保

n     形式記述された抽象文法による定義

n     プログラムは抽象構文木として表現し、一つの出力形態として「日本語」を導入

オブジェクトスタック式

 スタックを

n     スタックを「文脈」として考えられないか?

演算スタックに、オブジェクトを積むことができる。このことにより、スタック上の情報への

  オブジェクトをスタックに積むことでデータに対するアクセスの方法が保証される

n     以下のクラスのオブジェクトを積みこむ

  What   操作対象(主語に相当)

  Tag     操作対象の属性

  Value  データ(IntegerStringなど)

JV-Talkの文法

 JV-Talkの文法は、

n     文はWhatで始まり、Verbで終わる

  Verb   操作(述語に相当)
基本型1  - What [Tag Value]* Verb
基本型2  - What Tag Verb

n     その他に基本的な制御構造

  If, While, For  etc.

JV-Talkによるターゲットの駆動

 JV-Talkはスクリプトに従い、ターゲットに対してイベントを発生させるエンジンだと考えられる。画面の表示、入出力、ネットワークの機能などは、エンジン側では実装せず、ターゲット側で拡張することになる。ターゲットは、JV-Talkから受け取ったイベントをもとに必要な動作を行い、結果をJV-Talkのオブジェクトスタックに返すことになる。

JV-Talkのイベントハンドラ

 JV-Talkでのイベントハンドラの定義は、「何が」「どうしたら」「どうする」の形で定義する。この場合、「何が」に相当するのは、ターゲットであるから、Whatで表わす。「どうしたら」を表わすために、キーワードWhenを導入する。

 たとえば、アイコンという名前のターゲットがクリックされたときの動作を指定するときは、WhatWhenを組み合わせて、「When(アイコン) When(クリック)」として定義する。このようにしてターゲットからJV-Talkに渡されるイベントは、ボタンなどアクションや、マウスクリック、アプレットのinitstartstop、タイマイベントなど考えられる。

JV-Talkと日本語

 以上で、JV-Talkの概要について説明した。本節以降は、このように記述されたJV-Talkのスクリプトを、日本語として表示する方法について述べる。はじめに、助詞を補うルールを導入する。すなわち、

A)       What() Tag(名前) Value(中鉢) Verb(です)

B)       私の名前は中鉢です

 A)として記述されたスクリプトを、B)に変換するルールを設定する。これについては、現時点では未実装であるが、現在、有限オートマトンを用いることを検討している。また、スクリプトの入力は構造エディタで行うことを前提とする。すなわち、日本語で記述されたソースコードのパースは現時点では検討しない。これには、分かち書き、送り仮名、活用形の問題を避けるという消極的理由とともに、プログラム入力の新しい方法を検討したいという希望がある。

これからの日本語プログラミング

 最後に、これから日本語プログラミングについて研究するうえでの指針をまとめてみたい。まず、現時点で確立されているソフトウェアテクノロジーを無視しないことは、言語の普及を考えると重要である。JV-Talkでは、オブジェクト指向と、Javaのヴァーチャルマシンの利用を行なっている。また、プログラミング言語は進化する。多くのユーザに利用されることで洗練され、発展するものであるから、 まず実用的な言語を1つ普及させることを目指すべきだろう。日本語Mindのように、ある程度普及すると、それなりに面白い「日本語プログラミング文化」のようなものが生まれる。

 現在、コンピュータサイエンスは欧米の流儀で発展している。従って、生まれてくるソフトウェアは欧米中心の文化になっている。これはこれで、ソフトウェアのスタンダード化が進むことは利点かもしれないが、新たなソフトウェア文化を模索する場合、日本やアジアの各国など非西洋文化圏のものの考え方や見方がソフトウェアに反映されることが望まれる。

 言葉は文化であるから、日本語でプログラムを書くことが、次のソフトウェア文化の創造のための第一歩になるかもしれない。