Mercurial > hg > CbC > old > device
view Idea @ 622:682c8ec38d45
_code へ
author | kono |
---|---|
date | Thu, 07 Sep 2006 11:50:17 +0900 |
parents | 2dee957ef988 |
children | fd2dfa1fa627 |
line wrap: on
line source
Thu Nov 25 17:27:12 JST 1999 subroutine call ʤ ɽѿʤ ꡢѿ¿Ѥ ѿΥפ϶ɽŪ Fortran Ѥ˶ɽѿŪ˼ recursion ˤϡʬ¸ subroutine callΥ쥸Υ֤ɽŪ˹Ԥ ϡäѤʤ? äѤǥեȤΥե졼ϻ⤯? recursive call ȤǤʤΤ̤뤫? fp Ѱդɤ ؿƱˡѤfpι¤ΤѰդ C compileˤϡstack⤯ fp = (struct func_state *)stack äȡɤ? ⤢櫓͡ 㤢fp? ϵʤʡstatic fpˤɤ櫓͡ func(void *stack) { static struct func_state { static struct func_state *fp; int local1; brahbrah... } func_state; // ޤ hidden func_state.fp = (stack -= sizeof(struct func_state)); } func_state ȤäƤ黻Ҥäɤ? ͡ func.state 餤? fp->local1 ߤʤȤʤ顢C Ʊˤʤ롣 call argument ⡢ static func_state ֤ stack func_state ֤ Ȥ̤褬롣Cȸߴʤ顢ԡ Recursive ʤԤθϾܤҤ뤫顢static ʤΤǤɤϤ Internal function ? äƤ⤤... Recursive call ˤϡ fp saveɬפ͡ (--(struct func_state *)stack) = fp; call callee(&fp->arg,continuation,stack); call Ƥ⡢äʤ... continuation ϰŪˤcode ... Internal function ˤ뤫 continuation ˰ŪcompileˡͤʤȤʤ self ɬפʤ櫓? ̾ͤʤȤʤ C ΥѥʤȤʤΤ... Mon Dec 13 18:53:04 JST 1999 compiler based ǡ partial evaluation Ǥ? func databaseȤưʤʤ顢ϤǤʤ ܤȤƤϼ갷롣 func.state func.code ߤʷˤpartial evaluationɤ ǤߤޤΤ? textual ǤʤŪʥɽäɤ? <-> interpreter? Prolog ǤϤʤǤʤ? --> Unification Ť Sat Nov 27 13:50:41 JST 1999 func.state ȤΤä顢 struct { struct { int i; } state; state *code = { i = i+1; }; } name; ߤʷǡ켫Τ¤? ǡʬɾ롣 ǽʤۤɡ *name.code; ͤϤ櫓? ͤ &state Ǥ礦͡ self С struct { struct { int i; } state, *code = { self->i = self->i+1; }; } name; ʡself = state ͡ union γĥ⤢碌Ƶ... Partial evaluator ޥƥ¹ԷϤˤƤȤϲǽ? byte code ȤۥޥäǽǤʤ? ˤ衢¤ΤΥuniqueʤȤʡ إåեϤɤ? Mon Dec 13 18:53:18 JST 1999 library Ȥ? exec sequence Ǥϡ (--(struct func_state *)stack) = fp; call callee(&fp->arg); ȤpointerϤ? Ѥ͡ ϤˤȤСʣͤϤۤɤ func(void *stack) { static struct func_state { static struct func_state *fp; int local1; brahbrah... } func_state; // ޤ hidden func_state.fp = (stack -= sizeof(struct func_state)); } ΰΤ¤ΤǤ٤ func( struct void *stack ) { static struct func_state { static struct func_state *fp; int local1; brahbrah... } func_state; // ޤ hidden func_state.fp = (stack -= sizeof(struct func_state)); } ǡ¤Τ register storage func( static struct argument { register void *stack; register void *continuation; } ) { static struct func_state { static struct func_state *fp; int local1; brahbrah... } func_state; // ޤ hidden func_state.fp = (stack -= sizeof(struct func_state)); } ȡcaller ⡢¤ΤȤΤ call caller( static struct argument { register void *stack; register void *continuation; } arg = {a,b}; ) ߤʡι¤ΤϥեȸƤФ롣 argument ϡcallee ˤäɤɡcaller ¦ˤäƤ ɤregister ʤϡ caller(interface caller_arg = {a,b,c}) ߤsyntax ʡ caller->interface = {a,b,c}; *caller->code; caller(a,b,c); ȾΤ롣 function ˤϡinterface code state 뤳Ȥˤʤ롣 state ˥lock? protected state? synchronized state ? sequential implementationǤϡʤΤϤʤ function { interface: register int a; register struct self self; state: int b; serialized int c; code: b = a; } int void value 롣ϽŤʤ뤱... serialized semantics ? ⤦micro-C˶! carrying state static state Mon Dec 13 19:42:41 JST 1999 interface register keyword ȤΤϡޤ ꤹ롣Ǥ⡢ǤʤȾ֤ˤǤʤ? ʤȤϤʤäѤcaller¦static ΰ ľܽ? C٤Ǥ⡢40ĤȤ줿... Wed Dec 15 14:09:49 JST 1999 C ȸߴˤ? goto function(arguments); goto *continuation(arguments); ߤʴǡ stackδ? ɤlibrary ȤθߴϤȤʤ ʤ... local ѿ stack ưǤ⡢᤹ۤʤ closure 뤫? return εưʣˤʤ롣return櫓顣 arguments static ΰˤȸߴȤʤ stack frame pointer ˤʤȥ顣 ξΩΤ̵? ĤޤꡢȡƤӽФ줿 frame semantics ϡC ȸߴˤʤ롣顢stackľ frame pointer ȻפäƤ (? ) frame pointer stack pointer ˱äưưľˡoffset ǰ뤳Ȥˤʤ롣 ĤޤꡢϤäȤʤ? Ĥޤꡢgoto ȡ frame pointer ϡstack ľȤϸ¤ʤ顣 frame pointer Ф˰˥Ƥ̤ɤ͡ stack ˰ѤΤǧơgoto ξϡ¦ stack äƤΤ? ȤȤϡ̤δؿ ˡѤäƤȤޡϤʤ ȡgoto semantics ϡC ȸߴˤʤ롣 ۤʤ뤳Ȥ롣ϡʤʡˡ ȴؿƤӽФڤʤʤ... ȤȤϡϤꡢC call ϡcall function ¸ơ¾θƤӽФϡ٤ơgoto ϡθδؿcall줿ʡdual entry ˤơ call λȡgoto λ̤뤫 func: stack processing func_goto: normal processing ... ߤʴǤ⡢return Ϥʤ... Τ⼫ʬǵҤǤǤ٤̤͡ꡣ ĤޤꡢC Ȥstub ⼫ʬǵҤȸȤ protocol function { interface c { register "%esp" struct { entry code ret(int); void *fp; } *sp; register "%ebp" void *fp; }; code function_code { fp = sp; sp += sizeof(struct local); struct local *local = sp; local->i = 1; goto *fp->ret(local->i),sp=fp; // return(local->i); }; } ߤʴǤä֥顣ޤreturnɡ ޤreturn ϤΤޤreturnǤ⤤ɤ ɤΤʤcode ʣ뤫顣 state ʳϡconsistent state Ǥ뤳ȤݾڤʤäƤΤ? local ѿϻȤäƤɤɡcall/goto ǡͤݾڤʤ... Ƥʤ 顢쥸ФޥåԥεҤȡǤʤʬ ҤʬΥ٤Ǥ礦͡ դ˼櫓ˤϤʤ餡... Thu Dec 16 13:44:21 JST 1999 lock Ͼܥ٥Ǽ¸Τ顢self ʤɤ ȤälockɬפϤʤϤ Τľϡܥ٥ǡ lock(storage) -> transition ߤʷǵҤɤɤΤ褦˵Ҥ뤫 ⤦ꤷ褦 ϥ쥸Ϥˤ褦ĹϡƤӽФ¦ΰؤ ݥȤ롣ꤷƤɤСvarargs ߤʤΤϤʤʤ롣ʤǡʤΤ? ϤФ ʤΤǡϰ(or )˸¤Ȥˡ⤢롣 ȤȡϤꡢäŪΰưŪΰݤ뤳Ȥ Ǥʤ θǤưŪΰϼʬdzݤ櫓顢ʤ Thu Dec 16 20:24:55 JST 1999 ȤȴؿƤӽФϡ # register save # set 1st argument in register %eax # set 2nd argument in register %ecx # set extra arguments in save area # set extra argument pointer in %edx jmp function Ȥˤʤ櫓͡second ΤϤɤ ˤ褦 ȡframe pointer Ϥʤɡѥμ礫餹 äɤframe pointer ΤΤstatic ˤȤΤϤޤ顢frame pointer first argument ȤȤˤȤȰϡˡ ȸ櫓 f(fp,argument) fp ϤΤˤargument 쥸ϤΤϤɡ ޡɤ return ʤʤ顢return type ȤΤѤʡ f(fp,arg1,arg2,arg3) Ȥȡ줾줬ޤä쥸äơ ¿ʬˤȻפ롣դդ... fp->xx ǥСΤޤɽѿˤʤ롣 äƤɤ .set label,value as ͤåȤ褦Ǥ͡ ؿθäʤοۤϤʤƤ褤 frame pointer Ȥä鼫ʬݤ뤳ȡ a = atoi(s); ߤʤȤϤǤʤ... ̤Cȸȴְ㤤䤹 Ȥȡstruct Ʊͤˡ protocol code interface state Ѱդ櫓֤͡Τ? Ȥꤢregister Ϥfunction gotoʸ롣 code name(register "%ebp" void *arg) { goto name(arg); } 餤? ǡfirst argument ɬregisterˤΤ褦ˤʤ ʤregister storage class ơ register "%ebp" void *arg Ȥ櫓͡ äƤȤϡޤ쥸ʤȤʤ櫓͡ ǡstack Ȥä黻ϡΤޤޤˤ? ǤưϤ gotoϻȤʤ顢ǤϤ ǡ줫顢ĥƤ interface c { register "%ebp" void *arg; } code name(interface c) { goto name(c.arg); // c. Ͼάǽ } Ȥ͡ˡ protocol name { interface c { register "%ebp" void *arg; } code name(interface c) { goto name(arg); } code name1(interface c) { goto name(arg); } } ʤɤȤ櫓ʤȡ줬 C ȶ¸櫓͡ Fri Dec 31 11:44:03 JST 1999 code Ǥʤơ̤̾Τۤɤʤ? segment? action? 쥸̾ΤϡäѤꤤ䡣optionalˤϵ interface Ϲ¤ΤΤ褦ʤΤ... ¤ΤǤʤ? ¤Τξ... malloc ? malloc Ȥơ free ? ȤˤϡƤƤʤ? multi-thread ǤʤФ͡ multi thread Ǥϡ֤ϡ쥸ͳޤϡthread local ˻ ɬפ롣static ϡ thread local ˻ʤƤϤʤʤ ѿ˳꿶äᡣǤ⡢ޤϡ interface ϡȤꤢĤޤǤϤˤ褦 self arg Ǥ͡ ⤦ĥ䤹ѥ餬ʤ code name (c,a) struct state *c; struct arg *a; { goto name(arg); } local ѿ? θߴ꤫ KL/1 ռơinterface heap ֤ȤˤƤɤ GC ϸƤ٤interface machine independent Ǥ٤Ȥ use/forget ߤΤϤ Ǥ⺣ΤȤϹͤɬפϤʤ ȡ code name (c,a) struct state *c; struct arg *a; { int i; goto name(arg); } λΰѿiϤɤ? Ūˤϥ쥸Ƥ... Ѥʤ? ʸոޤäѤheap˳Ƥ㤦 ΤñǤ⡢ɤȴˤϤʤʤ櫓... ۤ餤ѿϡcallǤɬ̵ʤΤ̡ Ȥˤ쥸ѿɬפʤǤ礦? 顢GC ȹ碌Ƹ߷פ٤͡API ꤷơ ۤʤGCǤ褦ˤ롣 Sat Jan 1 22:40:22 JST 2000 ȡˤ storage class register 褦 stmode=REGISTER ǡlocal storage ȤʤȤ static register? ϡʤ symbol table storage class ? dsp==EXTRN ȽꤷƤ뤫顢 local ѿ36ʾ夢Ȥʤ뤾? sc GVAR/LVAR ɡregister LVAR üۤ顢 sc ۤ... Sun Jan 2 01:47:17 JST 2000 register ѿϤǤޤɡregister ĻȤȡ դˤʤäƤޤΤǡREGISTER6 ǥѥ뤷ʤ 빽Ҥɤregister ѿ%esi,%edi ˳Ƥ Sun Jan 2 04:43:04 JST 2000 ǡ code name (c,a) struct state *c; struct arg *a; { goto name(c); } ΰѿ̵ϼǤޤĤޤǤ͡ .file "tmp.c" .version "01.01" gcc2_compiled.: .text # # code name(c,a) .align 2 .globl code code: .type code,@function # struct state *c; struct arg *a; # { # goto name(c); movl %esi,%esi jmp name _5: .size code,_5-code .ident "Micro-C compiled" goto ʸɤstack ǡjmp 褤.. Sun Jan 2 11:17:50 JST 2000 ̤callcontinuation baseˤ뤳ȤǤ? Sun Jan 2 20:28:45 JST 2000 goto ʸɡϤꡢ١expr Ƥ顢top level jump code 褦 Tue Jan 4 03:32:55 JST 2000 code typeˤʤȡ code *p; Ȥʤ͡ int *p(); Ʊɤ main(ac,av) int ac; char *av[]; { goto code1(ac,av); } code code1(ac,av) int ac; char *av[]; { if (ac) goto code1(ac,av); else goto ac(ac,av); } Tue Jan 4 04:56:56 JST 2000 ʤ쥸ˤĤ㤦 ϡadecl reverseˤĤफ顣 code return ϤcodetypeˤʤȤᡣ main() { goto code1(); } Ȥȡmain äʤcode1() ʹߤǡ return 櫓ˤϤʤ(main disp code1 Τʤ) goto label code1ΰ? main() { goto code1(ret); ret: } ȡret forward labelɤʬʤ? code1 ǻȤѿ stack ˤȤΤϰʤ %ebp ͳǥȤȤϡmain ѿȤȡ ɤˤϡmain goto codeǡ%ebp Ƥɤ (äʤΤʤ) code1 goto Ǥϡäʤ顢ɬפϤʤ label code1 Ϥȡäȵޤ Ȥȡ϶ػߤơmain() stackǤgoto뤫? ȡ̵¸षơɡʤȤˤʤ... main() local code Сϲ褹뤬.. main() { goto code1(code2); code code2() { return; } } ߤʴǤ⡢scope rule ѤɬפΤǸ ޡϤʤɤ͡ continuation ˡ⤢롣 main() { goto code1(continuation); } code code1(ret) code (*ret)(); { goto *ret; } ? call/cc ? label ؤgotoΤ⤤ɡ Ǥ⡢label ȡspaghettiˤʤʤ? Tue Jan 4 11:47:24 JST 2000 continuation ʤơreturn keyword Ȥ (ºݡcontinuation Ⱦ㤦) type Ѥˤʤ뤱ɡޤɤ int main() { goto code1(return); } code code1(ret) code (*ret)(int); { goto *ret(3); } ʡprototype դʤȤʤ Tue Jan 4 12:21:44 JST 2000 method٤static ˤʤäƤޤdynamic method ƤӽФˤˤ? dispatcher ʬǺ뤳Ȥˤʤ롣ʤ ɤ... code method(obj,arg) { } 뤤ϡinline ˤ뤫... #define Τ inline ͤ ϤȤǹͤɤ Tue Jan 4 14:22:19 JST 2000 main ѿ٤Τȡgoto (*reg)(123) Ǥͤϡ register Ϥǡcurrent register ˤΤʤΤǡ ɡreturn label Ѥ˺ɬפ롣 Tue Jan 4 18:14:07 JST 2000 stack ѤơƤӽФСcall by value register Ϥ¤ɬפ̵ʤ롣 ʣ֤ͤȤưפ .file "tmp.c" .version "01.01" gcc2_compiled.: .text # # code name(a,b,c,d,e,f) .align 2 .globl code code: .type code,@function # struct arg *a,*b,*c,*d,*e,*f; # { # int g; # goto name(a,b,d,e,f); jmp name _5: .size code,_5-code .ident "Micro-C compiled" ?! %esp new %esp = old %esp - 12 -4 %ebp-4 = g %esi = a %edi = b %ebp = old %esp 0 %ebp+4 = c code_arg_offset=0 %ebp+8 = d %ebp+12 = e %ebp+16 = f interface դ褦! Ȥ goto name(struct {xxxx}) ߤʴɤ櫓͡ɤregisterˤ뤫ȸϤ뤬 ǡɤäcallФ櫓? emit_push뤫push ? Ǥϡᤫcode argument οѤȡ ebp ưȤˤʤ롣ˤold sp 뤫 Ĥ⥳ԡɬפ롣 %esp new %esp = old %esp - 20 %ebp-20 = g %esi = a %edi = b %ebp-16 = c code_arg_offset= -16 ((nargs-max_reg)*int_size) %ebp-12 = d %ebp-8 = e %ebp-4 = f %ebp = old %esp 0 function callˤϡlocal ѿ٤ɤ # goto name(a,b,d,e,f); %esp new %esp = old %esp - 20 %ebp-20 = g %esi = a %edi = b %ebp-16 = c code_arg_offset= -16 ((nargs-max_reg)*int_size) %ebp-12 = d %ebp-8 = e %ebp-4 = f %ebp = old %esp 0 disp=0 (*) local1 <----16 local variable %edx -12 <- disp_offset %ecx -8 %ebx -4 %ebp = %esp 0 %eip 4 <- arg_offset Ȥʤ롣ȤȤϡpushl %ebp ϡְ㤤 ɡ%ebp ΤޤȤΤɤʤdisp_offset äƤ뤫顣 顢⤦ pushl %ebp ۤ褤push ϡ Ρ(*) leave movl %ebp,%esp popl %ebp ʤä? Thu Jan 6 13:00:33 JST 2000 Ǥ͡ǤȤꤢưϤ®٤... Ȥϡ ANSI-C prototype ANSI-C prototype check Interface Definietion GC support Direct handling of Frame ͡ñ˽褽? ֤... Fri Jan 7 09:42:53 JST 2000 goto ʸưƤʤä peep hole optimization version 뤫? continuation Ȥ label 褦ˤ٤? ʤɡäȡץब 褦ˤʤ롣ȡ¦δĶ(frame)ݻ ɬפ롣ޡǤʤϤʤ... ȡlabel ͤĤ褦ˤʤ롣 a = label:; Ȥlabel:(a,b,c) {}; ߤʷǡparallel ȸ ⤢͡ CȤɤ... main() { label:(){ ... } } ߤnestɤȸ꤬롣 ѿλȤʤСäϤʤ a = label: ϡŤΰ̣ʤ ̾DinnerBell II Ȥ? join ? code entry_a().entry_b() {} Ǥ? parallel call ? Fri Jan 7 19:53:53 JST 2000 ޤΤޤޤ return ĶäƤʤ顢æФǤʤ ޤĶƤ⤤ɡɤ֤ȸ꤬ ͡ ʤơreturn ¦ȽǤ뤫? return(ID) ߤʷIDȽǤ롣Сreturn ¦ID ȽǤǤ롣... ޤϤꡢĶä⤯ʤǤ⡢ ϤƤ뤫顢İϤơȤ줿Ȥˡ ȿ¦äƤޤΤϤ͡ΤޤޤʤС Ȥϵʤ continuation ͭʤ顢ΤޤޤǤ⤤... continuation ĶϡΥƥǤϼʬǺ뤳Ȥ Ǥ뤫͡ ʤ.... retlabel retcont ϼ¤ϥ֥ Τ˰Ĥɤ ϤȤˡ˴ĶؤΥݥƤɤΤǡ ϳȴñȡι¤ΤϤȸ 褹ɬפ롣 Ǥ⡢μʤСޤäƱѿιʤХԡ ºݤˤϵʤ櫓ʤϤäˡݾڤ뤿ˡ interface ɬפ롣 return -> (void *)old bp return address bp ľǤ褦ˤȤ.... Sat Jan 8 08:49:59 JST 2000 ϡcode ǤreturnǤʤ櫓ɡ¤ϡreturn äơ code return0(i) int i; { return(i); } ? ϶ػߤƤʤ㤦͡ɤcodeФ? doreturn() Ǥ retpending åȤƤ顢control=1 Τޤޡǡcode νˤΤǥ顼ˤʤ롣checkret ϡ statement ΰȽǤ褦ˤۤŪ æФϷ빽͡åפƤ줷? destructor ƱǡcodeƤӤΤ̤ bp Ʊˤʤޤ return ɤ櫓͡ return ƱǡŪ˴ĶϤ褦ˤ뤫 type void * ɤ? return stackξ¤ۤƤ뤫ɤʬǥå ɬפ͡ïreturn뤫codeɤ櫓ɡ code return0(i) int i; { return(i); } ơǡframe pointer 褢뤤Ϥ Ӥƽ? code return0(i,env) int i; env *env; { if (env==self) return(i); } ? Ϥ͡ code return0(i,env) int i; env *env; { if (env!=self) { env->return(); return(i); } } ⡢ʤѤʤƤӽФȵս˵ꤿ櫓... ºݡսˤϵäƤ櫓͡ return ǤӤȤ⤢뤱ɡ ϡdestructor Ϥ͡self ɤ櫓 Τϡ쳰ǡŪˤ顢θ äƤ櫓ʤΤ顢ǽΤϤ code return0(i) int i; { return(i); } ȡreturn ηʤȸ꤬ʡñˤ åǤʤ int main() { code a() { } code b() { return(i); } } ˤСcheck ϤǤ褦ˤʤ롣Ǥ⡢ȡ int main() { a: { } b: { return(i); } } Ⱥʤmodule 쳰ǤȤΤݤʤΤ顢Ǥ ޤϹ饢֥ʤΤ顣 return ȡæлabortȤϡ㤦顢 ̤code ƤӽФʤȤᡣ뤤ϡͤǶ̤뤫ϡ logic programming fail/success ȻƤ롣 main() { } abort { ... } Ǥ⤤? main() { code abort { ... }; code return { ... }} ? 衢subroutine callΤʤξάʤ櫓顢 ʤΤޤޤ̾subroutine callߥ졼ȤǤΤ? code (struct arg {...},void *sp) { struct env; push(sp,arg); push(env,arg); } Ǥ뤱ɡäȽŤϤꡢframe pointer ľʤ ᡣ goto ʸΤۤˡenv ΤäۤΤ⡣ goto (*ret)(),environment; ʡtype ? (void *)? goto ret(),environment; ˤϤʤʤ? СʬthreadǤ롣environment ɾʤɤ? ޤͤ ϼưפ... goto ȤΤˤΤ? env Фoperationäʤpush Ȥ? code return0(i) int i; { return(i); } ǧСreturn ѿϤʤʤ롣 Ǥ⡢¤ϡreturn ϡcaller ΰοȰפƤʤȤʤ 櫓顢 code return0(i) int i; { return(i); } Ϥᡣenv ȰפƤʤȤʤȤȤʬΥȤޤʤ? ? ʤϤʤʡ Sun Jan 9 01:15:56 JST 2000 ϤꡢʬΥƤϤޤȤȡ goto func(arg); Τ goto func(arg) with current.env ߤʤΤĤޤꡢϡDinnerBell Ρ self message: arg Ʊself->func(arg); Ǥɤfunction callȶ̤դʤΤ ɤʤ ȡtype code size int Ǥʤʤ롣 code *p = func; ǤϤʤơ code p = {func,env}; ǤʤȤʤºݡ goto func(arg) Ǥϡcurrent environment pushl %ebp stack = current env ѤǤ櫓顣 ˤ衢 struct p = q; ϼɬפ롣localʡ code p = {func,env}; ưϤ... code (*p)(); goto (*p)(arg); Ϥ龯ϡgoto env äƤȹͤ٤ Τ褦ˤȡˡ func,env ȤcodeȤߤʤȤˤʤ롣ϡobject ȸƤ֤٤ ¸objectȤ̤ʡactor ɤ? joinСDinnerBellʡϤʤɡ Sun Jan 9 01:40:05 JST 2000 local ѿνallocation θ٤餻ɬפ롣 nptr Ϥ? nptr ˽ե饰? ʸǽиlocalѿνưƤ? ¤Τcopyϡlcheck ٤Ǥʤ Sun Jan 9 08:49:43 JST 2000 ʤ¿ʤȡؿƤӽФgoto ʸ ¤Τؤб goto (*code)(); self env ȤΤcode ͤȤΤ̤ ɬפ롣⤷*ȤʤȤlabel(FNAME)Ȥζ̤ ĤʤǤ⡢Ķ⤯Ȥˤ顢label ؤjump褦ȻפФǤ͡ ϤʤƤ⡢ιʤstatementñ̤ФΤ ưפ ФǤ뤱ɡν̤1㽪ʤʤ ưΤǤ礦? Mon Jan 10 09:00:12 JST 2000 ˹¤ΤˤϡɬANSI-Cˤɬפ롣 ʤ... goto ʸˤ label, code, continuation 3Ĥ롣 continuation = code + env | label +env ʤΤcode/label Ǥϡenv Ƥۤʤ롣Ǥ βͤϤΤ? code , env ʬΥȤޤ˴롣ɤgoto ʤ餤? ññʤ顢äˡ Ȥ٤ʤ? return δؿ¸Ϥʤɤ ĤˤΤϡpop ꤬Τɤʤ... ret envꤷ褦ˤ顢leave ɬפ ʤʤäơpush %ebp ʬϡlea -disp(%ebp),%sp ǾõƤ롣ȤȤϡjump function¸ʬϤʤ ȤȤ͡ Ǥ⡢ʤread only°hardware supportǤФʤ sched_yeilds() 뤫? lock ? ǤɡäѤ Wed Jan 12 16:12:27 JST 2000 ϡANSI prototype Ϥɤ bexpr() ǡؿǤΰνȡΤȤνѤ뤳Ȥ롣 ȡͥ褵Ƥޤϡޤ롣 code_arg_offset Τ褦ˡȡANSI style Ǥϡ äƤޤ Thu Jan 13 04:46:12 JST 2000 # goto name(a,b,d,e,f); code name { int g; ... %esp new %esp = old %esp - 20 %ebp-20 = g code's local variable %ebp-12 = f <- new_disp %ebp-8 = d %ebp-4 = d %ebp-0 = c %edi = b %esi = a %ebp = old %esp 0 disp=0 new env local1 <----16 old local variable ( to be erased ) %edx -12 <- disp_offset %ecx -8 %ebx -4 %ebp = %esp 0 <- old env %eip 4 <- arg_offset Thu Jan 13 13:38:24 JST 2000 Ǥɡtest/tmp7.c printf type mismatch ʤʤ? ASNI Ѥʤ ȡץؤΤȤˤϡ빽̤Υǡ ԡ뤳Ȥˤʤ롣Ǥ⤤... 줴ȡɤäˤȤä֤continuationؤλȤߤʤ Ǥʤʡ ԡǤСenvironment/return Ȥư櫓顢 ؤλȤؤäƤɤ͡ Fri Jan 14 12:03:35 JST 2000 Libretto keyboard줿... control key ʤ... printf λȤϲ褷ޤlist2 localheap ˳ƤƤΤʤä͡ return νϡgoto ʸǽꡢenvironment returnto ɤϤʤ? environment ϼ¤Ǥʤνɬס new-environment() ߤlibrary Сthread ˤǤ롣 join ? funcall Ѱդɤ͡ Mon Jan 17 15:23:34 JST 2000 struct aa f1() { return bb; } ߤʤΤ? ؿηηơcrn pointerϤơ ȤcopyƤ stack ࡣ # bb=f1(aaa); movl $bb,%eax pushl %eax movl $aaa,%eax pushl %eax call main2 popl %edx copy %eax,%edx,$400 addl $400,%esp # return a1; Ǥ⡢ȡlocalѿ֤Ȥ˺͡leave; ret; ƤϤʤ... äѤꡢϥԡmain2˰ϤƤߤ͡ void f1(struct aa *ret) { *ret = bb ; return; } Ʊϴñ f1().a[55] ߤʾϡɽѿ˶Ū˼äƤޤߤ͡Ϥ... μȤäȸ leal $-sizeof(struct),%esp pushl %esp ʤɡؿƤӽФǤϤǤʤ.... # main(ac,av) # int ac; .align 2 .globl main main: .type main,@function pushl %ebp movl %esp,%ebp pushl %ebx pushl %ecx pushl %edx # char *av[]; # { # register int i; # register char *p; # int j = 3; # struct { int b; void (*c)(struct aa); } q = {3,main1},r; # # j = 3; subl $20,%esp subl夫ꤷƤOk Ǥ⡢ jump λˤʤ? 뤫? ͡ ¹Ի˥åƤΤѤ ޤۤɬפʵǽǤϤʤɡ continuationϤƤȸˡȤʤȤϤʤ... ؿƤӽФκǽˤäƤФǤǤ뤫? Sun Feb 20 23:59:16 JST 2000 MIPS call frame $sp = $fp local variables saved register (including $31 = return address) mask ϻѤ쥸bit pattern -4 ϲ? 18 .mask 0xc0000000,-4 19 .fmask 0x00000000,0 20 0000 D0FFBD27 subu $sp,$sp,48 21 0004 2C00BFAF sw $31,44($sp) 22 0008 2800BEAF sw $fp,40($sp) 23 000c 0000000C move $fp,$sp 24 0010 21F0A003 jal __main 25 0014 03000224 li $2,0x00000003 # 3 26 0018 000082AF sw $2,a 27 001c 04000224 li $2,0x00000004 # 4 28 0020 00C082AF sw $2,b 29 0024 05000224 li $2,0x00000005 # 5 30 0028 000082A3 sb $2,c 31 002c 06000224 li $2,0x00000006 # 6 32 0030 08C082A3 sb $2,d 33 $L1: 34 0034 21E8C003 move $sp,$fp # sp not trusted here 35 0038 2C00BF8F lw $31,44($sp) 36 003c 2800BE8F lw $fp,40($sp) 37 0040 0800E003 addu $sp,$sp,48 38 0044 3000BD27 j $31 39 .end main Ʊ褦ˤʤСregiterλѿǽĴ٤ɬפ Τɡone path compiler Ǥ micro-C Ǥϡ Ǥʤäơenter ϸǤɤ Mon Jan 20 18:25:27 JST 2003 3ǯ֤äƤʤΤ衣äƤ? goto ʸΥХȤʤȤʤ ޤؿι¤ΤŸϡɤäƤȤʤϤ goto (*code)(i+1,j,...) ޤʤƤѿŦФ롣 foreach arg compare ñ黻 ( op+const , pointer , const assign ) ʤɤϡǸФ롣 ȾϡΤ褦ˤʤϤ 쥸˾褻ʬ뤫... ˤϿʤȤ... ʣʤΤϡäƷƤ(get_register ) å夫쥸˺롣 ĤȤʤ롣ƵŪ˷롣 ȡ礭ʽˤä? ʽˤä? code f( int a, int b, int c ) { goto g(b,c,a); } ߤʤĤ͡ ưΤĸФ롣 Τ˰ưɬפʤΤưƤ(Ƶ) ʤǤΤ? 롼פʤ? ͡롼פ get_register 롣 ȡ g(b,c,a) bܤ롣 b륳ɤФȡa 롣 a ɬפɤĴ٤롣ϡΥꥹȤФ狼롣 ˡa ư롣a ΰươ ƤСưOkc ʤΤǡ c 롣 b ˤʤΤǡ롼פΤ狼Τǡ b get_register 롣 ǡc ưǤ롣ǡaươȤäƤb Tue Jan 21 22:45:09 JST 2003 Ȥꤢjump ʣ롣äȴñˤ뤳Ȥͤ롣 parser ¦ǤٽǤʤ? goto f(a+3,b(),c); ʤɤ a = a+3; b = b(); goto f(a,b,c); ٤˴ά롣λf(a,b,c) (Ǥ) ؿΰꥹȤ˶դ롣Τ̵ʤΤǡñѿ ޤ ޤطʤѿϤɤ櫓äƤ ߤ͡ ȤȡΥɤȡѤ͡Τ⡢ʤ ʤäƤȤ Wed Jan 22 14:33:12 JST 2003 äѤꡢǶɽѿ䤷͡ Fri Jan 31 20:30:36 JST 2003 ʤ #ifdef / #if ʤȤʡ? ޤ Tue Feb 4 01:04:12 JST 2003 ## while ((*chptr++ = c = getc(filep->fcb)) != '\n') { _1120: movl $10,%eax movl $8,%ecx movl filep,%edx addl %ecx,%edx movl (%edx),%edx pushl %edx xchg %edx,%eax .... edx $10 (ʤxchg?) call getc addl $4,%esp movl %eax,-20(%ebp) c movl $chptr,%ecx pushl %ecx popl %ebx movl (%ebx),%ecx ecx chptr addl $1,(%ebx) movb %al,(%ecx) subl %edx,%eax eax-edx ($10) je _1119 ͳʤ... edx,ecx ˲㤦ߤ͡ Tue Feb 4 12:17:07 JST 2003 褦äľ... use_pointer äơʤˤ⤷ʤƤ? eax,ebx äƤȤ餷ɡ inline/դ #define ߤʤ? ֤ϡlocal name stack Ѥ㤦 Ÿ function ǹԤ getch פɬפϤ뤬֤åɬס Wed Feb 5 01:16:00 JST 2003 줿 struct field ѿȽŤʤäƤ롣 㤽ɡɤ? (ľɤʤ...) struct field ̾offset/type ȤƤФɤ͡ ʤɡ̵ι¤Τ⤢뤫顢̾դɬ ⤢롣ȤΤϡ̾Τʤ¤Τ⤢뤫顣̾ˤϡ ꥹȤĤƤ롣ʤ˻ȤɬפäǤ礦 ͡ɤ̵ˤäƤѿ̾Τľ äȡɡַ̾.ե̾פϿƤޤΤϤɤ? ̾ǽФȤޤ... def ϿȤˡnptrdispˡstruct field list (ѿ) ơtype ˡfield list (list3(nptr,offset, type)) ɤ Ȥϡstrop typelist褦ˤɤ櫓 ʤ顢ñľϤLUSTR/GUSTRʤɤζ̤ʤʤ뤷 Wed Feb 5 02:10:14 JST 2003 ưͤANSI CˤΤѡǤ⡢ ư餤ʤȡ code generation part ʬ䤷ơ ʣΥбˤ䤹褦ˤ롣 餯ۤɶͭʬϤʤɤ͡ Sample C code ѥ뤷ơη̤(Ⱦʬư) Micro CbC code generation part ˡѰդ롣 Thu Feb 6 11:47:03 JST 2003 Code Segment ñ̤ȤƻȤȤˡѿϤɤ 褦ʬ? static ʤϰ̣ʤ͡ ˥롼ʬ櫓ɡ ȥǡե͡ǡե˴ؤƤϡ ޤäƤʤʤ Fri Feb 7 14:36:15 JST 2003 inline Ǥϡɬ餺ɽѿä롣ޤinline ̤δؿȤŸƤɬפ⤢餷(?) #define ͤ #define c(a,b) g(a+1,b+1) #define g(a,b) printf("%d %d\n",a+1,b+1); main() { int a,b; a =1; b = 3; c(a,b); } local #define ͡g a Ф褿ˤϡ c a ֤ϵäƤϤʤȤȤϡc ֤g Ϥޤ˽äƤɬפ롣dynamic scope ʤ顢assoc ξ褻ɤϤ macro levelơ٥ǤϡŸ ԤʤȤˡɤʡ c(a,b) => a=>"a+1", b=>"b+1" g(a,b) => (a=>"a+1+1",a=>"a+1"), (b=>"b+1+1",a=>"a+1") ߤʴ? äѤؿϤǥޥ餻Τ̵? ɤߤ㤦 Sat Feb 8 00:53:52 JST 2003 macro ޤǽޤ֤ޥƤӽФ줿 cheap ֤ȡä륿ߥʤ mallocƤɤ.. chptrsave listˤɬפ롣list ɤ äѤmacro levelơʬȰפassoc valueޤ 귫äִǤ礦С֤ɬפ̵ ȤȤϡlocal_define mflagsǼɬפ롣 c(a,b) => a=>"a", b=>"b" a=>"a" .. mflag == 1 g(a,b) => (a=>"a+1+1",a=>"a+1"), (b=>"b+1+1",a=>"a+1") a=>"a+1" .. mflag == 2 macro ΤȤnptr ĤäƤʤȡꥸʥ֤ʤ ꥸʥϡsc ʤɤ˲ƤޤäƤȤϡlocal macro ϡlocal table ƤϤʤäƤȤ͡äƤȤϡ macro table ϡȤΤȤ̤Ѱդɬפ롣 #define c(a,b) g(a+1,b+1) #define g(a,b) printf("%d %d\n",a+2,b+2); main() { int a,b; a ... local a =1; b = 3; #ifndef a c(a, a = "a".. macro mflag==1 g(a, a="a+1" mflag==2 ^ a = "a" mflag==1 While replacing a in g's body, a should not be replaced to (original) "a", should be c's a. b); /* 3,5 expected */ #endif } ࡣ䤳 main() c(a,b) mflag++ a=>"a" mflag ==1 g(a,b) mflag++; a=>"a+1" mflag ==2 ^ is replaced by c's "a" not g's a; ä mflag level n Ÿ顢 mflag level n-1 Ȥʤ롣 Sat Feb 8 18:13:43 JST 2003 mflag ޤǤϥǥХå.... mflag ᤷƤʤʤ? ---c(a,b)----------------------- mflag ==1 a=>hoge, b=>hoga (mflag==1) ----g(ac,bc)----------------- mflag ==2 ac=>goge, bc=>goga(mflag==2) ----printf(a,b)---------- mflag ==3 a=>poge, b=>poga(mflag==3) g ƤӽФȡac,bc mflag==1 ǤΤִ롣 ƥȤ֤ȡ֤ޥmflag level (Ĥޤľʤ٥)ˤʤ롣 ֤ä顢level᤹ mflag==2level Ǥϡmflag==2local macroŸʤ ֤ȡmflag level 1 ˤʤΤǡ mflag==1 local macro Ÿ롣mflag==0 ϾŸԤ Sun Feb 9 11:35:23 JST 2003 ʤtypelist CHARʤɤäƤ뤸 int save = chptrsave; ǡchptrsave $chptrsave ˤʤäƤޤ Sun Feb 9 22:33:36 JST 2003 #define car(e) (heap[(int)(e)]) #define cadr(e) (heap[((int)(e))+1]) car(cadr(e)) car -> #define e cadr(e) (mleve=1) cadr -> #define e e (mleve=2) थ졢ޤʤޤäʤ #define c(a,b) g(a+1,b+1) #define g(a,b) printf("%d %d\n",a+1,b+1); c(a, b); äᤸաࡣlisp interpreter Τ褦 ФϤʤɡ Mon Feb 10 08:10:25 JST 2003 ɡlist base interpreter ޤʤ ˡǤ⡢ĥФǤǤ礦ɤ͡ Tue Feb 11 13:50:03 JST 2003 struct copy ... ؿstruct֤Ȥˡä ѤǤΤǤϡͤԡƤޤȤǡ å֤Ȥˤޤ function call λˡηΥåƤʤ type -1 heapΰߤƤĤ.. äѤޤʤ? temporal struct ϺѤǤɡdispѹǤʤΤ 뤷ʤ礭ȤʤƤ Ϥ뤱ɡ(ȡä褿ͤؤΥݥȤʤ ʤ뤬.... ̤ˤͤ͡켫Ȥľ return 礦֤ʤϤ) ɡƽ¦ǡΰݤưϤȤˤޤˡȡ ΤȤ٥ԡɬפʤ register ѤƤ뤫ʤơºݤcreg/dreg ͤ뤫ɤɬפ롣 Wed Feb 12 11:09:22 JST 2003 ɤ... äѤꥢɥۥå˼¸Τʤ? ޤͤregister ξγݤȡ̤̿顢 ɡregs flag ǤʤȤʤʤΤʡ ѹϤϤޤ뤬 Thu Feb 13 18:37:36 JST 2003 ơ jump ˤȤ꤫ޤ ¤ΤΰϤΥ˻Ȥɽѿΰ֤gccȰ㤦... register Ϲ¤Τˤ٤͡ struct register { int used; int valued; char *name; char *wname; char *bname; int type; /* register variable or not */ int number; } virtual/real ϡɤ롣 Sat Feb 15 14:00:03 JST 2003 fdecl_struct ʸŪ˰иȤ˹Ԥȡint *f(int a) ʤɤǡ* ɾˡint aɾ줷ޤ*obj obj ɾʤfΥפꤷʤint*f()[] ʾ礬뤫顣(?) ʤΤǡgcc ȡ뤿ˤϡ arg Ƭ fdecl_struct ԤˡǤϤǡfdecl Ǥ Ȥ齤ɤ fix 褦ˤꥹȤʤơ¸ߤʤ! varargs ΤϤɤ... rvalue(expr(),type) Ǥϡexpr() typervalue˰Ϥ Ǥ⡢type ѿˤȡrvalueۤʤ륿פǸ ӽФȤtypeѹɬפ롣rvaluetype ΰ ϡʤϤޤäȤΤǡrvalue(int e,int type) ɤȤϳΤʤ... struct_push registerΰʣʤä ñˤʤʤ? Sun Feb 16 07:58:23 JST 2003 ʤɤȸäơ ΥꥹȤƤϡɤʤ Sun Feb 16 22:55:58 JST 2003 vdisp äƤʤä? Mon Feb 17 12:35:39 JST 2003 Ͻ褿ߤϾΤˤ٤ʤΤ? ޤǤ㤤ɡΤ礭ΤϤ ͡ Tue Feb 18 11:56:10 JST 2003 overlapped Ѥ emit_copy float/double long long Tue Feb 18 19:34:31 JST 2003 code argument ȿžȡlist2(LVAR,offset) offsetɥ쥹ȰפƤȤ 롣ǡ¤ΤγǼƤޤ... ȤȤ... def(n) codeλargumentϡɽѿƱ ǥޥʥǽɤ ǤߤǤ⤵ int main( int ac, char *av[]) { int n; goto arg1(0,1,2,3,4,return,environment); } äơä return ʸʤȡʸ ͡ࡣ post processing overlapƤʤȤݾڤʤ Wed Feb 19 15:38:55 JST 2003 ʬȤȤoverlapƤʤΤǡ struct a a,int i int i,struct a a ߤʻ˼ʬȤƤޤʤΤǡemit_copy Ʋʤ褦˽ɬפ롣 call bcopy Ǥޤ͡ Wed Feb 19 20:42:07 JST 2003 ̤ C2CbC CbC2C micro C ˼ࡣƽˡ conv->func(); ࡣconv ϡ¤Ρ conv: original c2cbc cbc2c Ȥ롣ʤۤɡ Thu May 6 08:32:05 JST 2004 äѤ library ⼫ʬǺʤȤ͡С CbC only Ǻ뤫顣 conv ϡޤɤǥǤϤʤߤ뤫 Thu May 13 12:59:16 JST 2004 byte code interpreter CbC Ȥǽ? ǤäѤưʤ顢ޤ̣Ϥʤ... C ǽƤ⤤ Wed Dec 22 15:17:49 JST 2004 reset { shift; } ͤ ʤǡreturn ʸˤΤ̡ˤΤ goto ret(value),env; ޤͤ try { .... goto event .... } catch (event) { } Ƥ⤤ɡ ࡢޤʡ inline function return,env äƤ⤢뤱ɡ äѤꡣsetjmp = return ߤˤ? Ϥǡ 䤵.... Fri Jan 6 20:26:24 JST 2006 environment = interface frame ؤѰդʤȤ͡ Mon Jan 30 21:53:11 JST 2006 packet_put ..... fork packdet_put(interface hoge); packet_get ..... join interface hoga = packdet_get(); ----> distributed CbC Synatx code a() { } code a(a):b(b) {... } -> code a() { if (b = packet_get() { ..... } else goto a(); } code a() { goto b(); } code a() { goto b():d()@dest; } -> code a() { packet_put(d(),dest); goto b(); } Wed Sep 6 14:59:09 JST 2006 code hoge(int a, code f(int k,...), ...) { goto f(a,...); } syntax ... type λϤʤȤʤȤ͡ ... int a, 줿ȤΥȤʤɤʤ͡ ǽȤϻפɡ __meta goto { } ߤʴ?