LanguageGame Final Report

YAMAMIYA Takashi

propella@yuri.sakura.ne.jp

Qript One Soft, INC.

Background

For giving instruction to a computer, now we have many ways as selecting menu, push button, drag icon or so. Recent researches of computer user interface have developed various methods of interact with computer. Above all, with using WYSIWYG (What You See Is What You Get) way, user interface becomes very rich and useful for non-engineer. But yet, the most fundamental way of to dialog with computer is to input a sequence of command kind of programming language.

Using WYSIWIG style has advantages when a user uses a computer instead of a real paper. But to deal with more abstract or involved matter, using a programming language has more benefit because symbols are more stable and we can use powerful idea as a recursion or a reference with such language. Then I think the importance of programming language could be never change however GUI will be more improved.

There are various languages in the world, and there are many interesting aspect and taste in each language. I thought that a grammar of the programming language is very interesting but developing a language must be more fun. Of course making a language seemed to be difficult. Then I have taken another way to develop a parser generator that people can make their own script easily.

A parser generator is one of the most basic software in computer. Historically, various programming languages have been developed. And to make developing their parser easily, the technique of automatic parser generation was found. Now the parser generator becomes established technology.

Abstract

The motivation of LanguageGame project was very simple. If a parser generator has pretty GUI for non-professional user, what’s going to happening? Programming language is indispensability for computer. To learn programming language is to see computer deeply and to use more effectively. It’s also an important aspect to remember that a programming language parser is a program written in a programming language.

If a user just uses a computer as alternative to a real paper, a pencil or so, this aspect has no point yet. But if you want to handle symbols freely with a computer, The recursive aspect that a programming language is a program is very important. Though this aspect is assumed as an axiom for computer engineers when editing or debugging, if non-programmer like students, artist or businessperson can use it, I think that new application of computer should spread from here.

As first phase of developing LanguageGame, I surveyed GUI this project needed. Because I wanted to be focused on GUI, I chose Squeak as developing environment that has useful library and has informative code like “eToys”. And I used T-Gen as a table driven parser generator engine.

As development progressed, it become clear about the character that LanguageGame should be equipped. The following are especially mentioned as an important point.

Real-time operation

To make user operation reflect as immediately as possible, improvement in user-friendliness can be expected. I designed about the data structure required for this real-time nature.

External representation of symbols

Usually, we write a computer program using a series of texts. But not only texts, we can write a program using any symbols like graphical icons if their analysis is possible. In LanguageGame, programming with pictorial symbol was supported in order to give a sociable impression to user.

Semantic analysis

To describe a grammar, BNF (Backus-Naur Form) notation was established. But to describe a meaning, there are many way for definition. In LanguageGame, notation of BlockContext is used as representation of meaning.

Debugging

Not only for programmer, but also for general user, it is important to understand how to process in any program. Watching internal process and changing its behavior dynamically, user can get insight into the system intuitively. I developed the simplest debugger simple, which realizes this purpose.

Cooperation with external object

To operate external objects freely, a user can create pleasant application. Then LanguageGame need adjustable external interface. It is very difficult work to design such interface. In the present implementation, reference of an external object was statically stored in the class variable. It is hard to say that is has succeeded now. This portion is a future big subject.

Development

Design

Main window

Fig. 1 LanguageGame main window

A main window has two panes. The upper part is called grammar pane that a user describes a grammar using BNF notation here. And the lower part is input pane that a user can input the sentence to be analyzed now. As each interface, text mode and tile mode exists. A grammar or a sentence can be build intuitively with drag and drop in tile mode.

Fig 2: Grammar pane menu Fig 3: Input pane menu

With right click, the control menu appears. The meaning of command is as follows.

text/tile

Toggle to text/tile mode

palette

Show palette displayed symbols which can be used in the grammar

images

Show images tied in symbols

tree

Show syntax tree

inspect

Show inspector of the parsed node

explore

Show special explorer of the node

fire

Execute action if present grammar has action

save … (only grammar pane)

Save current grammar(save as instance method in GGrammarUsers class)

load … (only grammar pane)

Load a saved grammar

build (only grammar pane)

Rebuild current grammar

step (only input pane)

Do step execute current input

monad (only input pane)

Show an object for lazy execution of current input (for developer)

Table 1 menu

Describe grammar

In LanguageGame, BNF notation that is subset of T-Gen is used. But compare to T-Gen, user cannot make own scanner but can use preset scanner in LanguageGame. How to describe grammar is follows.

nonterminal : symbols … [ action block ]

Tile

Fig 4. drag on nonterminal

Fig 5. complemented terminals

A user can input with tile mode either a grammar pane or an input pane. In tile mode, to add the symbol is possible with drag and drop.

To use a tile in the input pane, first, you should call a palette pane from right click menu. Terminal symbols that can be used in the present grammar will be in the palette. When you drag the terminal tile from the palette to a nonterminal tile in an input pane, the nonterminal changes green if the nonterminal can acceptable the terminal.

If a nonterminal can determine which rule does match for the terminal uniquely, the remaining terminals of the rule are complemented automatically.

Using phase tile of eToys in block

Fig. 6

Fig. 7

In a grammar pane, a user can also do tile operation. Additionary, in the block element where is rightmost of a rule, a user can drop a phase tile from eToys’ viewer. In this case, the phase tile is automatically changed to expression of a block context in Smalltalk.

Using image in tile

Fig. 8 editing external name

Fig. 9 drop a sckech morph

Fig.10 a image tool

As a tile, not only a string but also any morph can be used. LanguageGame treats externalName of the morph as a terminal symbol of the tile. Specifically, if a morph is named and is dragged into a tile, the morph treated as a symbol string of the tile. The morph and the symbol is bind in the system, and the registered symbol string is always able to change into morph.

Using this function, programming by the pictorial symbol is realizable. It may be useful for user who cannot speak English and also to collaboration among people who have another language.

To look and delete these registered morphs, an image tool from menu is used.

Action block

Action block is used to add a meaning to syntax tree. An example is shown

carton : [ 0 ]

carton : egg carton [ :a :b | 1 + b ]

This grammar counts the number of words “egg” in the input sequence, and returns the number. In example, to input a sequence “egg egg egg”, a following tree is generated.

Fig. 11 parse tree

In the beginning, when this sentence is execute, the block matched a first rule is execute. In this case, an empty symbol matches “carton : “ at the lower right of Fig.11, and [0] is executed. This is a Smalltalk sentence that only returns zero.

Next, rule of the 2nd line “carton : egg carton” matches. By this block, egg is assigned to variable a, carton is assigned to variable b, and 1 +b is performed. In this case, what was assigned to b is set to 0 of the answer performed by the first block.

Debugger

It is easier to actually be shown rather than to explain by sentence about operation of a computer. LanguageGame is prepared easy debugger called Mole to debug grammar happily. Mole is shown with a right click menu on the nonterminal of a parse tree.

Fig. 12 Mole

When Mole is clicked, it will move onto the symbol that should me executed, and display the answer returned from the action.

Mole is also controllable with the mechanism of eToys in Squeak, it has ‘fire’ command in eToys’ viewer.

Implement

Tile interface and syntax tree

There are some advantages in using tile style like eToys to input from a user. One is that the users have familiarity. Another is being able to restrict operation of user appropriately. Restriction of operation can reduce incorrect operation and can stay focus a user on the essence of the problem. To restrict suitable operation, the complex interaction between tiles is required. To realize these, the following structures ware required.

The GTile object for displaying a tile on a screen: The GTile itself does not know the meaning of a sentence but know a GNode. If other morph dragged on the GTile, it will ask its GNode the processing. GNode decides whether accept the morph as a symbol or ignore.

The internal structure GNode of a tree: Contrary to other parser generator that process input sequences collectively, In LanguageGame, a tree is dynamically changed by operation of user. To realize this function, the node itself has the reference to its parser. The following operations are performed when the terminal B is dragged to the nonterminal A.

First, A compares whether an own parser and the parser of B are the same. When it differs, B "is made to pollute with A's parser", and B is scanned again. When the grammar class of B is acceptable, A chooses the rule that suits from own parser, and make B a child node according to the rule. When other child nodes become settled uniquely by the rule, the child node, which suits automatically, is generated and it connects (it works as an input complement).

Action and debugger

When “fire” is selected in the menu on an input pane or a tree, LanguageGame executes its sequence.

If it is where simple four-arithmetical-operations computer is created, this is realizable just to evaluate the given block according to input. However, using execution control of a loop etc. and a debugger, the simple wrapper for supporting delay execution is needed.

To hide the complexity of delay execution from a user, the delay execution object GMonad in LanguageGame has adopted the model “performed after asking.”

For example, When the block [ :a :b | b + 1 ] is given, what is bound to a or b is not the value of a symbol but the GMonad object lapped over the value. The value is not execute immediately, but the GMonad object lapped the value with block is bound to the variable of the following rule. When execution is completed and an asString method is called to display on a screen, a GMonad begins to perform as a string. In many cases, a GMonad executes its value and return the result as string. Except that value method was called, a GMonad returns its block as it is. Control structure is realizable with this feature.

When a GMonad evaluates self, the exception occurs each time for debugging. Although this exception is usually ignored, but when Mole runs for debugging, Mole receives this exception, interrupts its process and tells a user about the context that have variables under execution.

As interesting usage, combining this debug function and eToys’ step execution, such as a musical automatic performance can be carried out.

External object

LanguageGame hold the reference to external objects as a GGame class variable. There are the two following kinds.

VariableTable

The dictionary showing the variable used within a block. When any morph is dragged into text mode pane, morph will be registered into VariableTable. Thereby any morph can be operated in a block.

SymbolCostume

It is the dictionary, which connects a morph to a terminal. A morph registered at once can be used in all LanguageGame windows.

Test

Because this project had an investigation-purpose, the comprehensive combined test was omitted. To help the implementation, simple unit test was suitably created with SUnit.

Aspect

The evaluation of LanguageGame is very difficult because there is no parser generator product that was characterized with GUI to compare in others. To focus attention on the educational purpose as first goal of LanguageGame, it is specializing in the meta-level concept of program compare to other programming tools for education. That is to say, this is a tool for understanding the program that makes a program rather than the teaching material for doing/use of a program.

This is a powerful feature but has a risk of the purpose becoming ambiguous. Then for LanguageGame, how to use with many samples is required.

Future task

The present implementation has many redundant and unstable elements. I want to narrow down the goal from now and to aim implementation that is easy to use. Anyway, concrete applications currently I assumed and a technical improving point is described

Technical upgrade

Buildup of drag-and-drop function

In tile mode, now the function of symbol operation with drag and drop is poor. Insertion is impossible although adding and deletion of symbol are possible. For make insertion possible, it is necessary to display an insertion point to detect the pattern of list expression like list : | first list.

Accomplishment of real-time parsing

About the real-time parsing which is feature of LanguageGame, it is still incomplete. Especially, it has many portions with unstable operation in order to have to hold an incomplete syntax tree while usual parser generator treat only complete syntax tree. I have to complete this portion. Moreover, although now only LL grammar is supported, larger grammar class is necessary for practical.

Support of regular right-part grammar

To be dependent on BNF grammar with recursion, now it does not understand easily for non-programmer especially to describe a grammar as list structure. The notation is friendlier and more intuitively to adopting regular right-part grammar.

Educational application

When dealing with recursive or tree structure in field, such as mathematics and chemistry, LanguageGame offers an intuitive model. There are many cases that the notation of an idea is difficult but the idea itself. In such a case, unnecessary confusion is avoidable to design simpler notation with LanguageGame.

As a precedence example in this direction, there are functional language groups like as Lisp and Haskell. Those languages are suitable for symbol processing to be nearly mathematical notation. LanguageGame also has the character like a functional language because it does not depend in order of processing and it does not have a state. Then LanguageGame can be said that it is the environment that united with descriptiveness of a functional language and friendliness Squeak has. Moreover, the environment of Lisp or Haskell itself can be implemented in Smalltalk using the framework of LanguageGame, and the multimedia nature of Squeak can also be united with the logical feature such languages have.

Practical application

A lot of interesting application can be considered from the dynamic syntax tree generation function LanguageGame has. For example, recently in integrated development environment, it needs the function to detect dynamically the code that a user inputs and to provide an input complement and help. If the parser generation system of LanguageGame is more developed, the comprehensive framework for such input support function is generable. Moreover there may be applicable to the input support not only in development environment but also general purpose.

It is a very effective idea that complex object is made from a text in a viewpoint of the application productivity. For example, in web application, now using HTML language makes building interface easily and more portable than RAD system. Although XML with abstract semantic data will more popular, using a language for more abstraction that specialized in each application, it is able to generate a user interface automatically from a business rule.

In system development, cost occurs with the objective description of a business rule as well as programming. As another possibility of LanguageGame, there are development and implement of notation that support description of such a rule.

Accomplishment

The present accomplishment can be downloaded from here.

http://languagegame.org:8080/ggame/9

 

 

 

言語ゲーム最終レポート

山宮

propella@yuri.sakura.ne.jp

株式会社クリプトワンソフト

背景

コンピュータに指示を与えるために、メニュー選択、ボタン、アイコンのドラッグなど、現在私たちはたくさんの方法を持っている。近年のコンピュータユーザインターフェースの研究によりさまざまな方法が考案されて来た。とりわけ、WYSWIG(What You See Is What You Get) と呼ばれる方法により、ユーザインターフェースはより豊かになり、エンジニア以外の人々にも使いこなせるようになった。しかし、コンピュータと対話する最も基本的な手段はやはりプログラミング言語のような一連のコマンドによる方法である。

現実の紙の代わりとしてコンピュータを使う限りWYSWIG方式は有効である。しかし、より抽象的で複雑な作業においては、プログラミング言語による方法に利点がある。なぜなら、このような言語のシンボルはより信頼性があり、再帰や参照などの強力な概念が使えるからである。GUIがいかに発達してもプログラミング言語の重要性は変わらない。

世界には数多くのさまざまな言語があり、それぞれ興味深い性質と特徴を備えている。これらプログラミング言語の文法には非常に興味を惹かれるが、言語自身の開発はより興味深いに違いない。もちろん、言語の開発は非常に困難である。そこで、人々が彼ら自身のプログラミング言語を簡単に作れるような方法を考える事にした。

パーサジェネレータは最も基本的なコンピュータソフトウェアの一つである。歴史的にさまざまなプログラミング言語が開発されてきたが、これらの言語のパーサを簡単に開発するために、自動パーサ生成系の技術が開発されてきた。いまやパーサジェネレータは確立された技術になっている。

概要

言語ゲームプロジェクトの動機は非常に簡単であった。もしもGUIを備え、コンピュータに詳しくない人でも使いこなせるパーサジェネレータがあったとしたらそこに一体何が起こるだろうか?コンピュータにとって、プログラミング言語は不可欠な物である。プログラミング言語を深く学ぶことによって、コンピュータをより深く知り、有効に活用する事が出来る。そして特筆すべき事に、コンピュータ言語自身もまた他の言語によって実装されたプログラムである。

コンピュータを単なる実際の紙や鉛筆の代替物として使う限りにおいては、このコンピュータの特質はたいした意味を持たない。しかし現実のシミュレートを超えて、自由に記号を扱う第2の脳としてコンピュータを捕らえた場合。プログラミング言語の再帰的な生い立ち―プログラミング言語もまたプログラムである―は非常に大きな意味を持つ。この再帰的な性質は、プログラマにとっては自明な物として利用されているが、もしもプログラマ以外の人々、学者や学生、芸術家、ビジネスマンによって利用することが出来れば、ここから新しいコンピュータの利用法が広がると期待できる。

言語ゲーム開発の第一段階として、最初にこのプロジェクトに備わるべきGUI について調査した。GUIの開発に集中するために、開発プラットフォームとして再利用できるGUIパーツがすでに大量に存在し、開発が容易なSqueakを選んだ。また、パーサ生成エンジンについては、Squeakで利用できる既存のソフトウェアであるT-Genをベースに開発を行った。

開発が進むにつれて、言語ゲームが備えるべき性質についても明らかになった。特に重要な点として以下の物が挙げられる。

操作のリアルタイム性

ユーザの操作を出来るだけすぐに反映させる事により効率の良い開発が期待できる。このリアルタイム性のために必要なデータ構造について設計を行った。

プログラムの外部表現

通常プログラミング言語では一連のテキストを記述する事によって意味を記述する。しかし、解析可能な情報であれば特にテキストにこだわる必要は無い。言語ゲームでは、ユーザにより親しみやすい印象を与えるため、絵文字によるプログラミングをサポートした。

意味解析

構文を表現するためにBNFが実用的な記法として確立している。しかし構文ツリーを生成したあとの意味を表現する事は難しい。言語ゲームにおいてはSmalltalkのブロック文記法をそのまま使用する事によって柔軟な意味表現を可能とした。

デバッグ

プログラマだけでなく一般ユーザにとってもコンピュータがどのようなプロセスで動作しているのかを把握することは重要である。コンピュータの動作を追跡し、可能であれば動的に振る舞いを変更する事によってユーザはシステムの動作を直感的に把握する事が出来る。この目的を実現する最低限シンプルなデバッガについて開発した。

外部オブジェクトとの通信

自由に外部のオブジェクトを操作する事によって、ユーザは楽しいアプリケーションを作成する事が出来る。しかし整合性のある外部インタフェースを設計する事は非常に難しい仕事である。言語ゲームの場合、この点において成功しているとは言い難い。現在の実装では多少強引だがクラス変数に静的にオブジェクトの参照を格納して外部との通信を実現している。この部分は今後の大きな課題である。

開発内容

設計

メインウインドウ

Fig 1

メインウインドウ(Fig 1)は上下二つの領域に分けられる。上部を文法ペインと呼び、BNF記法によって文法を記述する。下部を入力ペインと呼び、これから解析する文を入力する。それぞれのインタフェースとして、テキストモードとタイルモードが存在し、タイルモードではドラッグアンドドロップを使って直感的に文法および文を構築する事が出来る

Fig 2 Fig 3

右クリックによって、文法ペインではFig 2 入力ペインにはFig 3のメニューが現れる。コマンドの意味は以下の通りである。

text

テキストモードにトグル

palette

その文法で使用可能なシンボルを表すパレットを表示する

images

シンボルに結び付けられた画像を閲覧する。

tree

文法ツリーの表示

inspect

文法ツリーのインスペクタを表示

explore

文法ツリーを辿るためにカスタマイズされたエキスプローラを表示

fire

現在の文法にアクションが設定されていれば実行する。

save … (文法ペインのみ)

現在の文法を記録(GgrammarUsersクラスのメソッドとして記録される)

load … (文法ペインのみ)

保存してあった文法を呼び出す。

build (文法ペインのみ)

現在の文法を再構築する。

step (入力ペインのみ)

現在の入力をステップ実行する。

monad (入力ペインのみ)

現在の入力によって構築される遅延実行オブジェクトを表示(開発時デバッグ用)

1 メニュー

文法の記法

言語ゲームで使われるBNF記法は、T-Genで使用される物のサブセットになっている。なお、T-Genと異なりスキャナを独自に作成する事は出来ない。スキャナに関しては言語ゲームの用意する標準のスキャナを使用する。文法は以下のように記述する。

非終端記号 : 記号 … [アクションブロック]

タイル

Fig. 4

Fig.5

文法ペイン、入力ペインのどちらでもタイルモードによる入力が出来る。タイルモードでは、ドラッグアンドドロップによるシンボルの追加が可能である。

入力ペインでタイルを使うには、まずパレットを右クリックメニューからパレットを呼び出す。パレットには、現在の文法で使用可能な終端記号が現れる。これをドラッグして、入力ペインの非終端記号の上に重ねる。もしも該当する非終端記号がドラッグしたタイルを解釈できる場合、非終端記号は緑色に変化する。

非終端記号が、ドラッグされた終端記号に対してルールを一意に決定する事が出来る場合、そのルールの残りの終端記号は自動的に補完される。

ブロックにeToys のタイルを使う

Fig. 6

Fig. 7

文法ペインに関しても同じようにタイル操作が出来る。ただ、ルールの一番右側の要素であるブロックについては、E-Toysのビューワからフェーズタイルを直接ドラッグ出来る。この場合、タイルはブロックコンテキストの表現形式に自動的に変換される。

タイルにイメージを使う

Fig. 8 editing external name

Fig. 9 drop a sckech morph

Fig.10 a image tool

タイルとして、単なる文字列だけではなく任意のモルフを使用する事が出来る。言語ゲームはそのモルフのexternalName をタイルの終端記号として扱う。具体的には、モルフに名前を付け、タイル上にドラッグする事により任意のモルフがタイルのシンボル文字列として扱われる。モルフと文字列は言語ゲーム内部で登録され、登録された文字列はいつでもモルフに変換される。

この機能により、絵文字によるプログラミングが実現出来る。英語を話せないユーザの助けになる他、将来的には別の言語を持つ人々が共同作業を行う際に役立つ可能性がある。

メニューのimagesから登録されたモルフを閲覧/削除するためのツールを呼び出す事が出来る。

アクションブロック

解析された文に意味を付加させるため、アクションブロックと呼ぶ仕組みを導入している。例を示す。

carton : [ 0 ]

carton : egg carton [ :a :b | 1 + b ]

この文法は入力された文字列の中で、”egg” の個数を数え、それを返すと言う機能を持つ。例えば、egg egg egg という入力があった場合、以下のツリーが生成される。

Fig. 11 parse tree

この文が実行されると、まず最初のルールにマッチしたブロックが実行される。この場合、Fig. 11 の右下で空記号がcarton にマッチし、[0]が実行される。これは、単にゼロを返すSmalltalk文である。

次に2行目のルール carton : egg carton がマッチする。このブロックで、egg は変数aに、cartonは変数bに割り当てられ、ブロックの右辺 1 + b が実行される。この場合、bに割り当てられたものは、最初のブロックで実行された答えの0になる。

以下これを繰り返し、最終的にeggが現れた文だけ加算され答えの3が返される。

デバッガ

コンピュータの動作は、文で説明されるよりも実際に示されるほうがずっと分かりやすい。言語ゲームでは楽しく文法のデバッグを行うため、Moleと呼ばれる簡単なデバッガを用意している。Moleはツリーの非終端子の上で右クリックメニューで登場させる。

Fig. 12 Mole

Moleをクリックすると、実行すべきシンボルの上に移動し、そのアクションから返される答えを表示する。MoleSqueakE-toyのメカニズムを使用して制御する事も出来る。

実装

タイルインタフェースと文法ツリー

ユーザからの入力にE-Toysと同じようなタイル形式のインターフェースを使うことにはいくつかの利点がある。ひとつは、ユーザにより親しみを持ってもらうこと。もうひとつは、ユーザの操作をある程度適切に制限出来ることである。操作の制限は誤操作を減らし、ユーザを問題の本質に集中させる事が出来る。適切な操作の制限を行うためにはまた複雑なタイル間の相互作用が必要である。これらを実現するために以下の構造が必要であった。

画面上でタイルを表示するためのGTileオブジェクト。GTile自身は文の意味を知らない。他のモルフがGTileにドラッグされると、GTileGNodeにその処理を問い合わせる。GNodeはそのモルフの内容によって、シンボルとして受け入れるか、無視するかを決める。

ツリーの内部構造GNode。他のパーサジェネレータが文法定義を一括して処理し、ツリーを生成するのに比較して、言語ゲームではユーザの操作に応じて動的にツリーのを変更してゆく。この機能を実現するためにノード自身がパーサへの参照を持つ。ある非終端子を表すノードAに終端子Bがドラッグされた場合、次のような操作が行われる。まず、Aは自身のパーサとBのパーサが同一であるかを比較する。異なっていた場合、Bを自分のパーサで汚染させ、Bをスキャンしなおす。Bの文法クラスを受け入れる場合。Aは自身のパーサから適合するルールを選択し、そのルールに従ってBを子ノードにする。もしもそのルールによって他の子ノードが一意に定まる場合、自動的に適合する子ノードを生成し接続する(入力補完として働く)

アクションとデバッガ

入力ペインやツリーのメニューで「fire」が選択された場合、言語ゲームはそのシーケンスを実行する。単純な四則計算器を作成する場合なら、これは単に与えられたブロックを入力に従って実行するだけで実現できる。しかし、ループなどの実行制御やデバッガ等の機能を考慮した場合、遅延実行をサポートするためのシンプルなラッパーが必要になる。

遅延実行の複雑さをユーザから隠蔽するために、言語ゲームの遅延実行オブジェクトGMonadは「求められてから実行する」モデルを採用している。例えば、[ :a :b | b + 1 ]と言うブロックが与えられた時、実際にabに束縛されるのはシンボルの値ではなく、シンボルをラップしたGMonadオブジェクトである。計算は即時実行されずブロックの形のままGMonadにラップされて次のルールの変数に束縛される。実行が完了し、画面に表示するために asStringメソッドが呼ばれた瞬間、GMonadは文字列として振る舞い始める。多くの場合は自分の持つ値やブロックを評価し、文字列として結果を返す。例外としてvalueメソッドが呼ばれた時のみブロックをそのまま返す。これによって制御構造が実現出来る。

GMonadが自身を評価する際、毎回デバッグ用の例外が発生する。この例外は通常無視されるが、Moleによってデバッグ実行される際。Moleはこの例外を受け取り、処理を中断させ実行中の変数等のコンテキストをユーザに知らせる。この機能とE-Toysの持つステップ実行機能を組み合わせて、音楽の自動演奏等の面白い使い方をする事が出来る。

外部オブジェクト

言語ゲームはGGame クラス変数として外部オブジェクトへの参照を保持している。下記の2種類がある。

VariableTable

ブロック内で使われる変数を表す辞書。テキストモードでペインに任意のモルフをドラッグすると、モルフはVariableTableに登録される。これにより任意のモルフをブロック内で操作できる。

SymbolCostume

終端記号とモルフを結びつける辞書。一度登録されたモルフは、すべての言語ゲームウインドウから同じように使う事が出来る。

テスト

本プロジェクトは調査的な目的を持つ為、包括的な結合テストは行っていない。単体テストについては、実装上の効率を助けるために、SUnitを利用して適宜テストスクリプトを作成した。

開発成果の特徴

GUIを特徴とした比較しうるパーサジェネレータ製品が他に無い為、言語ゲームの評価は非常に難しい。最初の言語ゲームの目的である教育用途に着目して、他の教育向けプログラミングツールと比較した場合の特徴は、言語ゲームがプログラムのメタレベル概念に特化していると言う点である。つまり、プログラムを作る/利用するための教材というよりは、プログラムを作るプログラムを理解するための道具という立場を取っている。

これは強力な特徴である反面、何に使えるのかあいまいになってしまう危険が伴うため、数多くのサンプルを用意しどのように使うと効果的なのかを強く打ち出す必要がある。

今後の課題、展望

現在の実装には冗長、不安定な要素も多い。今後はさらに目的を絞り、使いやすい実装を目指したいと思う。現時点での技術的な改善点および想定している具体的な応用について述べる。

技術的な改善

ドラッグアンドドロップ機能の強化

タイルモードにおいて、現在ドラッグアンドドロップによるシンボル操作の機能は弱く、シンボルの追加と削除は可能だが、挿入が出来ない。挿入を可能にするためには文法の中でリスト構造を表すパターン( list :| first list )を検出し挿入ポイントを、表示する必要がある。

リアルタイム文法解析の完成

言語ゲームの特徴であるリアルタイムな文法解析についてはまだまだ未完成である。特に、通常のパーサジェネレータが完成した文法ツリーしか扱わないのと異なり、言語ゲームは作成途中の未完成な文法ツリーを保持しなくてはならない為、動作が不安定な部分が多い。この部分を完成しなくてはならない。また、現在LL文法しか扱う事が出来ないが、実用的にはもう少し広いクラスの文法を扱える必要がある。T-Gen に依存しないシステムが必要になるだろう。

拡張BNF文法のサポート

アラン・ケイ氏よりご指摘を頂いたが、現在言語ゲームがサポートするBNF文法は再帰の考え方に依存するため、特にリスト構造を表す際に、直感的ではなく、一般の人々に分かりづらい記法となっている。拡張BNFを採用する事により、もっと分かりやすい文法の表記が可能になる。

教育的な応用

数学や化学などの分野で再帰的な構造を扱う場合に、言語ゲームは直感的なモデルを提供する。ある概念の難しさが、概念そのものから来るものでは無く、その表記法による場合が多い。そのような場合に、言語ゲームによってより単純な表記法を設計することで無用な混乱を避ける事が出来る。

この方面での先行事例としては、LispHaskellなどの関数型言語群がある。それらの言語はより数学的な記法に近く、記号処理に適している。言語ゲームもまた、それ自体としては処理の順番に依存せず、状態を持たないと言う点で関数型言語に近い側面を持ち、関数型言語の記述性にSqueakの持つ親しみやすさを持ち込む環境だとも言える。また、言語ゲームのフレームワークを利用してLispHaskellの実行環境自身をSmalltalkで実装し、これらの言語の持つ論理的な特徴とSqueakのマルチメディア性を融合させる事も出来る。

実用的な応用

言語ゲームの持つ動的な構文ツリー生成機能はそれだけでいくつもの興味深い応用が考えられる。例えば、近年の統合開発環境においてはユーザの入力するコードを検知し、適切な入力補完やヘルプの提供が必須となっている。言語ゲームのツリー生成系を発展させるとそういった入力支援機能の包括的なフレームワークを生成することが出来る。また、これらは開発環境のみならず、一般的なアプリケーションにおける入力支援に応用する事が出来るだろう。

一連のテキストから複雑なオブジェクトを生成すると言う考え方は、アプリケーションの生産性という観点から見ても非常に有効である。例えば近年のWEBアプリケーションでは、画面生成にHTML言語を介在させる事によりRADシステムに比較してメンテナンス性やポータビリティを向上させている。最近ではXMLによる抽象的な意味データの使用の方向に向かっているが、さらにアプリケーションに特化した抽象度の高い言語を使うことにより、ビジネスルールからのインタフェースの自動生成も可能になる。

システム開発の中で、実はコーディングそれ自体よりもルールの客観的な記述と言った点により多くのコストが発生する。言語ゲームのもうひとつの可能性として、このようなルールの記述を支援するような表記法の開発と実装があるだろう。

成果物

現在の成果物はこちらからダウンロード出来る。

http://languagegame.org:8080/ggame/9