Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
×Ô¼º¶¯ÊÖдGC
 
×÷Õß Robert Nystrom£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-06-30
 

µ±ÊÂÇé¶àµÃÎÒ´­²»¹ýÆøÀ´µÄʱºò£¬ÎÒ»á³öÏÖÒ»ÖÖÒì³£µÄ·´Ó¦£¬¾ÍÊÇÕÒµã±ðµÄÊÂ×ö£¬¾ÍÄܰÚÍÑ·³ÄÕÁË¡£Í¨³£ÎÒ»á×Ô¼ºÐ´Ò»Ð©¶ÀÁ¢µÄС³ÌÐò¡£

ÓÐÒ»ÌìÔçÉÏ£¬ÎÒÕýÔÚдÊ飬¹¤×÷£¬»¹ÒªÎªStrang Loop×¼±¸µÄ·ÖÏí£¬ÕâЩ¶«Î÷ÈÃÎҸе½¿ì±ÀÀ£ÁË£¬Í»È»¼äÎÒÏëµ½£¬¡°ÎÒҪдһ¸öÀ¬»ø»ØÊÕ³ÌÐò¡±¡£

Êǵģ¬ÎÒÖªµÀÕâÌýÆðÀ´Óеã·è¿ñ¡£²»¹ýÄã¿ÉÒÔ°ÑÎÒÕâ¸öÉñ¾­µÄÏë·¨µ±³ÉÊÇÒ»Ìñà³ÌÓïÑÔ»ù´¡µÄÃâ·Ñ½Ì³Ì¡£Í¨¹ý°ÙÀ´ÐÐÆÕͨµÄC´úÂ룬ÎÒʵÏÖÁËÒ»¸ö±ê¼Çɾ³ýµÄÊÕ¼¯Æ÷£¬Äã¶®µÄ£¬ËüµÄÈ·ÄÜ»ØÊÕÄÚ´æ¡£

ÔÚ³ÌÐò¿ª·¢ÁìÓò£¬À¬»ø»ØÊÕ¾ÍÏñһƬöèÓã³öûµÄË®Óò£¬²»¹ýÔÚ±¾ÎÄÖУ¬ÕâÖ»ÊǸö¶ùͯ³Ø£¬Äã¿ÉÒÔËæÒâÍæË£¡££¨Ëµ²»¶¨»¹ÊÇ»áÓÐöèÓ㣬²»¹ýÖÁÉÙˮdz¶àÁ˲»ÊÇ£¿£©

ÉÙÓã¬ÖØÓã¬Ñ­»·ÓÃ

À¬»ø»ØÊÕµÄ˼ÏëÔ´ÓÚ±à³ÌÓïÑÔËÆºõÐèÒªÎÞÏÞµÄÄÚ´æ¡£¿ª·¢ÈËÔ±¿ÉÒÔÒ»Ö±Ò»Ö±µÄ·ÖÅäÄڴ棬Ëü¾ÍÏñÊÇħ·¨Ò»°ã£¬ÓÀÔ¶²»»áʧ°Ü¡£

µ±È»ÁË£¬»úÆ÷µÄÄÚ´æ²»¿ÉÄÜÊÇÎÞÏ޵ġ£ËùÒÔ½â¾ö°ì·¨¾ÍÊÇ£¬µ±³ÌÐòÐèÒª·ÖÅäÄÚ´æ²¢ÇÒÒâʶµ½ÄÚ´æÒѾ­²»×ãÁË£¬Ëü¿ªÊ¼½øÐÐÀ¬»ø»ØÊÕ¡£

ÔÚÕâÀ¡°À¬»ø¡±ÊÇÖ¸ÄÇЩÒѾ­·ÖÅä³öÈ¥£¬µ«ÏÖÔÚ²»ÔÙʹÓõÄÄڴ档ΪÁËÈÃÄÚ´æ¿´ÆðÀ´ÊÇȡ֮²»¾¡µÄ£¬ÓïÑÔ±¾ÉíÓ¦µ±Ê®·Ö½÷É÷µØ¶¨ÒåʲôÊÇ¡°²»ÔÙʹÓõġ±¡£²»È»µÄ»°µ±ÄãµÄ³ÌÐòÕýÒª·ÃÎÊÄÇЩ¶ÔÏóµÄʱºò£¬ÄãÈ´Òª»ØÊÕËüÃÇ£¬Õâ¿É²»ÊÇÄÖ×ÅÍæµÄ¡£

ΪÁËÄܽøÐÐÀ¬»ø»ØÊÕ£¬ÓïÑÔ±¾ÉíµÃÈ·¶¨³ÌÐòÎÞ·¨ÔÙʹÓÃÕâЩ¶ÔÏó¡£Èç¹ûÄò»µ½¶ÔÏóµÄÒýÓ㬵±È»Ò²¾ÍÎÞ·¨Ê¹ÓÃËüÃÇÁË¡£ÄÇô¶¨ÒåʲôÊÇ¡°ÔÚʹÓÃÖеġ±¾ÍºÜ¼òµ¥ÁË£º

1. Èç¹û¶ÔÏó±»×÷ÓÃÓòÖеıäÁ¿ÒýÓõϰ£¬ÄÇôËü¾ÍÊÇÔÚʹÓÃÖеģ»

2. Èç¹û¶ÔÏó±»ÔÚʹÓÃÖеĶÔÏóÒýÓõϰ£¬ÄÇôËüÒ²ÊÇÔÚʹÓÃÖеġ£

µÚ¶þÌõ¹æÔòÊǵݹéµÄ¡£Èç¹û¶ÔÏóA±»Ò»¸ö±äÁ¿ÒýÓ㬲¢ÇÒËüÓиö×Ö¶ÎÒýÓÃÁ˶ÔÏóB£¬ÄÇôBÒ²ÊÇÕýÔÚʹÓÃÖеģ¬ÒòΪͨ¹ýAÄãÄܶÔËü½øÐзÃÎÊ¡£

×îºó¾ÍÊÇÒ»Õſɴï¶ÔÏóµÄͼÁË¡ª¡ª¡ª¡ªÒÔÒ»¸ö±äÁ¿ÎªÆðµã£¬ÄãÄܹ»±éÀúµ½µÄËùÓжÔÏó¡£²»ÔÚÕâÕſɴï¶ÔÏóͼÀïµÄ¶ÔÏó¶Ô³ÌÐòÀ´Ëµ¶¼ÊÇûÓõģ¬ÄÇôËüÕ¼ÓеÄÄÚ´æ¾Í¿ÉÒÔ»ØÊÕÁË¡£

±ê¼Ç-Çå³ý

²éÕÒ¼°»ØÊÕÎÞÓöÔÏóµÄ·½·¨ÓкܶàÖÖ£¬×î¼òµ¥Ò²ÊÇ×îÔçµÄÒ»ÖÖ·½·¨£¬½Ð¡°±ê¼Ç-Çå³ý·¨¡±¡£ËüÊÇÓÉJohn McCathy·¢Ã÷µÄ£¬Ëûͬʱ»¹·¢Ã÷ÁËLispºÍ´óºú×Ó£¨Òë×¢:Çë×Ô¾õËÑË÷ÏÂËûµÄÕÕÆ¬£©£¬Òò´ËÄãÓÃËüÀ´ÊµÏֵϰ¾ÍÏñÊǺÍÔ¶¹Å´óÉñ½»Á÷Ò»°ã£¬²»¹ýÏ£ÍûÄã¿É±ð¸ã³ÉͨÁéɶµÄ£¬²»È»ÎÒÅÂÄã»áÉñÖ¾²»Ç壬³öÏֻþõ¡£

ÕâºÍÎÒÃǶ¨Òå¿É´ïÐԵĹý³Ì¼òÖ±ÊÇÒ»ÑùµÄ£º

1. ´Ó¸ù¶ÔÏó¿ªÊ¼£¬±éÀúÕû¸ö¶ÔÏóͼ¡£Ã¿·ÃÎÊÒ»¸ö¶ÔÏ󣬾ͰÑÒ»¸ö±ê¼ÇλÉè³Étrue¡£

2. Ò»µ©Íê³É±éÀú£¬ÕÒ³öËùÓÐûÓб»±ê¼Ç¹ýµÄ¶ÔÏ󣬲¢Çå³ýµôËüÃÇ¡£

ÕâÑù¾ÍOKÁË¡£Äã¿Ï¶¨¾õµÃÕâЩÄãÒ²ÄÜÏëµ½°É£¿Èç¹ûÄãÔçµãÏëµ½£¬ÄãдµÄÕâ¸öÂÛÎÄ¿ÉÄܾͱ»ÎÞÊýÈËÒýÓÃÁË¡£ÒªÖªµÀ£¬ÏëÔÚ¼ÆËã»ú½ç»ì³öµãÃûÌã¬Äã¸ù±¾²»ÐèÒªÓÐÊ²Ã´ÌØ±ðÌì²ÅµÄÏë·¨£¬´ÀÖ÷ÒâÒ²ÐУ¬Ö»ÒªÄãÊǵÚÒ»¸öÌá³öÀ´µÄ¡£

Ò»×é¶ÔÏó

ÔÚÎÒÃÇ¿ªÊ¼ÊµÏÖÕâÁ½µãǰ£¬ÈÃÎÒÃÇÏÈ×öһЩ׼±¸¹¤×÷¡£ÎÒÃDz¢²»ÊÇÒªÕæÕýȥʵÏÖÒ»ÃÅÓïÑԵĽâÊÍÆ÷¡ª¡ªÃ»ÓнâÎöÆ÷£¬×Ö½ÚÂë»òÕßÈκÎÕâÐ©ÆÆÍæÒâ¶ù¡ª¡ª²»¹ýÎÒÃÇȷʵÐèҪдһµã´úÂ룬Éú³ÉһЩÀ¬»ø£¬ÕâÑùÎÒÃDzÅÓж«Î÷¿É»ØÊÕ¡£

¼ÙÉèÎÒÃÇÕýÔÚдһÃÅСÓïÑԵĽâÊÍÆ÷¡£ËüÊǶ¯Ì¬ÀàÐ͵ģ¬ÓÐÁ½ÖÖ¶ÔÏó£ºintÒÔ¼°pair¡£ÏÂÃæÊÇÒ»¸ö¶¨Òå¶ÔÏóÀàÐ͵Äö¾Ù£º

typedef enum {
OBJ_INT,
OBJ_PAIR
} ObjectType;

Ò»¶Ô(pair)¶ÔÏó¿ÉÒÔÊÇÈÎÒâÀàÐ͵쬱ÈÈçÁ½¸öint£¬Ò»¸öintÒ»¸öpair£¬Ê²Ã´¶¼ÐС£ÓÐÕâЩ¾Í×ã¹»ÄãÓõÄÁË¡£ÓÉÓÚÐéÄâ»úÀïµÄ¶ÔÏó¿ÉÊÇÊÇÕâЩÖеÄÈÎÒâÒ»ÖÖ£¬ÔÚCÀïÃæµäÐ͵ÄʵÏÖ·½Ê½ÊÇʹÓÃÒ»¸ö±ê¼ÇÁªºÏ(tagged union)¡£

ÎÒÃÇÀ´ÊµÏÖÒ»ÏÂËü£º

typedef struct sObject {
ObjectType type;

union {
/* OBJ_INT */
int value;

/* OBJ_PAIR */
struct {
struct sObject* head;
struct sObject* tail;
};
};
} Object;

Object½á¹¹ÓÐÒ»¸ötype×ֶΣ¬ÓÃÀ´±êʶËüÊÇʲôÀàÐ͵ġª¡ªint»òÕßÊÇpair¡£Ëü»¹ÓÐÒ»¸öunion½á¹¹£¬ÓÃÀ´±£´æint»òÕßpairµÄÊý¾Ý¡£Èç¹ûÄãCÓïÑÔµÄ֪ʶÒѾ­ÉúÐâÁË£¬ÄÇÎÒÀ´ÌáÐÑÄ㣬unionÊÇÖ¸ÄÚ´æÀïÃæÖØµþµÄ×ֶΡ£Ò»¸öÖ¸¶¨µÄ¶ÔÏóҪôÊÇintҪôÊÇpair£¬Ã»±ØÒªÔÚÄÚ´æÀïͬʱ¸øËüÃÇ·ÖÅäÈý¸ö×ֶΡ£Ò»¸öunion¾Í¸ã¶¨ÁË£¬°ô¼«ÁË¡£

Ò»¸öÃÔÄãµÄÐéÄâ»ú

ÏÖÔÚÎÒÃÇ¿ÉÒÔ°ÑËüÃÇ·â×°µ½Ò»¸öСÐÍÐéÄâ»úµÄ½á¹¹ÀïÁË¡£Õâ¸öÐéÄâ»úÔÚÕâµÄ×÷ÓþÍÊdzÖÓÐÒ»¸öÕ»£¬ÓÃÀ´´æ´¢µ±Ç°Ê¹ÓõıäÁ¿¡£ºÜ¶àÓïÑÔµÄÐéÄâ»ú¶¼ÒªÃ´ÊÇ»ùÓÚÕ»µÄ£¨±ÈÈçJVMºÍCLR£©£¬ÒªÃ´ÊÇ»ùÓڼĴæÆ÷µÄ£¨±ÈÈçLua£©¡£²»¹ÜÊÇÄÄÖֽṹ£¬Êµ¼ÊÉÏËüÃǶ¼µÃÓÐÒ»¸öÕ»¡£ËüÓÃÀ´´æ´¢±¾µØ±äÁ¿ÒÔ¼°±í´ïʽÖпÉÄÜ»áÓõ½µÄÖмä±äÁ¿¡£

ÎÒÃÇÓÃÒ»ÖÖ¼òµ¥Ã÷Á˵ķ½Ê½½«Ëü³éÏó³öÀ´£¬¾ÍÏñÕâÑù£º

#define STACK_MAX 256

typedef struct {
Object* stack[STACK_MAX];
int stackSize;
} VM;

ÏÖÔÚÎÒÃÇÐèÒªµÄ»ù±¾µÄÊý¾Ý½á¹¹ÒѾ­¾ÍÁË£¬ÎÒÃÇÔÙÀ´´Õ¼¸ÐдúÂ룬Éú³ÉһЩÀ¬»ø¶ÔÏó¡£Ê×ÏÈ£¬ÏÈдһ¸öº¯Êý£¬ÓÃÀ´´´½¨²¢³õʼ»¯ÐéÄâ»ú£º

VM* newVM() {
VM* vm = malloc(sizeof(VM));
vm->stackSize = 0;
return vm;
}

ÓÐÁËÐéÄâ»úºó£¬ÎÒÃÇÐèÒª¶ÔËüµÄÕ»½øÐвÙ×÷£º

void push(VM* vm, Object* value) {
assert(vm->stackSize < STACK_MAX, "Stack overflow!");
vm->stack[vm->stackSize++] = value;
}

Object* pop(VM* vm) {
assert(vm->stackSize > 0, "Stack underflow!");
return vm->stack[--vm->stackSize];
}

ºÃÁË£¬ÏÖÔÚÎÒÃÇ¿ÉÒ԰Ѷ«Î÷´æµ½±äÁ¿ÀïÁË£¬ÎÒÃÇÐèҪʵ¼ÊÈ¥´´½¨Ò»Ð©¶ÔÏó¡£ÕâÀïÊÇÒ»¸ö¸¨Öúº¯Êý£º

Object* newObject(VM* vm, ObjectType type) {
Object* object = malloc(sizeof(Object));
object->type = type;
return object;
}

Ëü»á½øÐÐÄÚ´æ·ÖÅä²¢ÇÒÉèÖÃÀàÐͱê¼Ç¡£Ò»»á¶ùÎÒÃÇÔÙ»ØÍ·¿´Ëü¡£ÓÐÁËËüÎÒÃǾͿÉÒ԰Ѳ»Í¬ÀàÐ͵ĶÔÏóѹµ½Õ»ÀïÁË£º

void pushInt(VM* vm, int intValue) {
Object* object = newObject(vm, OBJ_INT);
object->value = intValue;
push(vm, object);
}

Object* pushPair(VM* vm) {
Object* object = newObject(vm, OBJ_PAIR);
object->tail = pop(vm);
object->head = pop(vm);

push(vm, object);
return object;
}

Õâ¶¼ÊǸøÎÒÃÇÕâ¸öÃÔÄãµÄÐéÄâ»ú×¼±¸µÄ¡£Èç¹ûÎÒÃÇÓиö½âÎöÆ÷ºÍ½âÊÍÆ÷À´µ÷ÓÃÕâЩº¯Êý£¬ÎÒ¸Ò˵ÎÒÃÇÊÖÀïÕâ¸öÒѾ­ÊÇÒ»ÃÅÍêÕûµÄÓïÑÔÁË¡£²¢ÇÒ£¬Èç¹ûÎÒÃǵÄÄÚ´æÊÇÎÞÏÞ´óµÄ»°£¬Ëü¼òÖ±¾Í¿ÉÒÔÔËÐÐÕæÊµµÄ³ÌÐòÁË¡£²»¹ýµ±È»²»¿ÉÄÜÁË£¬ËùÒÔÎÒÃǵýøÐÐÀ¬»ø»ØÊÕ¡£

Marky mark

£¨Õâ¸ÃÔõô·­Ò룬Õâ»õÄѵÀÊÇ×÷Õßϲ°®µÄÒ»¸öÑÝÔ±£¿Âí¿Ë¡¤ÎÖ¶û²®¸ñ£¬ÔçÆÚÓÖ±»È˳ÆÎªÂõÆæ¡¤Âí¿Ë£¬Marky Mark£¬¸ÐÐËȤÇë×Ô¾õËÑË÷¡£²»¹ýÏÂÃæ¿Ï¶¨Êǽ²±ê¼ÇµÄ£©

µÚÒ»¸ö½×¶ÎÊDZê¼Ç½×¶Î¡£ÎÒÃÇÐèÒª±éÀúËùÓеĿɴï¶ÔÏ󣬲¢ÇÒÉèÖÃËüÃǵıê¼Çλ¡£ÐèÒª×öµÄµÚÒ»¼þʾÍÊǸøObject¼ÓÒ»¸ö±ê¼Çλ£º

typedef struct sObject {
unsigned char marked;
/* Previous stuff... */
} Object;

ÎÒÃǵÃÐÞ¸ÄÏÂnewObject()º¯Êý£¬µ±ÎÒÃÇ´´½¨Ð¶ÔÏóµÄʱºò£¬°ÑÕâ¸ömaked×ֶγõʼ»¯³É0¡£ÎªÁ˱ê¼ÇËùÓеĿɴï¶ÔÏó£¬ÎÒÃǵôÓÄÚ´æÀïµÄ±äÁ¿ÏÈ¿ªÊ¼£¬Ò²¾ÍÊÇ˵ÎÒÃǵ÷ÃÎÊÕ»ÁË¡£´úÂë¾ÍÏñÕâÑù£º

void markAll(VM* vm)
{
for (int i = 0; i < vm->stackSize; i++) {
mark(vm->stack[i]);
}
}

Õâ¸öº¯Êý×îºó»áµ÷Óõ½mark()¡£ÎÒÃÇÀ´·Ö½×¶ÎʵÏÖËü¡£Ê×ÏÈ£º

void mark(Object* object) {
object->marked = 1;
}

ºÁ²»¿äÕŵÄ˵£¬Õâ¿ÉÊÇ×îÖØÒªµÄÒ»¸öbitλÁË¡£ÎÒÃǰÑÕâ¸ö¶ÔÏó±ê¼Ç³É¿É´ïµÄÁË£¬²»¹ý¼Çס£¬ÎÒÃÇ»¹µÃ´¦Àí¶ÔÏóµÄÒýÓ㺿ɴïÐÔÊǵݹéµÄ¡£Èç¹û¶ÔÏóÊÇpairÀàÐ͵ϰ£¬ËüµÄÁ½¸ö×ֶζ¼ÊǿɴïµÄ¡£ÊµÏÖÕâ¸öÒ²¼òµ¥£º

void mark(Object* object) {
object->marked = 1;

if (object->type == OBJ_PAIR) {
mark(object->head);
mark(object->tail);
}
}

²»¹ýÕâÀïÓиöBUG¡£¿´µ½Ã»£¿ÎÒÃǵݹéµ÷ÓÃÁË£¬²»¹ýûÓÐÅжÏÑ­»·ÒýÓá£Èç¹ûÄãÓкܶàpair¶ÔÏ󣬻¥ÏàÖ¸Ïò¶Ô·½£¬ÒýÓÃÐγÉÁËÒ»¸ö»·£¬¾Í»áµ¼ÖÂÕ»Òç³ö×îºó³ÌÐò±ÀÀ£¡£

Òª½â¾öÕâ¸öÎÊÌ⣬ÎÒÃǵÃÄܹ»ÅжÏÕâ¸ö¶ÔÏóÎÒÃÇÊDz»ÊÇÒѾ­´¦Àí¹ýÁË¡£×îÖÕ°æµÄmark()º¯ÊýÊÇÕâÑùµÄ£º

void mark(Object* object) {
/* If already marked, we're done. Check this first
to avoid recursing on cycles in the object graph. */
if (object->marked) return;

object->marked = 1;

if (object->type == OBJ_PAIR) {
mark(object->head);
mark(object->tail);
}
}

ÏÖÔÚÎÒÃÇ¿ÉÒÔµ÷ÓÃmarkAllÁË£¬ËüÄÜÕýÈ·µÄ±ê¼ÇÄÚ´æÖÐËùÓеĿɴï¶ÔÏó¡£ÒѾ­Íê³ÉÒ»°ëÁË£¡

Sweepy sweep

(¿­¶ûÌØÈ˵ķè¿ñÖ§³ÖÕߣ¬²Î¿¼http://www.urbandictionary.com/define.php?term=sweep%20sweep£¬¿´Íê¾Í¶®ÁË£©

ÏÂÒ»¸ö½×¶Î¾ÍÊDZéÀúËùÓзÖÅäµÄ¶ÔÏó£¬ÊͷŵôÄÇЩûÓб»±ê¼ÇµÄÁË¡£²»¹ýÕâÀïÓиöÎÊÌ⣺ÄÇЩû±»±ê¼ÇµÄ¶ÔÏó£¬ÊDz»¿É´ïµÄ£¡ÎÒÃÇû·¨·ÃÎʵ½ËüÃÇ£¡

ÐéÄâ»úÒѾ­ÊµÏÖÁ˹ØÓÚ¶ÔÏóÒýÓõÄÓïÒ壺ËùÒÔÎÒÃÇÖ»ÔÚ±äÁ¿Öд洢Á˶ÔÏóµÄÖ¸Õë¡£Ò»µ©Ä³¸ö¶ÔÏóûÓÐÈËÒýÓÃÁË£¬ÎÒÃǽ«»á³¹µ×µÄʧȥËü£¬²¢µ¼ÖÂÁËÄÚ´æÐ¹Â¶¡£

½â¾öÕâ¸öµÄС¼¼ÇɾÍÊÇVM¿ÉÒÔÓÐÊôÓÚ×Ô¼ºµÄ¶ÔÏóÒýÓã¬Õâ¸öºÍÓïÒåÖеÄÒýÓÃÊDz»Í¬µÄ£¬ÄǸöÒýÓöԿª·¢ÈËÔ±ÊǿɼûµÄ¡£Ò²¾ÍÊÇ˵£¬ÎÒÃÇ¿ÉÒÔ×Ô¼ºÈ¥¼Ç¼ÕâЩ¶ÔÏó¡£

×î¼òµ¥µÄ·½·¨¾ÍÊÇΪËùÓзÖÅ䵨±ö¶ÔÏóά»¤Ò»¸öÁ´±í¡£ÎÒÃǽ«ObjectÀ©Õ¹³ÉÒ»¸öÁ´±íµÄ½Úµã£º

typedef struct sObject {
/* The next object in the list of all objects. */
struct sObject* next;

/* Previous stuff... */
} Object;

ÐéÄâ»úÀ´¼Ç¼Õâ¸öÁ´±íµÄÍ·½Úµã£º

typedef struct {
/* The first object in the list of all objects. */
Object* firstObject;

/* Previous stuff... */
} VM;

ÎÒÃÇ»áÔÚnewVM()ÖУ¬È·±£firstObject±»³õʼ³ÉNULL¡£µ±ÎÒÃÇÒª´´½¨¶ÔÏóʱ£¬ÎÒÃǰÑËü¼Óµ½Á´±íÀ

Object* newObject(VM* vm, ObjectType type) {
Object* object = malloc(sizeof(Object));
object->type = type;
object->marked = 0;

/* Insert it into the list of allocated objects. */
object->next = vm->firstObject;
vm->firstObject = object;

return object;
}

ÕâÑùµÄ»°£¬¼´±ã´ÓÓïÑԵĽǶÈÀ´¿´ÎÞ·¨ÕÒµ½Ò»¸ö¶ÔÏó£¬ÔÚÓïÑÔµÄʵÏÖÖл¹ÊÇÄܹ»ÕÒµ½µÄ¡£ÒªÉ¨Ã貢ɾ³ýʾ±ê¼ÇµÄ¶ÔÏó£¬ÎÒÃÇÖ»ÐèÒª±éÀúÏÂÕâ¸öÁбí¾Í¿ÉÒÔÁË£º

void sweep(VM* vm)
{
Object** object = &vm->firstObject;
while (*object) {
if (!(*object)->marked) {
/* This object wasn't reached, so remove it from the list
and free it. */
Object* unreached = *object;

*object = unreached->next;
free(unreached);
} else {
/* This object was reached, so unmark it (for the next GC)
and move on to the next. */
(*object)->marked = 0;
object = &(*object)->next;
}
}
}

Õâ¶Î´úÂë¶ÁÕæÀ´ÐèÒªµã¼¼ÇÉ£¬ÒòΪËüÓõ½ÁËÖ¸ÕëµÄÖ¸Õ룬²»¹ýÈç¹ûÄã¿´Ã÷°×ÁË£¬Äã»á·¢ÏÖËüÆäʵдµÄÏ൱ֱ°×¡£Ëü¾ÍÊDZéÀúÁËÒ»ÏÂÕû¸öÁÐ±í¡£Ò»µ©Ëü·¢ÏÖÒ»¸öδ±ê¼ÇµÄ¶ÔÏó£¬ÊÍ·ÅËüµÄÄڴ棬°ÑËü´ÓÁбíÖÐÒÆ³ý¡£Íê³ÉÁËÕâ¸öÖ®ºó£¬ËùÓв»¿É´ïµÄ¶ÔÏó¶¼±»ÎÒÃÇɾ³ýÁË¡£

¹§Ï²£¡ÎÒÃÇÖÕÓÚÓÐÁËÒ»¸öÀ¬»ø»ØÊÕÆ÷£¡²»¹ý»¹ÉÙÁËÒ»Ñù¶«Î÷£ºÊµ¼ÊÈ¥µ÷ÓÃËü¡£ÎÒÃÇÏȰÑÁ½¸ö½×¶Î·â×°µ½Ò»Æð£º

void gc(VM* vm) {
markAll(vm);
sweep(vm);
}

²»¿ÉÄÜÓбÈÕâ¸ü¼òµ¥µÄ±ê¼Ç-Çå³ýµÄʵÏÖÁË¡£×ÊֵľÍÊǵ½µ×ʲôʱºòÈ¥µ÷ÓÃËüÁË¡£µ½µ×ʲô²ÅÊÇÄÚ´æ½ôÕÅ£¬ÓÈÆäÊÇÔÚ¼¸ºõÓµÓÐÎÞÏÞÐéÄâÄÚ´æµÄÏÖ´ú¼ÆËã»úÀ

ÕâÆäʵ²¢Ã»Óбê×¼´ð°¸¡£ÕâÈ¡¾öÓÚÄãÈçºÎʹÓÃÄãµÄÐéÄâ»ú²¢ÇÒËüÔËÐÐÔÚʲôÑùµÄÓ²¼þÉÏÁË¡£ÎªÁËÈÃÕâ¸öÀý×Ó¼òµ¥µã£¬ÎÒÃÇÔÚ·ÖÅäÒ»¶¨ÊýÁ¿¶ÔÏóºó½øÐлØÊÕ¡£È·ÊµÓÐһЩÓïÑÔÊÇÕâôʵÏֵģ¬Í¬Ê±ÕâÒ²ºÜÈÝÒ×ʵÏÖ¡£

ÎÒÃÇÀ©Õ¹ÁËÒ»ÏÂVM£¬¸ú×ÙһϷÖÅäÁ˶àÉÙ¶ÔÏó£º

typedef struct {
/* The total number of currently allocated objects. */
int numObjects;

/* The number of objects required to trigger a GC. */
int maxObjects;

/* Previous stuff... */
} VM;

È»ºó³õʼ»¯ËüÃÇ£º

VM* newVM() {
/* Previous stuff... */

vm->numObjects = 0;
vm->maxObjects = INITIAL_GC_THRESHOLD;
return vm;
}

INITIAL_GC_THRESHOLD ¾ÍÊÇ´¥·¢GCʱ·ÖÅäµÄ¶ÔÏó¸öÊý¡£±£ÊصãµÄ»°¾ÍÉèÖõÄСµã£¬Ï£ÍûGC»¨µÄʱ¼äÉÙµãµÄ»°¾ÍÉèÖôóµã¡£¿´ÄãµÄÐèÒªÁË¡£

µ±´´½¨¶ÔÏóʱ£¬ÎÒÃÇ»áÔö¼ÓÕâ¸önumOjbectsÖµ£¬Èç¹ûËüµ½´ï×î´óÖµÁË£¬¾ÍÖ´ÐÐÒ»´ÎÀ¬»ø»ØÊÕ£º

Object* newObject(VM* vm, ObjectType type) {
if (vm->numObjects == vm->maxObjects) gc(vm);

/* Create object... */

vm->numObjects++;
return object;
}

ÎÒÃÇ»¹µÃµ÷ÕûÏÂsweepº¯Êý£¬Ã¿´ÎÊͷŶÔÏóµÄʱºò½øÐмõÒ»¡£×îºó£¬ÎÒÃÇÐÞ¸ÄÏÂgc()À´¸üÐÂÕâ¸ö×î´óÖµ£º

void gc(VM* vm) {
int numObjects = vm->numObjects;

markAll(vm);
sweep(vm);

vm->maxObjects = vm->numObjects * 2;
}

ÿ´Î»ØÊÕÖ®ºó£¬ÎÒÃÇ»á¸ù¾Ý´æ»î¶ÔÏóµÄÊýÁ¿£¬¸üÐÂmaxOjbectsµÄÖµ¡£ÕâÀï³ËÒÔ2ÊÇΪÁËÈÃÎÒÃǵĶÑÄÜËæ×Å´æ»î¶ÔÏóÊýÁ¿µÄÔö³¤¶øÔö³¤¡£Í¬ÑùµÄ£¬Èç¹û´óÁ¿¶ÔÏó±»»ØÊÕÖ®ºó£¬¶ÑÒ²»áËæ×ÅËõС¡£

ÂéȸËäС

ÖÕÓڴ󹦸æ³ÉÁË£¡Èç¹ûÄã¼á³Ö¿´ÍêÁË£¬ÄÇôÄãÏÖÔÚÒ²ÕÆÎÕÒ»ÖÖ¼òµ¥µÄÀ¬»ø»ØÊÕµÄËã·¨ÁË¡£Èç¹ûÄãÏë²é¿´ÍêÕûµÄÔ´´úÂ룬Çëµã»÷ÕâÀï¡£ÎÒµÃÇ¿µ÷һϣ¬Õâ¸ö»ØÊÕÆ÷ÂéȸËäС£¬ÎåÔà¾ãÈ«¡£

ÔÚËüÉÏÃæÄã¿ÉÒÔ×öºÜ¶àÓÅ»¯£¨ÔÚGCºÍ±à³ÌÓïÑÔÀ×öµÄ90%µÄÊÂÇé¶¼ÊÇÓÅ»¯£©£¬²»¹ýÕâÀïµÄºËÐÄ´úÂë¾ÍÊÇÒ»¸öÍêÕûµÄÕæÊµµÄÀ¬»ø»ØÊÕÆ÷¡£ËüºÍRubyºÍLua֮ǰµÄ»ØÊÕÆ÷·Ç³£ÏàÏñ¡£Äã¿ÉÒÔÔÚÄãµÄ²úÆ·ÖÐËæÒâʹÓÃÕâЩ´úÂë¡£ÏÖÔھͿªÊ¼¶¯ÊÖдµãʲô°É£¡

   
´Îä¯ÀÀ       
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
   
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ