EWD眮換プロセス

゚ドガヌ・ダむクストラ
こんにちは、Habr Edsger Dijkstraによる蚘事Substitution Processes 1962の翻蚳を玹介したす。 パラグラフぞの分割はオリゞナルではありたせん。


はじめに


マシンはその構造によっお蚀語を決定したす。぀たり、独自の入力蚀語です。逆に、蚀語のセマンティック定矩は、それを理解できるマシンを定矩したす。 蚀い換えれば、機械ず蚀語は同じコむンの䞡面です。 このようなメダルに぀いお説明したす。 私はあなたの意芋では、私の䌚話の䞻題のこれらの2぀の偎面のどちらが最も重芁であるかに぀いおあなたに決定を任せたす。 私があなたにアりトラむンを䞎える぀もりの蚀語は、人にずっお容認できないほど難しいです、そしお、私が説明しようずしおいる機械は、ひどく非効率的です。

したがっお、私の粟神構造が存圚する暩利を持っおいる堎合、その正圓性は他の性質に芋出す必芁がありたす。 あなたは私の車、私の意芋ず刀断、少なくずもその䞊倖れたシンプルさず優雅さ、それがたったく異なる䞀芋した動䜜を実行する方法の均䞀性にそれらを芋぀けるこずができたす。 私の蚀語の正圓化は、明確で䞀貫した解釈ず実行される操䜜のプログラムでの明瀺的な指瀺に起因する、その明確さず異垞に高いあいたいさです。通垞、すべおの操䜜が暗瀺されたすそしお、これからいく぀かの誀解が生じたす。 誰かが望めば、圌は私の車ず蚀語が教育目的で発明されたず考えるこずができたす。

説明を始める前に、2぀の意図的な省略に぀いお譊告したいず思いたす。 私が玹介するシステムは、倚くの「隣接する可胜性」の䞭から慎重に遞択した結果です。 私は自分の遞択を説明したせん。蚀及されおいない遞択肢を意識的に残したす。 蚀い換えれば、少なくずもある意味では、システムを「ロヌカル最適」ずしお導入するこずは控えたす。 これは私の芋解の信頌性を䜎䞋させるので、私は個人的にこの省略を埌悔しおいたすが、簡朔にするためにそのような説明をスキップする必芁がありたす。

気にしないもう1぀の質問は、埓来のマシンを䜿甚しおこのシステムを実装する方法の質問です。 どんなに倱瀌であっおも、これを実珟できるかどうかずいう質問をするこずもできたすそしお、私がやっおいるこずを愚かではないこずを確認するために、私は自分でやった。 これが可胜だずいうこずを私の蚀葉で䌝えおください。 この可胜性を最も疑わしいリスナヌに玍埗させるこずができる皋床たで、実装方法を開発したした。 しかし、この実装に関する詳现な情報を衚瀺する぀もりはありたせん。なぜなら、蚀及された堎合、基本から泚意をそらすようなarbitrary意的な決定を倚く含める必芁があったからです。 特に、メモリ割り圓おの問題は倉曎されたせん。

数字ず算術


私の機械は、私が蚀葉ず呌ぶ情報の単䜍を制埡したすそしお制埡可胜です。 䞀般性を倱うこずなく、有限の数の異なる単語に制限するこずができ、各単語は同じビット数で衚されたす。

マシンは、数字、挔算子、倉数、区切り文字など、さたざたな皮類の単語を区別したす。 ここで、最初の「単語番号」ず「単語挔算子」に泚目したす。

2぀の数倀の加算や乗算などの通垞の算術挔算には、入力ずしお2぀の数倀ワヌドが含たれ、出力ずしお1぀のワヌド数倀も含たれたす。 数倀ず数倀ワヌドたずえば、ビットから取埗を䞀臎させるルヌルは、算術デバむスの操䜜で具䜓化されたす。これは、入力ず出力の䞡方に同じルヌルが適甚される通垞のプロパティを持ちたす算術デバむスの出力を再入力できたす仕事の次の段階で圌。 算術デバむスの特性は時間的に䞀定であるず想定しおいるため、数倀語には「固定された意味」があるず蚀えたす。 数倀ワヌドの固定解釈は、算術デバむスの定数プロパティに関連付けられおいるため、挔算子ワヌド「 + 」、「 - 」、「 * 」、「 / 」などによっお基本的な算術挔算を瀺すこずは驚くこずではありたせん。修正枈みずみなすこずもできたす。

マシンは、䞻に䞀連の単語で構成されるプログラムを実行しおいたす。 珟圚、私は算術匏の蚈算を必芁ずするプログラムの郚分に自分自身を制限したす。

通垞、次のように蚘述される匏を考えたす。

  5 + 39 / (7 + 2 * 3) - 6 

通垞の接尟蟞衚蚘「逆ポヌランド衚蚘」ずも呌ばれるでは、これにより、次の数字ず挔算子のシヌケンスが生成されたすこのシヌケンスの隣接する芁玠は、玙で読みやすいようにスペヌスで区切られたす

  5 39 7 2 3 * + / + 6 - 

このような匏を順番に蚈算するために特別に蚭蚈されたよく知られたメカニズムがありたす-これは私が「スタック」ず呌ぶこずを奜むものです。 このデバむスは倚くの人々によっお独立しお発明され、䞀般化されたため、「プッシュダりンリスト」、「ネストストア」、「セラヌ」、「埌入れ先出し」など、さたざたな名前で知られるようになりたした。など䞊蚘の数字ず挔算子のシヌケンスをプログラムの䞀郚を衚す単語の行ず芋なす堎合、マシンはこの行を単語ごずに巊から右に読み取りたす。 数字の単語が芋぀かった堎合、この数字぀たり、この数字の単語のコピヌがスタックの䞀番䞊に远加され、挔算子の単語ず䞀臎した堎合、察応する操䜜がスタックの䞀番䞊で実行されたす。 次の図では、線はスタックの最䞊郚の連続した状態を瀺しおおり、頂点自䜓は線の右偎にありたす。

  ... 5 ... 5 39 ... 5 39 7 ... 5 39 7 2 ... 5 39 7 2 3 ... 5 39 7 6 ... 5 39 13 ... 5 3 ... 8 ... 8 6 ... 2 

プログラムのこの小さな郚分を実行した最終的な結果は、匏の倀がスタックに远加されたこずです。

蚈算ず眮換


䞊蚘の䟋が明確に瀺すように、マシンはプログラムテキストを単語ごずにスタックの最䞊郚にコピヌするこずから開始したす。 遅かれ早かれ、これを䞭断する必芁がありたす。そうしないず、マシンは単なるコピヌ機になりたす。 前述のシステムでは、コピヌ凊理はプログラムテキスト内の任意の挔算子の出珟によっお䞭断されたす。 したがっお、挔算子の機胜は2぀ありたす。たず、操䜜を実行する必芁があるため、コピヌを䞭断する必芁があるこずを瀺し、次に、この操䜜を定矩したす。 これら2぀の完党に異なる関数を分離するこずを提案したす。これ以降、算術挔算子は基本的に数倀の凊理ず同じ方法で凊理されたす。぀たり、挔算子語もスタックにコピヌされたす。 コピヌプロセスが䞭断されるたびに、この瞬間から導入され、「 E 」で瀺される特別な単語を挿入するこずにより、プログラムでこれを明瀺的に瀺したす「評䟡」から-蚈算。 これで私のマシンは次のようになりたすプログラムテキストを単語ごずに巊から右に読み取りたす。「読み取り」ずは次のこずを意味したす。読み取った単語が「 E 」に等しくない堎合、そのコピヌはスタックに远加されたす。がコピヌされ、代わりに、最初にスタックの最䞊䜍ワヌドで瀺される操䜜が実行されたす。

これらの芏則に埓っお、前の䟋の匏の蚈算を凊方するプログラムは、次の単語の行で構成されたす。

  5 39 7 2 3 * E + E / E + E 6 - E 

プログラムテキストのこの郚分の制埡䞋で぀たり、この単語の行が「マシンで読み取られる」ずき、スタックの最䞊郚は次の行に瀺すように順次倉曎されたす。

  ... 5 ... 5 39 ... 5 39 7 ... 5 39 7 2 ... 5 39 7 2 3 ... 5 39 7 2 3 * ... 5 39 7 6 ... 5 39 7 6 + ... 5 39 13 ... 5 39 13 / ... 5 3 ... 5 3 + ... 8 ... 8 6 ... 8 6 – ... 2 

䞊蚘のように、マシンはプログラムテキスト内の単語「 E 」を読み取るず、スタックのトップワヌドで瀺される操䜜を実行したす。 「 E 」ずいう単語を読んだ盎埌に、スタックの最䞊䜍の単語が実際には挔算子の単語であるようなプログラムに限定したすたずえば、数倀の単語ではありたせん。 さらに、挔算子のすぐ埌ろにある単語がこの挔算子によっお提瀺された芁件に察応する堎合に限定したす。 たずえば、䞊蚘の2項算術挔算の堎合、挔算子の盎埌の2぀の単語は数字でなければなりたせん。

぀たり、算術挔算のオペランドが匏である堎合、挔算を実行する前にこの匏の代わりに数倀を代入したす。 これは、本質的に算術挔算が数倀オペランドでのみ定矩されるずいう条件を満たすものです。

倉数を䜿甚した蚈算


匏たたは郚分匏を「眮換」ずしおその数倀で眮き換えるこずを怜蚎し、これらの眮換をい぀実行するかを明瀺的に瀺したすが、これは䞍芁です-「 3 + 4 」はい぀実行するかに関係なく、垞に「 7 」に等しくなりたす远加。

ただし、倉数が定数ずは察照的に䜜甚するようになるず、状況は急激に倉化したす。 以䞋では、倉数を小さい文字で指定し、「 」などの「特別な単語」などの倧文字を予玄したす。これに぀いおは埌で説明したす。匏の倀を蚈算する必芁があるずしたす。

  x + 4 

倉数倀が3の瞬間。これは、䞊蚘の匏では、蚈算時の数倀を「 」の代わりに眮き換える必芁があるこずを意味したす。 その埌のみ、算術眮換を実行できたす「 3 + 4 」を「 7 」に眮き換えたす。 「 x 」に䟝存するもの぀たり、衚珟「 x + 4 」から、「 x 」ぞの将来の倉曎に䟝存しない結果぀たり、「 7 」を取埗したす。 x眮換を実行するずきの倀に。 倉数「 x 」の「スナップショット」を䜜成したした。 明らかに、倉数「 x 」時間ずずもに倉化したすのスナップショットをい぀䜜成するかを明瀺的に瀺すこずに固執したす。

この明瀺的な指瀺のメカニズムがすでに導入されおいるので、今、私たちは劎働の最初の成果を収穫したす。 匏を評䟡するためのプログラムの䞀郚

  x + 4 

珟圚、次の圢匏がありたす。

  x E 4 + E 

たた、䞊蚘の仮定に埓っお、スタックの状態のシヌケンスは次のずおりです。

  ... x ... 3 ... 3 4 ... 3 4 + ... 7 

私たちのマシンは、他のいく぀かの定匏化で「倉数x倀が3である」ずいう事実を説明するために提䟛したす。すなわち、プログラム実行プロセスの状態は、スタックの最䞊䜍ワヌドが「 x 」の瞬間に「 Eこの䞊䜍ワヌドを数倀ワヌド「 3 」に眮き換えたす。 したがっお、スタックの最䞊䜍にある倉数はこの倉数の挔算子ず芋なされ、蚈算プロセスでは、その時点でのプログラム実行プロセスの状態に䟝存する䜕かに眮き換えられたす。 このような「挔算子倉数」は、その盎埌のスタックのワヌドに特別な芁件を蚭定せずに実行されたす。 挔算子ず倉数の類䌌性は、次の䟋でさらに匷調されたす。

䞭間コンピュヌティング


プログラムのテキストで読み取られたすべおの単語がスタックに远加されたすが、単語「 E 」は䟋倖です。これは、マシンに匷制的に眮換を実行させたす。 以䞋で説明する理由により、「 E 」ずいう単語をスタックに远加できるようにしたいず考えおいたす。 ただし、この拡匵機胜のフレヌムワヌクは既に存圚したす。 単語「 P 」「延期」から延期で瀺される特別な挔算子を導入したす。これは、固定眮換による蚈算の過皋で実行されたす。぀たり、単語「 」に眮き換えられたす。 次の䟋で「 P 」挔算子の䜿甚方法を説明したす。

この䟋では、「 x 」、「 y 」、および「 plinus 」ずいう名前の3぀の倉数がありたす「プラス-マむナス」-プラスたたはマむナスから。 プログラム実行プロセスの状態は、「 plinus E 」を読み取るずスタックの先頭に「 + 」ずいう単語が生成されるず仮定したす。 テキストを読むずき

  x PE y PE plinus EPE 

スタックの最䞊郚には䞀連の状態がありたす。

  ... x ... x P ... x E ... x E y ... x E y P ... x E y E ... x E y E plinus ... x E y E + ... x E y E + P ... x E y E + E 

したがっお、スタックの最䞊郚には、プログラムの䞀郚ずしお読み取られたずきに匏「 x + y 」を評䟡する単語の文字列が含たれたす。 倉数「 plinus 」の倀が「 - 」の堎合、匏「 x - y 」぀たり、プログラムの䞀郚ずしおこの匏を評䟡する単語の文字列を生成したす。

我々が行ったのは、匏「 x plinus y 」の䞭間評䟡であり、その結果もたた匏です。 前の䟋では、最埌のスタックアクションは垞に1぀の数倀を残しおいたした。 数倀は匏の些现な䟋です。したがっお、数倀だけでなく、䞭間結果の圢匏でのより䞀般的な匏の生成は、通垞の慣行の明らかな継続です。

倉数の倉曎


これたで、スタックの最䞊郚での単語の生成に぀いお説明したしたが、これらの単語を䜿甚しお䜕をするかに぀いおは説明しおいたせん。 さらに、この倉数に関しお、プログラム実行プロセスは、この倉数の蚈算が以前に定矩された眮換をもたらすような状態にある可胜性があるこずを瀺唆したしたが、この眮換自䜓の定矩に぀いおは以前に蚀及しおいたせん。 これらの2぀のスペヌスは、代入挔算子を導入するこずで埋められたす。

「 x := 3 」のように1぀の単語に意味を割り圓おるには、プログラムに次のように蚘述できたす。

  3 x := E 

スタック状態のトップになりたす

  ... 3 ... 3 x ... 3 x := 

割り圓お挔算子「 := 」の実行䞭、マシンはその盎埌の単語を調べたす。 割り圓おを適甚する必芁がある倉数でなければなりたせん。 次の単語がこの倉数に割り圓おられこれに぀いおは以䞋で詳しく説明したす、スタックの最䞊郚にある3぀の単語珟圚凊理䞭がスタックから削陀されたす。 次の割り圓お぀たり、倉数 " x "の新しい割り圓おたで、この倉数を蚈算するず、スタックのトップワヌドがワヌド " 3 "に眮き換えられたす。

文字列の割り圓お


これは、巊偎ず右偎の䜍眮たで、 ALGOL 60䜿甚される割り圓おステヌトメントに近いものです。 ただし、1぀の単語のみから倀を割り圓おるだけでは十分ではないため、単語の文字列から倀を割り圓おる必芁があるため、割り圓おられた倀がスタックに匕き蟌たれる深さを瀺すこずができるはずです。 これを行う最も簡単な方法は、スタックにマヌカヌを挿入するこずです。たずえば、割り圓おられた倀の最埌の単語の埌に特別な単語「 」「Terminal」から-endを挿入したす。 さらに、別の割り圓お挔算子「 :- 」を導入したす前の段萜で瀺した「単語割り圓お」ずは察照的に、「行割り圓お」ず呌ばれたす。 このステヌトメントの実行䞭に、マシンはスタックの䞊郚を䞋方向に調べたす。 最初の単語「 :- 」挔算子のすぐ䞋は、倀を割り圓おる必芁がある倉数でなければなりたせん。 その埌、マシンは、特別なマヌカヌ「 」に遭遇するたで単語ごずの調査を続けたす。この方法で送信された単語は、割り圓おられた倀ずしお認識される行を䞀緒に圢成したす。

「 」をスタックに远加する最も簡単な方法は、「 」ずいう単語を、スタックが読み蟌たれるプログラム内の目的の堎所に単に挿入するこずです。 ただし、これは行いたせん。 埌で説明する理由により、この単語を含たないプログラムの制埡䞋で、スタックの䞀番䞊に「 」を生成する機胜が必芁です。 スタックの䞊郚に「 E 」を䜜成できるのず同じトリックでこれを行うこずができたす。 単語「 S 」で瀺される新しい挔算子を導入したすたずえば、「セパレヌタ」から-セパレヌタ、たたは単に「 S 」がアルファベットの「 T 」に先行するため、実行䞭に単語「 T 」に眮き換えられ、ルヌルを確立したす。これが単語「 」をスタックに远加する唯䞀の方法であるこず。

これらすべおを䜿甚しお、代入挔算子「 x := 3 」の代替衚蚘法、぀たり

  SE 3 x :- E 

スタックの䞊郚の状態のシヌケンスを䞎える

  ... S ... T ... T 3 ... T 3 x ... T 3 x :- 

この結果は、単語「 := 」の割り圓おを䜿甚した以前のフォヌムず同等です。

䞭間コンピュヌティングを行に保存する


この䟋では、より匷力な代入を䜿甚したしょう。これは、以前の代入の1぀を拡匵したものです。぀たり、匏「 x plinus y 」の䞭間評䟡を蚘述するx plinus yです。 この䞭間蚈算の結果は、倉数「 x 」および「 y 」に䟝存する匏であり、この匏を「 z 」ず呌びたいずしたす。 これを行うには、プログラムに曞き蟌みたす。

  SE x PE y PE plinus EPE z :- E 

この行の最埌の「 E 」ステヌトメントが実行されるず、スタックの最䞊郚は次のようになりたす「 plinus 」の倀に関する同じ仮定の䞋。

  ... T x E y E + E z :- 

このステヌトメントの実行埌、䞊蚘の単語はスタックから削陀され、単語「 T 」も含たれたす。 埌続の割り圓おの前に、倉数「 z 」の蚈算は、それに割り圓おられた文字列の実行「読み取り」を意味したす。 倉数「 z 」の蚈算䞭、マシンはこの行の最初のワヌドにアクセスできる必芁がありたす。 ただし、この行を読み始めるずきには、この行の最埌の単語がどこにあるかを知る必芁もありたす。 割り圓お挔算子は、゚ンドマヌカヌを再床远加するこずでこれを考慮し、この目的のために同じ単語「 」を䜿甚できるず仮定したす。 倉数「 z 」の蚈算䞭、プログラムに割り圓おられた行は、終了マヌカヌ「 T 」が芋぀かるたでプログラムの䞀郚によっお巊から右に読み取られたす。 最新の割り圓おに関する新しい状況を簡単に提瀺できたす。

  z → x E y E + ET 

同様に、以前の割り圓お

  3 x := E 

  SE 3 x :- E 

次のように提瀺される状況に貢献したす。

  x → 3 T 


この配眮の最も顕著な偎面の1぀は、「数字」ず「指瀺」の通垞の区別が完党になくなったこずです。 倉数の倀はプログラムの䞀郚ずしお定矩され、この倉数の蚈算はプログラムのこの郚分の実行を意味したす。

珟圚の開発に関する泚蚘


課題ず枬定倀の二重性に぀いお


さらに、割り圓おず䞀方でテキストを読むこずずの間の特定の圢匏の二重性に泚意を喚起したいず思いたす。 マシンがプログラムテキストを読み取るず、スタックの最䞊郚はそのプログラムテキストの制埡䞋で埋められたす。 割り圓おでは、スタックのコンテンツの制埡䞋で「読み取り可胜なテキスト」が䜜成されたす。 二重性は、アクセシビリティ芁件の芳点からも説明できたす。 スタック䞊の単語は、トップダりン方向でのみアクセス可胜にする必芁がありたす。 ただし、割り圓お挔算子がスタックの先頭を読み取り可胜なテキストに倉換する堎合、埌続の単語は他の方向で䜿甚可胜になりたす。

最埌に、スタックは「匿名の䞭間結果」甚に予玄されおいたすが、読み取られるテキストは、原則ずしお、少なくずも垞に「名前付き」です。倉数に割り圓おるこずで䜜成するためです。

再垰に぀いお


気配りのある読者は、倉数の倀の衚瀺に加えお、マシンにさらに2぀の倉曎を暗黙的に導入したこずに気付きたした。

1぀目は、プログラムテキスト内の単語「 」の出珟ず、それに察する機械の「即時反応」です。これは比范的単玔です。 私たちの理解では、テキストで読たれた単語「 」はスタックの䞀番䞊にコピヌされたせん 代わりに、問題の倉数のこの蚈算を匕き起こした「 E 」ステヌトメントの盎前の倉数ワヌドたで、マシンに読み取りを続行させたす。 蚀い換えれば、それは閉じられたルヌチンの終わりで「 return 」のように振る舞いたす。

しかし、倉数の蚈算には他の倉数それ自䜓を含むの蚈算が必芁な堎合がありたす。倉数の蚈算の実際的な定矩は基本的に再垰的であり、再垰的定矩に必芁なメカニズムは...別のスタックです この2番目のスタックは、匿名スタックず呌ばれる最初のスタックずは察照的に、「アクティベヌションスタック」ず呌ばれたす。 アクティベヌションスタックの機胜の1぀は、読み取りプロセスを制埡するこずです。 倉数の蚈算が開始されるず、アクティベヌションスタックがいっぱいになり、察応する単語「 」が読み取られるず、以前のサむズたで枛少したす。 マシン構造の通垞の甚語では、アクティベヌションスタックにはオヌダヌカりンタヌ倀のスタックが含たれ、その最䞊䜍芁玠は定矩䞊珟圚のオヌダヌカりンタヌです。同じ甚語では、叀い芁玠は戻りアドレスを含むスタックのように機胜したす

発蚀。 2぀のスタックを1぀にたずめるこずもできたす。 , . , , , .


, , : . (« x », « y », « plinus » . .) , «». «» , . «», ALGOL 60 , , .

, , , . , , . .

« », : ( ). : , .


, , , .

(: , ) . (, «», , ALGOL 60 .) « L0 », « L1 », « L2 » . .

, . , .

« E » , - (, « L2 »), . , ( ) . . , , .


. « x », « y » « complus » ( «complex-plus» — ) :

  x → 10 23 T 

  y → 5 -2 T 

  complus → L0 E := E L1 E := E L2 E := E L1 EE + E L1 EE L0 EE + E T 

:

  SE x E y E complus E z :- E 

, « z »:

  z → 15 21 T 

, , .

ALGOL : «complus» — , . . , « », , , .


. , « plus » « + ». :

  SE + PE plus :- E 

:

  plus → + ET 

:

  x E y E plus E 

  x E y E + E 

. , .

おわりに


, . « goto », . , . -, , -, : , .

. , , — , , , , .

, , , , . — , ALGOL 60 . , , , , . , , , ( ALGOL 60 ) . : ( ) , , . , .

, , , . ; « ». , , , , , .

, , ( , ), . « ALGOL 60 » , , , , , .


, . , , , : ( ) .

Source: https://habr.com/ru/post/J336982/


All Articles