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 {
      }

ߤʴ?