Article View: pl.comp.lang.funkcyjne
Article #24Przepełnienie stosu w Ocamlu.
From: Arek Paterek
Date: Mon, 02 Dec 2002 16:59
Date: Mon, 02 Dec 2002 16:59
44 lines
2286 bytes
2286 bytes
Witam,
napisałem prosty programik:
let rec f a =
if a == 1 then
1
else
1 + f (a - 1)
in
f 100000
Skompiluję do bajtkodu:
$ ocamlc -g test.ml -o test
$ ./test
Fatal error: exception Stack_overflow
To samo jest w debuggerze, więc jak rekurencja jest za głęboka,
debugowanie odpada.
Jeśli wywołam f 10000000, stos przepełnia mi się w kodzie natywnym.
$ ocamlopt test.ml
$ ./a.out
Fatal error: exception Stack_overflow
Oczywiście można zapisać rekurencję w postaci ogonowej i pewnie
wtedy stos nie będzie używany, ale co robić w większych programach?
Nie zawsze chcę/potrafię zapisać rekurencję ogonową, nie zawsze
łatwo jest mi przewidzieć głębokość stosu. A funkcji rekurencyjnych
używa się w językach funkcyjnych często-gęsto.
Można oczywiście zapisać taką funkcję imperatywnie w Ocamlu,
ale nie o to chodzi (chodzi o to, że wiadomo o co chodzi).
W Ocamlu jest to problem (i w innych językach funkcyjnych pewnie też),
w językach imperatywnych problemu nie ma (jest w mniejszej skali,
bo w nich się nie używa rekurencji do wszystkiego).
Wydaje mi się, że skoro programowanie funkcyjne jest takie dobre i piękne,
funkcje rekurencyjne są lepsze od lamerskich pętli,
a Ocaml jest pięknym językiem i ma najlepszy kompilator,
to powinien poradzić sobie z przepełnieniem stosu przynajmniej
w swoim kompilatorze bajtkodowym.
--
Arek Paterek
Technical Details
Message-ID:
<asg3hf$25q$1@kenny.mimuw.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!not-for-mail
From: Arek Paterek <a.paterek@students.nospam.mimuw.edu.pl>
Newsgroups: pl.comp.lang.funkcyjne
Subject: Przepełnienie stosu w Ocamlu.
Date: Mon, 2 Dec 2002 16:59:27 +0000 (UTC)
Organization: MIMUW
Lines: 44
Sender: Arkadiusz Paterek <ap181283@zodiac.mimuw.edu.pl>
Message-ID: <asg3hf$25q$1@kenny.mimuw.edu.pl>
NNTP-Posting-Host: zodiac.mimuw.edu.pl
Mime-Version: 1.0
X-Trace: kenny.mimuw.edu.pl 1038848367 2234 10.1.1.1 (2 Dec 2002 16:59:27 GMT)
X-Complaints-To: abuse@news.mimuw.edu.pl
NNTP-Posting-Date: Mon, 2 Dec 2002 16:59:27 +0000 (UTC)
User-Agent: tin/1.5.10-20011117 ("Darkcell") (UNIX) (Linux/2.4.19 (i686))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit