2015-04-06 56 views
1

這個問題有部分答案herehere,這似乎隱含地暗示javascript和python導致'無限遞歸'。在編程中檢測尾遞歸langs

背景

最近我一直在尾遞歸這在我目前的理解是,編程風格(*一般)持有的可讀性的利益等同迭代求解性能的好處涉足 - 基本上使它成爲兩個世界中最好的。

例子

我已經注意到,如果一個人做在.NET或Java:

while(true) {...} 

最終的Windows將彈出一個對話框,允許用戶機器來改變這種說可執行文件的狀態:

The famous windows not responding dialog box

問題

由於尾遞歸(*幾乎)沒有在這裏對付計算器例外,我是假設不正確的是Java或C#要麼:

  1. 觸發「富。 exe文件沒有響應在無窮遞歸」對話框
  2. 結果

此外,我的假設,這種運行‘例外’將通過該語言的翻譯處理是否正確?

+2

Java將拋出一個'StackOverflowError' 。在Java中,尾遞歸併不是特例。 – Radiodef 2015-04-06 02:10:01

回答

3

由於尾遞歸(*幾乎)沒有在這裏對付計算器例外,我是不正確的假設,Java或C#要麼...

這包含一個不正確的假設。

尾遞歸只是源代碼中的一種模式。

它是尾遞歸優化將遞歸代碼變成迭代...在幕後的代碼。優化需要由編譯器執行。

的Java編譯(字節碼和JIT)在目前這一代的熱點實現做尾遞歸優化。這與安全相關的原因。


但忽略了:

我是假設不正確的是Java或C#要麼:

  1. 觸發 「foo.exe的沒有響應」 對話框
  2. 結果在無限遞歸

還有第三種情況。它可能會進入無限循環,而不會觸發「無響應」警報。我的理解是,只有當操作系統檢測到應用程序在特定的秒數內沒有「消費」或「響應」未決的GUI事件時,纔會顯示該警報。

我希望在下列情況下,第三種情況:

  • 測試應用程序有沒有GUI
  • 測試應用程序並不運行在事件線程
  • 用戶在遞歸測試並不試圖以任何方式

此外與測試應用程序GUI交互,我假設這是正確的運行時「異常」將由語言的解釋器處理?

如果Java中存在「堆棧溢出」事件,那麼JVM運行時會將它變成StackOverflowError異常。無論是解釋者還是「別的東西」,這都取決於......代碼是否在當時被解釋。

產生的異常是由應用程序本身「處理」...或忽略引發的。


1 - 要學究,你可以在源代碼級進行手工優化,但隨後你的源代碼是不是遞歸...