セマンティクスで副作用はどのように処理されますか?


19

Anthony AabyのSemanticsに関する「プログラミング言語入門」セクションで、彼は次の観察を行います。

プログラミング言語のセマンティクスにおける作業の多くは、命令型プログラム(割り当てコマンドを使用したプログラム)を構築して理解しようとする際に遭遇する問題によって動機付けられています。割り当てコマンドは値を変数に再割り当てするため、プログラムの離れた部分に予期しない影響を与える可能性があります。

これは、副作用を許可することでセマンティクスの作業の大部分が動機付けられるという驚くべき承認として私を打った。

プログラミング言語の副作用の存在は、プログラムを計算モデルにマップする機能にどのように影響しますか?副作用を許容しながら、このプロセスを改善できる状態管理のアプローチはありますか?


これをソフト質問としてタグ付けする必要がありますか?「セマンティクスの作業の多くは[副作用]によって動機付けられている」ため、確実に短く厳密な答えを期待することはできません。
ラドゥグリゴール

1
@Radu:MOでは、これはおそらく[big-picture]とタグ付けされますが、ほとんどは[soft-question]やCWではありません。
チャールズ・スチュワート

タグの全体像はさらに優れています。私はそれを忘れていました。
ラドゥグリゴール

良い提案; タグを追加しました。
シェーン

回答:


18

チャールズの答えに基づいて、プログラミング言語の理論の主な難しさは、プログラムの等価性の自然な概念は、通常、与えることができる最も単純な数学的意味論または基礎となる機械モデルのいずれにおいても厳密な平等ではないということです。たとえば、次のJavaのようなコードを考えてみましょう。

Object x = new Object();
Object y = new Object();
... some more code ...

したがって、このプログラムはオブジェクトを作成してxという名前を付け、次にyという名前の2番目のオブジェクトを作成してから、さらにコードの実行を続けます。ここで、プログラマーがこれら2つのオブジェクトの割り当ての順序を逆にすることにしたと仮定します。

Object y = new Object();
Object x = new Object();
... some more code ...

次に、質問をします。このリファクタリングはプログラムの動作を変更しますか?一方では、基礎となるマシンでは、xとyはプログラムの2つの実行の異なる場所に割り当てられます。この意味で、プログラムの動作は異なります。

しかし、Javaライクな言語では、参照をテストすることができるのは順序だけではなく、等しいかどうかだけです。したがって、これは「もう少しコード」が観察できない違いです。その結果、ほとんどのプログラマーは順序を逆にしても最終的な答えに違いはないと予想し、ほとんどのコンパイラー作成者はこれに基づいて並べ替えと最適化を実行できると期待します。(一方、Cライクな言語では、最初に整数にキャストすることで、ポインターを並べ替えて比較することができます。したがって、この並べ替えは必ずしも観察可能な動作を保持しませ。)

セマンティクスの中心的な質問の1つは、2つのプログラムが明らかに同等である場合の質問に答えることです。観察の概念はプログラミング言語の機能に依存するため、「クライアントプログラムが入力としてそれらのプログラムを受信することに基づいて異なる回答を計算できない場合、2つのプログラムは同等です」という定義になります。すべてのクライアントプログラムの定量化がこの質問を難しくしているのです。特定の2つのコードについて何かを言うには、考えられるすべてのクライアントプログラムについて何かを言わなければならないようです。

表示的セマンティクスのトリックは、この普遍的な数量化を避けることができる数学的な解釈を与えることです-コードの一部の意味は数学的な値であると言い、それらが数学的に等しいかどうかをチェックして比較しますありません。これはローカル(つまり、構成的)であり、可能なすべてのクライアントに対する定量化は含まれません。(もちろん、意味論的意味論は、それが健全であるための文脈的等価性を意味することを示す必要があります。

しかし、意味論的意味論がそれらの等価性を検証することを保証する必要があることを意味します。したがって、この例では、このJavaライクな言語に表示的なセマンティクスを与えたい場合、newを呼び出すとヒープが取得され、新しく作成されたオブジェクトで新しいヒープが返されるだけでなく、プログラムのすべては、入力ヒープのすべての順列で同じ不変です。これには、非常に複雑な数学的構造が含まれる可能性があります(たとえば、この場合、すべてが適切な順列グループを法として機能することを保証するカテゴリで動作します)。


「2つのプログラムは、クライアントプログラムが入力としてそれらのプログラムを受信することに基づいて異なる回答を計算できない場合、同等です。」私はこれに混乱しています。プログラムXとクライアントプログラムY がある場合、YがXを「呼び出す」ことを意味します。しかし、YはXのテキストを入力として読み取り、その場合、私はほとんど呼び出しませんYはXの「クライアント」です。明確にしてください。
ラドゥグリゴール

1
「Xのクライアント」とは、「プログラムコンテキスト」と同じ意味です。これは、「Xをサブタームとして含むより大きなプログラム」です。
ニールクリシュナスワミ

XをYに適用されるラムダと考えるので、「XはYのクライアントです」と「Xは入力としてYを読み取ります」と交換可能に使用しますか?それは理にかなっていますが、Javaについて話すときは少しねじれています。:)
ラドゥグリゴー

1
@RaduGRIGore:プログラムコンテキストは何か他のものを意味します。投稿を正しく読んでいますが、Xが入力としてYのソースコードを読み取る場合(これが投稿の解釈方法です)、構文的に異なる2つのプログラムを区別できます。代わりに、YがXのラムダ関数である場合、少数のプログラムを区別できます。「プログラムコンテキスト」に関するニールのコメントは正しい定義です。プログラムコンテキストYは、ASTに穴があるプログラムであり、2つの異なるプログラムフラグメントX1およびX2を(意味的に)配置できます。
ブレイザーブレード

@NeelKrishnaswami:投稿であなたが何を意味しているのか明確にできますか?引き続き例を使用して、いずれかのフラグメントを挿入できるプログラムについて話すことができます。
ブレイザーブレード

12

(表示)セマンティクスの効果を処理する方法はもちろんあります。たとえば、計算効果はモナドであるというEugenio Moggiのアイデアを使用できます(このアイデアはHaskellの設計でも使用されています)。これに関する問題の1つは、モナドを結合するのが難しいことです。ゴードン・プロットキンジョン・パワーが提案さLawvere理論にMoggiのモナドの改善、それらも呼ばれているとして包含し、または代数的理論を代数(最も一般的な効果は、このような状態として、I / O、非決定論が、継続があり、代数ある効果をない)。包括的な治療については、Matija Pretnarの論文を参照してください。

また、Frank OlesとJohn Reynoldsが開発したローカル状態の可能な世界のセマンティクスについても言及する必要があります(申し訳ありませんが、これは1982年のものです)。これはMoggiのモナドより前のものです。彼らはプリシーブのカテゴリを使用して、ローカル状態の多くの側面を正しくモデル化したアルゴルのような言語のセマンティクスを提供しました(ただし、すべてではありませんが、モデルはスナップバックを許可しましたが、私の記憶は間違っているかもしれません)。


1
はい、ファンクターカテゴリのセマンティクスは、Meyer-Sieberのすべての同等性を検証しませんでした。Peter O'HearnとRobert Tennantは、90年代半ばにファンクターカテゴリセマンティクスのパラメトリックバージョンを開発しました。これは(IIRC)Meyer-Sieberのすべての例を取得しましたが、完全に抽象的かどうかはわかりません。
ニールクリシュナスワミ

O'Hearn and Tennentモデルは完全に抽象的ではありません。これについては、論文自体で説明されています。しかし、線形ラムダ計算を使用したO'HearnとReynoldsによる改良は、2次まで完全に抽象的です。これは3次で破られます。例は、アーメド、ドレイヤー、ビルケダール等によって研究された同等性です。
Uday Reddy

12

Matthias Felleisenは、「制御と状態の構文理論」に関するシリーズで、セマンティクスの副作用問題に対する説得力のあるソリューションを紹介しました。

その作業の結果、CESKマシンが誕生しました。CESKマシンは、機能的、オブジェクト指向、命令型、さらには論理言語までを簡潔にモデル化できるシンプルな抽象マシンフレームワークです。CESKフレームワークは、副作用だけでなく、例外、継続、遅延、スレッドなどの「複雑な」制御構造も処理します。

CESKマシン、およびより小さなステップの動作セマンティクスは、プログラミング言語理論の約20年間の事実上の標準でした。

要するに、CESKマシンは、制御文字列(プログラムカウンターの一般化)、環境、ストア(ヒープとも呼ばれる)、および現在の継続の4つのコンポーネントを備えた小さなステップのマシンです。

環境は変数をアドレスにマップします。ストアはアドレスを値にマップします。

これにより、可変変数のモデル化が簡単になります。アドレスの値を変更するだけです。

また、ポインターと動的割り当てのモデル化も簡単になります。ストアアドレスをファーストクラスの値にするだけです。

同様に、ファーストクラスの継続は、それらをアドレス可能な値にすることから生じます。


6

プログラミング言語の副作用の存在は、プログラムを計算モデルにマップする機能にどのように影響しますか?

必ずしも難しくするわけではありませんが、小さな式から大きな式のセマンティクスを構築する方法に制限を課します。たとえば、グローバル参照への高階関数の割り当てを許可する言語にスコットスタイルの意味論的な意味を与えたい場合、他の特定のプログラミング構造と非常に悪い相互作用があります。

問題を引き起こすのは、状態のような単なる副作用ではありません。ダイクストラの保護されたコマンド言語などの単純な命令型言語には、この種の副作用があり、優れたセマンティクスがあります。副作用がない場合でも、プログラミング言語に期待される種類の操作上のセマンティクスを使用したラムダ計算の拡張で問題が発生します。初期のPlotkinのPCFには比較的早期に表示モデルが与えられましたが、セマンティクスは完全に抽象的ではなかったため、表示的意味論は過度に一般的であり、それらの操作的意味論に正確に対応していない。PCFは、1980年代後半に、ゲームのセマンティクスを使用して完全に抽象的な表記のセマンティクスを受け取りましたが、これはスコットの順序理論セマンティクスとはまったく異なります。並行性はまだ十分に適切な表示上の処置を受けていません。

多くの人がこの種のセマンティクスの重要性に疑問を投げかけています。その「セマンティクス」が単にプログラムのソースであり、プログラムをコンパイルして実行する一部のマシンの名前である場合でも、いつでも何らかの動作セマンティクスを提供できます。このため、Stracheyは動作セマンティクスを非難しました。しかし、Plotkinの構造操作セマンティクスは、操作セマンティクスをマシンモデルから分離する方法を示し、Pittの研究は、そのようなセマンティクスがプログラムおよびプログラミング言語に関する同様の推論を表示的セマンティクスにどのようにサポートできるかを示しました。したがって、操作的セマンティクスは、表示的セマンティクスの実行可能な代替手段であり、標準MLなどのかなりの数のプログラミング言語に成功裏に適用されています。

副作用を許容しながら、このプロセスを改善できる状態管理のアプローチはありますか?

ある程度まで、セマンティクスを提供することの難しさは、予想どおりに動作する強力なプログラミング言語を提供することの難しさに対応しています。実用的な動機に基づいた設計上の決定(通常はメッセージパッシングの同時実行による同時実行とグローバルステートの使用を回避するなど)により、セマンティクスの提供が容易になります。


ScottのPCFには状態がなく、ScottのPCFでもありませんか?en.wikipedia.org/wiki/…を
Andrej Bauer

@Andrej:まったく、ルーク・オングが私のD.Philを監督していたことを考えれば、私はその間違いをしてはいけません。私はWPのLTU物語としてよりも... succintあるミルナーのPCFとスコットのLCFのティーザー-要約を掲載:lambda-the-ultimate.org/node/2196 あなたが不足しているスコットへのアクセス権を持っているかもしれないと私にはそれが発生しました(1969)原稿...
チャールズスチュワート

それがPlotkinのPCFになると思います:-)原稿を手に入れることはできますが、実際には持っていません。
アンドレイバウアー

しかし、PCFには状態がないという点が残っています。Stracheyが運用上のセマンティクスを非難するという「理由」とは何ですか?それは私には明らかではありませんでした。最後の段落は、先ほど言ったことと矛盾しています。つまり、保護されたコマンドには優れたセマンティクスがありますが、PCFにはありません。
ウダイレディ

@ Andrej、Uday:3年以内に投稿を修正しました。
チャールズスチュワート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.