XeroxのPalo Alto研究所が開発した初期のオブジェクト指向言語。しばしば最初のオブジェクト指向言語であると説明されるが、実際にはその前にSimulaという言語が存在したので、これは正しくない。
膨大なクラスライブラリとそれを閲覧するためのシステムブラウザをはじめ、アプリケーションランチャやデバッガなど、一通りのツールが実行環境に含まれている。アプリケーション開発は環境中の既存のクラスライブラリに自分の作成したクラスを追加していくことで行なう。
全てがオブジェクトであり、あらゆる操作はオブジェクトに対しメッセージを送ることで行なう。
メッセージの解決には動的束縛を用いるため、C++のような強い型付けのある言語と異なり、あらゆるオブジェクトに任意のメッセージを送ることが可能である。勿論、送られたメッセージを、そのレシーバが理解できなかったときはエラーとなる。
プログラミング例 x := 1. 10 timesRepeat: [ x := x + 1 ]. 10という数値オブジェクトに対し, [ x := x + 1. ] というブロック式オ ブジェクトを伴ったメソッド timesRepeat: を送ることで, 10回の繰り返 しを行なっている. x := 1. y := 0. (x > y) ifTrue: [ ^x := x - 1 ]. x に y を引数とした > というメッセージを送り, その結果の真偽オブ ジェクト(true もしくは false)に [ ^a := a - 1 ] というブロック式オ ブジェクトを伴った ifTrue: メッセージを送る. >のようなメッセージは, 結果によって true(Trueクラスの唯一のインス タンス)かfalse(Falseクラスの唯一のインスタンス)を返すように定義さ れており, また ifTrue: メッセージは Trueクラスでは引数ブロックを評 価するように定義され, False クラスでは何もしないように定義されてい る.