LOGO

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
LOGO
Remi turtlegrafik.png
パラダイム マルチパラダイム:関数型手続き型リフレクティブ
登場時期 1967年
設計者 Wally Feurzeigシーモア・パパート
開発者 Wally Feurzeig、シーモア・パパート
型付け dynamic
主な処理系 UCBLogoなど多数
方言 StarLogoNetLogo
影響を受けた言語 LISP
影響を与えた言語 SmalltalkEtoysScratchNetLogoKTurtle英語版REBOL

LOGO(ロゴ)は、教育で使われているマルチパラダイムコンピュータプログラミング言語である。関数型プログラミング言語LISPを原型とし、元々は関数型言語のように書かれ[1]、出力機器としてタートルと呼ばれる機械を操作していた。また、リスト、ファイル、I/O、再帰などを扱う重要な能力を備えていた。今日、主にそのタートルグラフィックス英語版で記憶されているが、第3期の教育で教える言語はSchemeスクリプト言語に置換されてきた。

1967年教育(特に構成主義教育)のために、ダニエル・G・ボブロウ英語版Wally Feurzeigシーモア・パパート、シンシア・ソロモンによって開発された。名称はギリシャ語の logos (言葉)に由来し、他の既存の言語が数を処理するようにLOGOでは単語を処理することを強調している。多くの計算機科学の概念を教えるのに使うことができ、例えばカリフォルニア大学バークレー校の講師ブライアン・ハーヴェイ英語版は3巻の著書 Computer Science Logo Style にまとめている[2]

コンピュータの使用を通じた児童の思考能力の訓練を目的としており、主に8歳から12歳の児童にも扱い易いよう配慮された豊富なグラフィック関連のコマンドが特徴である。主な使用者は学生、教師が想定された。

歴史[編集]

1967年、マサチューセッツ州ケンブリッジにある研究機関 Bolt, Beranek and Newman (BBN) にて、Wally Feurzeig とシーモア・パパートが開発した[3]人工知能数理論理学発達心理学の成果を基盤としている。最初の4年間は、BBNにてLOGO開発とLOGOによる教育の研究が行われた。最初の実装はGhostと呼ばれ、SDS 940上のLISPで書かれていた。その目標は子どもが単語や文で遊べる数学の遊び場を作ることだった[4]。LOGOの設計では、しきいが低く使いやすいことと、エラーの原因がわかりやすいことが重視されている。タートル(亀)を採用したのは、視覚的フィードバックが即座に得られ、デバッグを即座に行えるからだった。

LOGOで操縦可能な亀のロボットMITで作られたのは1969年のことであり、それ以前から画面上で動作する仮想的なタートルが存在していた。現代のLOGOも、その最初のタートルの基本コンセプトからそれほど変わっていない。最初の亀ロボットは有線式であり、ラジコンあるいは無線操縦ではなかった。後にBBNはIrvingという亀ロボットを開発しており、それは触角センサを持ち、前進、後退、回転といった動きができ、ベルを鳴らす機能も備えていた。1968年から69年にかけて、マサチューセッツ州レキシントンの中学校で1年間かけたLOGO教育が実施されている。仮想的なタートルや亀ロボットを最初に教育に取り入れたのは同じレキシントンの小学校(5年生)で、1970年から71年にかけてのことである。

デザイン[編集]

LOGOは通常インタプリタとして実装されるが、最近ではコンパイラとして実装したものもある(LhoghoやLiogo)。大文字と小文字は区別しないが、出力では大文字/小文字を保持する。ブロック構造を持つ逐次的プログラミング言語と関数型プログラミング言語を折衷したものといえる。標準規格は存在しないが、UCBLogoが高く評価されている。教育用言語ではあるが、リスト処理能力の高さから実用的なスクリプトが非常に書きやすくなっている[5]

タートルとグラフィックス[編集]

LOGO最大の特徴はタートルであり[6]、画面上のカーソルで表され(タートルと呼ばれるようになったのは、先述の亀のロボットから)、それに動きと線描を命令することができ、プログラムに基づいて線で描かれたグラフィックスを生成できる。三角形または亀の形で表されることが多い(実際にはどんなアイコンでもよい)。シーモア・パパートがLOGOにタートルグラフィックスを追加したのは1960年代末ごろで、パパート自身が開発した亀ロボットに上げ下げ可能なペンを装着させて描画できるようにしたことからである。

実際問題として、それ以前からあるグラフィックス描画のモデルではなくタートルを採用したことで、LOGOでは亀ロボットの操縦を真似た形でグラフィックスを描画するようになった。そのためデカルト幾何学のように (x,y) で座標を指定するのとは異なり、ユークリッド空間的に相対的な距離と角度を指定することで描画する。タートルは命令を受けるとその時点の位置と向きを起点として動作し、例えば LEFT 90 と命令すれば右に90度回転する。子供は、自己と一体化しやすいタートルを操作してその軌跡を図形として描いたり色を塗ったりして楽しむ事が簡単に出来る。パパートはこれを body-syntonic reasoning(身体同調性推論)と呼んだ。特に複数のタートルを同時に操作可能なLOGO実装では、タートル(カーソル)の見た目を再定義でき、しかもタートル同士の当たり判定ができるようになっているものがあり、タートルをスプライトのように機能させることができる。

タートル方式は絶対座標指定方式の代替としてLOGO以外の環境でも使われることがある。例えば、フラクタルを生成するL-systemの描画にはタートル方式が適している。

データ[編集]

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 となり、:yy と呼ばれるものの中身をとる。その結果、両者を加算した和が数として得られる。

make は第二パラメータを評価した結果を第一パラメータに格納する。プログラミングの観点から言えば、makeの第一パラメータは参照渡しで、第二パラメータは値渡しである。

スコープ[編集]

通常は変数を使用前に宣言せず、変数スコープは大域的である。

local と宣言した変数は宣言したプロシージャおよびそのプロシージャを呼び出す任意のプロシージャに限定される(動的スコープの一種)。入力(LOGOでは引数を入力 input と呼ぶ)のあるプロシージャでは、引数値を保持するローカル変数が生成される。

リスト[編集]

LOGOは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 コマンドを使用する。

キーボードからの通常の入力ストリームから入力を受け付けるコマンドとして、readlistreadwordreadchar がある。入力ストリームはディスク上のファイルなどから入力するよう切り換えることができる。同様に出力もリダイレクト可能である。

文法[編集]

コマンドは1行または複数行で書かれる。多くのコマンドには短縮形があり、例えば FORWARDFDRIGHTRT と短縮できる。これは児童のタイピングの手間を省くという意味がある。セミコロンから行末まではコメントとして無視される。

; 辺の長さが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) コマンドを使用する。

関数とプロシージャ[編集]

各行は関数またはサブルーチンの呼び出しであり、それには次の2種類がある。

  • コマンド (command) - 何らかの副作用があるが、値は返さない。例えば print
  • 演算 (operation) - 値を返す。例えば、sumfirstreadlist など。

コマンドはPascalのプロシージャに似ており、演算はPascalの関数に似ている。コマンドとクエリの分離英語版 (CQS) で言えば、LOGOの演算はクエリに相当する。返す値がtrueまたはfalseというワードに限定されている演算を述語 (predicate) と呼び、慣習として名前の最後にpをつける。例えば、emptypwordplistp などがある。

Basic Chair

プロシージャは、TOENDで囲まれたコードで次のように定義できる。

TO CHAIR  REPEAT 4 [FD 100 RT 90]  FD 200  END

なお、初期の実装では物理的に1行で入力できる範囲でしかプロシージャを定義できなかった。

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の実装や方言があり、それぞれに特徴がある[7]。その多くは歴史的なもので既に使われていないが、今も活発に開発されているものもある。

標準規格がないが、言語の中核的部分については大まかな合意が形成されている。それでも様々な方言があり、相互に完全な互換性がない。単にタートルグラフィックス英語版の描画プログラムをLOGOと呼んでいる場合があり、状況を混乱させている。

1980年代初頭から中ごろにかけて、Apple II用の Apple LogoTI-99/4A用の TI Logo が発売され、初心者のプログラミング入門に最適と宣伝された。このころ欧米の小学校での教育によく使われ、LOGOの最盛期だったといえる。Apple Logo を開発したのはLCSI[8]で、これ (LCSI Logo) が初期のLOGO実装として広く普及した。

今日ほぼデファクトスタンダードとされているのがブライアン・ハーヴェイの開発したUCBLogo (Berkeley Logo) である[9]。フリーかつクロスプラットフォームの実装だが、GUIは初歩的なものしかなく、そのインタフェースを改良するプロジェクトがいくつかある。Microsoft Windows 向けに拡張したMSWLogo[10]とその後継であるFMSLogo[11]は、イギリスオーストラリアギリシャの学校でよく使われている。製品として販売されているLOGOも学校でよく使われており、MicroWorldsImagine Logoなどがある。

MSWLogoは複数のタートルを扱え、3Dグラフィックスを描画できる。また、COMポートやLPTポートからの入力を扱える。またウィンドウインタフェースもサポートしており、GUIを通したI/Oも可能で、キーボードやマウスからのイベントを扱える。MSWLogo 6.5 では gifsave コマンドで簡単なGIFアニメーションも生成できる。

最近の実装では、数千ものタートルを同時に扱える。代表的な実装として、MITStarLogo[12][13]とCCL (Center for Connected Learning) のNetLogo[14]がある。これを使って創発現象など、社会学、生物学、物理学などの分野の研究も行われている。

多くのLOGO実装は2Dグラフィックスしか扱えないが、Elicaなどは3Dグラフィックスをサポートしている[15]。多くの実装はインタプリタだが、Elicaの作者はLhoghoというコンパイラも開発している[16]。元々タートルは単純なロボットに対する操作をコンピュータ上で再現した物であるため、ロボット操作との親和性が非常に高い。そのためロボット制御ができる実装もある。例えば、レゴで作ったものをLOGOで操作するということも行われていたが、後にMINDSTORMSとして発展させた際に別の言語を採用した。その元になった Crikets はレゴとMITが共同開発したもので[17]、そのための Criket Logo が開発された[18]

オブジェクト指向的拡張を施した実装としてObjectLOGO[19]などがある。

LOGOを3次元グラフィックスに拡張した実装としてLogo3Dもある[20]

Javaで実装されたオープンソースのLOGOとして Daniel Azuma の開発したTurtleTracksがある。これは BSD Logo に拡張を施したもので、後に George Birbilis が .NET / J# に移植している。

E-Slate Logo はTurtleTracksにオブジェクト指向的プリミティブ (TELL, ASK, EACH, TELLALL) を追加して拡張したもので、こちらも開発は George Birbilis である[21]

日本で開発された、あるいは日本語版が発売されたLOGOとして以下の例がある。

  • ドリトル (Dolittle) - ロゴ言語実行環境「ロゴ坊」を拡張したもの。厳密にはLogo言語から派生したオリジナル言語を用いる。
  • FindOut - 旧福武書店が、ACCESSと共同で開発した教育用環境。
  • GLOGO - 大阪電気通信大学が開発した3次元対応LOGO
  • LogoWriter - LCSI Logoの日本語版。PC-9801シリーズをはじめ多くの機種に対応した、日本におけるLogoブームの火付け役となった実行環境。現行バージョンは「ロゴライターWin 4」。のちにレゴ・マインドストームのロボット制御用Logoとして「Lego Logo」も開発された(日本では「レゴロゴコントロール Lego TC Logo」として、Logo Writer 2とテクニカルレゴがセットでパッケージ販売された。
  • Microworlds - LCSI Logoの日本語版。現行バージョンは「マイクロワールドEx」、派生バージョンとしてEx Roboticsがある。他にMicroworlds Jr、Microworlds Pro。

影響[編集]

LOGOはプログラミング言語Smalltalkに大きな影響を与えた。オブジェクト指向がタートル・グラフィックスに起源を持つことはよく知られている[22][23]Smalltalkから派生したSqueakで書かれたプログラミング教育環境EtoysもLOGOの影響を強く受けている。

学習者の学習環境として思考の表現方法としては、そのEtoys、同じくSqueakで書かれたMITのScratch[24]、カーネギーメロン大学のAlice英語版[25]、Elicaがその可能性を競い合っている。

LOGOはまた、Boxerの基盤言語でもある。Boxerはカリフォルニア大学バークレー校マサチューセッツ工科大学の共同開発プロジェクトで、「リテラシーモデル」に基づくマイクロワールドの一種である[26]

KTurtle英語版は、緩やかにLOGOに基づいた子供向けプログラミング環境であり、KDE上で動作するKDE Education Projectに含まれる[27][28]

脚注[編集]

参考文献[編集]

関連項目[編集]

  • SMC-777 - 同言語環境(DR LOGO)が標準でサポートされていた。
  • N88-BASIC - NECの初期のパソコンにはタートルグラフィック機能を実装したBASICがついていた。
  • UCSD Pascal - LOGOと同様に教育用として開発された言語で、タートルグラフィック機能が実装されていた。
  • 知育玩具 - 遊びを通して教育ないし知能をトレーニングする玩具。LOGOも広義の知育玩具である。
  • Processing

外部リンク[編集]