LOGO (ロゴ)は、教育向けとして設計されたマルチパラダイム のコンピュータ プログラミング言語 である。しばしば簡易言語だと誤解されていることもあるが、再帰 なども扱える言語としての機能、リストなどのデータ構造や、I/O・ファイルなどの一般的な機能を持ったライブラリなど、簡易言語ではなく、十分な能力を持ったプログラミング言語である。特徴的な機能としては「タートルグラフィック」がある。
1967年 、教育 (特に構成主義 および構築主義 (英語版 ) 学習)のために開発された。名称はギリシャ語の logos (言葉)に由来する。(現代ではいささか想像しにくくなったことであるが)当時代表的な既存言語であったFORTRAN や、その影響を受けた言語がもっぱら数値計算を指向したものであったのに対し、「言葉」で操作する言語であるといったようなことを強調したものである。多くの計算機科学の概念を教えるのに使うことができ、例えばカリフォルニア大学バークレー校 の講師ブライアン・ハーヴェイ (英語版 ) は3巻の著書 Computer Science Logo Style にまとめている[ 1] 。
コンピュータ の使用を通じた児童 の思考能力の訓練を目的としており、主に8歳から12歳の児童にも扱い易いよう配慮された豊富なグラフィック関連のコマンドが特徴である。主な使用者は学生、教師が想定された。
歴史
1967年、マサチューセッツ州 ケンブリッジ にある研究機関 Bolt, Beranek and Newman (BBN) にて、Wally Feurzeig (英語版 ) とシーモア・パパート が開発した[ 2] [ 3] 。人工知能 、数理論理学 、発達心理学 の成果を基盤としている。最初の4年間は、BBNにてLOGO開発とLOGOによる教育の研究が行われた。
最初のコンセプトは1966年 にシーモア・パパート、Wally Feurzeig、ダニエル・G・ボブロウ (英語版 ) の間で交わされた議論によって生まれ、パパートが本質的な機能の詳細を設計し、ボブロウがプロトタイプの実装を行った。シンシア・ソロモン、リチャード・グラント、フランク・フレイジャー、ポール・ウェクセルブラットも開発に貢献した[ 4] 。LOGOの初期の公開バージョンは「Ghost」という名前で、PDP-1 のLISP で書かれた。
目標は子どもが単語や文で遊べる数学の遊び場を作ることだった[ 5] 。LOGOの設計では、ハードルが低く使いやすいことと、エラーの原因がわかりやすいことが重視されている。タートル (亀)を採用したのは、視覚的フィードバックが即座に得られ、デバッグを即座に行えるからだった。
LOGOで操縦可能な亀のロボット がMIT で作られたのは1969年のことであり、それ以前から画面上で動作する仮想的なタートルが存在していた。現代のLOGOも、その最初のタートルの基本コンセプトからそれほど変わっていない。最初の亀ロボットは有線式であり、ラジコン あるいは無線 操縦ではなかった。後にBBNはIrvingという亀ロボットを開発しており、それは触角センサを持ち、前進、後退、回転といった動きができ、ベルを鳴らす機能も備えていた。1968年から69年にかけて、マサチューセッツ州レキシントン の中学校で1年間かけたLOGO教育が実施されている。仮想的なタートルや亀ロボットを最初に教育に取り入れたのは同じレキシントンの小学校(5年生)で、1970年から71年にかけてのことである。
タートルグラフィックス
LOGO最大の特徴はタートルであり[ 6] 、画面上のカーソル で表され(タートルと呼ばれるようになったのは、先述の亀のロボットから)、それに動きと線描を命令することができ、プログラムに基づいて線で描かれたグラフィックスを生成できる。三角形または亀の形で表されることが多い(実際にはどんなアイコンでもよい)。シーモア・パパートがLOGOにタートルグラフィックスを追加したのは1960年代末ごろで、パパート自身が開発した亀ロボットに上げ下げ可能なペンを装着させて描画できるようにしたことからである。
やはり現代からは想像が難しいことであるが、1960年代にはCRTによるラスタースキャンディスプレイ自体は存在していたものの、コンピュータグラフィックスの出力先としてはあまり一般的で実用的なものではなかった(たとえば、フレームバッファに必要なメモリの容量と帯域幅は当時のコンピュータの性能では非現実的であった)。当時、グラフィックの一般的な出力方式としては、プロッター やベクタースキャン ディスプレイであり、いずれも「デカルト座標」的に (x, y) の絶対値ないし相対値で指定するものであった。
そのような描画方式のほうが便利なこともあるが、正多角形や渦巻きなど、自然に再帰的あるいは繰返しになっているものを、そのまま自然に再帰あるいは繰返しによって描く、という操作にはあまり向いていない。
それに対しタートルでは、命令は常にその時点での状態から、相対的に作用する。すなわち、タートルは命令を受けるとその時点の位置と向きを起点として動作し、例えば LEFT 90 と命令すれば左に90度回転する。子供は、自己と一体化しやすいタートルを操作してその軌跡を図形として描いたり色を塗ったりして楽しむ事が簡単に出来る。パパートはこれを body-syntonic reasoning(身体同調性推論)と呼んだ。特に複数のタートルを同時に操作可能なLOGO実装では、タートル(カーソル)の見た目の再定義や、タートル同士の当たり判定 ができるようになっていて、ビデオゲーム用語でいういわゆる「スプライト 」のように使うことができるものもある。
「最終参照座標」といったようなものがある、タートル的な描画システムはごくありふれたものだが(例えばSVGのpath要素による描画など)、一例としては、L-system の図形を描画するFractintというプログラムは、内部でタートルへのコマンドという形で描画を表現している。
言語
大文字と小文字は区別しないが、出力では大文字/小文字を保持する。標準規格は存在しないが、UCBLogo が高く評価されている。教育用言語ではあるが、リスト処理能力の高さから実用的なスクリプトが非常に書きやすくなっている[ 7] 。
データ
UCBLogoには次の3種類のデータ型 がある。
数はワードの特殊ケースと解釈される。
静的型付け ではなく、データ型は実行によってチェックされる。
次の2つの記号は重要な意味を持つ。
コロン (:
) は「-の中身(値)」を意味する。これは変数が実際にはメモリの特定の位置を示していると児童に意識させるのに役立つ。
ダブルクオート ("
) は「そのワードをそれ自身として評価する」あるいは「それを評価した後の値はそれ以前と同じである」を意味する。他のプログラミング言語ではダブルクオートは引用符として2つを組みにして使うが、LOGOではそのような対応付けがない。
数はその点で特別であり、本当はダブルクオート付きで書く必要があるが、2 も "2 も同じに扱われる。
変数への代入(例えば、x := y + 3
)は、LOGOではmake
コマンドで行う。例えば、以下の2つの文は等価である。
make "x sum :y 3
make "x sum :y "3
make
は2つのパラメータをとり、この例での2つ目のパラメータは sum :y "3
である。sum
は2つのパラメータをとる演算 (operation) であり、2つのパラメータの和を計算する。"3
を評価すると 3
となり、:y
は y
と呼ばれるものの中身をとる。その結果、両者を加算した和が数として得られる。
make
は第二パラメータを評価した結果を第一パラメータに格納する。プログラミングの観点から言えば、make
の第一パラメータは参照渡しで、第二パラメータは値渡しである。
スコープ
通常は変数を使用前に宣言せず、変数スコープ は大域的である。
local
と宣言した変数のスコープは、宣言したプロシージャ およびそのプロシージャを呼び出す任意のプロシージャに限定される(動的スコープ の一種)。入力(引数)のあるプロシージャでは、実引数(アーギュメント)の値を保持するローカル変数が生成される(仮引数(パラメータ))。
リスト
LISP と同様のリストがあり、主要なデータ構造として頻用される。配列も用意している。
ワード列をリストに変換する演算、リスト群を配列に変換する演算、および逆の演算が存在する。
リストは配列とは異なり無限に拡張可能という利点がある。first, butfirst, last, butlast, butmember, member, item といった演算でリストからデータを取り出すことができる。データ要素をリストに追加する場合は、fput または lput という文を使う。
リストはキュー として扱うこともでき、そのための queue と dequeue という演算がある。また、スタック として扱うための push と pop という演算もある。
リストを処理する際はループではなく再帰を使うのが自然である。
制御構造コマンド
LOGOには、if文 、while文 、do-while文 、回数指定のループ といった、いくつかの一般的制御構造 を備えている。一般にLOGOではループよりも再帰を好んで使用する。
また、リストベースの制御構造もある。基本的な考え方は次のように2つのリストを使う。
OPERATION [ コマンドのリスト ] [ データのリスト ]
そうすると、コマンド群がリストの個々のアイテムに適用される。MAP, APPLY, FILTER, FOREACH, REDUCE, CASCADE といったテンプレートコマンドがある。テンプレート反復は、explicit-slot、named-procedure、named-slot(またはLambda)、procedure-text の4種類に分類される。
属性リスト
属性リストは特殊なリストで、奇数番目のアイテムは属性名、偶数番目のアイテムは属性値となっている。属性リストを操作するコマンドとして以下の3つがある。
pprop :listname :name :value
- 新たなペアをリストに追加する。
remprop :listname :name :value
- リストから指定したペアを削除する。
show gprop :listname :name
- 指定した属性名に対応する属性値を取得する。
I/O
コマンドウィンドウ(出力ストリーム)にテキストを書き込むには print
コマンドを使い、グラフィックスウィンドウにテキストを出力するには label
コマンドを使用する。
キーボードからの通常の入力ストリームから入力を受け付けるコマンドとして、readlist
、readword
、readchar
がある。入力ストリームはディスク上のファイルなどから入力するよう切り換えることができる。同様に出力もリダイレクト可能である。
構文
コマンドは1行または複数行で書かれる。多くのコマンドには短縮形があり、例えば FORWARD
は FD
、RIGHT
は RT
と短縮できる。これは児童のタイピングの手間を省くという意味がある。セミコロンから行末まではコメントとして無視される。
; 辺の長さが100の正方形を描画
FORWARD 100
LEFT 90
FORWARD 100
LEFT 90
FORWARD 100
LEFT 90
FORWARD 100
LEFT 90
FD 100 RT 120 FD 100 RT 120 ; 三角形の描画
FD 100 RT 120
LOGOでの Hello world プログラムは次のようになる。
print [Hello World]
ループ
ループ用コマンドは3種類ある。その1つが REPEAT で、次の例は正方形を描画する。
REPEAT 4 [FD 100 LEFT 90]
この場合、FD 100 LEFT 90
というコマンドを4回実行する。近似的に円を描くには、REPEAT 360 [FD 1 RIGHT 1] のように1度ずつ回転して1単位だけ描画するコマンドを360回反復すればよい。ループは入れ子可能であり、次のようなちょっとしたコードで面白い図形を描画できる。
REPEAT 36 [RT 10 REPEAT 360 [FD 1 RT 1]]
FD 25
RT 90
次もループの入れ子の例である。
REPEAT 36 [REPEAT 4 [FD 100 RT 90] RT 10]
ペン
タートルで破線を描いた例
タートルは、その尻尾にペンをつけた形のアナロジーで使われることが多い。タートルのペンは上げ下げでき、次のように破線を描くことができる。
FD 20 ; 直線を描きつつタートルが移動する
PENUP ; ペンを持ち上げる。そのため描画されなくなる
FD 20 ; 移動するが、線は描かれない
PENDOWN ; ペンを下ろすので、再び描画されるようになる
FD 20 ; 直線を描きつつタートルが移動する
PENUP ; ペンを持ち上げる。そのため描画されなくなる
FD 40 ; 移動するが、線は描かれない
PENDOWN ; ペンを下ろすので、再び描画されるようになる
RT 20 ; 右(時計回り)に20度回転
LOGOの設計は「しきいは低く、天井はない」(low threshold and no ceiling) という精神で貫かれており、初心者にとってはとっつきやすいが熟練したユーザーが使えば高度なこともできる。アニメーションを行うには図形を描画し、それを消去する機能を必要とする。タートルのアナロジーでは、タートルが描画だけでなく消去もできなければならない。UCBLogoでは PENERASE (PE) というコマンドで既に描かれているものをタートルが消去することができる。その状態でFDコマンドを使えば、タートルが通った跡に沿って既に描画されていたものが消去される。再び描画状態にするには PENPAINT (PPT) コマンドを使用する。
手続き
command - 何らかの副作用があるが、値は返さない。例えば print
operation - 値を返す。例えば、sum
、first
、readlist
など。
commandはPascal において値を返さない「プロシージャ」に似ており、operationはPascalにおいて値を返す「関数」に似ている。コマンドとクエリの分離 (英語版 ) (CQS) で言えば、LOGOのoperationはクエリに相当する。LISPに似た慣習として、返す値がtrue
またはfalse
に限定されているoperationを述語 (predicate) と呼び、慣習として名前の最後にp
をつける。例えば、emptyp
、wordp
、listp
などがある。
プロシージャ
Basic Chair
プロシージャは、TO とEND で囲まれたコードで次のように定義できる。
TO CHAIR REPEAT 4 [FD 100 RT 90] FD 200 END
LOGOではEDALL などのコマンドでエディタを呼び出すことができる。エディタではプロシージャを複数行で記述でき、完了の後に解釈される。
EDALL
TO CHAIR
REPEAT 4 [FD 100 RT 90] FD 200
END
新たに定義したプロシージャは名前に対応するワード(上記の例ではCHAIR)としてセーブされるが、LOGOのセッションが終了すると忘れられてしまう。上の例の場合、プロシージャを定義した後は CHAIR
と入力すれば REPEAT 4 [FD 100 LEFT 90] FD 200
というコードが実行される。つまり CHAIR
というワードはコマンドのように使うことができ、例えば REPEAT 4 [CHAIR]
とすれば CHAIR
の操作が4回反復される。
EDALL ; エディタモードに入り、その後実際のプロシージャを記述する
TO ERASECHAIR
PE
BK 200 REPEAT 5 [FD 50 RT 144]
PPT
END
CS CHAIR WAIT 200 ERASECHAIR
CS
はグラフィックスウィンドウをクリアするコマンド、WAIT
は指定した時間だけ待つコマンドである。次のようにすればアニメーションが可能となる。
CS REPEAT 20 [CHAIR WAIT 200 ERASECHAIR FD 20]
プロシージャ呼出
例によって描かれるパターン
LOGOではプロシージャに追加情報を渡し、プロシージャが情報を返すことができる。追加情報を使用するプロシージャは、定義の際にそれらに名前をつける。その場合、名前の前のコロンをつける。情報は値渡しであり、コロンは「-の値」を意味する。次の例のように CHAIR 200 という形でプロシージャを呼び出せば、:thesize に200という値がセットされ、FD :thesize とすることで、FDに対して200という値を指定して実行することになる。
EDALL ;
TO CHAIR :thesize
REPEAT 4 [FD :thesize RT 90]
FD :thesize
END
CS
REPEAT 9 [CHAIR 50 RT 20 CHAIR 100 WAIT 50 RT 20]
その他
数式は前置記法 が基本であり、sum :x :y, product :x :y, difference :x :y, quotient :x :y
のように記述する。中置記法 も可能である。
キーワードについての説明はhelp
コマンドで表示できる。その際キーワードの前にダブルクオートが必要である。
再帰で描いた螺旋
LOGOは再帰呼び出し が可能であり、プロシージャの定義内でそのプロシージャ自身を呼び出せる。
to spiral :size
if :size > 30 [stop] ; 脱出条件
fd :size rt 15 ; 本体処理
spiral :size *1.02 ; 再帰呼び出し(引数は中置記法の数式)
end
spiral 10
再帰 と描画機能によって、コッホ曲線 やヒルベルト曲線 、二分木 などといった再帰的な図形を自然に描くことができるのもLOGOの大きな特徴である。教育としては、子供に思い思いの図形を定義させ、図形に潜んでいる規則性に気づかせるというような指導が行われている。
原設計者たちが英語話者であったため、英語ベースで設計されたが、他言語をベースとしたコマンドへの置き換えがさかんに行われている言語でもある。例えば日本語化されたコマンドを持つLOGOでは、FORWARD
を「まえへ」、RIGHT
を「みぎへ」などとしているものがある。
実装
2012年11月時点で、261の実装や方言があり、それぞれに特徴がある[ 8] 。その多くは歴史的なもので既に使われていないが、今も活発に開発されているものもある。
標準規格がないが、言語の中核的部分については大まかな合意が形成されている。それでも様々な方言があり、相互に完全な互換性がない。単にタートルグラフィックス (英語版 ) の描画プログラムをLOGOと呼んでいる場合があり、状況を混乱させている。
1980年代初頭から中ごろにかけて、Apple II 用の Apple Logo やTI-99/4A 用の TI Logo が発売され、初心者のプログラミング入門に最適と宣伝された。このころ欧米の小学校での教育によく使われ、LOGOの最盛期だったといえる。Apple Logo を開発したのはLCSI[ 9] で、これ (LCSI Logo) が初期のLOGO実装として広く普及した。
今日ほぼデファクトスタンダードとされているのがブライアン・ハーヴェイの開発したUCBLogo (Berkeley Logo) である[ 10] 。フリーかつクロスプラットフォームの実装だが、GUI は初歩的なものしかなく、そのインタフェースを改良するプロジェクトがいくつかある。Microsoft Windows 向けに拡張したMSWLogo (英語版 ) [ ※ 1] とその後継であるFMSLogo (英語版 ) [ 11] は、イギリス 、オーストラリア 、ギリシャ の学校でよく使われている。製品として販売されているLOGOも学校でよく使われており、MicroWorlds やImagine Logo などがある。
MSWLogoは複数のタートルを扱え、3Dグラフィックスを描画できる。またウィンドウインタフェースもサポートしており、GUIを通したI/Oも可能で、キーボードやマウスからのイベントを扱える。MSWLogo 6.5 では gifsave コマンドで簡単なGIFアニメーション も生成できる。
最近の実装では、数千ものタートルを同時に扱える。代表的な実装として、MIT のStarLogo [ 12] [ 13] とCCL (Center for Connected Learning) のNetLogo [ ※ 2] がある。これを使って創発 現象など、社会学、生物学、物理学などの分野の研究も行われている。
多くのLOGO実装は2Dグラフィックスしか扱えないが、Elica などは3Dグラフィックスをサポートしている[ 14] 。多くの実装はインタプリタだが、Elicaの作者はLhogho [ ※ 3] というコンパイラも開発している。元々タートルは単純なロボット に対する操作をコンピュータ上で再現したものであるため、ロボット操作との親和性が非常に高く、実際にロボット制御ができる実装もある。例えば、Lego Technicsで作ったものをLOGOで操作するものとして、LCSI LOGO/LOGO Writer をベースにしたLOGO Writer ROBOTIQUE/Lego Logo/Lego TC LOGOも発売され、のちLego DactaとMITメディアラボ が共同でCriket Logo を用いたCriketを開発している[ 15] (レゴを後にMINDSTORMS として発展させた際に、別の言語を採用、LEGOsheetsとなっている)。
オブジェクト指向的拡張を施した実装としてObjectLOGO [ 16] などがある。
LOGOを3次元グラフィックスに拡張した実装としてLogo3D もある[ 17] 。
Java で実装されたオープンソースのLOGOとして Daniel Azuma の開発したTurtleTracks がある。これは BSD Logo に拡張を施したもので、後に George Birbilis が .NET / J♯ で動かしたものもある。
E-Slate Logo [ ※ 4] はTurtleTracksにオブジェクト指向 的プリミティブ (TELL, ASK, EACH, TELLALL) を追加して拡張したもので、こちらも開発は George Birbilis である。
日本で開発された、あるいは日本語版が発売されたLOGOとして以下の例がある。
ドリトル (Dolittle) - ロゴ言語実行環境「ロゴ坊」を拡張したもの。厳密にはLogo言語から派生したオリジナル言語を用いる。
FindOut - 旧福武書店 が、ACCESS と共同で開発した教育用環境。
GLOGO [ ※ 5] - 大阪電気通信大学が開発した3次元対応LOGO
ロゴライター (LOGO Writer) - Logo Computer Systems Inc.によるLCSI Logo/LOGO Writerの、ロゴジャパン株式会社/株式会社ロゴコミュニティによる日本語版。海外ではMactintoshに、日本語MS-DOS ベースではPC-9800シリーズ ・FMR50 /FMR60 およびFM-TOWNS にも対応した。定期的に機関紙が発行されるなど、日本におけるLOGOブームの火付け役となった実行環境。のちにレゴの制御用LOGOであるLego Logoの日本では「レゴロゴコントロール Lego TC Logo」として、2とテクニカルレゴがセットでパッケージ販売された。現行バージョンは「ロゴライターWin 4」、公式にはWindows 7 までサポートされているが、Windows 10 でも(初期バージョンのロゴノート読込も含め)動作可能。
Microworlds - LCSI Logoの株式会社エフ・シー・マネジメントによる日本語版。現行バージョンは「マイクロワールドEx」、Windows Vista からWindows 10 までサポートされ、プラグインでWebブラウザでも表示できる。派生バージョンとしてEx Roboticsがある。他にMicroworlds Jr、Microworlds Pro。
影響
LOGOはプログラミング言語Smalltalk に大きな影響を与えた。オブジェクト指向がタートル・グラフィックスに起源を持つことはよく知られている[ 18] [ 19] 。Smalltalk から派生したSqueak で書かれたプログラミング教育環境Etoys もLOGOの影響を強く受けている。
学習者の学習環境として思考の表現方法としては、そのEtoys、同じくSqueakで書かれたMITのScratch [ ※ 6] 、カーネギーメロン大学のAlice (英語版 ) [ ※ 7] 、Elicaがその可能性を競い合っている。
LOGOはまた、Boxerの基盤言語でもある。Boxerはカリフォルニア大学バークレー校 とマサチューセッツ工科大学 の共同開発プロジェクトで、「リテラシー モデル」に基づくマイクロワールドの一種である[ 20] 。
KTurtle (英語版 ) は、緩やかにLOGOに基づいた子供向けプログラミング環境であり、KDE 上で動作するKDE Education Project に含まれる[ 21] [ 22] 。
注釈
出典
参考文献
Harvey, Brian (1997), Computer Science Logo Style Volume 1: Symbolic Computing (2 ed.), MIT Press, ISBN 0-262-58148-5 , http://www.cs.berkeley.edu/~bh/v1-toc2.html
Harvey, Brian (1997), Computer Science Logo Style Volume 2: Advanced Techniques (2 ed.), MIT Press, ISBN 0-262-58149-3 , http://www.cs.berkeley.edu/~bh/v2-toc2.html
Harvey, Brian (1997), Computer Science Logo Style Volume 3: Beyond Programming (2 ed.), MIT Press, ISBN 0-262-58150-7 , http://www.cs.berkeley.edu/~bh/v3-toc2.html
How to Think Like a Computer Scientist: Logo Version (Paperback) , Allen Downey & Guido Gay, Lulu .
The Great Logo Adventure , Jim Muller, Doone Publications ISBN 0-9651934-6-2 - 絶版だが、MSWLogo のサイトからPDFファイルを圧縮したものをダウンロード可能
To Artificial Intelligence (1976) - LOGOを多く使っている初期のAIの教科書(エディンバラ大学 の方言 AI2LOGO を使用)
Turtle Geometry Abelson and diSessa
Children Designers , Idit Harel Caperton, Ablex Publishing Corporation ISBN 0893917885 .
Learning With Logo , Daniel Watt, McGraw Hill, ISBN 0-07-068570-3 .
Teaching With Logo: Building Blocks For Learning, Molly Watt and Daniel Watt, Addison Wesley (now Pearson) 1986, ISBN 0-201-08112-1
関連項目
外部リンク
ウィキメディア・コモンズには、
LOGO に関連するカテゴリがあります。
低水準言語 高水準言語
1950年代 1960年代 1970年代 1980年代 1990年代 2000年代 2010年代
架空の言語