Elég sokat készültem, az átalakítás viszont rendkívül egyszerű volt. Sok olvastam a garbage collectorokról, a Boehm GC oldaláról elindulva rengeteg hasznos leírás elérhető. A Boehm GC (teljesebb nevén: Boehm-Demers-Weiser garbage collector) egy mark-and-sweep algoritmust használó konzervatív garbage collector C-hez és C++-hoz. Noha érdekes téma ez a garbage collection, nekem most nem az az elsődleges érdeklődésem, hogy garbage collectort implementáljak, ezért kézenfekvő volt, hogy a Boehm GC-t integráljam, lévén az interpreter host nyelve a C nyelv. Itt gyakorlatilag annyit kellett átalakítani, hogy:
- A fájl elejére beírni a
#include <gc.h>
sort.
- A main() elejére berakni egy GC_INIT() hívást. (Bár ez Linux/x86-on opcionális.)
- Szövegszerűen lecserélni a malloc hívásokat GC_MALLOC-ra.
- Fordításnál megadni az -lgc kapcsolót.
- Amikor sztring számára foglalok le területet (a szimbólumok miatt kell), akkor a GC_MALLOC_ATOMIC-ot használom, ez jelzi a konzervatív GC-nek, hogy azon a területen ne keressen pointereket, mert nincsenek.
A tail-call optimizationhöz gyakorlatilag nem kellett a forráskódot módosítanom. Átolvastam a kódot és megállapítottam, hogy az eval-apply "ciklus" (technikailag kölcsös rekurzió) sikeresen delegálja a proto-Lisp nyelvem tail-calljait a C fordítónak. Eszerint mind a GCC, mint a Microsoft C/C++ compilere képes tail-call optimizationre. GCC-nél -foptimize-sibling-calls opció kapcsolja be ezt a feature-t, ami egyébként része az -O2 és az -O3 halmaznak. Így gyakorlatilag annyi dolgom volt csak, hogy fordításkor meg kell adni az "-O1 -foptimize-sibling-calls" vagy az "-O2" opciók valamelyikét. Itt látható pár teszt a tail-call optimizationről.
Végezetül jöjjön a teszteléshez használt ominózus végtelen "ciklus". A program rendkívül egyszerű, egy booleant toszogat oda-vissza, igazról hamisra és hamisról igazva, az idők végezetéig.
((lambda (begin invert)
(begin
(set! invert
(lambda (b) (invert (not b))))
(invert #t)))
(lambda (one two) two)
(quote unbound))
A kód úgy működik, ahogy kell: htop szépen kimutatja, ahogy 100%-on pörget egy magot; pmap-pal látható, hogy a memóriafogyasztás nem növekszik; továbbá gdb-vel kiírható a stacktrace, ami sekély.
- utpKabel blogja
- A hozzászóláshoz be kell jelentkezni
- 1174 megtekintés
Hozzászólások
jo ez az original content :-)
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Vegre valami erdekes es jo. Meg tobbet!
--------------------------------------
Unix isn't dead. It just smells funny.
- A hozzászóláshoz be kell jelentkezni