.jpg/500px-GOTOkey(ZXSpectrum).jpg)
Goto は、多くのコンピュータプログラミング言語で見られる文です。これは、コードの別の行に制御を一方向に転送します。対照的に、関数呼び出しは通常、制御を返します。ジャンプ先の場所は通常、ラベルを使用して識別されますが、一部の言語では行番号が使用されます。マシン コードレベルでは、は分岐文またはジャンプ文の一種であり、場合によってはスタック調整と組み合わされます。多くの言語が文をサポートしていますが、サポートしていない言語も多数あります (§ 言語サポートを参照)。
gotogoto
構造化プログラム定理は、フローチャートとしてgoto表現できるプログラムを記述するためにこのステートメントは必要ではないことを証明しました。コードの重複と追加の変数を導入する必要があるかもしれないという注意点はありますが、チューリングマシンで実行できる計算には、シーケンス、選択/選択、繰り返し/反復という3つのプログラミング構造の組み合わせで十分です。[1]
goto の使用は以前は一般的でしたが、 1960 年代と 1970 年代に構造化プログラミングが登場して以来、その使用は大幅に減少しました。特定の一般的な使用パターンでは引き続き使用されていますが、代替手段が利用できる場合は通常それが使用されます。過去には、goto ステートメントの使用の利点について、学界と産業界でかなりの議論がありました。主な批判は、goto ステートメントを使用するコードは、代替構造よりも理解しにくいというものです。その (より限定された) 使用に関する議論は、学界とソフトウェア業界の間で続いています。
使用法
goto label
このステートメントは、多くの場合、条件付きの制御の転送を引き起こすために
if ステートメントgotoと組み合わせて使用されます。
IF condition THEN goto label
プログラミング言語は、文の宛先に関してさまざまな制限を課しますgoto。たとえば、Cプログラミング言語では、別の関数内に含まれるラベルへのジャンプは許可されませんが、[2] setjmp/longjmp関数を使用すると、単一の呼び出しチェーン内でのジャンプは可能です。
批判
1959年に開催されたALGOL以前の会議で、ハインツ・ゼマネクはGOTO文の必要性に明確に疑問を投げかけたが、当時は誰も[要出典]、後にGOTOの象徴的な反対者となるエドガー・W・ダイクストラを含めて彼の発言に注意を払わなかった。 [3] 1970年代と1980年代には、GOTO文の使用が減少し、構造化プログラミング パラダイムが好まれ、GOTOは保守不可能なスパゲッティコードにつながると批判された。GNU Pascalコーディング標準など、一部のプログラミングスタイルのコーディング標準では、GOTO文の使用を推奨していない。 [4]ベーム-ヤコピニの証明(1966)は、ソフトウェア開発に構造化プログラミングを採用するかどうかという問題を解決しなかった。その理由の1つは、その適用には追加のローカル変数の導入が必要になるため、構造化プログラミングの構築によってプログラムが改善されるよりもわかりにくくなる可能性が高いためである。[5]しかし、これはコンピュータ科学者、教育者、言語設計者、アプリケーションプログラマーの間で大きな議論を引き起こし、以前は広く使われていたGOTOの使用からゆっくりと、しかし着実に離れていく傾向が見られました。おそらくGOTOに対する最も有名な批判は、1968年にエドガー・ダイクストラが書いた「Go-to文は有害であると考えられる」という手紙でしょう。[3]その手紙で、ダイクストラは、制限のないGOTO文は、プログラム(特にループを含むもの)の正しさを分析および検証する作業を複雑にするため、高水準言語から廃止されるべきであると主張しました。[6]その手紙自体が議論を引き起こし、 1987年3月にCommunications of the ACM (CACM)に送られた「「GOTOは有害であると考えられる」有害であると考えられる」という手紙[7]や、ダイクストラの「やや残念な書簡について」を含む他の人々からのさらなる返信も含まれました。[8]
ドナルド・クヌースの『Structured Programming with go to Statements』では、別の視点が提示されています。この本では、多くの一般的なプログラミングタスクを分析し、そのうちのいくつかでは GOTO が最適な言語構造であると結論付けています。[9]ブライアン・カーニハンとデニス・リッチーは、 『The C Programming Language』で、これは「無限に悪用される可能性がある」と警告していますが、関数終了時のエラーハンドラやループからの複数レベルのブレークにも使用できると示唆しています。[10]これらの 2 つのパターンは、他の著者による C に関する多数の後続の本で見つけることができます。[11] [12] [13] [14] 2007 年の入門書では、エラー処理パターンは「C 言語内の組み込み例外処理の欠如」を回避する方法であると述べられています。[11] Linuxカーネルの設計者でプログラマーのリーナス・トーバルズやソフトウェアエンジニアで本の著者でもあるスティーブ・マッコーネルなどの他のプログラマーもダイクストラの見解に反対しており、GOTOはプログラムの速度、サイズ、コードの明瞭さを向上させる便利な言語機能になり得るが、それは同等に賢明なプログラマーが賢明な方法で使用する場合に限られると主張している。[15] [16]コンピュータサイエンスの教授ジョン・レガーによると、2013年にはLinuxカーネルコードに約10万回のgotoのインスタンスがあった。[17]goto
他の学者はより極端な見解を取り、ループの途中からのや のような命令でさえもbreak、ベーム-ヤコピニの結果には必要ないので悪い習慣であると主張し、したがってループは単一の終了ポイントを持つべきだと主張した。 [18]たとえば、ベルトラン・マイヤーは2009 年の教科書で、 や のような命令は「羊の皮をかぶった古いものにすぎない」と書いている。[19]ただし、ベーム-ヤコピニの結果をわずかに修正した形式では、ループからの複数レベルのブレークが許可されている限り、構造化プログラミングで追加の変数を回避することができます。[20] C などの一部の言語ではキーワードによる複数レベルのブレークが許可されていないため、一部の教科書では、そのような状況ではを使用するようにプログラマにアドバイスしています。 [14] MISRA C 2004 標準では、、 、および複数のand文が禁止されています。[21] 2012年版のMISRA C標準では、の禁止が「必須」から「推奨」に格下げされました。2012年版には、による後方ジャンプは禁止するが前方ジャンプは禁止しないという追加の必須ルールがあります。[22] [23]returnbreakcontinuegotobreakgotogotocontinuereturnbreakgotogoto
FORTRAN は1978 年に構造化プログラミング構造を導入し、その後の改訂で、goto の使用の許容範囲を規定する比較的緩い意味規則が厳格化されました。プログラマーが GOTO を使用して実行中の DO ループから抜けて再び入ることのできる「拡張範囲」は 1978 年に言語から削除され、[24] 1995 年までに、Computed GOTO や Assigned GOTO を含むいくつかの形式の Fortran GOTO が削除されました。[25] JavaやPython などの広く使用されている最新のプログラミング言語にはGOTO ステートメントがありません (言語サポートを参照)。ただし、ほとんどの言語では、選択から抜け出すか、反復の次のステップから抜け出すか、次のステップに進むための手段が提供されています。コード内の制御フローを乱すことは望ましくないという観点は、一部のプログラミング言語の設計に見られることがあります。たとえば、Ada [26]では、山括弧を使用してラベル定義を視覚的に強調しています。
comp.lang.c FAQリスト[27]のエントリ17.10では、GOTOの使用の問題を直接取り上げ、次のように述べています。
プログラミング スタイルは、ライティング スタイルと同様、ある意味芸術であり、柔軟性のないルールで体系化することはできませんが、スタイルに関する議論は、多くの場合、そのようなルールだけに集中しているようです。goto ステートメントの場合、goto を無制限に使用すると、すぐに保守不可能なスパゲッティ コードになることが長い間観察されてきました。ただし、goto ステートメントを単純に無意識に禁止しても、必ずしもすぐに美しいプログラミングにつながるわけではありません。構造化されていないプログラマーは、goto をまったく使用せずにビザンチン タングルを構築することができます (代わりに、奇妙にネストされたループとブール制御変数を使用するなど)。多くのプログラマーは中庸なスタンスを採用しています。goto は通常は避けるべきですが、必要に応じて、制約の厳しいいくつかの状況では許容されます。たとえば、複数レベルの break ステートメントとして、switch ステートメント内で一般的なアクションを結合する場合、または複数のエラーを返す関数でクリーンアップ タスクを集中させる場合などです。 (...) 特定の構造を盲目的に避けたり、ルールを理解せずにそれに従ったりすると、ルールが回避するはずだった問題と同じくらい多くの問題を引き起こす可能性があります。さらに、プログラミング スタイルに関する多くの意見は、まさに意見にすぎません。それらは強く主張され、強く感じられ、確かな証拠や議論によって裏付けられているかもしれませんが、反対意見も同様に強く感じられ、支持され、主張されている可能性があります。「スタイル戦争」に巻き込まれるのは通常無駄です。なぜなら、特定の問題では、反対者は決して同意できないか、同意しないことに同意できないか、議論をやめられないからです。
一般的な使用パターン
goto の使用は全体的に減少していますが、一部の言語では、goto がプログラムのロジックを表現する最も短くて簡単な方法となる状況がまだあります (goto を使わずに同じロジックを表現することは可能ですが、同等のコードは長くなり、理解しにくくなることがよくあります)。他の言語では、例外や末尾呼び出しなどの構造化された代替手段があります。
goto がよく役立つ状況としては、次のようなものがあります。
- コードをより読みやすく、理解しやすくするため[15] [28]
- プログラムを小さくし、コードの重複を排除する[15] [28]
- 状態遷移表とgotoを使用して状態を切り替える有限状態機械を実装します(末尾呼び出しの削除がない場合)。特に自動生成されたCコードで使用します。[29]たとえば、標準的なLRパーサーのgotoです。
- 言語で直接サポートされていない場合は、複数レベルの break と continue を実装します。これは C では一般的なイディオムです。 [14] Java は goto キーワードを予約していますが、実際に実装しているわけではありません。代わりに、Java はラベル付きの break 文とラベル付きの continue 文を実装しています。 [30] Java のドキュメントによると、複数レベルの break に goto を使用することは、C での goto の使用法として最も一般的 (90%) でした。[31] Java は、goto を禁止するが複数レベルの break を提供するというこのアプローチを採用した最初の言語ではありません。この点では、 BLISSプログラミング言語 (より正確にはその BLISS-11 バージョン) が先行していました。[32]
- 追加のループの導入によって制御フローに誤った影響を与える可能性がある場合に、単一レベルのbreakまたはcontinue(再試行)ステートメントの代替となるもの。この方法はNetbsdコードで確認されています。[33]
- エラー処理(例外がない場合)、特にリソースの割り当て解除などのクリーンアップコード。[11] [14] [33 ] [29] [34] C++では、このユースケースに対してgoto文の代替手段を提供しています。それは、デストラクタを使用するか、例外処理で使用されるtry例外とcatch例外を使用することで、リソース取得初期化(RAII)を実行することです。[35] setjmpとlongjmpは別の代替手段であり、呼び出しスタックの一部を巻き戻すことができるという利点があります。
- スタックをポップインします (例: Algol、PL/I)。
- ビデオゲームの対話システムなど、線形に動作する特殊なスクリプト言語。[36]
これらの使用法はCでは比較的一般的ですが、C++やより高水準の機能を備えた他の言語ではあまり一般的ではありません。[34]しかし、関数内で例外をスローしてキャッチすることは、一部の言語では非常に非効率的になることがあります。その代表例がObjective-Cで、gotoの方がはるかに高速な代替手段です。[37]
goto文のもう1つの用途は、gotoを回避するために大規模なリファクタリングやコードの複製が必要となる、適切にファクタリングされていないレガシーコードを修正することです。たとえば、特定のコードのみに関心がある大規模な関数がある場合、goto文を使用すると、関数を変更することなく、関連するコードのみにジャンプしたり、関連するコードからジャンプしたりできます。この使用法はコード臭と見なされますが、[38]時折使用されます。
代替案
構造化プログラミング
サブルーチンという現代的な概念は、 David WheelerがEDSACをプログラミングする際に発明されました。サブルーチン呼び出し命令のないマシンで呼び出しと戻りを実装するために、Wheelerジャンプと呼ばれる自己変更コードの特別なパターンを使用しました。[39]gotoこれにより、ライブラリから取得したルーチンを適切にネストした実行を使用してプログラムを構造化できるようになりました。これは、ライブラリから取得したターゲットコードがどこにジャンプして戻ればよいかわからないため、
のみを使用しては不可能でした。
その後、 Pascalなどの高級言語は、サブルーチン(プロシージャまたは関数とも呼ばれる)から次のようなさらなる制御構造へと一般化された構造化プログラミングのサポートを中心に設計されました。
while、repeat untilまたはdo、およびforステートメントを使用したループswitch別名ステートメント、多方向分岐caseの一形態
gotoこれらの新しい言語メカニズムは、以前はと を使って記述されていた同等のフローを置き換えましたif。マルチウェイ分岐は、ジャンプ先の命令が動的に (条件付きで) 決定される「計算された goto」を置き換えます。
特定の条件下では、レガシープログラムのローカルgoto文をマルチレベルループexit文に置き換えることで削除することが可能です。[40]
例外
実際には、構造化プログラミングの基本的な 3 つの構造テンプレートに厳密に従うと、構造化ユニットを途中で終了することができないため、高度にネストされたコードが生成され、すべての可能な条件を処理するための非常に複雑なプログラム状態データによる 組み合わせ爆発が発生します。
一般的に採用されている解決策は 2 つあります。構造化単位を途中で終了する方法と、より一般的には例外です。どちらの場合も、例外は構造を上っていき、囲んでいるブロックまたは関数に制御を戻しますが、任意のコード位置にジャンプすることはありません。これらは、非終端位置での return ステートメントの使用に似ています。早期終了のため厳密には構造化されていませんが、構造化プログラミングの制約がわずかに緩和されています。C では、breakおよびにより、追加のorステートメントを必要とせずに、ループを終了したり、次の反復に続行したりcontinueできます。一部の言語では、複数レベルのブレークも可能です。例外的な状況を処理するために、 Java の
/ /などの特殊な例外処理構造が追加されました。whileiftrycatchfinally
throw-catch例外処理メカニズムも、gotoが悪用されるのと同じように、簡単に悪用されて非透過的な制御構造を作成する可能性があります。[41]
末尾呼び出し
1977 年にシアトルで開催された ACM カンファレンスで発表された論文で、Guy L. Steele はGOTO と構造化プログラミングに関する議論を要約し、プロシージャの末尾位置でのプロシージャ呼び出しは、呼び出されたプロシージャへの制御の直接転送として最も最適に処理でき、通常は不要なスタック操作操作が排除されると指摘しました。[42]このような「末尾呼び出し」は、プロシージャ呼び出しが遍在する言語であるLispでは非常に一般的であるため、この形式の最適化により、他の言語で使用される GOTO と比較して、プロシージャ呼び出しのコストが大幅に削減されます。Steele は、実装が不十分なプロシージャ呼び出しによって、プロシージャ呼び出しに比べて GOTO の方が安価であるという人為的な認識が生まれたと主張しました。Steele はさらに、「一般にプロシージャ呼び出しは、パラメータも渡す GOTO ステートメントとして便利に考えることができ、マシン コードのJUMP 命令として統一的にコード化できる」と主張し、マシン コードのスタック操作命令は「最適化と見なされます (その逆ではなく!)」と主張しました。[42]スティールは、Lispの最適化された数値アルゴリズムは、当時入手可能な商用Fortranコンパイラで生成されたコードよりも高速に実行できるという証拠を挙げた。これは、Lispの手続き呼び出しのコストがはるかに低いためである。スティールがジェラルド・ジェイ・サスマンと共同で開発したLisp方言であるSchemeでは、末尾呼び出しの最適化が必須である。[43]
Steele の論文は、少なくとも MIT で実践されていたものにおいては、コンピュータ サイエンスに目新しいことをあまり導入しなかったが、プロシージャ呼び出しの最適化の余地を明らかにした。これにより、モジュール化を促進するプロシージャの特性が、複雑な内部制御構造と広範な状態データを持つ大規模でモノリシックなプロシージャという当時の一般的なコーディング習慣に代わる、より信頼性の高いものになった。特に、Steele が説明した末尾呼び出しの最適化により、プロシージャは単一の末尾再帰(同じ関数を呼び出す末尾再帰) による反復を実装する信頼性の高い方法になった。さらに、末尾呼び出しの最適化により、末尾呼び出しを前提とした無制限の深さの相互再帰が可能になり、これにより有限状態マシンのように制御の転送が可能になる。これは通常、goto ステートメントで実現される。
コルーチン
コルーチンは構造化プログラミングを大幅に緩和したもので、複数の終了ポイント(末尾以外の位置での return など)だけでなく、goto 文に似た複数のエントリ ポイントも許可します。コルーチンは goto よりも制限が厳しく、コード内の任意の位置にジャンプするのではなく、現在実行中のコルーチンを指定された位置(yield の後に継続)でのみ再開できます。コルーチンの制限された形式はジェネレーターで、これはいくつかの目的には十分です。さらに制限されているのはクロージャーです。クロージャーは、状態(静的変数経由)は維持しますが、実行位置は維持しないサブルーチンです。状態変数と構造化制御の組み合わせ、特に全体的な switch 文により、サブルーチンは後続の呼び出しで任意の位置から実行を再開できます。これは、コルーチンがない場合の goto 文の構造化された代替手段です。これは、たとえば C でよく使われるイディオムです。
継続
継続は、プログラム内の任意のポイントから以前にマークされたポイントに制御を移すという点で、GOTO に似ています。継続は、それをサポートする言語では GOTO よりも柔軟です。これは、ほとんどの構造化プログラミング言語では GOTO が実行できない、現在の関数から制御を移すことができるからです。ローカル変数と関数の引数を格納するためのスタック フレームを維持する言語実装では、継続を実行すると、ジャンプに加えてプログラムの呼び出しスタックの調整が必要になります。Cプログラミング言語のlongjmp関数は、現在のコンテキストから周囲のコンテキストにエスケープするために使用できるエスケープ継続の例です。Common Lisp のGO 演算子にも、構造がレキシカル スコープであるにもかかわらず、このスタック アンワインド プロパティがあります。ジャンプ先のラベルはクロージャから参照できるためです。
Schemeでは、継続は必要に応じて制御を外側のコンテキストから内側のコンテキストに移動することさえできます。次にどのコードを実行するかをほぼ無制限に制御できるため、コルーチンや協調型マルチタスクなどの複雑な制御構造を比較的簡単に記述できます。[43]
メッセージパッシング
非手続き型パラダイムでは、 goto はあまり重要ではないか、まったく存在しません。主な代替手段の 1 つはメッセージ パッシングであり、これは並行コンピューティング、プロセス間通信、およびオブジェクト指向プログラミングで特に重要です。これらの場合、個々のコンポーネントは制御を任意に転送しませんが、全体的な制御は、プリエンプションなどを介して複雑な方法でスケジュールされる場合があります。影響力のある言語SimulaとSmalltalk は、メッセージとオブジェクトの概念を最初に導入した言語の 1 つです。オブジェクト指向プログラミングでは、状態データをカプセル化することで、ソフトウェアの複雑さをオブジェクト間のやり取り (メッセージ) にまで削減しました。
バリエーション
gotoステートメントのクラスには、さまざまな言語構成要素があります。
計算された GOTOそして割り当てられたGOTO
Fortranでは、計算式はGOTO式の値に基づいてリスト内の複数のラベルの1つにジャンプします。例は ですgoto (20,30,40) i。[44] C言語での同等の構文はswitch文であり、新しいFortranではSELECT CASE構文が推奨される代替手段です。[45] BASICには同じ目的を達成する文がありました'On GoTo'が、Visual Basicではこの構文はサポートされなくなりました。[46]
Fortran 95 より前のバージョンでは、Fortran には、整数変数に格納されている (割り当てられた) 文ラベル (行番号) に制御を移す、割り当て済み goto バリアントもありました。残念ながら、割り当てられていない整数変数にジャンプすることが可能であり、割り当て済み goto に関連するバグの主な原因でした。[ 47] Fortranassign文では、整数変数に割り当て可能なのは定数 (既存の) 行番号のみです。ただし、一部のコンパイラでは、その後この変数を誤って整数として扱い、たとえば増分してしまうことがあり、その結果、特定の時点で未指定の動作が発生します。次のコードは、行iが指定されていない場合gotoの動作を示しています。
goto i
200 をiに代入i = i + 1 iへ移動! 未指定の動作200 を( * , * )で書き込み"これは有効な行番号です"
いくつかの C コンパイラは、もともとgccによって導入された goto に関連する 2 つの非標準 C/C++ 拡張機能を実装しています。[48]void* GNU 拡張機能では、単項のプレフィックスラベル値演算子 を使って、現在の関数内のラベルのアドレスを として取得できます&&。goto 命令も拡張され、任意の式にジャンプできるようになりました。この C 拡張機能は、それをサポートする C コンパイラのドキュメントでは計算 gotovoid*と呼ばれています。そのセマンティクスは Fortran の割り当て goto のスーパーセットです。これは、任意のポインタ式を goto ターゲットとして使用できるのに対し、Fortran の割り当て goto では任意の式をジャンプ ターゲットとして使用できないためです。[49] C の標準 goto と同様に、GNU C 拡張機能では、計算 goto のターゲットを現在の関数内にのみ配置できます。現在の関数外へのジャンプを試みると、未指定の動作が発生します。[49]
BASICのいくつかの亜種は、GNU Cで使用されている意味での計算されたGOTOもサポートしています。つまり、ターゲットはリスト内の1つだけではなく、任意の行番号にすることができます。たとえば、MTS BASICでは、変数iGOTO i*1000の値(たとえば、選択されたメニューオプションを表す)の1000倍の番号の行にジャンプするように記述できます。[50]
PL/I ラベル変数は、計算または割り当てられた効果を実現しますGOTO。
変更
1985年のANSI COBOL標準まで、既存のGO TOの宛先を変更するために使用できるALTER文がありましたが、これは段落内に単独で存在しなければなりませんでした。[51]多態性を可能にするこの機能は頻繁に非難され、めったに使用されませんでした。[52]
Perl の GOTO
Perlには、goto従来のGOTO文とはまったく異なる文のバリエーションがあります。関数名を受け取り、ある関数呼び出しを別の関数呼び出しに置き換えることで制御を移します(末尾呼び出し)。新しい関数はGOTOに戻るのではなく、元の関数が呼び出された場所に戻ります。[53]
エミュレートされた GOTO
デフォルトではGOTOをサポートしていないプログラミング言語がいくつかあります。GOTOエミュレーションを使用すると、いくつかの制限はあるものの、これらのプログラミング言語でもGOTOを使用できます。Java、[54]、 JavaScript、[55]、PythonでGOTOをエミュレートできます。[56] [57]
PL/I ラベル変数
PL/I にはLABELというデータ型があり、これを使用して「割り当て goto」と「計算 goto」の両方を実装できます。PL/I では、現在のブロックから分岐できます。呼び出しプロシージャは、呼び出されたプロシージャに引数としてラベルを渡すことができ、呼び出されたプロシージャは分岐して終了できます。ラベル変数の値にはスタック フレームのアドレスが含まれ、ブロック外への goto はスタックをポップします。
/* これは、*/ と同等のものを実装します。 /* 割り当てられた goto */ where ラベルを宣言します。 where = どこか; どこへ行く; ... どこか: /* ステートメント */ ; ...
/* これは、*/ と同等のものを実装します。 /* 計算された goto */ (5)ラベルをどこに付けるかを宣言する。 inx を固定として宣言します。 ここで(1) = abc; ここで(2) = xyz; ... どこへでも行きます(inx); ... abc: /* ステートメント */ ; ... xyz: /* ステートメント */ ; ...
同等の結果を得るためのより簡単な方法は、LABEL型変数の明示的な宣言を必要としないラベル定数配列を使用することです。
/* これは、*/ と同等のものを実装します。 /* 計算された goto */ inx を固定として宣言します。 ... どこへでも行きます(inx); ... where(1): /* ステートメント */ ; ... where(2): /* ステートメント */ ; ...
MS/DOS ゴートゥー
DOSバッチ ファイルでは、Goto はコロンで始まるラベルに実行を指示します。Goto のターゲットは変数にすることができます。
@エコーオフSET D8str =
%date% SET D8dow = %D8str:~0,3 %
FOR %% D in ( Mon Wed Fri ) do if " %% D" == " %D8dow% " goto SHOP%%D
echo今日、%D8dow% はショッピングの日ではありません。
goto end
: SHOPMon
echoランチにピザを買う - 月曜日はピザの日。
終了へ
: SHOPWed
echoカルツォーネを買って家に持ち帰る - 今日は水曜日です。
終了へ
: SHOPFri
echo誰かがゼロカロリーの飲み物を欲しがっている場合に備えて、セルツァーを買ってください。
:終わり
言語サポート
多くの言語gotoでは 文をサポートしていますが、サポートしていない言語もたくさんあります。Java では は予約語ですgotoが、 は使用できません。ただし、コンパイルされたファイルは GOTO と LABEL を生成します。[58] Python は goto をサポートしていませんが、それを提供するジョークモジュールがいくつかあります。[56] [57] Seed7には goto 文はなく、break 文や continue 文などの隠れた goto も省略されています。[59] PHPでは、バージョン 5.3 までのネイティブサポートはありませんでした(その機能をエミュレートするライブラリは利用可能でした)。[60].classgoto
C#とVisual Basic .NET はどちらも をサポートしていますgoto。[61] [62]ただし、現在のスコープ外のラベルへのジャンプは許可されておらず、オブジェクトの破棄と finally 構造が尊重されるため、goto他のプログラミング言語の キーワードに比べて強力で危険性は大幅に低くなります。また、caseおよびdefaultステートメントはラベルになり、そのスコープは囲むswitch ステートメントです。goto caseまたはgoto default は、C# が許可しない暗黙的なフォールスルーの明示的な代替としてよく使用されます。
PL /Iプログラミング言語には、ブロック外転送のためにスタックをアンワインドし、ブロック外からブロック内への転送を許可しない GOTO ステートメントがあります。
他の言語では明示的なフォールスルーのための独自のキーワードを持っている場合があり、これはgotoこの特定の目的に限定された のバージョンと考えることができます。たとえば、Go ではfallthroughキーワードが使用され、暗黙的なフォールスルーはまったく許可されません。[63]一方、Perl 5 では、next明示的なフォールスルーに がデフォルトで使用されますが、モジュールのデフォルトの動作として暗黙的なフォールスルーを設定することもできます。
goto文を持つ言語のほとんどはそれをそのように呼んでいますが、コンピュータの初期の頃は他の名前が使われていました。例えば、MADではTRANSFER TO文が使われていました。[64] APLではgotoの代わりに右向きの矢印が使われています→。
C には goto があり、上で説明したようにさまざまな慣用句でよく使用されます。
Scheme などの関数型プログラミング言語では、通常、goto は使用されず、代わりに継続が使用されます。
参照
- 由来
- 制御フロー
- ゴスブ
- Switch ステートメント–多方向分岐(または条件付き goto)
- 非構造化プログラミング
注記
- ^ ワット&フィンドレー 2004年。
- ^ Kernighan & Ritchie 1988、p. 224、A9.6 ジャンプステートメント。
- ^ ダイクストラ 1968より。
- ^ GNU Pascal 開発チーム 2005、5.1 さまざまな Pascal プログラミングのヒント。
- ^ ラウデン&ランバート 2012年。
- ^ 「goto ステートメントを無制限に使用すると、プロセスの進行状況を記述するための意味のある座標セットを見つけることが非常に困難になります。... 現状の「go to」ステートメントはあまりにも原始的であり、プログラムを台無しにする原因になりすぎています。」
- ^ ルビン 1987.
- ^ ダイクストラ、エドガー W.「やや残念な書簡について (EWD-1009)」(PDF) 。EW ダイクストラ アーカイブ。テキサス大学オースティン校アメリカ歴史センター。(転写)(1987年5月)
- ^ クヌース 1974年。
- ^ Kernighan & Ritchie 1988、pp. 65–66、3.8 Gotoとラベル。
- ^ abc Vine 2007、262ページ。
- ^ ガイスラー 2011.
- ^ プラタ 2013年。
- ^ abcd サニ&ツメリク 1995.
- ^ abc アンドリュース2003年。
- ^ マコーネル 2004年。
- ^ レゲール 2013.
- ^ ロバーツ 1995年。
- ^ マイヤー 2009.
- ^ コゼン&ツェン 2008.
- ^ Stack Overflow の質問 2012。
- ^ ピッチフォード&タップ 2013.
- ^ ウィリアムズ 2013.
- ^ ANSI X3.9-1978。米国国家規格 - プログラミング言語 FORTRAN。米国国家規格協会。ISO 1539-1980 とも呼ばれ、非公式には FORTRAN 77 とも呼ばれる。
- ^ ISO/IEC 1539-1:1997。情報技術 – プログラミング言語 – Fortran – パート 1: 基本言語。非公式には Fortran 95 として知られています。この標準にはさらに 2 つのパートがあります。パート 1 は ANSI によって正式に採用されています。
- ^ バーンズ 2006年。
- ^ サミット1995。
- ^ Torvalds 2016より。
- ^ Cozens 2004より。
- ^ Javaチュートリアル2012。
- ^ ゴスリング&マクギルトン 1996年。
- ^ ブレンダー2002、960-965頁。
- ^ スピネリス 2003より 。
- ^ Allain 2019より。
- ^ ストロウストルップ 2012.
- ^ Hoad, Nathan (2022年7月28日). 「nathanhoad/godot_dialogue_manager」. GitHub . 2023年2月3日閲覧。
- ^ チズナル 2012年。
- ^ コンティエリ 2021年。
- ^ ウィルクス、ウィーラー、ギル 1951年。
- ^ ラムショー 1988年。
- ^ ジーダースレーベン 2006年。
- ^ スティール 1977より。
- ^ ケルシー、クリンガー、リース 1998より。
- ^は、 i が0 より小さい、0 と等しい、または 0 より大きい場合、プログラムがラベル 20、30、または 40 にジャンプすることを意味します。
- ^ Lahey Computer Systems、Inc 2004年。
- ^ マイクロソフト 2021.
- ^ ヴェーア 1997.
- ^ IBM Documentation 2021 の z/OS 2.5.0。
- ^ ab GCC、GNU コンパイラ コレクション 2021。
- ^ フロンチャック&ラバーズ、1974年、p. 226.
- ^ ALTER文はCOBOL 1985標準では廃止とみなされ、2002年に削除されました。COBOL > 自己変更コードを参照してください。
- ^ ヴァン・タッセル 2004年。
- ^ Perl 構文マニュアル 2021。
- ^ Java 2009 の GOTO。
- ^ セクストン 2012年。
- ^ Hindle 2004より。
- ^ ab Noack et al. 2015.
- ^ Gosling 他 (2005) C や C++ とは異なり、Java プログラミング言語には goto 文がありません。識別子文ラベルは、ラベル付き文内の任意の場所に出現する break (§14.15) または continue (§14.16) 文で使用されます。キーワード const および goto は、現在は使用されていませんが、予約されています。これにより、これらの C++ キーワードがプログラム内に誤って出現した場合に、Java コンパイラが適切なエラー メッセージを生成できるようになります。
- ^ Seed7プログラミング言語2021のマニュアル。
- ^ PHPマニュアル2021。
- ^ ワーグナー 2021.
- ^ 「GoTo ステートメント - Visual Basic | Microsoft Learn」。Microsoft Learn。2021年 9 月 15 日。2023 年9 月 25 日に閲覧。
- ^ Goプログラミング言語仕様2021。
- ^ Galler 1962、26–28、197、211。
参考文献
- Allain, Alex (2019). 「C で Goto を使用するタイミング」。2021 年 11 月 14 日閲覧。
- Andrews, Jeremy (2003 年 1 月 13 日). 「Linux: カーネル コード内で goto を使用する」。2005 年 11 月 28 日時点のオリジナルよりアーカイブ。2021年 11 月 14 日閲覧。
- バーンズ、ジョン(2006-06-30)。Ada でのプログラミング 2005。Addison Wesley。 p. 114-115。ISBN 978-0-321-34078-8。
- Brender, Ronald F. (2002). 「BLISS プログラミング言語: 歴史」(PDF) .ソフトウェア: 実践と経験. 32 (10): 955–981. doi :10.1002/spe.470. S2CID 45466625.
- Chisnall, David (2012). Objective-C フレーズブック. Addison-Wesley Professional. p. 249. ISBN 978-0-321-81375-6。
- コンティエーリ、マキシ(2021-11-02)。 「コードスメル100 - GoTo」。Maximiliano Contieri - ソフトウェア デザイン。2021年11月14日閲覧。
- Cozens, Simon (2004-04-16). 「goto の適切な使用法」。2011-03-19 にオリジナルからアーカイブ。
- Dijkstra, Edsger W. (1968 年 3 月)。「編集者への手紙:有害と考えられる声明へ」(PDF)。Communications of the ACM。11 ( 3): 147–148。doi : 10.1145 /362929.362947。S2CID 17469809。
- ダイクストラ、エドガー W.「やや残念な書簡について (EWD-1009) (PDF) 」。EW ダイクストラ アーカイブ。テキサス大学オースティン校アメリカ歴史センター。(書き起こし)
- Fronczak, Edward J.; Lubbers, Clark E. (1974 年 9 月)。MTS、ミシガン端末システム。ミシガン大学コンピューティング センター。UOM:39015034770076。
- Galler, Bernard A. (1962 年 1 月 1 日)。『コンピュータの言語』(PDF)。McGraw-Hill。
- GCC、GNU コンパイラ コレクション (2021)。「値としてのラベル - GNU コンパイラ コレクション (GCC) の使用」。Gcc.gnu.org。2021年 11 月 13 日閲覧。
- ガイスラー、サンドラ (2011)。『C オールインワン デスクリファレンス フォー ダミーズ』。ジョン ワイリー アンド サンズ。pp. 217–220。ISBN 978-1-118-05424-6。
- GNU Pascal 開発チーム(2005)。「GNU Pascal コーディング標準」。www.gnu-pascal.de。フリーソフトウェア財団。2021年 11 月 10 日閲覧。
- Gosling, James、McGilton, Henry (1996 年 5 月)。「Java 言語環境」。Oracle.com。2014年 7 月 22 日閲覧。
- Gosling, James; Joy, Bill ; Steele, Guy Lewis ; Bracha, Gilad (2005)。Java 言語仕様 (第 3 版)。Addison- Wesley。ISBN 0-321-24678-0. 2012年2月14日時点のオリジナルよりアーカイブ。2019年2月8日閲覧。
- GOTO for Java (2009 年 7 月 6 日)。「GOTO for Java」。steik。2012年 6 月 15 日時点のオリジナルよりアーカイブ。2012年4 月 28 日閲覧。
- Hindle, Richie (2004 年 4 月 1 日)。「Python の goto」。Entrian Solutions。英国ハートフォード: Entrian Solutions Ltd。2021年 11 月 10 日閲覧。
- Java チュートリアル (2012-02-28)。「分岐ステートメント (Java チュートリアル > Java 言語の学習 > 言語の基礎)」。Docs.oracle.com。2021年 11 月 10 日に取得。
- Kelsey , R.; Clinger, W.; Rees, J.; et al. (1998 年 8 月)。「アルゴリズム言語スキームに関する改訂版レポート」。高次および記号計算。11 (1): 7–105。doi : 10.1023 /A:1010051815785。S2CID 14069423。
- カーニハン、ブライアン・ウィルソン、リッチー、デニス・マカリスター(1988年)。Cプログラミング言語(第2版)。プレンティス・ホール。ISBN 978-0-13-308621-8。
- Knuth, Donald (1974). 「go to 文による構造化プログラミング」(PDF) . Computing Surveys . 6 (4): 261–301. CiteSeerX 10.1.1.103.6084 . doi :10.1145/356635.356640. S2CID 207630080. 2017-07-17 に オリジナル(PDF)からアーカイブ。2017-01-26に取得。
- Kozen, Dexter ; Tseng, Wei-Lung Dustin (2008 年 7 月)。「Böhm_Jacopini の定理は命題的に偽である」( PDF) 。Audebaud, Philippe、Paulin - Mohring, Christine (編) による。プログラム構築の数学。第 9 回国際会議 MPC 2008。コンピュータ サイエンスの講義ノート。第 5133 巻。フランス、マルセイユ。pp. 177_192。CiteSeerX 10.1.1.218.9241。doi : 10.1007 / 978-3-540-70594-9_11。ISBN 978-3-540-70593-2。
- Lahey Computer Systems, Inc (2004). 「Computed GOTO Statement (obsolescent)」. Lahey Computer Systems, Inc. 2016-05-26 にオリジナルからアーカイブ。2021-11-10に取得。
- Louden, Kenneth C.; Lambert, Kenneth A. (2012)。プログラミング言語: 原則と実践。Cengage Learning。p. 422。ISBN 978-1-111-52941-3。
- Seed7 プログラミング言語のマニュアル (2021)。「Seed7 の機能」。2021 年 11 月 10 日に取得。
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)
- McConnell, Steve (2004 年 12 月)。Code Complete: ソフトウェア構築の実践ハンドブック、第 2 版(第 2 版)。Microsoft Press。ISBN 978-0735619678。
- マイヤー、バートランド (2009)。『Touch of Class: オブジェクトとコントラクトを使ってプログラミングを学ぶ』。Springer Science & Business Media。189 ページ。ISBN 978-3-540-92144-8。
- Noack, Sebastian; Blank, Douglas; Grainger, Thomas; spacewander (2015 年 9 月 19 日)。「snoack/python-goto: バイトコードを書き換えて Python でgotoを有効にする関数デコレータ」。GitHub。2021年 11 月 10 日取得。
- Perl構文マニュアル (2021)。Goto (レポート) 。2021-11-14に取得。
- PHP マニュアル (2021)。「goto」。PHP。2021年 11 月 13 日閲覧。
- Pitchford, Mark; Tapp, Chris (2013-02-25). 「MISRA C:2012: 変更すべき十分な理由」. Electronic Design . 2014-07-22に取得。
- プラタ、スティーブン(2013)。Cプライマープラス。アディソンウェスレー。pp.287-289。ISBN 978-0-13-343238-1。
- Ramshaw, L. (1988). 「プログラム構造を維持しながら go to を削除する」Journal of the ACM . 35 (4): 893–920. doi : 10.1145/48014.48021 . S2CID 31001665.
- Regehr, John (2013 年 2 月 4 日)。「システム コードでの Goto の使用 - 学術界への組み込み」。blog.regehr.org。
- Roberts, Eric S. (1995 年 3 月). 「ループ終了と構造化プログラミング: 議論の再開」. ACM SIGCSE 速報. 27 (1): 268–272. doi : 10.1145/199691.199815 .
- Rubin, Frank (1987 年 3 月)。「"GOTO は有害であると考えられる" 有害であると考えられる」(PDF)。Communications of the ACM。30 ( 3): 195–196。doi :10.1145/214748.315722。S2CID 6853038。2009年 3月20 日の オリジナル( PDF)からアーカイブ。
- サーニ、サルタージ。ボブ・シメリック (1995)。 C. Silicon Press でのソフトウェア開発。 p. 135.ISBN 978-0-929306-16-2。
- Sexton, Alex (2012)。「The Summer of Goto | Official Home of Goto.js」。2015年10月25日時点のオリジナルよりアーカイブ。
{{cite web}}: CS1 メンテナンス: 不適切 URL (リンク)
- Siedersleben, Johannes (2006)。「エラーと例外 - 権利と義務」。Christophe Dony (編)。例外処理テクニックの高度なトピック。Springer Science & Business Media。p. 277。ISBN 978-3-540-37443-5。
- Spinellis, Diomidis (2003 年 5 月 27 日)。コード リーディング: オープン ソースの視点。Addison-Wesley Professional。pp. 43–44。ISBN 978-0-672-33370-5。
- Stack Overflow の質問 (2012-06-11)。「なぜ「continue」は MISRA C:2004 で C 違反とみなされるのか?」。Stack Overflow。2021-11-10に取得。
- Steele, Guy Lewis (1977 年 1 月)。「「高価なプロシージャ コール」という神話の打破、またはプロシージャ コールの実装が有害であると考えられる、または LAMBDA」。1977年 ACM '77 年次会議の議事録。pp. 153–162。doi : 10.1145 / 800179.810196。ISBN 9781450323086. S2CID 9807843。
- Stroustrup、Bjarne (2012-01-09)。 「1 日目基調講演 - Bjarne Stroustrup: C++11 スタイル | GoingNative 2012 | Channel 9」。 Channel9.msdn.com 。2021年11月10日閲覧。
- Summit, Steve (1995). 「comp.lang.c FAQ リスト · 質問 17.10」. C-faq.com . 2021 年 11 月 10 日閲覧。
- Go プログラミング言語仕様 (2021 年 7 月 26 日)。「Go プログラミング言語仕様 - Go プログラミング言語」。
- Torvalds, Linus (2016). 「Linux カーネル コーディング スタイル」。Linux カーネルのドキュメント。2021年 11 月 10 日閲覧。
- Van Tassel, Dennie (2004 年 7 月 8 日)。「プログラミング言語におけるラベルの歴史」 。2011年1 月 4 日閲覧。
- ヴァイン、マイケル A. (2007)。『初心者のための C プログラミング』。Cengage Learning。ISBN 978-1-59863-634-5。
- Wagner, Bill (2021)。「goto ステートメント - C# リファレンス」。docs.microsoft.com。2021年 11 月 9 日に取得。
- Watt, David Anthony; Findlay, William (2004)。プログラミング言語設計コンセプト。John Wiley & Sons。p. 228。ISBN 978-0-470-85320-7。
- Wehr, Jason (1997). 「Go to (assigned)」www.personal.psu.edu/jhm/f90/201.html . 2021年11月13日閲覧。
- Wilkes, Maurice V. ; Wheeler, David J. ; Gill, Stanley (1951)。電子デジタルコンピュータ用のプログラムの作成。Addison -Wesley。
(著者の頭文字をとってWWGと呼ばれることもある)は、コンピュータプログラミングに関する最初の本でした。
- Williams, Tom (2013年3月). 「C言語のチェックルール: 信頼性と安全性の確保」. RTC Magazine . 22 (3): 12–15 . 2021年11月10日閲覧。
- IBM ドキュメントの z/OS 2.5.0 (2021)。「計算型 goto ステートメント (IBM 拡張)」。IBM 。2021-11-13に取得。
このドキュメントでは、C および C++ プログラミング言語の構文、セマンティクス、および IBM z/OS XL C/C++ 実装について説明します。汎用 C または C++ 標準リファレンスについては、cppreference.com を参照してください。
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)
