8

Erlangで最適化された末尾呼び出しではない関数でスタックオーバーフローを取得することは可能ですか? たとえば、このような関数があるとします

sum_list([],Acc) ->
   Acc;
sum_list([Head|Tail],Acc) ->
   Head + sum_list(Tail, Acc).

十分な大きさのリストが渡された場合、最終的にスタック スペースが不足してクラッシュするように思われます。私はこれを次のようにテストしてみました:

> L = lists:seq(1, 10000000).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 23,24,25,26,27,28,29|...]
> sum_test:sum_list(L, 0).
50000005000000

しかし、それは決してクラッシュしません!100,000,000 個の整数のリストで試してみましたが、完了するまでに時間がかかりましたが、クラッシュすることはありませんでした! 質問:

  1. これを正しくテストしていますか?
  2. もしそうなら、スタックオーバーフローを生成できないのはなぜですか?
  3. Erlang は、スタックオーバーフローの発生を防止する何かを行っていますか?
4

1 に答える 1