問題タブ [goto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 役に立たないgotoを削除するJavaバイトコードオプティマイザーはありますか?
問題:8000バイトを超えるJavaバイトコードにコンパイルするメソッドがあります。HotSpotには、8000バイトを超えるメソッドに対してJITが起動しないようにする魔法の制限があります。(はい、巨大なメソッドを持つことは合理的です。これはトークナイザーループです。)メソッドはライブラリ内にあり、ライブラリのユーザーが魔法の制限を無効にするようにHotSpotを構成する必要はありません。
観察:バイトコードを逆コンパイルすると、EclipseJavaコンパイラが多くの無意味なgotoを生成することがわかります。(javacはさらに悪いです。)つまり、ジャンプからのみ到達可能なgotoがあります。明らかに、後藤にジャンプするジャンプは、代わりに後藤がジャンプする場所に直接ジャンプする必要があり、後藤は削除する必要があります。
質問:無意味なジャンプチェーンをフラット化して不要なgotoを削除するJava 5クラスファイル用のバイトコードオプティマイザーはありますか?
編集:私は次のようなパターンを意味します:
明らかに、2番目のgotoに到達するには、8701にジャンプする必要があります。これは、0に直接ジャンプする場合もあります。
2回目の調査では、この疑わしいパターンがより一般的です。
明らかに、コンパイラーが「等しくない」比較を「等しい」比較に逆にし、8704にジャンプして、gotoを削除するようにしたい場合。
c - エラー処理に C switch ステートメントを使用する
実際の作業を行う前にエラーをチェックする次の C コンストラクトを検討してください。
これを読みやすいと思いますか?goto
使用または積み重ねた代替案はif()
より良いでしょうか?
string - これを書き直して、速度や読みやすさを損なうことなく goto を削除するにはどうすればよいでしょうか?
私はこれを書きました。はい、私はそれがVB6であることを知っています。はい、それは製品コードであり、goto を使用していることはわかっています。私は怠け者で邪悪な獣です...
だから私に(そして私たちの残りの人たちに)それがどのように書かれるべきかを見せてください
ちなみに、これは文字列を配列に分割します。文字列内の要素は引用符で囲むことができます。
c++ - goto を使用して 2 つのループから抜け出す正当な方法はありますか?
Project Eulerの問題 9 を解決しています。私のソリューションでは、「goto」ステートメントを使用して 2 つの for ループから抜け出します。問題は次のとおりです。
ピタゴラスのトリプレットは、3 つの自然数 abc のセットです。
a^2 + b^2 = c^2
たとえば、3^2 + 4^2 = 9 + 16 = 25 = 52 です。
a + b + c = 1000 であるピタゴラスの 3 連符が 1 つだけ存在します。積 abc を見つけます。
私の解決策はC ++にあります:
「goto」ステートメントは C++ プログラマーの間ではあまり一般的ではないため、これが「goto」の合理的な使用法と見なされるかどうかを知りたいです。または、「goto」を必要としない問題のより良い解決策がある場合。これは、単に「goto」を回避するソリューションではなく、アルゴリズムを改善する方法で「goto」を回避するソリューションを意味します。
delphi - ブロックから飛び出すときにスタックベースのコードをクリーンアップする安全な方法はありますか?
私はPascalScriptスクリプトエンジンのIssue14に取り組んでいます。この場合、Gotoコマンドを使用してCaseブロックからジャンプすると、完全に有効な(醜い場合)Object Pascalコードであっても、コンパイラエラーが発生します。
コンパイラのProcessCaseルーチンがHasInvalidJumpsを呼び出していることがわかります。これは、Caseブロックの外側につながるすべてのGotoをスキャンし、見つかった場合はコンパイラエラーを返します。そのチェックアウトについてコメントすると、コンパイルは問題なく実行されますが、実行時にクラッシュすることになります。バイトコードを逆アセンブルすると、その理由がわかります。元のスクリプトコードで注釈を付けました。
「gotoL1;」103のステートメントは、113と114のクリーンアップポップをスキップし、スタックを無効な状態のままにします。
Delphiは計算スタックを使用しないため、これに問題はありません。ただし、PascalScriptはそれほど幸運ではありません。このパターンは、PascalScriptに変換した制御構造がほとんどなく、サポートできる必要がある、はるかに単純なシステムの一部のレガシースクリプトで非常に一般的であるため、これを機能させる方法が必要です。
スタックを適切にクリーンアップするためにcodegenにパッチを適用する方法を知っている人はいますか?
c - while(1)..gotoの代わりにbreak
Cプログラムで次のコードを見つけました。
ここでwhile(1)
は、「finally」のローカルエミュレーションとして使用されます。sを使用してこれを書くこともできますgoto
:
gotoソリューションは通常のイディオムだと思いました。私はカーネルソースでこのイディオムのいくつかの出現を見てきました、そしてそれはDiomidisSpinellisの「CodeReading」本でも言及されています。
私の質問は:どの解決策がより良いですか?while(1)
ソリューションを使用する特別な理由はありますか?
質問943826は私の質問に答えません。
matlab - MATLAB のジャンプ コマンド
MATLAB の m-file エディターを使用していて、ある行から別の行にジャンプする必要があります。For
...の中からジャンプする必要がある場合end
、通常の「while」手法は使用できません。C
のように、行から別の行にジャンプする方法はありますか?goto
c# - C#パズル:到達不能なラベルを指す到達可能なgoto
この投稿からのEricLippertのコメントは次のとおりです。
答えがわかったので、このパズルを解くことができます。到達不能なラベルに到達する到達可能なgotoがあるプログラムを作成してください。– EricLippert7月17日7:17
到達不能なラベルを指す到達可能なgotoを持つコードを作成できません。それも可能ですか?はいの場合、C#コードはどのようになりますか?
注:「goto」がどのように悪いかなどについては議論しないでください。これは理論的な演習です。