ercizMedlem sedan maj 20011 880 inlägg
Fick en liten fundering om programmeringsspråk. Det kommer ju väldigt många nu, och nästan alla kommer med en egen Runtime Environment, RE (Virtuell Maskin) och nästan alla använder Garbage Collection, GC.
Går det att implementera GC utan en RE? Isåfall finns det nåt språk som användet det? Dvs kör native utan VM men använder GC.
nitro2k01Medlem sedan aug. 20037 630 inlägg
ercizMedlem sedan maj 20011 880 inlägg
Ah, se där! Men jag har lite svårt att förstå hur det fungerar. Om det inte finns nån runtime environment, vad är det då som sköter själva skräpsamlingen? Är det kompilatorn som lägger in kod för det eller hur fungerar det?
spangoMedlem sedan juni 20006 147 inlägg
Det är skillnad på vitrual machines och runtimes. Även native-program har ganska ofta runtime-tjänster som de använder, så även D (det står bl.a. i artikeln som nitro länkade till). Om inte annat så i alla fall operativsystemet.
Hursom, i princip det enda som behövs för att ha en GC är att man har (a) en minnesallokeringsfunktion som är lite mer sofistikerad än gamla C-malloc, och (b) någonting som periodiskt frigör minne (kan vara en tråd som startas av main-funktionen, eller så kan det triggas av att minnet börjar ta slut när man försöker allokera, eller både och, etc). Är man beredd att ha bara halvautomatisk minneshantering kan man komma undan med ännu mindre mha referensräkning (som bland annat Objective-C gör, om jag inte misstar mig, och som man gör med "smarta pekare" i C++).
Minneshanteringskoden länkas sen antingen in direkt i programmet eller så ligger den i ett externt bibliotek (.dll, .so) som distribueras med det kompilerade programmet. Skillnaden blir alltså egentligen mer i huruvida runtimen kör programmet (som t.ex. i fallet Java) eller om programmet kör runtimen (vilket normalt är fallet när man gör körbara exe-filer). Fast det är också en ganska meningslös distinktion eftersom man kan skriva exe-wrappers som startar ens javaprogram åt en :)