Smalltalk

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
Smalltalk
Smalltalk80book.jpg
パラダイムオブジェクト指向
によって設計されたアラン・ケイダン・インガルスアデル・ゴールドバーグ
デベロッパーアラン・ケイ、ダン・インガルス、アデル・ゴールドバーグ、テッド・ケイラーダイアナ・メリー、スコット・ウォレス、ピーター・ドイチュゼロックス・パーク
初登場1972 ; 50年前(1969年に開発が始まりました) (1972)
安定リリース
Smalltalk-80バージョン2/1980 ; 42年前 (1980)
規律の入力強くダイナミック
範囲字句(静的)
実装言語Smalltalk
プラットホームゼロックスアルト74181[1] [2]
OSクロスプラットフォーム(マルチプラットフォーム)
主な実装
AmberDolphin SmalltalkGemStone / SGNU SmalltalkPharo、Smalltalk / X、Squeak、Cuis、Haver、VA SmalltalkVisualWorks
に影響を受けた
Lisp[3] Simula[3] Euler[3] IMP[3] Planner[3] Logo[4] Sketchpad[3] ARPAnet[3] Burroughs B5000 [3]
影響を受ける
AppleScriptCommon Lisp Object SystemDartDylanErlangEtoysGoGroovyIoIokeJavaLassoLogtalkNewspeakNewtonScriptObject REXXObjective-CPHP 5、PythonRakuRubyScalaScratchSelfSwift

Smalltalkは、オブジェクト指向動的型付け リフレクション プログラミング言語です。Smalltalkは、「人間とコンピューターの共生」に代表されるコンピューティングの「新世界」を支える言語として作成されました。[4]これはアラン・ケイダン・インガルスアデルゴールドバーグテッド・ケイラーダイアナ メリースコット・ウォレス、および1970年代の他の人。

この言語は、最初はSmalltalk-80として一般的にリリースされました。Smalltalkのような言語は活発に開発されており、周囲のユーザーの忠実なコミュニティを集めています。ANSI Smalltalkは1998年に承認され、Smalltalkの標準バージョンを表しています。[5]

Smalltalkは、2017年のStack Overflow Developer Survey [6]で「最も愛されているプログラミング言語」で2位になりましたが、2018年の調査で最も愛されている26のプログラミング言語には含まれていませんでした。[7]

歴史

Smalltalkの亜種はたくさんあります。[8]修飾されていない単語Smalltalkは、1980年に公開されて作成された最初のバージョンであるSmalltalk-80言語を示すためによく使用されます。SmalltalkVMを実行する最初のハードウェア環境はXeroxAltoコンピューターでした。

Smalltalkは、Xerox Palo Alto Research Center(PARC)のAlanKayが主導した研究成果ですAlan Kayが初期のSmalltalkバージョンのほとんどを設計し、Adele Goldbergがほとんどのドキュメントを作成し、DanIngallsが初期のバージョンのほとんどを実装しました。Smalltalk-71と呼ばれる最初のバージョンは、 Simulaに触発されたメッセージパッシングのアイデアに基づくプログラミング言語を「コードページ」に実装できるという賭けで、数日の朝にKayによって作成されました。[4]研究作業に使用された後のバリアントは、現在Smalltalk-72と呼ばれ、アクターモデルの開発に影響を与えました。その構文と実行モデル最新のSmalltalkバリアントとは大きく異なります。

実行セマンティクスのいくつかの側面を凍結してパフォーマンスを向上させる(実行のSimulaのようなクラス継承モデルを採用することにより)大幅な改訂の後、Smalltalk-76が作成されました。このシステムには、クラスライブラリコードのブラウザ/エディタなど、今ではおなじみのツールのほとんどを備えた開発環境がありました。Smalltalk-80はメタクラスを追加し、プロパティと動作を個々のクラス、さらには整数値やブール値などのプリミティブ(たとえば、インスタンスを作成します)。

Smalltalk-80は、PARCの外部で利用可能になった最初の言語バリアントであり、最初はSmalltalk-80バージョン1として、少数の企業(Hewlett-PackardApple ComputerTektronix、およびDigital Equipment Corporation(DEC))と大学(DEC)に提供されました。 UC Berkeley)のピアレビューとプラットフォームへの実装。その後(1983年)、Smalltalk-80バージョン2という名前の一般提供の実装が、イメージ(オブジェクト定義を含むプラットフォームに依存しないファイル)および仮想マシン仕様としてリリースされました。ANSI Smalltalkは、1998年以来標準の言語リファレンスとなっています。[9]

現在人気のあるSmalltalk実装バリアントの2つは、これらの元のSmalltalk-80イメージの子孫です。Squeakは、 AppleSmalltalkを介してSmalltalk-80バージョン1から派生したオープンソースの実装です。VisualWorksは、Smalltalk-80バージョン2からSmalltalk-80 2.5およびObjectWorks(Smalltalkを市場に投入するために設立されたXeroxPARCスピンオフ会社であるParcPlaceSystemsの製品)から派生しています。世代間の興味深いリンクとして、2001年にVassili Bykovは、VisualWorks内でSmalltalk-80を実行する仮想マシンであるHobbesを実装しました。[10]ダン・インガルスは後にホッブズをスクイークに移植した。)

1980年代後半から1990年代半ばにかけて、サポート、トレーニング、アドオンを含むSmalltalk環境は、カリフォルニアを拠点とする2つの競合組織であるParcPlaceSystemsとDigitalkによって販売されました。ParcPlaceSystemsはUnix / Sunマイクロシステム市場に焦点を当てる傾向がありましたが、DigitalkはMicrosoftWindowsまたは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は後にCincomSystemsに買収され、現在はObjectStudioという名前で販売されており、CincomSmalltalk製品スイートの一部です。

1995年にParcPlaceとDigitalkはParcPlace-Digitalkに統合され、1997年にカリフォルニア州アーバインにあるObjectShareとしてブランド名が変更されました。ObjectShare(NASDAQ:OBJS)は、1999年に上場廃止され、解散するまで公に取引されていました。合併した会社は、市場でのポジショニングに関してJavaに対する効果的な対応を見つけることができず、 1997年までにその所有者は事業の売却を検討していました。1999年、SeagullSoftwareはObjectShareJava開発ラボ(元のSmalltalk / VおよびVisualSmalltalk開発チームを含む)を買収し、VisualSmalltalkを所有していますが、Smalltalk製品の世界的な販売権はObjectShareにあり、ObjectShareはCincomに販売しました。[11] VisualWorksはCincomに売却されました現在はCincomSmalltalkの一部です。CincomはSmalltalkを強力に支援しており、1999年以来、毎年VisualWorksとObjectStudioの複数の新しいバージョンをリリースしています。

Cincom、GemTalk、およびInstantiationsは、引き続きSmalltalk環境を販売しています。IBMは、1990年代後半に代わりにJavaをサポートすることを決定したVisualAge Smalltalkのサポートを終了しました。これは、2005年の時点で、製品の名前をVA Smalltalk(VASTプラットフォーム)に変更したInstantiations、Inc。[12]によってサポートされています。毎年新しいバージョンをリリースします。オープンSqueak実装には、元のSmalltalkコミュニティの多くを含む、アクティブな開発者コミュニティがあり、最近では、OLPCプロジェクト、コラボレーションアプリケーションCroquet Project、およびOpenCobalt仮想世界アプリケーションを開発するためのツールキットでEtoys環境を提供するために使用されています。 GNU SmalltalkGNUプロジェクトからのSmalltalk-80の派生物のフリーソフトウェア実装ですPharo Smalltalkは、商業環境での研究と使用を目的とした Squeakのフォークです。

2016年の時点ですべてのSmalltalk環境に広がっている重要な開発は、複雑なWebアプリケーションの構築を簡素化するために、 SeasideAIDA / Webの2つのWebフレームワークの使用が増えていることです。Seasideは、Cincom、Gemstone、およびInstantiationsを組み込んで拡張することで、かなりの市場の関心を集めています。

影響

Smalltalkは、 Simulaに基づく多くのオブジェクト指向プログラミング言語の1つでした[13] Smalltalkは、最も影響力のあるプログラミング言語の1つでもあります。その後に登場した実質的にすべてのオブジェクト指向言語( Flavours[14] CLOSObjective-CJavaPythonRuby[15]など)は、Smalltalkの影響を受けました。Smalltalkは、アジャイルソフトウェア開発手法、Rapid Application Development(RAD)またはプロトタイピング、およびソフトウェアデザインパターンで最も人気のある言語の1つでもありました[16]Smalltalkプラットフォームが提供する生産性の高い環境により、Smalltalkプラットフォームは迅速で反復的な開発に理想的でした。

Smalltalkは、多くの点で現代のコンピューティングの世界を定義する、国防高等研究計画局(ARPA)が資金提供した研究のより大きなプログラムから生まれました。Smalltalkに加えて、ハイパーテキスト、GUI、マルチメディア、マウス、テレプレゼンス、インターネットなどの実用的なプロトタイプが1960年代にARPAの研究者によって開発されました。[17] [18] Alan Kay(Smalltalkの発明者の1人)は、iPadのような最新のタブレットコンピューターに似たDynabookと呼ばれるタブレットコンピューターについても説明しました。[4]

Smalltalk環境は、多くの場合、現在一般的なオブジェクト指向ソフトウェアデザインパターンを開発した最初の環境でした。最も人気のあるものの1つは、ユーザーインターフェイス設計用のモデル-ビュー-コントローラー(MVC)パターンです。MVCパターンにより、開発者は同じ基になるデータの複数の一貫したビューを持つことができます。これは、同じ基本仕様のさまざまなビュー(エンティティ関係、データフロー、オブジェクトモデルなど)が存在するソフトウェア開発環境に最適です。また、基礎となるモデルをさまざまな角度や抽象化レベルから表示できるシミュレーションやゲームの場合。[19]

MVCパターンに加えて、Smalltalkの言語と環境は、グラフィカルユーザーインターフェイス(GUI)の歴史に大きな影響を与え、表示されるものは、ユーザーインターフェイス(WYSIWYG)のユーザーインターフェイス、フォントエディター、およびUIデザインのデスクトップメタファーです。 。Smalltalk環境に付属する強力な組み込みのデバッグおよびオブジェクト検査ツールは、その後のLisp Machine環境をはじめ、すべての統合開発環境の標準を設定します。[20]

オブジェクト指向プログラミング

他のオブジェクト指向言語と同様に、Smalltalk-80(Smalltalk-72ではない)の中心的な概念はオブジェクトの概念ですオブジェクトは常にクラスのインスタンスですクラスは、インスタンスのプロパティと動作を説明する「青写真」です。たとえば、GUIのウィンドウクラスは、ウィンドウにラベル、位置、ウィンドウが表示されているかどうかなどのプロパティがあることを宣言する場合があります。クラスは、インスタンスが開く、閉じる、移動、非表示などの操作をサポートすることを宣言する場合もあります。それぞれの特定のウィンドウオブジェクトは、それらのプロパティの独自の値を持ち、それぞれがそのクラスによって定義された操作を実行できるようになります。

Smalltalkオブジェクトは、正確に3つのことを実行できます。

  1. 状態を保持します(他のオブジェクトへの参照)。
  2. それ自体または別のオブジェクトからメッセージを受信します。
  3. メッセージを処理する過程で、それ自体または別のオブジェクトにメッセージを送信します。

オブジェクトが保持する状態は、常にそのオブジェクトに対してプライベートです。他のオブジェクトは、オブジェクトに要求(メッセージ)を送信することによってのみ、その状態を照会または変更できます。任意のメッセージを任意のオブジェクトに送信できます。メッセージを受信すると、受信者はそのメッセージが適切かどうかを判断します。Alan Kayは、オブジェクトに注意が払われているにもかかわらず、メッセージングは​​Smalltalkの最も重要な概念であるとコメントしています。 Xerox PARCフェーズで完了しました)。」[21]

他のほとんどの言語とは異なり、Smalltalkオブジェクトはシステムの実行中に変更できます。「オンザフライ」での ライブコーディングと修正の適用は、Smalltalkの主要なプログラミング手法であり、その効率の主な理由の1つです。

Smalltalkは「純粋な」オブジェクト指向プログラミング言語です。つまり、C ++Javaとは異なり、オブジェクトである値とプリミティブ型である値の間に違いはありません。Smalltalkでは、整数、ブール値、文字などのプリミティブ値も、対応するクラスのインスタンスであるという意味でオブジェクトであり、それらに対する操作はメッセージの送信によって呼び出されます。プログラマーは(サブクラス化を通じて)変更または拡張できます)プリミティブ値を実装するクラス。これにより、インスタンスに対して新しい動作を定義できます(たとえば、新しい制御構造を実装するため)、または既存の動作を変更することもできます。この事実は、よく聞かれる「Smalltalkではすべてがオブジェクトである」というフレーズに要約されています。変数はそうではないので、「すべての値はオブジェクトです」とより正確に表現できます。

すべての値がオブジェクトであるため、クラスもオブジェクトです。各クラスは、そのクラスのメタクラスのインスタンスです。メタクラスもオブジェクトであり、すべてメタクラスと呼ばれるクラスのインスタンスです。コードブロック(Smalltalkの無名関数の表現方法)もオブジェクトです。[22]

リフレクション

リフレクションとは、コンピューターサイエンティストが、解析ツリー入力および出力パラメーターのデータ型など、独自の構造を検査する機能を備えたソフトウェアプログラムに適用する用語です。リフレクションは、SmalltalkやLispなどの動的でインタラクティブな言語の機能です。リフレクション(インタープリターまたはコンパイル済み)を備えた対話型プログラムは、コードオブジェクト自体を含む、すべてのメモリ内オブジェクトの状態を維持します。これらのオブジェクトは、解析/コンパイル中に生成され、プログラムでアクセスおよび変更できます。

リフレクションは、Smalltalkと同様にメタモデルを持つ機能でもあります。メタモデルは言語を記述するモデルであり、開発者はメタモデルを使用して、オブジェクトの解析ツリーをウォークスルー、調査、変更したり、特定の種類の構造のすべてのインスタンスを検索したりできます(たとえば、メタモデルのMethodクラスのすべてのインスタンス)。

Smalltalk-80は完全に反射するシステムであり、Smalltalk-80に実装されています。Smalltalk-80は、構造的反射と計算的反射の両方を提供します。Smalltalkは、構造がSmalltalk-80オブジェクトによって定義される構造反射システムです。システムを定義するクラスとメソッドもオブジェクトであり、それらが定義するのに役立つシステムの完全な一部です。Smalltalkコンパイラは、テキストソースコードをメソッドオブジェクト(通常は次のインスタンス)にコンパイルします。CompiledMethodこれらは、クラスのメソッドディクショナリに格納することでクラスに追加されます。クラスを定義するクラス階層の一部は、システムに新しいクラスを追加できます。システムは、クラスとメソッドを作成または定義するSmalltalk-80コードを実行することによって拡張されます。このように、Smalltalk-80システムは「生きている」システムであり、実行時にそれ自体を拡張する機能を備えています。

クラスはオブジェクトであるため、「どのメソッドを実装しますか?」などの質問をすることができます。または「どのフィールド/スロット/インスタンス変数を定義しますか?」そのため、システム内の任意のオブジェクトに適用される汎用コードを使用して、オブジェクトの検査、コピー、(逆)シリアル化などを簡単に行うことができます。[23]

Smalltalk-80は、システムの計算状態を監視する機能である計算反射も提供します。オリジナルのSmalltalk-80から派生した言語では、メソッドの現在のアクティブ化は、疑似変数(6つの予約語の1つ)を介して名前が付けられたオブジェクトとしてアクセスできますthisContextメソッドにメッセージを送信することによりthisContext、アクティベーションは「このメッセージを私に送信したのは誰か」などの質問をすることができます。これらの機能により、仮想マシンを変更することなく、コルーチンまたはPrologのようなバックトラッキングを実装できます例外システムは、この機能を使用して実装されます。これのより興味深い使用法の1つは海辺です編集された各ページの継続を保存し、ユーザーがWebサイトをナビゲートするときにそれらを切り替えることにより、プログラマーがWebブラウザーの戻るボタンの複雑さに対処するのを軽減するWebフレームワーク。Seasideを使用したWebサーバーのプログラミングは、従来のプログラミングスタイルを使用して実行できます。[24]

Smalltalkがリフレクションを使用する方法の例は、エラーを処理するためのメカニズムです。オブジェクトに実装されていないメッセージが送信されると、仮想マシンは、メッセージの具体化を引数としてオブジェクトにメッセージを送信ますdoesNotUnderstand:メッセージ(別のオブジェクト、のインスタンス)には、メッセージのセレクターとその引数が含まれています。インタラクティブなSmalltalkシステムでは、のデフォルトの実装は、ユーザーにエラーを報告するエラーウィンドウ(通知機能)を開くものです。これとリフレクティブ機能により、ユーザーはエラーが発生したコンテキストを調べ、問題のあるコードを再定義し、Smalltalk-80のリフレクティブ機能を使用してすべてシステム内で続行できます。[25] [26]MessageArraydoesNotUnderstand:

doesNotUnderstand:のみを理解(実装)するクラスを作成することにより、doesNotUnderstand:メソッドを介して送信されたメッセージをインターセプトできるインスタンスを作成できます。このようなインスタンスは、透過プロキシと呼ばれます。[27] このようなプロキシを使用して、複数のSmalltalkシステム間でメッセージを交換する分散Smalltalk、オブジェクトがデータベースから透過的にフォールトされるデータベースインターフェイス、promiseなどの多くの機能を実装できます分散Smalltalkの設計は影響を受けますCORBAなどのシステム

構文

Smalltalk-80の構文は、ほんの一握りの宣言と予約語に基づいており、かなりミニマリストです。実際、 Smalltalktrueでは6つ「キーワード」のみが予約されています:、、、、、、、およびこれらは適切に疑似変数と呼ばれ、変数識別子の規則に従うが、プログラマーが変更できないバインディングを示す識別子です。、、および疑似変数はシングルトンインスタンスです。そして、そのメッセージに応答してアクティブ化されたメソッド内のメッセージの受信者を参照しますが、falsenilselfsuperthisContexttruefalsenilselfsupersuperレシーバーのクラスではなく、メソッドの定義クラスのスーパークラスで検索されます。これにより、サブクラスのメソッドがスーパークラスの同じ名前のメソッドを呼び出すことができます。thisContext現在のアクティベーションレコードを参照します。組み込みの言語構造は、メッセージの送信、割り当て、メソッドの戻り、および一部のオブジェクトのリテラル構文のみです。すべての年齢の子供向けの言語としての起源から、標準のSmalltalk構文は、主流のコーディング言語よりも英語に似た方法で句読点を使用します。条件付き評価と反復のための制御構造を含む言語の残りの部分は、標準のSmalltalkクラスライブラリによって組み込みの構造体の上に実装されます。(パフォーマンス上の理由から、実装はこれらのメッセージの一部を特別なものとして認識して処理する場合がありますが、これは最適化にすぎず、言語構文に組み込まれていません。)

「Smalltalk構文ははがきに収まる」という格言は、 Ralph Johnsonによるコードスニペットを指し、メソッドのすべての基本的な標準構文要素を示しています。[28]

exampleWithNumber: x 
    | y | 
    true   false  not  nil  isNilifFalse: [自己 停止] 
    y  := セルフ サイズ + スーパー サイズ
    #($ a #  a'a  '  1  1.0 
        do: [ each  | 
            トランスクリプト ショー:( クラス ; 
                       表示: '' ] 
    ^x  <  y

リテラル

次の例は、Smalltalk-80メソッドでリテラル値として記述できる最も一般的なオブジェクトを示しています。

数字。次のリストは、いくつかの可能性を示しています。

42-42123
_ _ 
_ 451
_ 2345e2 
2r10010010 
16 rA000

最後の2つのエントリは、それぞれ2進数と16進数です。'r'の前の数字は、基数または基数です。ベースは2の累乗である必要はありません。たとえば、36rSMALLTALKは、10進数の80738163270632に等しい有効な数値です。

文字の前にドル記号を付けると、次のように記述されます。

$ A

文字列は、一重引用符で囲まれた文字のシーケンスです。

'こんにちは世界!'

文字列に引用符を含めるには、2番目の引用符を使用してエスケープします。

「私は彼らに「Hello、world!」と言いました。」

一重引用符は文字列を区切るため、二重引用符はエスケープする必要はありません。

「Hello、world!」と言いました。彼らへ。'

2つの等しい文字列(文字列がすべて同じ文字を含む場合は文字列は等しい)は、メモリ内の異なる場所にある異なるオブジェクトである可能性があります。文字列に加えて、SmalltalkにはSymbolと呼ばれる文字シーケンスオブジェクトのクラスがあります。シンボルは一意であることが保証されています。異なるオブジェクトである2つの等しいシンボルは存在できません。そのため、シンボルは比較するのに非常に安価であり、メッセージセレクターなどの言語アーティファクトによく使用されます(以下を参照)。

記号は、#の後に文字列リテラルが続くものとして記述されます。例えば:

'foo'

シーケンスに空白文字や句読文字が含まれていない場合は、次のように記述することもできます。

#foo

配列:

#(1  2  3  4 

4つの整数の配列を定義します。

多くの実装は、ByteArrayの次のリテラル構文をサポートしています。

 [ 1  2  3  4 ]

4つの整数のByteArrayを定義します。

そして最後になりましたが、ブロック(無名関数リテラル)

[...いくつかの smalltalk コード..]

ブロックについては、本文でさらに詳しく説明されています。

多くのSmalltalk方言は、他のオブジェクトに追加の構文を実装していますが、上記の方言は、すべての人がサポートする基本的なものです。

変数宣言

Smalltalkで一般的に使用される2種類の変数は、インスタンス変数と一時変数です。その他の変数および関連する用語は、特定の実装によって異なります。たとえば、VisualWorksにはクラス共有変数と名前空間共有変数がありますが、Squeakや他の多くの実装にはクラス変数、プール変数、グローバル変数があります。

Smalltalkの一時変数宣言は、メソッド内で宣言された変数です(以下を参照)。これらは、メソッドの上部で、スペースで区切られ、縦棒で囲まれた名前として宣言されます。例えば:

| インデックス|

最初に値を含むindexという名前の一時変数を宣言しますnil

1セットのバー内で複数の変数を宣言できます。

| インデックス母音|

indexとvowelsの2つの変数を宣言します。すべての変数が初期化されます。ヌル文字に初期化されるStringsのインデックス付き変数、または0に初期化されるByteArraysを除いて、変数はnilに初期化されます。

割り当て

:=変数には、 ' '構文を介して値が割り当てられます。それで:

母音 :=  'aeiou'

'aeiou'以前に宣言された母音変数に文字列を割り当てます。文字列はオブジェクトであり(一重引用符で囲まれた文字のシーケンスはリテラル文字列の構文です)、コンパイル時にコンパイラによって作成されます。

元のParcPlace画像では、アンダースコア文字⟨_⟩のグリフが左向きの矢印⟨←⟩として表示されていました(1963年版のASCIIコードのように)。Smalltalkは当初、この左矢印を唯一の代入演算子として受け入れていました。一部の最新のコードには、割り当てとして機能するアンダースコアのように見えるものがまだ含まれており、この元の使用法に耳を傾けています。最新のSmalltalk実装のほとんどは、アンダースコアまたはコロンに等しい構文のいずれかを受け入れます。

メッセージ

メッセージは、Smalltalkの最も基本的な言語構成です。制御構造でさえ、メッセージ送信として実装されますSmalltalkは、デフォルトで動的ディスパッチ単一ディスパッチ戦略を採用しています(他のオブジェクト指向言語で使用される 複数ディスパッチとは対照的です)。

次の例では、メッセージ「factorial」を番号42に送信します。

42 階乗

この状況では、42はメッセージ受信者と呼ばれ、 「階乗」はメッセージセレクターです。受信者は、値(おそらくこの場合は42の階乗)を返すことによってメッセージに応答します。特に、メッセージの結果を変数に割り当てることができます。

aRatherBigNumber  :=  42 階乗

上記の「階乗」は、受信者という1つのオブジェクトのみが関与するため、いわゆる単項メッセージです。メッセージは、次のように、 引数として追加のオブジェクトを運ぶことができます。

2raisedTo   4

この式には、2つのオブジェクトが含まれています。2つは受信者として、4つはメッセージ引数として使用されます。メッセージの結果、またはSmalltalkの用語では、答えは16であると想定されています。このようなメッセージはキーワードメッセージと呼ばれます。次の構文を使用して、メッセージにさらに多くの引数を含めることができます。

'hello world'  indexOf: $ o startAt   6

これは、受信者文字列の文字「o」のインデックスに応答し、インデックス6から検索を開始します。このメッセージのセレクターは「indexOf:startingAt:」で、2つの部分またはキーワードで構成されます。

キーワードと引数のこのようなインターリーブは、引数が先行するキーワードによって説明されるため、コードの可読性を向上させることを目的としています。たとえば、C ++またはJavaのような構文を使用して長方形を作成する式は、次のように記述できます。

新しい 長方形100、200 ; _ 

どの議論がどれであるかは不明です。対照的に、Smalltalkでは、このコードは次のように記述されます。

長方形の 幅: 100 高さ: 200

この場合のレシーバーはクラスである「Rectangle」であり、答えは指定された幅と高さのクラスの新しいインスタンスになります。

最後に、ほとんどの特殊な(アルファベット以外の)文字は、いわゆるバイナリメッセージとして使用できます。これらにより、数学および論理演算子を従来の形式で記述できます。

3  +  4

これは、メッセージ「+」を受信者3に送信し、引数として4が渡されます(その答えは7になります)。同様に、

3  >  4

は、引数4で3に送信されるメッセージ ">"です(その答えはfalseになります)。

Smalltalk-80言語自体は、これらの演算子の意味を意味するものではないことに注意してください。上記の結果は、メッセージの受信者(この場合はNumberインスタンス)がメッセージ「+」および「>」にどのように応答するかによってのみ定義されます。

このメカニズムの副作用は、演算子のオーバーロードです。メッセージ「>」は他のオブジェクトでも理解できるため、「a> b」の形式の式を使用してそれらを比較できます。

式には、複数のメッセージ送信を含めることができます。この場合、式は単純な優先順位に従って解析されます。単項メッセージが最も優先され、次にバイナリメッセージ、次にキーワードメッセージが続きます。例えば:

3 階乗 +4 階乗10 から100    

次のように評価されます。

  1. 3は「階乗」というメッセージを受け取り、6と答えます。
  2. 4は「階乗」というメッセージを受け取り、24に応答します
  3. 6は、引数として24を含むメッセージ「+」を受信し、30と応答します。
  4. 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 階乗 階乗 ログ

これは、「階乗」を3に送信し、次に「階乗」を結果(6)に送信し、次に「ログ」を結果(720)に送信して、結果2.85733を生成します。

次の(架空の)例のように、それぞれがピリオドで区切られた一連の式を記述できます。この例では、最初にクラスWindowの新しいインスタンスを作成し、それを変数に格納してから、2つのメッセージを送信します。

 | ウィンドウ| 
  window  =  Windownew  ウィンドウラベル:'こんにちは' ウィンドウが開いています
    
   

一連のメッセージが上記の例のように同じ受信者に送信される場合、それらはセミコロンで区切られた個々のメッセージ を含むカスケードとして書き込むこともできます。

  ウィンドウの 新しい
    ラベル: 'こんにちは' ; 
    開いた

前の例を単一の式として書き直すことで、新しいウィンドウを一時変数に格納する必要がなくなります。通常の優先順位規則に従って、最初に単項メッセージ「new」が送信され、次に「label:」と「open」が「new」の応答に送信されます。

コードブロック

コードのブロック(無名関数)は、リテラル値(すべての値がオブジェクトであるため、オブジェクト)として表現できます。これは角かっこで実現されます。

[ params  |  <メッセージ-> ]

ここで、 :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  select: [ anAmount  |  anAmount  isPositive ]

これは関数型プログラミングに関連しており、計算パターン(ここでは選択)が高階関数に抽象化されていることに注意してくださいたとえば、コレクションのメッセージselect:は、適切なファンクターの高階関数フィルターと同等です。[29]

制御構造

Smalltalkでは、制御構造に特別な構文はありません。代わりに、オブジェクトに送信されるメッセージとして実装されます。たとえば、条件付き実行は、メッセージifTrue:をブールオブジェクトに送信し、ブールレシーバーがtrueの場合にのみ実行されるコードのブロックを引数として渡すことによって実装されます。ブール値の2つのサブクラスは両方ともifTrue:を実装します。ここで、サブクラスTrueの実装は常にブロックを評価し、サブクラスFalseの実装はブロックを評価しません。

次のコードはこれを示しています。

結果 :=  a  >  b 
    ifTrue: [ 'より大きい' ]
     ifFalse: [ '以下' ]

ブロックは、ユーザー定義の制御構造、列挙子、訪問者、例外処理、プラグイン可能な動作、およびその他の多くのパターンを実装するためにも使用されます。例えば:

| aString母音| 
aString  :=  'これは文字列です' 
母音 :=  aString  select: [ aCharacter  |  aCharacterisVowel  ] _

最後の行で、文字列にメッセージselect:が送信されます。引数はコードブロックリテラルです。コードブロックリテラルは、文字列の要素が「select: " メッセージ。

Stringオブジェクトは、メンバーを反復処理して(メッセージ「do:」を送信することにより)、「select:」メッセージに応答し、引数として含まれる各文字を使用して選択ブロック(「aBlock」)を1回評価します。評価されると(メッセージ「value:each」が送信されることにより)、選択ブロック(パラメーター「aBlock」によって参照され、ブロックリテラル「[:aCharacter | aCharacter isVowel]」によって定義される)は、ブール値に応答します。次に、「ifTrue:」を送信しました。ブール値がオブジェクトtrueの場合、文字は返される文字列に追加されます。「select:」メソッドは抽象クラスCollectionで定義されているため、次のように使用することもできます。

| 長方形aPoint衝突| 
長方形 :=  OrderedCollection 
  with :(長方形  0 右: 10 上: 100 下: 200with :(長方形  10 右: 10 上: 110 下: 210
aPoint  := ポイント x: 20  y: 20 
衝突 := 長方形 選択: [ aRect  |  aRect containsPoint: aPoint ] 

例外処理メカニズムは、ブロックをハンドラーとして使用します(CLOSスタイルの例外処理と同様)。

[
  いくつかの 操作
] on:エラー do: [ ex  | 
  ハンドラー-コード
  exreturn  _
]

例外ハンドラーの「ex」引数は、中断された操作の状態(スタックフレーム、行番号、レシーバー、引数など)へのアクセスを提供し、計算の進行方法を制御するためにも使用されます(「exproceed」のいずれかを送信することにより) 「、「元の拒否」、「元の再起動」または「元の戻り」)。

クラス

これは株式クラスの定義です:[30]

オブジェクト サブクラス: #MessagePublisher 
    instanceVariableNames: '' 
    classVariableNames: '' 
    poolDictionaries: ''
    カテゴリ: 'Smalltalkの例'

多くの場合、この定義のほとんどは環境によって埋められます。Objectこれは、というサブクラスを作成するためのクラスへのメッセージであることに注意してくださいMessagePublisher言い換えると、クラスはSmalltalkのファーストクラスのオブジェクトであり、他のオブジェクトと同じようにメッセージを受信でき、実行時に動的に作成できます。

メソッド

オブジェクトがメッセージを受信すると、メッセージ名に一致するメソッドが呼び出されます。次のコードはメソッドpublishを定義しているため、このオブジェクトが「publish」メッセージを受信したときに何が起こるかを定義します。


    トランスクリプト ショー を公開する: 「HelloWorld!」

次のメソッドは、複数の引数を受け取り、値を返す方法を示しています。

quadMultiply: i1 および: i2 
    "このメソッドは、指定された数値を相互に乗算し、結果を4で乗算します。" 
    | mul | 
    mul  :=  i1  *  i2 
    ^ mul  *  4

メソッドの名前は#quadMultiply:and:です。戻り値は^演算子で指定します。

オブジェクトは、実行時にメッセージに応答して実行するメソッドを動的に決定する責任があることに注意してください。多くの言語では、これはコンパイル時に静的に決定される場合があります(場合によっては、または常に)。

クラスのインスタンス化

次のコード:

MessagePublisher  new

MessagePublisherクラスの新しいインスタンスを作成(および返し)ます。これは通常、変数に割り当てられます。

パブリッシャー :=  MessagePublisher  new

ただし、一時的な匿名オブジェクトにメッセージを送信することもできます。

MessagePublisherの 新しい 公開

HelloWorldの例

Hello worldプログラムは、言語の最も基本的な構文と環境を示すことを学習した最初のプログラムとして、事実上すべてのテキストで新しいプログラミング言語に使用されます。Smalltalkの場合、プログラムの作成は非常に簡単です。次のコード、メッセージ「show:」は、文字列リテラル「Hello、world!」とともにオブジェクト「Transcript」に送信されます。その議論として。「show:」メソッドを呼び出すと、引数の文字(文字列リテラル「Hello、world!」)がトランスクリプト(「ターミナル」)ウィンドウに表示されます。

トランスクリプト ショー: 「Hello、world!」

この例の結果を表示するには、トランスクリプトウィンドウを開く必要があることに注意してください。

画像ベースの永続性

最も一般的なプログラミングシステムは、静的プログラムコード(クラス定義、関数、またはプロシージャの形式)を動的または実行時のプログラム状態(オブジェクトや他の形式のプログラムデータなど)から分離します。これらはプログラムの開始時にプログラムコードをロードし、以前のプログラム状態は構成ファイルまたは他のデータソースから明示的に再作成する必要があります。プログラム(およびプログラマー)が明示的に保存しない設定は、再起動するたびに再設定する必要があります。従来のプログラムでは、プログラムがファイルを保存し、終了し、リロードするたびに、多くの有用なドキュメント情報も失われます。これにより、取り消し履歴やカーソル位置などの詳細が失われます。イメージベースのシステムは、コンピューターの電源がオフになっている、またはOSが更新されているという理由だけで、それらすべてを強制的に失うことはありません。

ただし、多くのSmalltalkシステムは、プログラムデータ(オブジェクト)とコード(クラス)を区別しません。実際、クラスはオブジェクトです。したがって、ほとんどのSmalltalkシステムは、プログラムの状態全体(Classオブジェクトと非Classオブジェクトの両方を含む)を画像ファイルに保存します。次に、Smalltalk仮想マシンによってイメージをロードして、 Smalltalkのようなシステムを以前の状態に復元できます。[31]これは、 Alan Kayによって作成され、彼の修士課程で説明さ れている言語であるFLEXに触発されました。論文。[32]

Smalltalkイメージは(再起動可能な)コアダンプに似ており、エラー時のプログラム状態に完全にアクセスできる遅延デバッグやリモートデバッグなど、コアダンプと同じ機能を提供できます。Lispなど、アプリケーションコードをデータの形式としてモデル化する他の言語、多くの場合、画像ベースの永続性も使用します。この永続化の方法は、すべての開発情報(プログラムの解析ツリーなど)が保存され、デバッグが容易になるため、迅速な開発に強力です。ただし、真の永続性メカニズムとしては重大な欠点もあります。1つには、開発者は実装の詳細を非表示にし、ランタイム環境で利用できるようにしたくない場合があります。合法性とメンテナンスの理由から、実行時に誰でもプログラムを変更できるようにすると、実行時環境でソースコードを公開しないコンパイル済みシステムでは不可能な複雑さと潜在的なエラーが必然的に発生します。また、永続性メカニズムは使いやすいものですが、ほとんどのマルチユーザーシステムに必要な真の永続性機能を欠いています。[33]

アクセスレベル

Smalltalk-80のすべては、実行中のプログラム内から変更できます。これは、たとえば、IDEを再起動せずに、実行中のシステムでIDEを変更できることを意味します。一部の実装では、言語の構文またはガベージコレクションの実装もその場で変更できます。ステートメントtrue become: falseでさえSmalltalkで有効ですが、実行することはお勧めしません。

ジャストインタイムコンパイル

Smalltalkプログラムは通常、バイトコードにコンパイルされ、仮想マシンによって解釈されるか、マシンネイティブコードに動的に変換されます。

実装のリスト

OpenSmalltalk

OpenSmalltalk VM(OS VM)は、Smalltalkランタイムランナーの注目すべき実装であり、多くの最新のSmalltalk実装がベースまたは派生しています。[34] OS VM自体は、Smalltalkソースコードファイルのセット(Slangと呼ばれるSmalltalkのサブセットを使用)からネイティブC言語のソースコード(VMMakerと呼ばれるトランスパイラーを使用)にトランスパイルされます[ 35]。 Smalltalkイメージのクロスプラットフォーム実行を実質的に可能にするハードウェアのプラットフォームとアーキテクチャ。ソースコードはGitHubで入手でき、MITライセンスの下で配布されます。OSVMに基づく既知のSmalltalk実装は次のとおりです。[36]

その他

JavaScript VM

も参照してください

参考文献

  1. ^ 「AltoISchematics」 (PDF)ビットセーバーp。54 2016年7月21日取得
  2. ^ 「コンピュータとコンピューティングの歴史、現代のコンピュータの誕生、パーソナルコンピュータ、ゼロックスアルト」2016年4月19日取得
  3. ^ a b c d e f g h ケイ、アラン; ラム、ステファン(2003-07-23)。「2003年7月23日の電子メール」「オブジェクト指向プログラミング」の意味についてのアラン・ケイ博士2009年1月3日取得
  4. ^ a b c d ケイ、アラン。「Smalltalkの初期の歴史」2007年9月13日取得
  5. ^ 「ANSISmalltalk標準」Smalltalk.org。2004年。2006年2月16日のオリジナルからアーカイブ2021-03-02を取得
  6. ^ 「StackOverflowDeveloperSurvey2017」
  7. ^ 「StackOverflowDeveloperSurvey2018」
  8. ^ 「バージョン」Smalltalk.org。2015年9月8日にオリジナルからアーカイブされまし2007年9月13日取得
  9. ^ 「ANSISmalltalk標準」Smalltalk.org。2015年9月7日にオリジナルからアーカイブされまし2007年9月13日取得
  10. ^ 「ホッブズ」2003年4月19日にオリジナルからアーカイブされました。
  11. ^ 「歴史」Seagullソフトウェア。2002年8月6日にオリジナルからアーカイブされまし2007年9月13日取得
  12. ^ 「VisualAgeSmalltalk移行FAQ」
  13. ^ Simula言語もオブジェクト指向であり、Smalltalkに先行していました(そして影響力として認められていました)が、それはシミュレーション言語であり、汎用プログラミング言語ではありませんでした。
  14. ^ キャノン、ハワード。「フレーバーオブジェクト指向プログラミングへの非階層的アプローチ」(PDF)softwarepreservation.org 2013年12月17日取得
  15. ^ 「Rubyについて」ruby-lang.org 2013年12月17日取得
  16. ^ 「リファクタリングはどこから来たのですか?」sourcemaking.com 2013年12月17日取得
  17. ^ 「DARPA / ARPA」livinginternet.com 2013年12月16日取得このニーズを満たすために、ARPAは1962年にIPTOを設立し、国防総省、シャイアンマウンテン、およびSAC本部にある国防総省のメインコンピューターを相互接続するための存続可能なコンピューターネットワークを構築することを義務付けました。
  18. ^ 「初期のコンピュータネットワーキングにおけるエンゲルバートの役割」dougengelbart.org 2013年12月17日取得
  19. ^ クラスナー、グレン; 教皇、スティーブン(1988年8月〜9月)。「Smalltalk-80でModel-View-Controllerユーザーインターフェイスパラダイムを使用するためのクックブック」。オブジェクト指向プログラミングジャーナル
  20. ^ 「私たちの影響力」cincomsmalltalk.com 2013年12月16日取得
  21. ^ ケイ、アラン(1998年10月10日)。「プロトタイプvsクラス(Squeakリストの電子メール)」
  22. ^ ゴールドバーグ、アデル; ロブソン、デビッド(1989)。Smalltalk-80言語アディソンウェスリー。pp。31、75–89。ISBN 0-201-13688-0
  23. ^ クラーク、AN(1997)。「Smalltalkのメタクラスとリフレクション」。CiteSeerX10.1.1.33.5755_  {{cite journal}}: Cite journal requires |journal= (help)
  24. ^ Ducasse、Stéphane; リエンハルト、エイドリアン; Renggli、Lukas。「Seaside–複数の制御フローWebアプリケーションフレームワーク」(PDF)scg.unibe.chSoftware Composition Group Institut fur Informatik und angewandte Mathematik Universitaat Bern、Switzerland 2013年12月16日取得
  25. ^ フット、ブライアン; ジョンソン、ラルフ(1989年10月1〜6日)。「Smalltalk-80の反射施設」Oopsla '89:327–335。土井10.1145 /74877.74911ISBN 0897913337S2CID14207536  _ 2013年12月16日取得
  26. ^ スミス、ブライアンC(1982-01-01)。「プログラミング言語における手続き型リフレクション」MITテクニカルレポート(MIT-LCS-TR-272)2013年12月16日取得
  27. ^ デンカー、マーカス; ペック、マリアーノマルティネス; Bouraqadi、Noury; ファブレス、リュック; デュカス、ステファン。「Smalltalkの効率的なプロキシ」(PDF) {{cite journal}}: Cite journal requires |journal= (help)
  28. ^ [1] [2]
  29. ^ ゴールドバーグ、アデル; ロブソン、デビッド(1989)。Smalltalk-80言語アディソンウェスリー。pp。17–37。ISBN 0-201-13688-0
  30. ^ ゴールドバーグ、アデル; ロブソン、デビッド(1989)。Smalltalk-80言語アディソンウェスリー。pp。39–53。ISBN 0-201-13688-0
  31. ^ 「画像ベースの永続性」book.seaside.st 2013年12月17日取得
  32. ^ ケイ、アレン(1968)。「FLEX–柔軟で拡張可能な言語」ユタ大学MSC論文
  33. ^ ファウラー、マーティン。「メモリイメージ」martinfowler.com 2013年12月17日取得
  34. ^ OpenSmalltalk / opensmalltalk-vm、OpenSmalltalk、2020-11-03、2020-11-08取得
  35. ^ 「スラング」wiki.squeak.org 2020年11月8日取得
  36. ^ a b Mirand、Eliot; ベラ、クレメント; Gonzalez Boix、Elisa; ダン、インガルス(2018年10月8日)。「SmalltalkVM開発の20年:シミュレーションツールによるライブVM開発」(PDF) {{cite web}}: CS1 maint: url-status (link)
  37. ^ 目次、Cuis Smalltalk、2021-11-24、2021-11-25取得
  38. ^ 「Strongtalk:オプションの型システムを備えた高性能オープンソースSmalltalk」www.strongtalk.org 2021-11-25を取得

さらに読む

外部リンク