ジャンプ手順-Wikipedia

before-content-x4

ジャンピング またはa ジャンプコマンド プログラミング言語の指示です。コンピュータープログラムでは、後続のコマンドで処理を継続するのに役立ちますが、いつでも。

after-content-x4

最もよく知られているジャンプ命令は、SO -Calledです goto (から 英語 行きます 行く)。これは、プログラムコードのプログラミングのコマンドであり、プログラムの別のポイントにジャンプします。

サブプログラムのレビュー(また:サブルーチンと機能)が使用しています 電話 または同様のコマンド(プログラミング言語とサブプログラムタイプに応じて)。

a バックジャンプ (メイン)プログラムが、そのようなsubroutine of thenの実行の後に継続される場所への復帰は、 戻る サブルーチンの指示。

ただし、プログラムコードの既に訪問されたエリアに戻る、つまりループ内のプログラムセクションの繰り返しも参照されます。
GOTOの指示の代わりに、いわゆる制御構造が最新のプログラミングプロセスで使用されます。詳細については、以下を参照してください。

高い言語とは対照的に、人はより頻繁に話します ジャンプコマンド から ジャンプ手順

通常、プロセッサはいくつかの異なるジャンプコマンドを知っています。これは、次のように分けることができます。

絶対 また 条件付き
ジャンプは常に実行されるか、特定のフラグに特定の必要な値がある場合にのみ、ステータスレジスタに必要です。コード化されたジャンプ命令にある値とフラグ(例:JNZは、ゼロではないジャンプ(if)を意味します)。
絶対に、相対的な、登録 また 保管所
  • プログラムは、指定されたアドレスで継続されます。
  • ジャンプは現在の位置に関連しています。これにより、より多くの(移転可能な)コードを移動できます。
  • 宛先アドレスはレジスタにあります JMP Reg
  • ジャンプ宛先のアドレスはメモリにあります JMP [Reg] また JMP [reg+offs]

サブプログラム呼び出しは、ジャンプコマンドの特別な形式です。 H.戻るつもりでジャンプします。実行されると、Follow -Upコマンドのアドレスが最初に保護されます(スタックまたはレジスタで)、 [初め] その場合にのみ、宛先アドレスがジャンプします。以上 リアジャンプコマンド サブルーチンは元の位置に戻ることができ、プログラムは継続します。返品アドレスはスタックから削除されるか、レジスタにあります。

after-content-x4

より高いプログラミング言語には1つあります ジャンピング フォームの指示

goto ブランド名  

また

もしも 状態 goto ブランド名  

最初のケースでは、それはそうします 声明を称える 、2番目 条件付きジャンプ手順 呼び出されました。スタンド ブランド名 プログラムの別の場所で定義されているジャンプブランドの名前。プログラムを処理するとき、その場所はジャンプマークの位置に続きます。

原則として、すべてのアルゴリズムを条件付きジャンプ命令と、データ入力と出力のためのいくつかの追加関数をプログラムできます。ただし、結果のプログラムは、特定のサイズからほとんど訓練できません。したがって、現在のプログラミング言語では、明示的に策定されたジャンプ命令はめったに使用されません。代わりに、高品質の制御構造、特にループ、サブプログラム呼び出し、および実行されるプログラムブロックがより頻繁に使用され、論理的に関連する分岐および再分岐コマンドが暗黙的にコマンドを使用します。 H. gotoなしでマシンコードに翻訳者によって挿入される必要があります。

マシンクロースプログラミングでは、GOTOコマンドは、絶対または条件に依存して、プログラムの別のポイントに分岐するのに役立ちます。一部のアセンブラー言語では、対応するgotoコマンドが呼び出されます JMP 英語 ジャンプ ジャンプ)またはbr( 英語 ブランチ ブランチ)。

より高いプログラミング言語(小さな文字も許可する場合があります)、コードライン番号(古い基本方言の場合)または定義されたジャンプマークのいずれかのGOTOコマンド( ラベル 、たとえばCまたはPascal)。

PascalのGoToを使用した簡単なプログラムの例:

プログラム  ;  ラベル  ;  始める   Writeln 「エンドレスループ」 )) ;  goto  ;  終わり  

次のプログラムの例(エッセイから コーディングスタイル Linus Torvaldsによって) [2] GOTOコマンドの使用を示します ゴットアウト Cで:

int  楽しい int  a ))  {   int  結果  =  0 ;   char  * バッファ  =  Kmalloc サイズ );   もしも  バッファ  ==  ヌル ))   戻る   -  enomem ;   もしも  条件1 ))  {   その間  ループ1 ))  {              // ...         }

        result = 1;
        goto out;
    }

    // ...
out:
    kfree(buffer);
    return result;
}

FortranやBasicなどの古いプログラミング言語の初期のバリエーションでは、GOTOコマンドが依然として最も重要であり、プログラムの流れを制御する唯一の方法でさえありました。したがって、これらはループと条件付き実行を実装するためにも使用されました。これにより、Spaghetticodeにつながりました。

プログラミング言語Algolで、1960年の独自の制御構造など その間 ために if-else プログラミングループと条件付き命令およびブランチ用に導入されています。これらのイノベーションは、すぐに他のプログラミング言語に引き継がれました。それで その間 残留物の代替として もしも 各プログラムの適切な再構築を伴うフォワードジャンプの進捗状況の代替としての理論的には余分なもの。

ただし、構造化されたプログラミングとGOTOプログラミングは、理論的なコンピューターサイエンスの観点と同等です。このようなプログラムはすべて、GOTOプログラムのカテゴリに分類されます。

また、他の点では、GOTO同等の構造化プログラミングのコマンドは次のとおりです。プロセッサのコマンドレートには、一般に、ような構成要素の明示的なサポートは含まれていません。 その間 繰り返す ために if-else したがって、プログラムをコンパイルするとき、これらは無条件で条件付きジャンプ命令によってコンパイラによって作成されます(Mnemonics:JP、JMP、J cond 、 すぐに戻る CC 、…)複製。上記の構成要素は新しいオプションを提供しませんが、読みやすく、したがってより多くのメンテナンス – フレンドリーなコードを促進するために理にかなっています。

1968年、Edsger W. Dijkstraは彼のエッセイで話しました 有害と見なされるステートメントに移動します (元は: Go to Statementに対する訴訟 ;後のタイトルは、すべてのより高いプログラミング言語でのGOTOコマンドの廃止のために、Niklaus Wirthに戻ります。 [3] これは簡単に可能です。なぜなら、ほとんどすべての段階を通り抜けているからです。 する ために また その間 交換できます(Simulation gotoもしばらく参照)。最初の抵抗の後、プログラミングトレーニングにおけるこの意見はすぐにドグマに提起されました。 Javaのようないくつかの言語では、GoToコマンドは意図的に導入されませんでしたが、代替手段はまったく導入されました ラベル付きブレーク そして後にa ラベルが継続します 。まだです goto Javaのキーワードとしても予約されています。実装を予約することもできますが、おそらく実際的な理由もあります。それ以外の場合はそうなるでしょう goto 有効な識別子。一方、多数の新しい命令的なプログラミング言語は、まだGOTOをサポートしています。 B. C ++、さらには2000年に開発され、D。2009が2007年に発行されたC#でさえ、GOTOはその後、バージョン5.3からPHPスクリプト言語を導入し、新しい言語に含まれました。

GOTOコマンドのあまり批判されていないバリアントは、サブルーチンの時期尚早の離脱です 戻る 、ループのキャンセル 壊す または、特定の研削ランと次の実行の始まりを壊します 続く 。それにもかかわらず、一部のプログラミング言語では、ブロックに正確なエントリポイントと正確な出口ポイントがある場合、それは良いプログラミングスタイルです。一方、例外的な治療を許可する言語では、1つの釈放ポイントルールは時代遅れと見なされています。 投げる – インストラクションは、このルールの背後にある議論をリードしています。

しかし、実際には、Gotoの免除が可能であることが示されていますが、場合によっては非常に複雑な構造につながります。 [4] ドナルド・E・クヌート・ゴトは、いくつかの通常のプログラミングの問題の最適な解決策を考えています。 [5] 特に、批判的なプログラムの部分では、GOTOは、いくつかの揺れたループの終わりよりもはるかに効率的であり、解体テストを実施します。

一部の開発者は、LinuxカーネルメーリングリストのLinuxのソースコードでGOTOを頻繁に使用することについて議論しました。 Linus Torvaldsは、GOTOの使用は、多くの場合、ソースコードの読みやすさを大幅に向上させる可能性があると述べました。 [6]

  1. IBM System/360操作原則。 (PDF)IBM、1964、 S. 64 2015年2月2日にアクセス (英語、「ブランチとリンク」のコマンド説明:Bal、Balr)。
  2. Linuxカーネルコーディングスタイル、第7章:関数の集中退場 (英語)
  3. Edsger W. Dijkstra: 編集者への手紙:有害と見なされるステートメントに移動する 。の: ACMの通信 バンド 11 いいえ。 3 、1968年3月、 S. 147–148 、doi: 10.1145/362929.362947
  4. フランク・ルービン: 「GOTOは有害と見なされている」と考えられています 。 In:ACM(hrsg。): ACMの通信 バンド 30 いいえ。 3 、1987年3月、 S. 195–196 、doi: 10.1145/214748.315722 web.Archive.org [PDF; 208 KB ; 2021年9月11日にアクセス])。
  5. ドナルドE.クヌース: ステートメントに移動する構造化プログラミング 。 In:ACM(hrsg。): コンピューティング調査 バンド 6 いいえ。 4 、1974年、 S. 261–301 、doi: 10.1145/356635.356640 オンライン [PDF; 2.9 MB ; 2021年9月11日にアクセス])。
  6. Linux:kernelコードでgotoを使用します。 (もはやオンラインで利用できなくなりました。)kerneltrap.org、アーカイブ オリジナル 午前 28. 2005年11月 ; 2010年9月21日にアクセス (英語)。
after-content-x4