LOGO
LOGO（ロゴ）は、教育向けとして設計されたマルチパラダイムのコンピュータプログラミング言語である。しばしば簡易言語だと誤解されていることもあるが、再帰なども扱える言語としての機能、リストなどのデータ構造や、I/O・ファイルなどの一般的な機能を持ったライブラリなど、簡易言語ではなく、十分な能力を持ったプログラミング言語である。特徴的な機能としては「タートルグラフィック」がある。
1967年、教育（特に構成主義教育）のために、、、シーモア・パパート、シンシア・ソロモンによって開発された。名称はギリシャ語の "logos" （言葉）に由来する。（現代ではいささか想像しにくくなったことであるが）当時代表的な既存言語であったFORTRANや、その影響を受けた言語がもっぱら数値計算を指向したものであったのに対し、「言葉」で操作する言語であるといったようなことを強調したものである。多くの計算機科学の概念を教えるのに使うことができ、例えばカリフォルニア大学バークレー校の講師は3巻の著書 "Computer Science Logo Style" にまとめている。
コンピュータの使用を通じた児童の思考能力の訓練を目的としており、主に8歳から12歳の児童にも扱い易いよう配慮された豊富なグラフィック関連のコマンドが特徴である。主な使用者は学生、教師が想定された。
1967年、マサチューセッツ州ケンブリッジにある研究機関 Bolt, Beranek and Newman (BBN) にて、Wally Feurzeig とシーモア・パパートが開発した。人工知能、数理論理学、発達心理学の成果を基盤としている。最初の4年間は、BBNにてLOGO開発とLOGOによる教育の研究が行われた。LOGOの最初の実装は、「Ghost」という名前で、PDP-1のLISPで書かれた。その目標は子どもが単語や文で遊べる数学の遊び場を作ることだった。LOGOの設計では、しきいが低く使いやすいことと、エラーの原因がわかりやすいことが重視されている。タートル（亀）を採用したのは、視覚的フィードバックが即座に得られ、デバッグを即座に行えるからだった。
LOGOで操縦可能な亀のロボットがMITで作られたのは1969年のことであり、それ以前から画面上で動作する仮想的なタートルが存在していた。現代のLOGOも、その最初のタートルの基本コンセプトからそれほど変わっていない。最初の亀ロボットは有線式であり、ラジコンあるいは無線操縦ではなかった。後にBBNはIrvingという亀ロボットを開発しており、それは触角センサを持ち、前進、後退、回転といった動きができ、ベルを鳴らす機能も備えていた。1968年から69年にかけて、マサチューセッツ州レキシントンの中学校で1年間かけたLOGO教育が実施されている。仮想的なタートルや亀ロボットを最初に教育に取り入れたのは同じレキシントンの小学校（5年生）で、1970年から71年にかけてのことである。
LOGO最大の特徴はタートルであり、画面上のカーソルで表され（タートルと呼ばれるようになったのは、先述の亀のロボットから）、それに動きと線描を命令することができ、プログラムに基づいて線で描かれたグラフィックスを生成できる。三角形または亀の形で表されることが多い（実際にはどんなアイコンでもよい）。シーモア・パパートがLOGOにタートルグラフィックスを追加したのは1960年代末ごろで、パパート自身が開発した亀ロボットに上げ下げ可能なペンを装着させて描画できるようにしたことからである。
やはり現代からは想像が難しいことであるが、1960年代にはCRTによるラスタースキャンディスプレイ自体は存在していたものの、コンピュータグラフィックスの出力先としてはあまり一般的で実用的なものではなかった（たとえば、フレームバッファに必要なメモリの容量と帯域幅は当時のコンピュータの性能では非現実的であった）。当時、グラフィックの一般的な出力方式としては、プロッターやベクタースキャンディスプレイであり、いずれも「デカルト座標」的に (x, y) の絶対値ないし相対値で指定するものであった。
そのような描画方式のほうが便利なこともあるが、正多角形や渦巻きなど、自然に再帰的あるいは繰返しになっているものを、そのまま自然に再帰あるいは繰返しによって描く、という操作にはあまり向いていない。
それに対しタートルでは、命令は常にその時点での状態から、相対的に作用する。すなわち、タートルは命令を受けるとその時点の位置と向きを起点として動作し、例えば "LEFT 90" と命令すれば左に90度回転する。子供は、自己と一体化しやすいタートルを操作してその軌跡を図形として描いたり色を塗ったりして楽しむ事が簡単に出来る。パパートはこれを body-syntonic reasoning（身体同調性推論）と呼んだ。特に複数のタートルを同時に操作可能なLOGO実装では、タートル（カーソル）の見た目の再定義や、タートル同士の当たり判定ができるようになっていて、ビデオゲーム用語でいういわゆる「スプライト」のように使うことができるものもある。
「最終参照座標」といったようなものがある、タートル的な描画システムはごくありふれたものだが（例えばSVGのpath要素による描画など）、一例としては、L-systemの図形を描画するFractintというプログラムは、内部でタートルへのコマンドという形で描画を表現している。
大文字と小文字は区別しないが、出力では大文字/小文字を保持する。標準規格は存在しないが、UCBLogoが高く評価されている。教育用言語ではあるが、リスト処理能力の高さから実用的なスクリプトが非常に書きやすくなっている。
UCBLogoには次の3種類のデータ型がある。数はワードの特殊ケースと解釈される。
静的型付けではなく、データ型は実行によってチェックされる。
次の2つの記号は重要な意味を持つ。
数はその点で特別であり、本当はダブルクオート付きで書く必要があるが、2 も "2 も同じに扱われる。
変数への代入（例えば、codice_3）は、LOGOではcodice_4コマンドで行う。例えば、以下の2つの文は等価である。
codice_4は2つのパラメータをとり、この例での2つ目のパラメータは codice_6 である。codice_7 は2つのパラメータをとる演算 (operation) であり、2つのパラメータの和を計算する。codice_8 を評価すると codice_9 となり、codice_10 は codice_11 と呼ばれるものの中身をとる。その結果、両者を加算した和が数として得られる。
codice_4 は第二パラメータを評価した結果を第一パラメータに格納する。プログラミングの観点から言えば、codice_4の第一パラメータは参照渡しで、第二パラメータは値渡しである。
通常は変数を使用前に宣言せず、変数スコープは大域的である。
codice_14 と宣言した変数のスコープは、宣言したプロシージャおよびそのプロシージャを呼び出す任意のプロシージャに限定される（動的スコープの一種）。入力（引数）のあるプロシージャでは、実引数（アーギュメント）の値を保持するローカル変数が生成される（仮引数（パラメータ））。
LISPと同様のリストがあり、主要なデータ構造として頻用される。配列も用意している。LOGOには、if文、while文、do-while文、回数指定のループといった、いくつかの一般的制御構造を備えている。一般にLOGOではループよりも再帰を好んで使用する。
また、リストベースの制御構造もある。基本的な考え方は次のように2つのリストを使う。
そうすると、コマンド群がリストの個々のアイテムに適用される。MAP, APPLY, FILTER, FOREACH, REDUCE, CASCADE といったテンプレートコマンドがある。テンプレート反復は、explicit-slot、named-procedure、named-slot（またはLambda）、procedure-text の4種類に分類される。
属性リストは特殊なリストで、奇数番目のアイテムは属性名、偶数番目のアイテムは属性値となっている。属性リストを操作するコマンドとして以下の3つがある。
コマンドウィンドウ（出力ストリーム）にテキストを書き込むには codice_18 コマンドを使い、グラフィックスウィンドウにテキストを出力するには codice_19 コマンドを使用する。
キーボードからの通常の入力ストリームから入力を受け付けるコマンドとして、codice_20、codice_21、codice_22 がある。入力ストリームはディスク上のファイルなどから入力するよう切り換えることができる。同様に出力もリダイレクト可能である。
コマンドは1行または複数行で書かれる。多くのコマンドには短縮形があり、例えば codice_23 は codice_24、codice_25 は codice_26 と短縮できる。これは児童のタイピングの手間を省くという意味がある。セミコロンから行末まではコメントとして無視される。
LOGOでの Hello world プログラムは次のようになる。
ループ用コマンドは3種類ある。その1つが REPEAT で、次の例は正方形を描画する。
この場合、codice_27 というコマンドを4回実行する。近似的に円を描くには、REPEAT 360 [FD 1 RIGHT 1] のように1度ずつ回転して1単位だけ描画するコマンドを360回反復すればよい。ループは入れ子可能であり、次のようなちょっとしたコードで面白い図形を描画できる。
次もループの入れ子の例である。
タートルは、その尻尾にペンをつけた形のアナロジーで使われることが多い。タートルのペンは上げ下げでき、次のように破線を描くことができる。
LOGOの設計は「しきいは低く、天井はない」(low threshold and no ceiling) という精神で貫かれており、初心者にとってはとっつきやすいが熟練したユーザーが使えば高度なこともできる。アニメーションを行うには図形を描画し、それを消去する機能を必要とする。タートルのアナロジーでは、タートルが描画だけでなく消去もできなければならない。UCBLogoでは PENERASE (PE) というコマンドで既に描かれているものをタートルが消去することができる。その状態でFDコマンドを使えば、タートルが通った跡に沿って既に描画されていたものが消去される。再び描画状態にするには PENPAINT (PPT) コマンドを使用する。
commandはPascalにおいて値を返さない「プロシージャ」に似ており、operationはPascalにおいて値を返す「関数」に似ている。 (CQS) で言えば、LOGOのoperationはクエリに相当する。LISPに似た慣習として、返す値がcodice_32またはcodice_33に限定されているoperationを述語 (predicate) と呼び、慣習として名前の最後にcodice_34をつける。例えば、codice_35、codice_36、codice_37 などがある。
プロシージャは、TOとENDで囲まれたコードで次のように定義できる。
LOGOではEDALLなどのコマンドでエディタを呼び出すことができる。エディタではプロシージャを複数行で記述でき、完了の後に解釈される。
新たに定義したプロシージャは名前に対応するワード（上記の例ではCHAIR）としてセーブされるが、LOGOのセッションが終了すると忘れられてしまう。上の例の場合、プロシージャを定義した後は codice_38 と入力すれば codice_39 というコードが実行される。つまり codice_38 というワードはコマンドのように使うことができ、例えば codice_41 とすれば codice_38 の操作が4回反復される。
codice_43はグラフィックスウィンドウをクリアするコマンド、codice_44は指定した時間だけ待つコマンドである。次のようにすればアニメーションが可能となる。
LOGOではプロシージャに追加情報を渡し、プロシージャが情報を返すことができる。追加情報を使用するプロシージャは、定義の際にそれらに名前をつける。その場合、名前の前のコロンをつける。情報は値渡しであり、コロンは「-の値」を意味する。次の例のように CHAIR 200 という形でプロシージャを呼び出せば、:thesize に200という値がセットされ、FD :thesize とすることで、FDに対して200という値を指定して実行することになる。
数式は前置記法が基本であり、codice_45 のように記述する。中置記法も可能である。
キーワードについての説明はcodice_46コマンドで表示できる。その際キーワードの前にダブルクオートが必要である。
LOGOは再帰呼び出しが可能であり、プロシージャの定義内でそのプロシージャ自身を呼び出せる。
再帰と描画機能によって、コッホ曲線やヒルベルト曲線、二分木などといった再帰的な図形を自然に描くことができるのもLOGOの大きな特徴である。教育としては、子供に思い思いの図形を定義させ、図形に潜んでいる規則性に気づかせるというような指導が行われている。
原設計者たちが英語話者であったため、英語ベースで設計されたが、他言語をベースとしたコマンドへの置き換えがさかんに行われている言語でもある。例えば日本語化されたコマンドを持つLOGOでは、codice_23を「まえへ」、codice_25を「みぎへ」などとしているものがある。
2012年11月時点で、261の実装や方言があり、それぞれに特徴がある。その多くは歴史的なもので既に使われていないが、今も活発に開発されているものもある。
標準規格がないが、言語の中核的部分については大まかな合意が形成されている。それでも様々な方言があり、相互に完全な互換性がない。単にの描画プログラムをLOGOと呼んでいる場合があり、状況を混乱させている。
1980年代初頭から中ごろにかけて、Apple II用の Apple Logo やTI-99/4A用の TI Logo が発売され、初心者のプログラミング入門に最適と宣伝された。このころ欧米の小学校での教育によく使われ、LOGOの最盛期だったといえる。Apple Logo を開発したのはLCSIで、これ (LCSI Logo) が初期のLOGO実装として広く普及した。
今日ほぼデファクトスタンダードとされているのがブライアン・ハーヴェイの開発したUCBLogo (Berkeley Logo) である。フリーかつクロスプラットフォームの実装だが、GUIは初歩的なものしかなく、そのインタフェースを改良するプロジェクトがいくつかある。Microsoft Windows 向けに拡張したとその後継であるは、イギリス、オーストラリア、ギリシャの学校でよく使われている。製品として販売されているLOGOも学校でよく使われており、やImagine Logoなどがある。
MSWLogoは複数のタートルを扱え、3Dグラフィックスを描画できる。またウィンドウインタフェースもサポートしており、GUIを通したI/Oも可能で、キーボードやマウスからのイベントを扱える。MSWLogo 6.5 では gifsave コマンドで簡単なGIFアニメーションも生成できる。
最近の実装では、数千ものタートルを同時に扱える。代表的な実装として、MITのStarLogoとCCL (Center for Connected Learning) のNetLogoがある。これを使って創発現象など、社会学、生物学、物理学などの分野の研究も行われている。
多くのLOGO実装は2Dグラフィックスしか扱えないが、Elicaなどは3Dグラフィックスをサポートしている。多くの実装はインタプリタだが、Elicaの作者はLhoghoというコンパイラも開発している。元々タートルは単純なロボットに対する操作をコンピュータ上で再現した物であるため、ロボット操作との親和性が非常に高い。そのためロボット制御ができる実装もある。例えば、レゴで作ったものをLOGOで操作するということも行われていたが、後にMINDSTORMSとして発展させた際に別の言語を採用した。その元になった Crikets はレゴとMITが共同開発したもので、そのための Criket Logo が開発された。
オブジェクト指向的拡張を施した実装としてなどがある。
LOGOを3次元グラフィックスに拡張した実装としてLogo3Dもある。
Javaで実装されたオープンソースのLOGOとして Daniel Azuma の開発したTurtleTracksがある。これは BSD Logo に拡張を施したもので、後に George Birbilis が .NET / J♯ で動かしたものもある。
E-Slate Logo はTurtleTracksにオブジェクト指向的プリミティブ (TELL, ASK, EACH, TELLALL) を追加して拡張したもので、こちらも開発は George Birbilis である。
日本で開発された、あるいは日本語版が発売されたLOGOとして以下の例がある。
LOGOはプログラミング言語Smalltalkに大きな影響を与えた。オブジェクト指向がタートル・グラフィックスに起源を持つことはよく知られている。Smalltalkから派生したSqueakで書かれたプログラミング教育環境EtoysもLOGOの影響を強く受けている。
学習者の学習環境として思考の表現方法としては、そのEtoys、同じくSqueakで書かれたMITのScratch、カーネギーメロン大学の、Elicaがその可能性を競い合っている。
LOGOはまた、Boxerの基盤言語でもある。Boxerはカリフォルニア大学バークレー校とマサチューセッツ工科大学の共同開発プロジェクトで、「リテラシーモデル」に基づくマイクロワールドの一種である。
は、緩やかにLOGOに基づいた子供向けプログラミング環境であり、KDE上で動作するKDE Education Projectに含まれる。