雑談
![]() | |
パラダイム | オブジェクト指向 |
---|---|
デザイン: | アデル・ゴールドバーグ、ダン・インガルス、アラン・ケイ |
開発者 | ピーター・ドイチュ、アデル・ゴールドバーグ、ダン・インガルス、テッド・ケーラー、アラン・ケイ、ダイアナ・メリー、スコット・ウォレス、ゼロックスPARC |
初登場 | 1972年 | (開発開始は1969年)
安定版リリース | Smalltalk-80 バージョン 2 / 1980 |
タイピングの規律 | オブジェクトですが、実装によっては、強力または動的 |
範囲 | 語彙(静的) |
実装言語 | 雑談 |
プラットフォーム | ゼロックスアルト(74181)[1] [2] |
OS | クロスプラットフォーム(マルチプラットフォーム) |
主な実装 | |
Amber、Dolphin Smalltalk、GemStone/S、GNU Smalltalk、Pharo、Smalltalk/X、Squeak、Cuis Smalltalk、Haver、VA Smalltalk、VisualWorks | |
影響を受けた | |
Lisp、[3] Simula、[3] Euler、[3] IMP、[3] Planner、[3] Logo、[4] Sketchpad、[3] ARPAnet、[3] Burroughs B5000 [3] | |
影響を受けた | |
AppleScript、Common Lisp Object System、Dart、Dylan、Erlang、Etoys、Go、Groovy、Io、Ioke、Java、Lasso、Logtalk、Newspeak、NewtonScript、Object REXX、Objective-C、PHP 5、Python、Raku、Ruby、Scala、Scratch、Self、Swift | |
Smalltalkは純粋なオブジェクト指向 プログラミング言語(OOP) で、もともとは1970 年代に教育用途、特に構成主義学習用に作成されましたが、後にビジネスで使用されるようになりました。これは、 Alan Kay、Dan Ingalls、Adele Goldberg、Ted Kaehler、Diana Merry、Scott Wallace を含む Learning Research Group (LRG) の科学者によってXerox PARCで作成されました。
Smalltalk では、実行プログラムは、クラスに格納されたテンプレート コードのインスタンスである、不透明でアトミックな、いわゆるオブジェクトから構築されます。これらのオブジェクトは、中間の仮想マシン環境 (VM) を介してメッセージを渡すことで相互通信します。プリミティブと呼ばれる比較的少数のオブジェクトは、ライブ再定義に適しておらず、Smalltalk プログラミング環境とは独立して定義されることがあります。
Smalltalk は、ビジネス機能やデータベース機能など、他の用途に向けて業界で大きな発展を遂げ、現在でも使用されています。Smalltalk-80 は、最初に公開されたとき、オブジェクト指向プログラミング (OOP) という初期の分野に数多くの基礎的なアイデアを提示しました。
当初から、この言語は統合開発環境を介して対話型プログラミングを提供してきました。これには、言語によるコード実行におけるリフレクションと遅延バインディングが必要です。その後の開発により、そのような統合されたグラフィカル ユーザー インターフェイスやフロントエンド を欠いた Smalltalk 実行環境のインスタンスが少なくとも 1 つ生まれました。
Smalltalkのような言語は活発に開発されており、その周りにユーザーコミュニティが集まっています。アメリカ規格協会(ANSI)Smalltalkは1998年に承認され、Smalltalkの標準バージョンとなっています。[5]
Smalltalkは2017年のStack Overflow開発者調査で「最も愛されているプログラミング言語」の第2位を獲得しましたが、[6] 2018年の調査では最も愛されている26のプログラミング言語の中には入りませんでした。[7]
歴史
Smalltalkには多数の亜種があります。[8] Smalltalkという修飾語は、Smalltalk-80言語と互換性のあるVMを指すためによく使用されます。これは、1980年に作成され、公開された最初のバージョンです。Smalltalk VMを実行した最初のハードウェア環境は、Xerox Altoコンピュータでした。
Smalltalk は、ゼロックス パロアルト研究所(PARC)のAlan Kayが主導した研究の成果です。Alan Kay は Smalltalk の初期バージョンのほとんどを設計し、Adele Goldberg はほとんどのドキュメントを書き、Dan Ingalls は初期のバージョンのほとんどを実装しました。Smalltalk-71 と呼ばれる最初のバージョンは、 Simulaに触発されたメッセージ パッシングのアイデアに基づくプログラミング言語が「1 ページのコード」で実装できるという賭けで、Kay が数日間で作成しました。 [4]研究作業に使用された後のバリアントは現在 Smalltalk-72 と呼ばれ、アクター モデルの開発に影響を与えました。その構文と実行モデルは、現代の Smalltalk バリアントとは非常に異なっていました。
パフォーマンスを向上させるために実行セマンティクスの一部の側面を固定する大幅な改訂 ( Simulaのようなクラス継承実行モデルを採用) の後、 Smalltalk-76 が作成されました。このシステムには、クラス ライブラリ コード ブラウザー/エディターなど、現在ではおなじみのツールのほとんどを備えた開発環境がありました。 Smalltalk-80 では、プロパティと動作を個々のクラスに関連付けることにより、「すべてがオブジェクトである」(変数を除く) パラダイムを維持するのに役立つメタクラスが追加されました。さらに、整数値やブール値などのプリミティブも追加されました(たとえば、インスタンスを作成するさまざまな方法をサポートするため)。
Smalltalk-80はPARCの外部で利用可能になった最初の言語バリアントでした。1981年に、Tektronix、Hewlett-Packard、Apple Computer、DECと共有され、各社のプラットフォームでレビューとデバッグを行いました。[9] [10] 1981年8月のByte MagazineはSmalltalk-80を特集し、そのアイデアを多くの読者に紹介しました。Smalltalk-80に関する本もいくつか出版されました。Smalltalk-80は、Smalltalkの将来のすべての商用バージョンの基礎となりました。[11] Smalltalk-80バージョン1の最終リリースは1981年11月でした。 [12] Xeroxはバージョン1をApple、DEC、HP、Tektronixにのみ配布しましたが、これらの企業は構築したシステムを介して無制限に再配布することを許可されました。これにより、Smalltalkが広く普及しました。[13]その後、1983年にゼロックスはSmalltalk-80バージョン2をリリースしました。このバージョンは、制限付きライセンスではありましたが、一般に公開されました。バージョン1とバージョン2はほぼ同じでしたが、バージョン2にはスペル修正機能などの追加機能がありました。各リリースは、仮想イメージ(オブジェクト定義を含むプラットフォームに依存しないファイル)と仮想マシン仕様で構成されていました。[13]
ANSI Smalltalk は、1998 年以来、標準言語リファレンスとなっています。[14]現在人気のある 2 つの Smalltalk 実装バリアントは、これらのオリジナルの Smalltalk-80 イメージの子孫です。Squeakは、Apple Smalltalk を経由して Smalltalk-80 バージョン 1 から派生したオープンソース実装です。VisualWorksは、Smalltalk-80 2.5 および ObjectWorks (どちらも Smalltalk を市場に投入するために設立された Xerox PARC のスピンオフ企業である ParcPlace Systems の製品) を経由して Smalltalk-80 バージョン 2 から派生しています。世代間の興味深いつながりとして、2001 年に Vassili Bykov が、VisualWorks 内で Smalltalk-80 を実行する仮想マシンである Hobbes を実装しました。[15] ( Dan Ingalls が後に Hobbes を Squeak に移植しました。)
1980 年代後半から 1990 年代半ばにかけて、サポート、トレーニング、アドオンを含む Smalltalk 環境は、カリフォルニアを拠点とする ParcPlace Systems と Digitalk という 2 つの競合組織によって販売されていました。ParcPlace Systems は Unix/Sun マイクロシステム市場に重点を置く傾向があり、Digitalk は Microsoft Windows または IBM の OS/2 が稼働する Intel ベースの PC に重点を置きました。Smalltalk は大量のメモリを必要とし、実行時のパフォーマンスが限られており、当初はSQLベースのリレーショナル データベースサーバーへの接続がサポートされていなかったため、両社とも Smalltalk を主流にするのに苦労しました。ParcPlace Smalltalk は価格が高かったため、市場への浸透は中規模から大規模の商業組織に限られていましたが、Digitalk 製品は当初、より低価格でより幅広いユーザー層にリーチしようとしました。IBM は当初 Digitalk 製品をサポートしていましたが、1995 年に VisualAge/Smalltalk という Smalltalk 製品で市場に参入しました。Easel はこのとき、Windows と OS/2 で Enfin を導入しました。 Enfin は、IBM Smalltalk (後の VisualAge) の開発前に IBM が IT ショップに導入したため、ヨーロッパで非常に人気が高まりました。Enfin は後にCincom Systemsに買収され、現在はObjectStudioという名前で販売されており、Cincom Smalltalk 製品スイートの一部となっています。
1995年、ParcPlaceとDigitalkは合併してParcPlace-Digitalkとなり、1997年にカリフォルニア州アーバインに拠点を置くObjectShareとしてブランド名を変更した。ObjectShare ( NASDAQ : OBJS)は1999年まで株式公開されていたが、上場廃止となり解散した。合併後の企業は市場でのポジショニングに関してJavaに対する効果的な対応策を見つけることができず、1997年までに所有者は事業の売却を検討していた。1999年、Seagull SoftwareはObjectShare Java開発ラボ(オリジナルのSmalltalk/VおよびVisual Smalltalk開発チームを含む)を買収し、現在もVisualSmalltalkを所有しているが、Smalltalk製品の全世界での配布権はObjectShareが保持しており、その後Cincomに売却された。[16] VisualWorksはCincomに売却され、現在はCincom Smalltalkの一部となっている。CincomはSmalltalkを強力に支援しており、1999年以来毎年VisualWorksとObjectStudioの新しいバージョンを複数リリースしている。
Cincom、GemTalk、Instantiationsは、引き続きSmalltalk環境を販売しています。IBMは1990年代後半にJavaをサポートすることを決定したためVisualAge Smalltalkを終了し、2005年現在、 Instantiations, Inc. [17][アップデート]によってサポートされています。Instantiationsは製品名をVA Smalltalk (VAST Platform)に変更し、毎年新しいバージョンをリリースし続けています。オープンなSqueak実装には、元のSmalltalkコミュニティの多くを含むアクティブな開発者コミュニティがあり、One Laptop per Child (OLPC)プロジェクトのEtoys環境、共同アプリケーションCroquetプロジェクトの開発ツールキット、およびOpen Cobalt仮想世界アプリケーションを提供するために使用されました。GNU Smalltalkは、GNUプロジェクトのSmalltalk-80の派生のフリーソフトウェア実装です。Pharo Smalltalkは、研究と商用環境での使用を目的としたSqueakのフォークです。
2016 年現在、すべての Smalltalk 環境に広まっている重要な開発は、複雑な Web アプリケーションの構築を簡素化する 2 つの Web フレームワーク、SeasideとAIDA/Webの使用が増えていることです。Seaside は、Cincom、Gemstone、Instantiations に組み込んで拡張されたことで、市場で大きな関心を集めています。
影響
Smalltalkは、 Simulaをベースにした多くのオブジェクト指向プログラミング言語の1つでした。[18] Smalltalkは、最も影響力のあるプログラミング言語の1つでもあります。[要出典]その後に登場したオブジェクト指向言語のほとんどすべて、つまりFlavors、[19] 、 CLOS、Objective-C、Java、Python、Ruby、[20]など、Smalltalkの影響を受けています。また、Smalltalkは、アジャイルソフトウェア開発手法、ラピッドアプリケーション開発(RAD)またはプロトタイピング、ソフトウェア設計パターンのための最も人気のある言語の1つでした。[21] Smalltalkプラットフォームが提供する生産性の高い環境は、迅速な反復開発に最適です。
Smalltalk は、多くの点で現代のコンピューティングの世界を定義した、高等研究計画局(ARPA)が資金提供した大規模な研究プログラムから生まれました。Smalltalk に加えて、ハイパーテキスト、GUI、マルチメディア、マウス、テレプレゼンス、インターネットなどの実用的なプロトタイプが 1960 年代に ARPA の研究者によって開発されました。[22] [23] Alan Kay (Smalltalk の発明者の 1 人)は、iPad などの現代のタブレット コンピューターに似たDynabookと名付けたタブレット コンピューターについても説明しました。 [4]
Smalltalk 環境は、現在では一般的なオブジェクト指向ソフトウェア設計パターンを最初に開発した環境であることが多い。最も人気のあるものの 1 つは、ユーザー インターフェイス設計用のモデル ビュー コントローラー(MVC) パターンである。MVC パターンにより、開発者は同じ基礎データに対して複数の一貫したビューを持つことができる。これは、同じ基礎仕様のさまざまなビュー (エンティティ リレーション、データフロー、オブジェクト モデルなど) があるソフトウェア開発環境に最適である。また、基礎モデルをさまざまな角度や抽象化レベルから見ることができるシミュレーションやゲームにも最適である。[24]
Smalltalk言語と環境は、MVCパターンに加えて、グラフィカルユーザーインターフェイス(GUI)とWYSIWYG(見たままが得られる)ユーザーインターフェイス、フォントエディタ、UIデザインのデスクトップメタファーの歴史にも影響を与えました。Smalltalk環境に付属していた強力な組み込みデバッグおよびオブジェクト検査ツールは、Lispマシン環境から始まり、その後登場したすべての統合開発環境の標準となりました。[25]
オブジェクト指向プログラミング

他のオブジェクト指向言語と同様に、Smalltalk-80 の中心的な概念は (Smalltalk-72 ではそうではありません) オブジェクトの概念です。オブジェクトは常にクラスのインスタンスです。クラスは、インスタンスのプロパティと動作を記述する「設計図」です。たとえば、GUI のウィンドウ クラスは、ウィンドウにラベル、位置、ウィンドウの表示/非表示などのプロパティがあることを宣言する場合があります。また、クラスは、インスタンスが開く、閉じる、移動する、非表示にするなどの操作をサポートすることも宣言する場合があります。特定のウィンドウ オブジェクトはそれぞれ、それらのプロパティの独自の値を持ち、それぞれがクラスで定義された操作を実行できます。
Smalltalk オブジェクトは次の 3 つのことを行うことができます。
- 状態を保持します (他のオブジェクトへの参照)。
- 自分自身または別のオブジェクトからメッセージを受信します。
- メッセージの処理中に、メッセージを自分自身または別のオブジェクトに送信します。
オブジェクトが保持する状態は、常にそのオブジェクト専用です。他のオブジェクトは、そのオブジェクトに要求 (メッセージ) を送信することによってのみ、その状態を照会または変更できます。任意のメッセージは任意のオブジェクトに送信できます。メッセージが受信されると、受信者はそのメッセージが適切かどうかを判断します。メッセージがオブジェクトによって理解されない場合、仮想マシンは元のメッセージを引数として、doesNotUnderstand: メッセージを送信します。doesNotUnderstand: のデフォルト実装は例外を発生させます。例外がキャッチされない場合は、システムのデバッガーが開きます。Alan Kay は、オブジェクトが注目されているにもかかわらず、メッセージングが Smalltalk で最も重要な概念であるとコメントしています。「大きなアイデアは「メッセージング」です。Smalltalk/Squeak のカーネルはまさにそれです (そして、Xerox PARC フェーズでは決して完成しませんでした)。」[26]
他のほとんどの言語とは異なり、Smalltalk コードはシステムの実行中に変更できます。ライブ コーディングと「オンザフライ」での修正の適用は Smalltalk の主要なプログラミング手法であり、生産性の主な理由の 1 つです。
Smalltalk は「純粋な」オブジェクト指向プログラミング言語です。つまり、C++やJavaとは異なり、プリミティブ型はありません。すべての値はオブジェクトとして表され、整数の計算では他のオブジェクトと同様にメッセージ送信が使用されます。Smalltalk では、整数、ブール値、文字などの型も、対応するクラスのインスタンスであるという意味でオブジェクトであり、それらの操作はメッセージを送信することで呼び出されます。効率性と汎用性のために、整数は 4 つのクラスで実装されています。Integer はすべての整数の抽象スーパークラスです。SmallInteger はインスタンスがマシン ワードに収まるクラスで、たとえば 64 ビット実装で 61 ビットの符号付き範囲を持ちます。LargePositiveInteger と LargeNegativeInteger はバイトのベクトルです。その結果、Smalltalk は 52 の階乗を評価して 806581751709438785716606368564037669752895054408832778240000000000000 を生成できます。小さい整数から大きい整数への移行はプログラマーには透過的であり、変数には型宣言は必要ありません。これにより、システムは簡潔かつ柔軟になります。プログラマーは、他の言語ではプリミティブ値を実装するクラスを変更または拡張 (サブクラス化を通じて) できるため、インスタンスの新しい動作を定義できます (たとえば、新しい制御構造を実装するため)。また、既存の動作を変更することさえできます。この事実は、よく聞かれる「Smalltalk ではすべてがオブジェクト」というフレーズに要約されていますが、変数はそうではないため、「すべての値はオブジェクト」とより正確に表現できます。
すべての値はオブジェクトなので、クラスもオブジェクトです。各クラスは、そのクラスのメタクラスのインスタンスです。メタクラスもオブジェクトであり、すべて Metaclass というクラスのインスタンスです。クラスには、セレクタ (他の言語の関数プロシージャ名に相当) をメソッド オブジェクトにマップするメソッド ディクショナリが含まれています。メソッド オブジェクトは、メッセージを評価するために実行されるオブジェクトです。クラスは他のクラスを継承し、クラス階層のルートには Object または ProtoObject があります。最も抽象的なオブジェクトにメッセージを送信するには、受信者 (メッセージを送信するオブジェクト) のクラスを取得し、クラスのメソッド ディクショナリでメッセージのセレクタを検索し、次にスーパークラスを検索し、メソッドが見つかるか doesNotUnderstand が送信されるまでこれを繰り返します。Smalltalk 仮想マシンは、さまざまな手法を使用してメッセージ検索を高速化するため、システムはシンプルで一貫性のあるメッセージ バインディング メカニズムと優れた効率の両方を提供します。Smalltalk の匿名関数の表現方法であるコード ブロックもオブジェクトです。[27]コードブロックは非常に軽量な構文を持ち、特にコレクション階層の制御構造を実装するためにシステム全体で使用されます。
反射
リフレクションとは、解析ツリーや入力および出力パラメータのデータ型など、独自の構造を検査および/または表現する機能を持つソフトウェア プログラムに適用される用語です。リフレクションは、Smalltalk や Lisp などの動的対話型言語の機能です。リフレクション (解釈またはコンパイル) を備えた対話型プログラムは、解析/コンパイル中に生成され、プログラムでアクセスおよび変更可能なコード オブジェクト自体を含む、すべてのメモリ内オブジェクトの状態を維持します。
リフレクションは、Smalltalk のようなメタモデルを持つことの特徴でもあります。メタモデルは、プログラミング システム自体を実装するシステムの一部であり、開発者はメタモデルを使用して、実行中のシステム内のコードをウォークスルー、検査、変更したり、特定の種類の構造のすべてのインスタンス (たとえば、メタモデル内の Method クラスのすべてのインスタンス) を検索したりすることができます。
Smalltalk-80 は完全にリフレクションなシステムです。Smalltalk-80 は、構造的リフレクションと計算的リフレクションの両方を提供します。Smalltalk は構造的にリフレクションなシステムであり、その構造は Smalltalk-80 オブジェクトによって定義されます。システムを定義するクラスとメソッドCompiledMethod
もオブジェクトであり、それらが定義するシステムの完全な一部です。Smalltalk コンパイラは、それ自体が Smalltalk で記述され、システム内の他のすべてのコードとともに存在し、テキスト ソース コードをメソッド オブジェクト (通常は のインスタンス) にコンパイルします。これらは、クラスのメソッド ディクショナリに格納することでクラスに追加されます。クラスを定義するクラス階層の一部は、システムに新しいクラスを追加できます。システムは、クラスとメソッドを作成または定義する Smalltalk-80 コードを実行することで拡張されます。このように、Smalltalk-80 システムは「生きた」システムであり、実行時に自分自身を拡張する機能を持ち歩いています。実行時にコンパイラを拡張することさえ可能です。実際、これがコンパイラの開発と保守の方法です。
クラスはオブジェクトなので、「どのようなメソッドを実装しますか?」や「どのようなフィールド/スロット/インスタンス変数を定義しますか?」などの質問をすることができます。そのため、システム内の任意のオブジェクトに適用される汎用コードを使用して、オブジェクトを簡単に検査、コピー、シリアル化(デシリアル化)などすることができます。[28]
Smalltalk-80 は、システムの計算状態を観察する機能である計算リフレクションも提供します。オリジナルの Smalltalk-80 から派生した言語では、メソッドの現在のアクティベーションは、疑似変数 (6 つの予約語の 1 つ) を介して名前が付けられたオブジェクトとしてアクセス可能で、thisContext
これは従来の言語実装のスタック フレームに対応し、「コンテキスト」と呼ばれます。メッセージの送信は何らかのコンテキスト内で行われ、メッセージを評価するために別のコンテキストが作成されます。最初のコンテキストは、前者の送信者です。このように、スタックはコンテキスト オブジェクトのリンク リストであり、デバッガーは基本的にこの「スパゲッティ スタック」のインスペクターです。メソッドにメッセージを送信することにより、アクティベーションは「誰がこのメッセージを送信したか」などの質問をすることができます。これらの機能により、仮想マシンを変更せずにコルーチンまたはPrologthisContext
のようなバックトラッキングを実装できます。例外システムはこの機能を使用して実装されます。この興味深い使用法の 1 つは、Seaside Web フレームワークです。このフレームワークでは、編集された各ページの継続を保存し、ユーザーが Web サイトをナビゲートするときにそれらを切り替えて、Web ブラウザーの [戻る] ボタンの複雑さに対処するプログラマーを解放します。Seaside を使用した Web サーバーのプログラミングは、より一般的なプログラミング スタイルで行うことができます。[29]メッセージ送信と同様に、Smalltalk-80 仮想マシンは、コストのかかるコンテキストの使用を内部的に最適化し、スパゲッティ スタックの錯覚と柔軟性を、そのコストのほとんどをかけずに提供します。基本的に、コンテキスト オブジェクトは、たとえばメッセージが thisContext 変数に送信されたときに、必要に応じて遅延して作成されます。
Smalltalk がリフレクションをどのように使用できるかの一例は、エラー処理のメカニズムです。オブジェクトに実装されていないメッセージが送信されると、仮想マシンは、引数としてメッセージの具体化doesNotUnderstand:
を含むメッセージをオブジェクトに送信します。メッセージ (別のオブジェクト、 のインスタンス) には、メッセージのセレクタとその引数の が含まれます。対話型 Smalltalk システムでは、 のデフォルトの実装は、ユーザーにエラーを報告するエラー ウィンドウ (通知機能) を開くものです。これとリフレクション機能により、ユーザーはエラーが発生したコンテキストを調べ、問題のあるコードを再定義し、システム内で Smalltalk-80 のリフレクション機能を使用して続行できます。[30] [31]Message
Array
doesNotUnderstand:
doesNotUnderstand: のみを理解(実装)するクラスを作成することにより、doesNotUnderstand: メソッドを介して送信されたすべてのメッセージを傍受できるインスタンスを作成できます。このようなインスタンスは透過プロキシと呼ばれます。[32]このようなプロキシは、複数の Smalltalk システム間でメッセージが交換される分散 Smalltalk、オブジェクトがデータベースから透過的にフォールトアウトされるデータベース インターフェイス、promiseなど、さまざまな機能を実装するために使用できます。分散 Smalltalk の設計は、CORBAなどのシステムに影響を与えました。
構文
Smalltalk -80構文は、宣言と予約語をほんの少しだけ使用した、むしろ最小限のものです。実際、Smalltalk で予約されている「キーワード」はtrue
、、、、、、およびの6 つだけです。これらは、正確には擬似変数と呼ばれるもので、変数識別子の規則に従う識別子ですが、プログラマが変更できないバインディングを示します。、、および擬似変数はシングルトンインスタンスです。およびは、そのメッセージに応答してアクティブ化されたメソッド内のメッセージの受信者を参照しますが、への送信は、受信者のクラスではなく、メソッドの定義クラスのスーパークラスで検索されます。これにより、サブクラスのメソッドがスーパークラスの同じ名前のメソッドを呼び出すことができます。は、現在のアクティブ化レコードを参照します。組み込みの言語構成要素は、メッセージの送信、割り当て、メソッドの戻り、および一部のオブジェクトのリテラル構文のみです。あらゆる年齢の子供向けの言語として始まったため、標準の Smalltalk 構文では、主流のコーディング言語よりも英語に近い方法で句読点を使用します。条件評価と反復のための制御構造を含む言語の残りの部分は、標準 Smalltalk クラス ライブラリによって組み込み構造の上に実装されます。(パフォーマンス上の理由から、実装ではこれらのメッセージの一部を認識して特別なものとして扱う場合がありますが、これは最適化のみであり、言語構文にはコード化されていません。)
false
nil
self
super
thisContext
true
false
nil
self
super
super
thisContext
「Smalltalk の構文はポストカードに収まる」という格言は、アラン・ケイが数十、数百回に及ぶ公開講演のほぼすべてで語った言語の元々の構想に由来している可能性がある(前掲書)。あるいは、ラルフ・ジョンソンによる、メソッドの基本的な標準構文要素をすべて示すコードスニペットを指しているのかもしれない。[33] [34]
exampleWithNumber: x
| y |
true & false not & ( nil isNil ) ifFalse: [ self halt ] .
y := self size + super size .
#( $a #a 'a' 1 1.0 )
do: [ : each |
トランスクリプトの 表示: (各 クラス 名) ;
表示: ' ' ] .
^ x < y
リテラル
次の例は、Smalltalk-80 メソッドでリテラル値として記述できる最も一般的なオブジェクトを示しています。
数字。次のリストはいくつかの可能性を示しています。
42
- 42
123 . 45
1 . 2345e2
2r10010010
16 rA000
最後の 2 つのエントリは、それぞれ 2 進数と 16 進数です。「r」の前の数字は基数または基数です。基数は 2 の累乗である必要はありません。たとえば、36rSMALLTALK は 10 進数で 80738163270632 に等しい有効な数値です。
文字は、先頭にドル記号を付けて記述します。
$A
文字列は、一重引用符で囲まれた文字のシーケンスです。
'こんにちは世界!'
文字列に引用符を含めるには、2 番目の引用符を使用してエスケープします。
「私は彼らに『こんにちは、世界!』と言いました。」
一重引用符は文字列を区切るため、二重引用符をエスケープする必要はありません。
「私は彼らに『こんにちは、世界!』と言いました。」
2 つの等しい文字列 (文字列はすべて同じ文字を含む場合、等しい文字列となります) は、メモリ内の異なる場所に存在する異なるオブジェクトである可能性があります。文字列に加えて、Smalltalk には Symbol という文字シーケンス オブジェクトのクラスがあります。シンボルは一意であることが保証されており、異なるオブジェクトである 2 つの等しいシンボルは存在しません。そのため、シンボルの比較は非常に簡単で、メッセージ セレクタ (以下を参照) などの言語アーティファクトによく使用されます。
シンボルは # の後に文字列リテラルが続く形で記述されます。例:
# 'フー'
シーケンスに空白文字や句読点が含まれていない場合は、次のように記述することもできます。
#フー
配列:
#( 1 2 3 4 )
4 つの整数の配列を定義します。
#(( 1 2 3 4 ) [ 1 2 3 4 ] '4' 4.0 #4)
最初の要素がリテラル配列、2 番目の要素がバイト配列、3 番目の要素が文字列 'four' などである 7 つの要素の配列を定義します。
多くの実装では、ByteArray に対して次のリテラル構文がサポートされています。
# [ 1 2 3 4 ]
4 つの整数の ByteArray を定義します。
そして最後に、ブロック(匿名関数リテラル)
[...いくつかの Smalltalk コード... ]
以下は2つの引数を取り、数値や文字列など、「より小さい」と理解できる任意の2つのオブジェクトを比較します。
[ : a : b | a < b ]
ブロックについては本文でさらに詳しく説明します。
多くの Smalltalk 方言では、他のオブジェクト用の追加構文を実装していますが、上記の構文はすべてでサポートされている基本的なものです。
変数宣言
Smalltalk でよく使用される 2 種類の変数は、インスタンス変数と一時変数です。その他の変数と関連用語は、特定の実装によって異なります。たとえば、VisualWorks にはクラス共有変数と名前空間共有変数がありますが、Squeakや他の多くの実装にはクラス変数、プール変数、およびグローバル変数があります。
Smalltalk における一時変数宣言は、メソッド内で宣言される変数です (下記参照)。メソッドの先頭で、スペースで区切られ、縦棒で囲まれた名前として宣言されます。例:
|インデックス|
初期値 を含む index という名前の一時変数を宣言しますnil
。
1 つのバー セット内で複数の変数を宣言できます。
|インデックス母音|
2 つの変数、インデックスと母音を宣言します。すべての変数が初期化されます。文字列のインデックス付き変数は null 文字に初期化され、ByteArray は 0 に初期化されますが、それ以外の変数は nil に初期化されます。
割り当て
変数には ' ' 構文を使用して値が割り当てられます:=
。つまり、
母音 := 'aeiou'
以前に宣言された vowels 変数に文字列を割り当てます'aeiou'
。文字列はオブジェクト (一重引用符で囲まれた文字のシーケンスはリテラル文字列の構文) であり、コンパイル時にコンパイラによって作成されます。
オリジナルの Parc Place イメージでは、アンダースコア文字 ⟨_⟩ のグリフは、左向きの矢印 ⟨←⟩ として表示されていました (1963 年版のASCIIコードと同様)。Smalltalk は当初、この左矢印を唯一の代入演算子として受け入れていました。最近のコードの中には、代入として機能するアンダースコアと思われるものもまだ含まれており、この元の使用法を思い起こさせます。最近の Smalltalk 実装のほとんどは、アンダースコアまたはコロンとイコールの構文のいずれかを受け入れます。
メッセージ
メッセージは Smalltalk で最も基本的な言語構成要素です。制御構造もメッセージ送信として実装されます。Smalltalk は、デフォルトで動的ディスパッチと単一ディスパッチ戦略を採用しています (他のオブジェクト指向言語で使用される多重ディスパッチclass
とは対照的です)。メッセージ送信には 3 種類あります。1 つは、やなどの単一のキーワードを持つ単項メッセージ、 、size
などの算術演算などに使用されるバイナリ メッセージ、 の各引数の前にキーワードとそれに続くコロンがあるキーワード メッセージで、 はメッセージを引数およびとともにに送信します。単項メッセージの優先順位はバイナリ メッセージよりも高く、バイナリ メッセージの優先順位はキーワード メッセージよりも高く、評価は厳密に左から右の順に行われます。算術優先順位はありません。 は7 ではなく 9 と評価されます。
a < b
a ~= b
a between: b and: c
#between:and:
a
b
c
1 + 2 * 3
次の例では、メッセージ「factorial」を番号 42 に送信します。
42 階乗
この場合、42 はメッセージレシーバーと呼ばれ、'factorial' はメッセージセレクターと呼ばれます。レシーバーは、値 (この場合はおそらく42 の階乗) を返すことでメッセージに応答します。特に、メッセージの結果は変数に割り当てることができます。
aRatherBigNumber := 42 階乗
上記の「階乗」は、受信側という 1 つのオブジェクトのみが関係するため、単項メッセージと呼ばれます。メッセージは、次のように、引数として追加のオブジェクトを運ぶことができます。
2 上昇To: 4
この式には、2 つのオブジェクトが関係しています。2 はレシーバー、4 はメッセージ引数です。メッセージの結果、または Smalltalk の用語では、答えは16 になるはずです。このようなメッセージは、キーワード メッセージと呼ばれます。メッセージには、次の構文を使用して、さらに引数を含めることができます。
'hello world' インデックス: $o 開始位置: 6
これは、受信側文字列内の文字 'o' のインデックスに応答し、インデックス 6 から検索を開始します。このメッセージのセレクターは、2 つの部分、つまりキーワードで構成される "indexOf:startingAt:" です。
キーワードと引数をこのように交互に配置すると、引数が先行するキーワードによって説明されるため、コードの可読性が向上します。たとえば、C++ または Java のような構文を使用して四角形を作成する式は、次のように記述できます。
新しい長方形(100、200 );
どの引数がどれなのかは不明です。対照的に、Smalltalk では、このコードは次のように記述されます。
長方形の 幅: 100 高さ: 200
この場合の受信者はクラス「Rectangle」であり、応答は指定された幅と高さを持つクラスの新しいインスタンスになります。
最後に、特殊文字(アルファベット以外)のほとんどは、いわゆるバイナリ メッセージとして使用できます。これにより、数学演算子と論理演算子を従来の形式で記述できます。
3 + 4
これは、引数として 4 を渡して受信者 3 にメッセージ "+" を送信します (答えは 7 になります)。同様に、
3 > 4
は、引数 4 とともに 3 に送信されるメッセージ ">" です (答えは false になります)。プログラマーは、新しい単項メッセージやキーワード メッセージを自由に定義できるのと同様に、新しいバイナリ セレクターを自由に定義できます。
Smalltalk-80 言語自体はこれらの演算子の意味を暗示していないことに注意してください。上記の結果は、メッセージの受信者 (この場合は Number インスタンス) がメッセージ「+」および「>」にどのように応答するかによってのみ定義されます。
このメカニズムの副作用は、演算子のオーバーロードです。メッセージ「>」は他のオブジェクトでも理解できるため、「a > b」という形式の式を使用して比較することができます。
表現
Smalltalk は式ベースの言語です。制御構造を含むすべてのステートメントには、何らかのオブジェクトである値があります。式には複数のメッセージ送信を含めることができます。この場合、式は単純な優先順位に従って解析されます。単項メッセージの優先順位が最も高く、次にバイナリ メッセージ、キーワード メッセージの順になります。例:
3 階乗 + 4 階乗、 範囲: 10 ~ 100
次のように評価されます。
- 3は「factorial」というメッセージを受け取り、6と答えます。
- 4は「factorial」というメッセージを受け取り、24と答えます。
- 6は24を引数としてメッセージ「+」を受け取り、30を応答します。
- 30は、10と100を引数として「between:and:」というメッセージを受け取り、trueと答える。
最後に送信されたメッセージの回答が、式全体の結果になります。
必要に応じて括弧で評価の順序を変えることができます。例えば、
( 3 の 階乗 + 4 ) 10から100までの階乗
意味が変わり、式は最初に「3 の階乗 + 4」を計算して 10 を生成します。次に、その 10 は 2 番目の「階乗」メッセージを受け取り、3628800 を生成します。次に、3628800 は「between:and:」を受け取り、false と答えます。
バイナリ メッセージの意味は Smalltalk-80 構文にコード化されていないため、すべてのバイナリ メッセージは同じ優先順位を持つと見なされ、単純に左から右に評価されます。このため、バイナリ メッセージを使用する Smalltalk 式の意味は、その「従来の」解釈とは異なる場合があります。
3 + 4 * 5
「(3 + 4) * 5」と評価され、35 が生成されます。期待される答え 23 を得るには、括弧を使用して演算の順序を明示的に定義する必要があります。
3 + ( 4 * 5 )
単項メッセージは、次々に書き込むことで 連鎖させることができます。
3 階乗 階乗 対数
これは「factorial」を 3 に送信し、次に「factorial」を結果 (6) に送信し、最後に「log」を結果 (720) に送信して、結果 2.85733 を生成します。
一連の式は、次の (仮定の) 例のように、それぞれピリオドで区切って記述できます (ピリオドはステートメントの区切り文字であり、ステートメントの終了文字ではありません)。この例では、最初に Window クラスの新しいインスタンスを作成し、それを変数に格納してから、そのインスタンスに 2 つのメッセージを送信します。
| window |
window := 新しいウィンドウ 。ウィンドウラベル: 'Hello' 。ウィンドウが開く
上記の例のように、一連のメッセージを同じ受信者に送信する場合は、個々のメッセージをセミコロンで区切って カスケードとして記述することもできます。
ウィンドウの 新しい
ラベル: 'Hello' ;
開く
先ほどの例を単一の式として書き直すと、新しいウィンドウを一時変数に格納する必要がなくなります。通常の優先順位のルールに従って、単項メッセージ「new」が最初に送信され、次に「label:」と「open」が「new」の受信者に送信されます。
コードブロック
コード ブロック (匿名関数) は、リテラル値 (すべての値がオブジェクトであるため、オブジェクト) として表現できます。これは、角括弧を使用して実現されます。
[ :パラメータ | <メッセージ-式> ]
ここで、:params はコードが受け取ることができるパラメータのリストです。つまり、Smalltalk コードは次のようになります。
[ : x | x + 1 ]
次のように理解できます。
またはラムダ式で次のように表現されます。
そして
[ : x | x + 1 ]値: 3
次のように評価できる
または、ラムダ式では次のようになります。
結果のブロック オブジェクトはクロージャを形成できます。つまり、いつでもそれを囲むレキシカル スコープの変数にアクセスできます。ブロックはファーストクラス オブジェクトです。
ブロックは、値メッセージを送信することで実行できます。ブロックにパラメータを提供する複合バリエーションも存在します (例:value:value:
および ) valueWithArguments:
。
ブロックのリテラル表現は、一方では特定のコードの可読性を大幅に向上させる革新であり、反復を伴うアルゴリズムを明確かつ簡潔にコーディングできるようにしました。一部の言語では通常ループを使用して記述されるコードを、Smalltalk ではブロックを使用して簡潔に記述でき、場合によっては 1 行で記述できます。しかし、より重要なのは、ブロックではメッセージとポリモーフィズムを使用して制御構造を表現できることです。ブロックは計算を延期し、ポリモーフィズムを使用して代替を選択できるためです。したがって、Smalltalk の if-then-else は次のように記述および実装されます。
expr ifTrue: [ exprの場合に評価するステートメント ] ifFalse: [ exprでない場合評価するステートメント]
真の評価方法
ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
^trueAlternativeBlock 値
誤った評価方法
ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
^falseAlternativeBlock 値
positiveAmounts := allAmounts 選択: [ : anAmount | anAmount isPositive ]
これは関数型プログラミングに関連しており、計算パターン(ここでは選択)が高階関数に抽象化されます。たとえば、コレクションのメッセージselect:は、適切なファンクタの高階関数filterと同等です。[35]
制御構造
Smalltalk では、制御構造に特別な構文はありません。代わりに、オブジェクトに送信されるメッセージとして実装されます。たとえば、条件付き実行は、ブール オブジェクトに ifTrue: メッセージを送信し、ブール レシーバが true の場合にのみ実行されるコード ブロックを引数として渡すことによって実装されます。Boolean の 2 つのサブクラスは両方とも ifTrue: を実装します。サブクラス True の実装では常にブロックが評価され、サブクラス False の実装ではブロックが評価されません。
次のコードはこれを示しています。
結果 := a > b
ifTrue: [ 'より大きい' ]
ifFalse: [ '以下' ]
ブロックは、ユーザー定義の制御構造、列挙子、ビジター、例外処理、プラグ可能な動作、その他多くのパターンを実装するためにも使用されます。例:
| aString 母音|
aString := 'これは文字列です' 。
母音 := aString select: [ : aCharacter | aCharacter isVowel ] 。
最後の行では、文字列に、コード ブロック リテラルである引数を含むメッセージ select: が送信されます。コード ブロック リテラルは述語関数として使用され、文字列の要素が、"select:" メッセージの引数であるコード ブロックによって表されるテストを満たす文字のコレクションに含まれる場合にのみ、true を返します。
String オブジェクトは、そのメンバーを反復処理して (自分自身にメッセージ「do:」を送信することによって)、「select:」メッセージに応答し、選択ブロック (「aBlock」) を、そこに含まれる各文字を引数として 1 回評価します。評価されると (メッセージ「value: each」が送信されることによって)、選択ブロック (パラメータ「aBlock」によって参照され、ブロック リテラル「[:aCharacter | aCharacter isVowel]」によって定義されます)、ブール値を応答し、その後「ifTrue:」が送信されます。ブール値がオブジェクト true の場合、文字が返される文字列に追加されます。「select:」メソッドは抽象クラス Collection で定義されているため、次のように使用することもできます。
|長方形 aPoint 衝突|
長方形 := OrderedCollection
で: (長方形 左: 0 右: 10 上: 100 下: 200 )
で: (長方形 左: 10 右: 10 上: 110 下: 210 ) 。aPoint
:= Point x: 20 y: 20 。衝突:=長方形 で選択: [ : aRect | aRect containsPoint: aPoint ] 。
例外処理メカニズムは、ブロックをハンドラーとして使用します (CLOS スタイルの例外処理に似ています)。
[
何らかの 操作
]オン:エラー 実行: [ : ex |
ハンドラー-コード
ex 戻り
]
例外ハンドラの「ex」引数は、中断された操作の状態 (スタック フレーム、行番号、レシーバー、引数など) へのアクセスを提供し、計算の進行方法を制御するためにも使用されます (「ex proceed」、「ex reject」、「ex restart」、または「ex return」のいずれかを送信することによって)。
クラス
これは株式クラスの定義である: [36]
オブジェクト サブクラス: #MessagePublisher
インスタンス変数名: ''
クラス変数名: ''
プール辞書: ''
カテゴリ: 'Smalltalk の例'
多くの場合、この定義のほとんどは環境によって入力されます。これは、Object
という名前のサブクラスを作成するためのクラスへのメッセージであることに注意してくださいMessagePublisher
。言い換えると、クラスはSmalltalk のファーストクラス オブジェクトであり、他のオブジェクトと同様にメッセージを受信でき、実行時に動的に作成できます。
方法
オブジェクトがメッセージを受信すると、メッセージ名に一致するメソッドが呼び出されます。次のコードは、メソッド publish を定義し、このオブジェクトが 'publish' メッセージを受信したときに何が起こるかを定義します。
トランスクリプトショー を公開: 'Hello World!'
次のメソッドは、複数の引数を受け取って値を返す方法を示しています。
quadMultiply: i1 and: i2
「このメソッドは、指定された数値を互いに乗算し、その結果を 4 倍します。」
| mul |
mul := i1 * i2 .
^ mul * 4
メソッドの名前は です#quadMultiply:and:
。戻り値は^
演算子で指定されます。
オブジェクトは、メッセージに応答してどのメソッドを実行するかを実行時に動的に決定する役割を担いますが、多くの言語では、これはコンパイル時に(場合によっては常に)静的に決定されることがあります。
クラスのインスタンス化
次のコード:
メッセージパブリッシャー 新規
MessagePublisher クラスの新しいインスタンスを作成 (および返します)。これは通常、変数に割り当てられます。
パブリッシャー := MessagePublisher 新規
ただし、一時的な匿名オブジェクトにメッセージを送信することも可能です。
MessagePublisher 新規 公開
統合開発環境
Smalltalk は、統合開発環境をベースにした最初のシステムの 1 つです。コード開発や、グラフィックス、音楽などの他のアクティビティをサポートするツールが豊富にあります。Smalltalk は、ウィンドウ、アイコン、メニュー、ポインタ ( WIMP ) という現代のデスクトップ パラダイムが作成された最初のシステムです。ポインタはすでに発明されていましたが、Smalltalk は重なり合うウィンドウとポップアップ メニューを実装した最初のシステムでした。プログラミング ツールはいくつかありますが、ここでは次の 5 つの主要なツールについて説明します。ツールの画像は、2024 Squeak システムのものです。
- ブラウザ、コードの表示と書き込みの主要ツール
- ワークスペース、式を評価できるテキストエディタ
- トランスクリプトはテキストの出力ウィンドウであり、多くの方言ではワークスペースでもある。
- 検査官
- 通知/デバッガー、未処理の例外に応答して開かれるウィンドウ、完全なデバッガーに変形可能
ブラウザ
Smalltalk-80 派生システムでは、クラスはKernel-Numbers
、、、、などの「システム カテゴリ」内に編成され、クラス内のメソッドは、、、、などの名前付きカテゴリ内に編成されますKernel-Objects
。これは、従来の 5 つのペインを持つブラウザに倣ったもので、ウィンドウの上半分にある 4 つのペインには上から左に向かってシステム カテゴリのリストが表示され、そのうちの 1 つを選択すると 2 番目のウィンドウにそのカテゴリのクラスのリストが表示され、そのうちの 1 つを選択すると選択したクラスのメッセージ カテゴリのリストが表示され、そのうちの 1 つを選択すると最後のペインに選択したクラスの選択したカテゴリのメソッドのセレクタが表示されます。4 番目のペインでセレクタの 1 つを選択すると、そのメソッドのソースが 5 番目のペインに表示されます。カテゴリのみを選択しメソッドを選択していない場合、5 番目のペインには新しいメソッドを定義するためのテンプレートが表示されます。システム カテゴリを選択しクラスを選択していない場合は、カテゴリ内にクラスを作成するためのテンプレートが表示されます。さまざまなポップアップ メニューを使用すると、名前によるクラスの検索、選択したメッセージのすべての送信者、またはメッセージのすべての実装者の検索など、ツールを照会できます。このように、ブラウザーはコード読み取りおよびシステム探索ツールであると同時に、コード作成ツールでもあります。
Collections-Abstract
Collections-Sequenceable
accessing
arithmetic
instance creation
ワークスペース
ワークスペースは、単一の文字列を編集する単純なテキスト エディターです。ワークスペースには、Smalltalk 式を含む任意のテキストを入力できます。ポップアップ メニューの「実行」(選択した式を評価する)、「印刷する」(選択した式を評価し、選択範囲の直後に結果の印刷文字列を挿入する)、「検査する」(選択した式の評価結果のインスペクターを開く。以下の「インスペクター」を参照) は、よく使用される 3 つのアクションです。ブラウザーの 5 番目のペインもワークスペースであるため、メソッド定義を編集しながら式を評価し、その結果を挿入できます。また、メソッドのコメントに評価可能な式 (通常は例) を含めるのが一般的です。メソッドのテキストが表示されるほぼすべての場所 (デバッガーなど) では、ワークスペースと同様にコードを実行できるためです。ワークスペースとブラウザーのテキスト ペインはどちらも、通常、構文が強調表示されます。ブロックを使用して異なる式を区切ることで、1 つのワークスペースに複数の構文が強調表示された式を配置し、それぞれに独自の一時要素を含めることができます。

トランスクリプト
トランスクリプトは、グローバル トランスクリプトに関連付けられた特別なワークスペースです。したがって、を評価すると、80658175170943878571660636856403766975289505440883277824000000000000 に続いて改行がトランスクリプト ウィンドウに表示されます。したがって、トランスクリプトはログ メッセージを出力する場所として機能しますが、ワークスペースとしても機能します。
Transcript print: 52 factorial; cr; flush
検査官
さまざまなインスペクタがあり、さまざまな種類のオブジェクトを表示するように調整されているものもあります。最も基本的なインスペクタには 2 つのペインがあります。左側にはオブジェクト自体のリスト (ラベルは「self」) があり、その後にオブジェクト内のインスタンス変数が続きます。インスタンス変数には、文字列や配列などのシーケンス内の番号付きインスタンス v 変数が含まれます。右側にはワークスペース ペインがあります。リスト内の名前を選択すると、ワークスペースの内容が、選択した変数の印刷文字列に置き換えられます。インスタンス変数を選択したときにワークスペース ペイン内のテキストを編集して「承認」すると、評価の結果が選択した変数に割り当てられます。リスト メニューの「検査」コマンドを使用して「ドリルダウン」すると、選択したインスタンス変数に適用されます。より高度なインスペクタはカスケード サポートしており、追加のウィンドウを開かずにオブジェクト構造をトラバースできます。
通知機能/デバッガ
処理されない例外に対するデフォルトの応答は、通知ウィンドウを開くことです。通知ウィンドウは、最初の数回のアクティベーションのスタック バックトレースと、「デバッグ」、「続行」、「閉じる」などのボタンを含むウィンドウです。プログラマが「デバッグ」を選択すると、完全なデバッガが開きます。このウィンドウには 6 つのペインがあります。上部にはスタック ウィンドウがあり、スタック内のコンテキストのリストが含まれています。コンテキストを選択すると、中央のペインにコンテキストのメソッドのテキストが表示され、メソッド内の現在の式が強調表示されます。上部のコンテキストを選択すると、例外を発生させるメソッドが表示され、例外を発生させるメッセージが強調表示されます。コンテキストを選択すると、下部の 4 つのペインが更新されます。下部の左 2 つのペインは、選択したメッセージの受信者を検査する受信者インスペクタです。下部の右 2 つのペインは、選択したコンテキスト内の引数と一時変数名を表示し、これらの変数の表示と変更を可能にするコンテキスト インスペクタです。
メッセージを送信するとself halt
例外が発生し、通知機能が開き、簡単なブレークポイント機能が提供されます (通常、ブレークポイント機能は単純な停止以上の機能を提供しますが、これはそのような機能としては初めてのものでした)。ワークスペースには、「デバッグ」評価機能も用意されており52 factorial
、選択した式でデバッガーが開き、式内の最初のメッセージ送信位置に配置されます。したがって、ポップアップ メニューから「デバッグ」を選択すると、「doit コンテキスト」が選択され、factorial
セレクタが強調表示された状態でデバッガーが開きます。デバッガーには、「ステップ イン」、「ステップ オーバー」などを実行するためのボタンが用意されています。したがって、「ステップ イン」を選択すると、の評価を調べることができます52 factorial
。このように、デバッガーはプロセスのインスペクターを提供し、停止した計算を調べることができます。
例外が doesNotUnderstand: または subclassResponsibility 送信によって発生した場合、通知機能には [作成] ボタンが含まれ、プログラマーは、レシーバーの階層のどこに実装するメソッドの「初期ドラフト」を定義するかを選択できます。デバッガーでメソッドを再定義すると、選択したコンテキストが最初のステートメントにリセットされます (Smalltalk では引数は変更できないため、実行状態はメソッドの開始に戻ります)。このように、デバッガーはライブ プログラミングをサポートし、計算の進行に合わせてメソッドを定義します。これは、非常に生産的で楽しいプログラミング方法です。システム内のすべてのものが指先で操作できます。ワークスペースのフル機能を使用して部分式を評価し、ブラウザーを使用してプログラミング時にサポート コードを検索できます。
Hello Worldの例
Hello world プログラムは、新しいプログラミング言語のほとんどすべてのテキストで、言語の最も基本的な構文と環境を示すために学習する最初のプログラムとして使用されています。 Smalltalk の場合、このプログラムは非常に簡単に記述できます。 次のコードでは、メッセージ「show:」が、文字列リテラル「Hello, world!」を引数としてオブジェクト「Transcript」に送信されます。 「show:」メソッドを呼び出すと、その引数の文字 (文字列リテラル「Hello, world!」) がトランスクリプト (「ターミナル」) ウィンドウに表示されます。
トランスクリプト ショー: 「Hello, world! 」
この例の結果を表示するには、トランスクリプト ウィンドウを開く必要があります。
イメージベースの永続性
一般的なプログラミング システムのほとんどは、静的プログラム コード (クラス定義、関数、またはプロシージャの形式) を動的または実行時のプログラム状態(オブジェクトやその他の形式のプログラム データなど) から分離します。プログラム コードはプログラムの起動時に読み込まれ、以前のプログラム状態は構成ファイルまたはその他のデータ ソースから明示的に再作成する必要があります。プログラム (およびプログラマー) が明示的に保存しない設定は、再起動のたびに再設定する必要があります。従来のプログラムでは、プログラムがファイルを保存し、終了し、再読み込みするたびに、多くの有用なドキュメント情報が失われます。これにより、元に戻す履歴やカーソル位置などの詳細が失われます。イメージ ベースのシステムでは、コンピューターの電源がオフになったり、OS が更新されたりしても、これらすべてが失われることはありません。
しかし、多くの Smalltalk システムでは、プログラム データ (オブジェクト) とコード (クラス) を区別しません。実際、クラスはオブジェクトです。したがって、ほとんどの Smalltalk システムでは、プログラムの状態全体 (クラス オブジェクトと非クラス オブジェクトの両方を含む) をイメージファイルに保存します。その後、このイメージを Smalltalk仮想マシンでロードして、Smalltalk のようなシステムを以前の状態に復元できます。 [37] これは、 Alan Kayが作成し、彼の修士論文で説明されている言語である FLEX に触発されました。[ 38 ]
Smalltalkイメージは(再起動可能な)コアダンプに似ており、エラー発生時のプログラム状態に完全にアクセスして遅延デバッグやリモートデバッグを行うなど、コアダンプと同じ機能を提供できます。[39]
Lispなど、アプリケーション コードをデータの形式としてモデル化する他の言語でも、イメージ ベースの永続性がよく使用されます (たとえば、 EMACSを参照)。この永続化方法は、すべての開発情報 (プログラムの解析ツリーなど) が保存され、デバッグが容易になるため、迅速な開発に効果的です。
しかし、真の永続化メカニズムとしては重大な欠点もあります[引用が必要]。まず、開発者は実装の詳細を隠し、実行時環境で利用できないようにしたい場合がよくあります [ 引用が必要 ]。合法性とメンテナンス上の理由から、実行時に誰でもプログラムを変更できるようにすると、必然的に[引用が必要]複雑性や潜在的なエラーが発生しますが、これは実行時環境でソース コードを公開しないコンパイル済みシステムでは不可能です。また、永続化メカニズムは使いやすいものの、ほとんどのマルチユーザー システムに必要な真の永続化機能がありません[引用が必要] 。 最も明らかなのは、複数のユーザーが同時に同じデータベースにアクセスするトランザクションを実行する機能です[引用が必要]。
アクセスレベル
Smalltalk-80 のすべては、変更の可能性を回避するためにカスタマイズされていない限り、実行中のプログラム内から変更できます。つまり、たとえば、IDE は、再起動せずに実行中のシステムで変更できます。実装によっては、言語の構文やガベージ コレクションの実装も、実行中に変更できます。ステートメントもtrue become: false
Smalltalk では有効ですが、デモンストレーション目的以外で実行することは推奨されません (仮想マシン、イメージベースの永続性、およびバックアップを参照)。
ジャストインタイムコンパイル
Smalltalk プログラムは通常[引用が必要]バイトコードにコンパイルされ、その後仮想マシンによって解釈されるか、ネイティブのマシンコードに動的に変換されます。以前のメッセージ検索の結果は自己修正マシンコードにキャッシュされ、C++ 仮想メソッド呼び出しの間接関数呼び出しよりも優れた非常に高性能な送信を実現します。
実装のリスト
オープンスモールトーク
OpenSmalltalk VM (OS VM) は、いくつかの最新のオープンソース Smalltalk 方言のベースとなっている Smalltalk 仮想マシンの比較的高性能な実装です。[40] [41] OS VM は、Dan Ingalls、Ted Khaeler、John Maloney および他の多くの貢献者によって実装されたオリジナルの Back-to-the-Future [42] (BTTF) Squeak インタプリタから派生したものです。BTTF VM と同様に、OS VM は、それが開発された Smalltalk システム (Slang と呼ばれる Smalltalk のサブセットを使用) からネイティブC言語ソース コードにトランスパイルされ、[ 43]次に、特定のプラットフォームとハードウェア アーキテクチャに対してコンパイルされ、Smalltalk イメージのクロスプラットフォーム実行が実質的に可能になります。OS VM は、BTTF VM と次の点で異なります。
- 洗練されたマシンコードメソッドキャッシュ技術を含む、ネイティブマシンコードへのJITコンパイラの導入
- 「コンテキストからスタックへのマッピング」を使用してコンテキストオブジェクトのオーバーヘッドを大幅に削減する
- オリジナルのBTTFオブジェクト表現と、大幅に改善されたガベージコレクタ、オブジェクトピンニング、遅延実行を備えた、より効率的でネイティブな32ビットおよび64ビットスキームであるSpurの両方をサポートします。
OS VMに基づく注目すべきSmalltalk方言は以下のとおりである。[44]
- Squeakは、OpenSmalltalk VMが構築されたオリジナルのオープンソースSmalltalkである[44] : 2 は、Xerox PARCのSmalltalk-80 v1から派生したものである。
- Pharo Smalltalkは、 Squeakから派生したオープンソースのクロスプラットフォーム言語です。
- Croquet 、 Croquet プロジェクト用の Squeak 関連の Smalltalk VM
- Squeakから派生したCuis Smalltalk
その他
- Amber Smalltalk は、トランスパイルを介してJavaScript上で動作します。
- オブジェクトアートのドルフィン・スモールトーク
- Etoys、Squeak で構築された学習用ビジュアルプログラミングシステム
- GemTalk Systems のGemStone/S
- GNU Smalltalk、Smalltalk のヘッドレス (GUI なし) 実装
- Smalltalk MT Smalltalk for Windows (Object Connect より)
- CincomのObjectStudio
- ビジュアル プログラミング システムScratch (2.0 より前のバージョンのみが Smalltalk ベースです)
- StepTalk 、GNUstep スクリプト フレームワークは、 Objective-Cランタイムで Smalltalk 言語を使用します。
- Strongtalkはオープンソース(2006年以降)のWindows専用バージョンで、オプションの強力な型指定を提供します。当初はSun Microsystem Labsで作成されました。[45]
- IBM のVisualAge Smalltalk
- Visual Smalltalk Enterpriseおよび Smalltalk/V を含むファミリー
- CincomのVisualWorks は、オリジナルの Xerox PARC Smalltalk-80 v2 の後継です。
参照
参考文献
- ^ 「Alto I 回路図」(PDF) . Bitsavers . p. 54 . 2016年7月21日閲覧。
- ^ 「コンピュータとコンピューティングの歴史、現代コンピュータの誕生、パーソナルコンピュータ、Xerox Alto」 。 2016年4月19日閲覧。
- ^ abcdefgh Kay, Alan; Ram, Stefan (2003-07-23). 「2003-07-23 の電子メール」.アラン・ケイ博士による「オブジェクト指向プログラミング」の意味について. 2009年1月3日閲覧。
- ^ abc Kay, Alan. 「Smalltalk の初期の歴史」 。2007年 9 月 13 日閲覧。
- ^ 「ANSI Smalltalk Standard」。Smalltalk.org。2004年。2006年2月16日時点のオリジナルよりアーカイブ。2021年3月2日閲覧。
- ^ 「Stack Overflow 開発者アンケート 2017」.
- ^ 「Stack Overflow 開発者アンケート 2018」.
- ^ 「バージョン」。Smalltalk.org。2015年9月8日時点のオリジナルよりアーカイブ。2007年9月13日閲覧。
- ^ 「Tektronix による Smalltalk-80 実装者による第 1 回国際会議への招待」(PDF)。Tektronix Smalltalk ドキュメント アーカイブ。1981 年 8 月 27 日。
- ^ 「第 1 回 Smalltalk-80 実装者国際会議の出席者リスト」(PDF)。Tektronix Smalltalk ドキュメント アーカイブ。1981 年 9 月 24 日。
- ^ 「Smalltalk Zoo の紹介」CHM 2020 年 12 月 17 日。
- ^ 「VI リリースノート」(PDF) 1981 年 11 月 20 日。
- ^ ab Ingalls, Daniel ( 2020 ). 「Smalltalk の進化: Smalltalk-72 から Squeak まで」ACM プログラミング言語に関する議事録。4 : 1–101。doi : 10.1145 /3386335。S2CID 219603700。
- ^ 「ANSI Smalltalk Standard」。Smalltalk.org。2015年9月7日時点のオリジナルよりアーカイブ。2007年9月13日閲覧。
- ^ 「ホッブズ」。2003年4月19日時点のオリジナルよりアーカイブ。
- ^ 「履歴」。Seagull Software。2002年8月6日時点のオリジナルよりアーカイブ。2007年9月13日閲覧。
- ^ 「VisualAge Smalltalk 移行 FAQ」。
- ^ Simula 言語もオブジェクト指向であり、Smalltalk に先行していました (また、Smalltalk に影響を与えたことが認められていました) が、これはシミュレーション言語であり、汎用プログラミング言語ではありませんでした。
- ^ Cannon, Howard. 「Flavors オブジェクト指向プログラミングへの非階層的アプローチ」(PDF) . softwarepreservation.org . 2013 年12 月 17 日閲覧。
- ^ 「Rubyについて」ruby-lang.org . 2013年12月17日閲覧。
- ^ 「リファクタリングはどこから来たのか?」sourcemaking.com 。2013年12 月 17 日閲覧。
- ^ 「DARPA – ARPA」。livinginternet.com 。 2013年12月16日閲覧。
このニーズを満たすために、ARPAは1962年にIPTOを設立し、国防総省のペンタゴン、シャイアンマウンテン、SAC本部の主要コンピューターを相互接続する存続可能なコンピューターネットワークを構築することを使命としました。
- ^ 「初期のコンピュータネットワーキングにおけるエンゲルバートの役割」dougengelbart.org 。 2013年12月17日閲覧。
- ^ Krasner, Glen; Pope, Stephen (1988 年 8 月 - 9 月)。「Smalltalk -80 でモデル - ビュー - コントローラ ユーザー インターフェイス パラダイムを使用するためのクックブック」。オブジェクト指向プログラミング ジャーナル。
- ^ 「Our Influence」. cincomsmalltalk.com . 2013年12月16日閲覧。
- ^ Kay, Alan (1998 年 10 月 10 日)。「プロトタイプとクラス (Squeak リストの電子メール)」。
- ^ ゴールドバーグ、アデル、ロブソン、デイビッド (1989)。Smalltalk -80 The Language 。アディソン・ウェスレー。pp . 31、75–89。ISBN 0-201-13688-0。
- ^ Clark, AN (1997 年 9 月 18 日). 「Smalltalk におけるメタクラスとリフレクション」. arXiv : 1804.07272 [cs.SE].
- ^ デュカス、ステファン;エイドリアン・リーンハルト。レングリ、ルーカス。 「Seaside – 複数の制御フロー Web アプリケーション フレームワーク」(PDF)。scg.unibe.ch。ソフトウェア構成グループ Institut fur Informatik und angewandte Mathematik Universitaat Bern、スイス。2013 年12 月 16 日に取得。
- ^ Foote , Brian; Johnson, Ralph (1989 年 10 月 1 ~ 6 日)。「Smalltalk-80 のリフレクション機能」。オブジェクト指向プログラミング システム、言語、アプリケーションに関する会議議事録。pp . 327 ~ 335。doi : 10.1145/ 74877.74911。ISBN 0-89791-333-7. S2CID 14207536 . 2013年12月16日閲覧。
- ^ Smith, Brian C (1982-01-01). 「プログラミング言語における手続き型リフレクション」. MIT 技術レポート(MIT-LCS-TR-272) . 2013 年12 月 16 日閲覧。
- ^ ペック、マリアノ・マルティネス;ブーラカディ、ナウリー。デンカー、マーカス。デュカス、ステファン。ファブレス、リュック (2011-08-23)。Smalltalk の効率的なプロキシ。 ACM。 p. 1~16。土井:10.1145/2166929.2166937。hdl : 20.500.12210/28011。ISBN 978-1-4503-1050-5。
- ^ デュカス、ステファン (2001)。 「Squeak: ミニマリスト構文を使用しない / Squeak: ミニマリスト構文!」(PDF)。プログラムズ!ル・マガジン・デュ・デベロップメント。1 . 2024 年1 月 15 日に取得。
- ^ Ducasse, Stéphane. 「Smalltalk によるオブジェクト指向設計 - 純粋オブジェクト言語とその環境」(PDF)。ソフトウェア構成グループ (ベルン大学) 。2024年1 月 15 日閲覧。
- ^ ゴールドバーグ、アデル、ロブソン、デイビッド (1989)。Smalltalk -80 The Language。アディソン・ウェスレー。pp. 17–37。ISBN 0-201-13688-0。
- ^ ゴールドバーグ、アデル、ロブソン、デビッド (1989)。Smalltalk -80 The Language。アディソン・ウェスレー。pp. 39–53。ISBN 0-201-13688-0。
- ^ 「Image-Based Persistence」. book.seaside.st . 2013年12月17日閲覧。
- ^ Kay, Allen (1968). 「FLEX – 柔軟で拡張可能な言語」.ユタ大学修士論文.
- ^ Fowler, Martin. 「Memory Image」. martinfowler.com . 2011年10月7日時点のオリジナルよりアーカイブ。2013年12月17日閲覧。
- ^ "opensmalltalk-vm", OpenSmalltalk、Git hub、2020-11-03、2020-11-08取得
- ^ Eliot Miranda、Clément Bera、Elisa Gonzalez Boix、Dan Ingalls (2018)。Two Decades of Smalltalk VM Development: Live VM development through Simulation Tools; Virtual Machines and Language Implementations VMIL 2018、ボストン、米国 (レポート)。hal.archives-ouvertes.fr. doi :10.1145/3281287.3281295。2022年11月5日時点のオリジナルよりアーカイブ。
- ^ Ingalls, Dan; Kaehler, Ted; Maloney, John; Wallace, Scott; Kay, Alan (1997). 「バック・トゥ・ザ・フューチャー:実用的な Smalltalk が独自に書かれた Squeak の物語」ACM SIGPLAN 通知. 32 (10). ACM デジタル ライブラリ: 318–326. doi : 10.1145/263700.263754 .
- ^ “Slang”. Squeak . 2020年11月8日閲覧。
- ^ ab Miranda, Eliot; Bera, Clément; Gonzalez Boix, Elisa; Dan, Ingalls (2018 年 10 月 8 日)。「Smalltalk VM 開発の 20 年: シミュレーション ツールによるライブ VM 開発」(PDF)。
- ^ 「Strongtalk: オプションの型システムを備えた高性能オープンソースSmalltalk」。2021年11月25日閲覧。
さらに読む
- ゴールドバーグ、アデル(1983年12月)。Smalltalk -80:対話型プログラミング環境。Addison- Wesley。ISBN 0-201-11372-4。
- Goldberg, Adele ; Kay, Alan編 (1976 年 3 月)。Smalltalk-72 取扱説明書(PDF)。カリフォルニア州パロアルト: Xerox Palo Alto Research Center。2011年 11 月 11 日閲覧。
- ゴールドバーグ、アデル、ロブソン、デイビッド(1983年5月)。Smalltalk -80:言語とその実装。Addison- Wesley。ISBN 0-201-11371-6。
- ゴールドバーグ、アデル、ロブソン、デイビッド(1989年1月11日)。Smalltalk 80:言語。Addison- Wesley。ISBN 0-201-13688-0。
- Kay, Alan C. (1993 年 3 月). 「Smalltalk の初期の歴史」(PDF) . ACM SIGPLAN Notices . 28 (3). ACM : 69–95. doi :10.1145/155360.155364. 2023 年 5 月 3 日時点のオリジナル(PDF)からアーカイブ。
- グレン・クラスナー編 (1983 年 8 月)。Smalltalk-80: 歴史の断片、アドバイスの言葉。Addison- Wesley。ISBN 0-201-11669-3。
- Nierstrasz, Oscar; Ducasse, Stéphane; Pollet, Damien; Black, Andrew P. (2009-10-07). Squeak by Example. Kehrsatz, スイス: Square Bracket Associates. ISBN 978-3-9523341-0-2。
- Nierstrasz, Oscar; Ducasse, Stéphane; Pollet, Damien; Black, Andrew P. (2010 年 2 月 23 日)。Pharo by Example。Kehrsatz、スイス: Square Bracket Publishing。ISBN 978-3-9523341-4-02009年10月21日時点のオリジナルよりアーカイブ。
- ウィンストン、パトリック・ヘンリー(1997 年 9 月 3 日)。On to Smalltalk。MIT、米国:Addison Wesley。ISBN 978-0-201-49827-1。
- Brauer, Johannes (2015).プログラミング Smalltalk – 初歩からのオブジェクト指向. Springer. ISBN 978-3-658-06823-3。
- 「Smalltalk特集号」。Byte 6 (8)。McGraw-Hill。1981年8月。 2013年10月18日閲覧。
- Goldberg, Adele (1981 年 8 月)。「Smalltalk-80 システムの紹介」。Byte . 6 ( 8)。McGraw-Hill。2013年 10 月 18 日閲覧。
- インガルス、ダン(1981 年 8 月)。「Smalltalk の設計原則」。Byte 6 ( 8)。McGraw-Hill。2011年11 月 11 日閲覧。
- Tesler, Larry (1981 年 8 月)。「Smalltalk 環境」。Byte 6 (8)。McGraw-Hill。2016年5 月 2 日閲覧。
外部リンク
- 無料のオンライン Smalltalk 書籍
- 雑談について
- ファロ スモールトーク
- スクイーク・スモールトーク
- シンコム スモールトーク オブジェクトスタジオ
- シンコム スモールトーク ビジュアルワークス
- ドルフィン・スモールトーク
- GNUスモールトーク
- スモールトーク/X
- ストロングトーク
- アンバー・スモールトーク
- レッドライン・スモールトーク
- スカーレット・スモールトーク
- VA スモールトーク
- 宝石
- GLASS (GemStone、Linux、Apache、Seaside、Smalltalk)
- スモールトークMT
- Smalltalk-78 オンライン エミュレータ
- Squeak、Pharo、Cuis、Newspeak 用の OpenSmalltalk クロスプラットフォーム仮想マシン
- Smalltalk-80 Bluebook の C++ 実装: GitHub の dbanay と rochus-keller による