有沒有辦法來翻譯機械陳述goto
到if
,switch
,while
,break
和continue
報表等,或函數調用,對象,什麼?翻譯goto語句來如果交換機,同時,破發等
回答
雖然這不是一個好主意,但可以使用循環和開關。在下面的例子中,goto變量決定什麼標籤(0,1,2或默認值)在轉爲繼續時轉到。
int goTo=0;
while(true){
switch(goTo){
case 0:
doSomething();
goTo = 1;
continue;
case 1:
doSomethingElse();
goTo = 2;
continue;
case 2:
doSOmethingDifferent();
goTo = 0;
continue;
default:
return;
}
}
考慮到這goto
的可以創建基於其地方之間的跳躍,這是非常值得懷疑的複雜性。
Java語言不支持將goto模擬到任意位置所需的功能(即使在相同的方法中也不行)。您可以使用您提到的構造實現goto
的一些簡單用途,但不能實現所有可能的goto
這種方式。 (*)
在字節代碼級別上,您可能實現goto
(至少在方法中),但是在這種情況下,該字節代碼無法映射回有效的Java代碼。
至於goto
s表示交叉法或對象邊界:這絕對是一個很大的禁忌在JVM上水平。整個Java安全模型取決於代碼可驗證的事實,因此只有定義的入口點(也稱爲「方法」)。 (*)免責聲明:這裏假定您不想完全重構方法來實現goto的效果,也可能會調用代碼重複和混淆方法的「正常」流。既然你可以在Java方法實現圖靈機你絕對可以實現「轉到」在Java方法;-)
是,使用你所提到的方法的組合......這是可能的(一切皆有可能真的,只是想清楚如何正確地做到這一點是屁股疼痛)。
請記住,goto
可能會導致極其複雜的執行路徑...因此可能會導致在生成的任何內容中出現難看的大量重複代碼。
它不需要*重複,必要時只需要大量的樣板。見下文。 – 2009-09-28 14:38:52
在實踐中,我想任何給定的例子goto
可以被翻譯成別的東西,特別是如果方法提取是允許的轉型。這是一個抽象的問題,還是你真的有這麼多的goto,你真的需要一個實際的工具?也許java代碼本身是從某種機器翻譯過來的?
我習慣把一個實際goto
到每一個項目我寫只是爲了激怒較真。
我認爲這將是值得在這裏分享。有一天,我在Reddit上看到了這一點,它是通過自定義類加載器轉到任意行號(在相同的.java文件中)的實現。這是一段有趣的代碼。 http://steike.com/tmp/goto.zip。我對此不以爲然。
編輯: 對於那些誰是好奇,但不想下載zip並運行它,以下文件:
public class GotoDemo {
public static void main(String[] args) {
int i = 5;
System.out.println(i);
i = i - 1;
if (i >= 0) {
GotoFactory.getSharedInstance().getGoto().go(4);
}
try {
System.out.print("Hell");
if (Math.random() < 2) throw new Exception();
System.out.println("World!");
} catch (Exception e) {
System.out.print("o ");
GotoFactory.getSharedInstance().getGoto().go(13);
}
}
}
它會打印:
3 2 1 0 Hello World!
當然:(爲了清晰起見稍微縮寫)
int goTo = 0; boolean done = false;
while (!done) {
switch (goTo) {
default:
case 1: System.out.println("We're at line 1!"); goTo = 2; break;
case 2: System.out.println("We're going to line 4!"); goTo = 4; break;
case 3: System.out.println("We're at line 3 and we're done!"); done = true; break;
case 4: System.out.println("We're at 4, going to 2! Screw you, line 3!"); goTo = 2; break;
}
}
爲什麼你會想要做這樣的事我是無法理解,但是,嘿,你可以 ...
這與Marius的回答幾乎完全一致。正如那裏指出的那樣,這是一個有限狀態機(即將「goTo」更改爲「狀態」)。FSM沒什麼問題,但將它用作goto解決方法會很奇怪。 – Kip 2009-09-28 14:47:33
是的,他在我編輯窗口時發佈了......多線程的危險...... 這很奇怪。但它回答了OP的要求。 – 2009-09-28 17:16:08
- 1. 使用goto語句從如果到時
- 2. 如果交換機CASE語句
- 3. Netezza GOTO語句
- 4. sql-goto語句
- 5. 如果語句出現破
- 6. 如何在交換機-case語句
- 7. 無法翻譯SQL語句
- 8. 實現goto語句
- 9. 替換Swift中的goto語句
- 10. PHP如果/ ELSE或交換機/ Case語句
- 11. 如何將find_by_sql語句翻譯成named_scope?
- 12. 如何翻譯SQL語句的LINQ
- 13. Java:如果語句不等於打破程序
- 14. 切換翻譯的術語
- 15. perl的堆疊交換機case語句
- 16. 堆疊交換機語句C++
- 17. 即將使用goto語句
- 18. C#.NET中的GOTO語句
- 19. goto語句vs遞歸
- 20. 使用現有的人工翻譯來幫助機器翻譯成新語言
- 21. Django的翻譯:如何翻譯語言
- 22. 如果語句可能似乎翻轉
- 23. 如果語句語法等於
- 24. 交換if語句
- 25. 如果else語句,while循環破碎
- 26. Groovy中的GOTO語句如何?
- 27. 如何在Android中使用goto語句
- 28. 如何正確使用goto語句
- 29. 即時語言翻譯器
- 30. 豬拉丁語翻譯(句子)
到底爲什麼你需要知道這一點?這只是一個思想實驗,或者你有什麼真正的理由? – Kip 2009-09-28 13:59:24
模擬一個goto應該是不必要的 - 在極少數情況下,使用goto不是一個糟糕設計的症狀。 – 2009-09-28 14:02:31