Mercurial > hg > CbC > old > device
diff Idea @ 724:e60c3d8dadd6
convert to UTF-8
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 08 Nov 2008 15:11:06 +0900 |
parents | f536897fa3cb |
children |
line wrap: on
line diff
--- a/Idea Fri Nov 07 20:12:29 2008 +0000 +++ b/Idea Sat Nov 08 15:11:06 2008 +0900 @@ -1,88 +1,88 @@ Thu Nov 25 17:27:12 JST 1999 -subroutine call がない -局所変数もない -その代わり、大域変数を多用する -大域変数のスコープは局所的 -Fortran の用に局所変数は静的に取る -recursion する時には、自分で保存する -subroutine call時のレジスタのセーブも局所的に行う -それは、ちょっと変じゃない? -やっぱりデフォルトのフレームは持ち歩くか? - -recursive call とそうでないのを区別するか? - -fp は用意する方が良い - -関数定義と同時に、それ専用のfpの構造体を用意する - -C をcompileする時には、stackを持ち歩く +subroutine call +絮紊違 +篁c紊у紊違紊 +紊у紊違鴻潟若絮 +Fortran 絮紊違 +recursion т絖 +subroutine call吾鴻帥祉若絮茵 +<c紊? +c宴若≧? + +recursive call с阪ャ? + +fp 鴻 + +∽医臂絨fp罕篏 + +C compilestack≧ fp = (struct func_state *)stack -えっと、どこに代入するの? そういう問題もあるわけね。 -じゃあ、fpは特別? それは気に入らないな。static -なfpにすれば良いわけね。 +c篁eャ? 馹 +fp劫? 羂ャstatic +fp域 func(void *stack) { static struct func_state { static struct func_state *fp; int local1; brahbrah... - } func_state; // ここまで hidden + } func_state; // 障 hidden func_state.fp = (stack -= sizeof(struct func_state)); } -func_state をとってくる演算子があった方が良い? そうね。 +func_state c羲膊絖c鴻? func.state -ぐらい? - -fp->local1 みたいなことだけするなら、C と同じになる。 - -call する時のargument も、 - static な func_state に置く - stack 上の func_state に置く -という二通りの選択肢がある。Cと互換なら、当然、後者。 - -Recursive なら後者だが、この言語は状態遷移を記述するから、static -なものでも良いはず。 - -Internal function は? あってもいいんだけど... - -Recursive call する時には、 fp をsaveする必要があるね。 +? + +fp->local1 帥C + +call argument + static func_state 臀 + stack 筝 func_state 臀 +篋御≪C篋綵吟緇 + +Recursive 緇荐茯倶欠Щ荐菴違static +с + +Internal function ? c... + +Recursive call fp save綽荀 (--(struct func_state *)stack) = fp; call callee(&fp->arg,continuation,stack); -call しても、戻って来ないから... continuation は一般的にはcode -だから... それは Internal function にするか。 - -continuation に一般的にcompileする方法を考えないといけないか。 -self は必要なわけね? - -言語の名前も考えないといかんなぁ。 - -C からのコンパイラも書かないといけないのか... +call 祉cャ... continuation 筝code +... Internal function + +continuation 筝compile号 +self 綽荀? + +荐茯 + +C 潟潟ゃ吾... Mon Dec 13 18:53:04 JST 1999 -compiler based で、内部で partial evaluation できる? - -func をdatabaseとして扱えないなら、それはできない。 - -しかし、状態遷移としては取り扱える。 +compiler based с partial evaluation с? + +func database宴с + +倶欠Щ宴 func.state func.code -みたいな形にしてpartial evaluationすれば良い - -でも止まるのか? - -textual でない、中間的なコード表現があった方が良い? <-> interpreter? - -Prolog ではなんでいけないの? --> Unification が重いから +帥綵≪partial evaluation域 + +с罩≪障? + +textual с筝潟若茵憗c鴻? <-> interpreter? + +Prolog сс? --> Unification Sat Nov 27 13:50:41 JST 1999 -func.state とか作るのだったら、 +func.state 篏c struct { struct { int i; @@ -91,11 +91,11 @@ i = i+1; }; } name; -みたいな形で、それ自体を構造化すれば? で、代入すると部分評価される。 -代入も可能。なるほど。 +帥綵≪с篏罕? с篁eャ荅箴< +篁eャ純祉 *name.code; -値はあるわけ? 値は &state でしょうね。 -self があれば、 +ゃ? ゃ &state с +self 違 struct { struct { int i; @@ -104,39 +104,39 @@ self->i = self->i+1; }; } name; -かな。self = state だよね。 - -union の拡張もあわせて議論すると... - -Partial evaluator をセマンティクスや実行系にいれておくことは可能か? - -byte code とか仮想マシンだったら可能。そうでない場合は? - -いずれにせよ、構造体のタグのunique性を修正しないとだめだな。 - -ヘッダファイルはどうするの? +self = state + +union ≦宍茘域... + +Partial evaluator 祉潟c鴻絎茵膤祉純? + +byte code 篁潟激潟c純с翫? + +罕篏帥違uniqueс篆罩c + +<ゃ? Mon Dec 13 18:53:18 JST 1999 -library との整合性は? - -exec sequence では、 +library 翫с? + +exec sequence с (--(struct func_state *)stack) = fp; call callee(&fp->arg); -という形でpointerだけ渡すの? それは変だよね。 - -値渡しにするとすれば、複数の値を渡せたほうが良い。 +綵≪pointer羝<? 紊 + +ゆ検違茲違ゃ羝<祉 func(void *stack) { static struct func_state { static struct func_state *fp; int local1; brahbrah... - } func_state; // ここまで hidden + } func_state; // 障 hidden func_state.fp = (stack -= sizeof(struct func_state)); } -の引数自体が、構造体であるべき。 +綣域篏罕篏с鴻 func( struct void *stack @@ -145,11 +145,11 @@ static struct func_state *fp; int local1; brahbrah... - } func_state; // ここまで hidden + } func_state; // 障 hidden func_state.fp = (stack -= sizeof(struct func_state)); } -で、構造体に register storage を許す。 +с罕篏 register storage 荐宴 func( static struct argument { @@ -161,11 +161,11 @@ static struct func_state *fp; int local1; brahbrah... - } func_state; // ここまで hidden + } func_state; // 障 hidden func_state.fp = (stack -= sizeof(struct func_state)); } -すると、caller の方も、構造体を引数とするのが自然。 +caller 鴻罕篏綣違吟 call caller( static struct argument { @@ -174,23 +174,23 @@ } arg = {a,b}; ) -みたいな。もちろん、この構造体はインタフェースと呼ばれる。 - -argument は、callee にあった方が良いけど、caller 側にあっても -良い。register なんかは、そう。 +帥<罕篏ゃ潟帥с若鴻若違 + +argument callee c鴻caller 眼c +register caller(interface caller_arg = {a,b,c}) -みたいなsyntax かな。 +帥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 code state + +state ≪祉鴻lock? protected state? synchronized state ? +<sequential implementationс function { interface: @@ -203,72 +203,72 @@ b = a; } -int にvoid value を定義する。実装は重くなるけど... - -serialized の semantics は? - -もう少しmicro-Cに近く! - -carrying state と static state。 +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個とかかかれたら... +interface register keyword 篏帥障 +絎茖сс倶с? +c宴caller眼static +贋・吾莨若? + +Cс綣違40... Wed Dec 15 14:09:49 JST 1999 -C と互換にする? +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 の時を区別するか。 +帥с + +stack膊∞? library 篋 +... + +local 紊違翫 stack с祉絅眼 +closure ? + +return 茲紊уreturn + +arguments static 劫篋с +stack 筝 frame pointer 筝< + +筝∞∞? ゃ障若喝冴鴻 +frame semantics C 篋stack翫 +frame pointer c (? ) frame pointer +stack pointer 羃帥c腱糸翫offset +у違篏 + +ゃ障c? ゃ障goto +frame pointer stack 翫 +frame pointer 後障綣違≪祉鴻医ャ + +stack 綣違腥絎壕goto 翫眼 +stack 潟c? ∽違絎臂 +号紊c障 + +goto semantics C 篋 +鴻違 +∽医若喝冴荵純... + +C call call function +絎憗篁若喝冴鴻goto 宴 +鴻罩c + +馹荐茯∽違calldual entry +call goto 阪ャ func: stack processing func_goto: normal processing ... -みたいな感じ。でも、return はないから... - -このあたりも自分で記述できる言語であるべきだよね。その通り。 -つまり、C とのstub も自分で記述すると言うことか。 +帥сreturn ... + +ц菴違с荐茯с鴻 +ゃ障C stub ц菴違荐 protocol function { interface c { @@ -288,120 +288,120 @@ }; } -みたいな感じでさ。さっすが、アセンブラ。いまいちreturnが汚いけど。 -まぁ、return はそのままreturnでもいいけどさ。 - -あ、これは良いかも知れない。code が複数かけるから。 - -state 以外は、consistent state であることを保証しない。ってのは? -local 変数は使っても良いけど、call/goto の前後で、値を保証しないか... - -うーん、だんだん炸裂してるなぁ。 - -だから、レジスタに対するマッピングの記述と、そうでない部分の -記述は分離するべきでしょうね。 - - -全部一辺に実装するわけにはいかないからぁ... +帥сc≪祉潟障return羆 +障return 障returnс + +ャcode 茲違 + +state 篁ュconsistent state с篆荐若c? +local 紊違篏帥ccall/goto 緇сゃ篆荐若... + +若梧 + +吾鴻帥絲障潟違荐菴違с +荐菴違≪鴻с + + +筝莨冴絎茖... Thu Dec 16 13:44:21 JST 1999 -lock は状態遷移レベルで実現するのだから、self などを -使ってlockする必要はないはず。 - -全体の直列化は、状態遷移レベルで、 +lock 倶欠Щу憗self +篏帥clock綽荀 + +篏翫倶欠Щс lock(storage) -> transition -みたいな形で記述すれば良い。この当たりを、どのように記述するかは -もう少し先送りしよう。 - - -引数はレジスタ渡しにしよう。長い引数は、呼び出し側の領域への -ポインタとする。実装を規定しても良い。そうすれば、varargs -みたいなものはなくなる。だいたい、なんで、そんなものがいるんだろう? -配列を渡せばいいじゃん。 - -なので、引数は一つ(or 二つ)に限るという方法もある。 - -とすると、やはり、前もって静的領域や動的領域を確保することは -できない。 - -この言語では動的領域は自分で確保するわけだから、その点は問題ない。 +帥綵≪ц菴違域綵荐菴違 +絨 + + +綣違吾鴻炊検激綣違若喝冴眼吾 +ゃ潟帥絎茖荀鎘違varargs +帥с? +羝<違 + +с綣違筝(or 篋)号 + +c腆坂 +с + +荐茯сх∈篆鴻馹 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 -ということにする方が正しい。とすると引数は、さらに、その -後と言うわけか。 +綵√second 筝 + + +若frame pointer 潟潟ゃ +c鴻frame pointer static +障frame pointer first argument +鴻罩c綣違 +緇荐 f(fp,argument) -fp を渡すのにさらにargument をレジスタで渡すのはおかしい。おかしいけど、 -ま、良いか。 - -return しないなら、return type の定義をとるのは変だな。 - -f(fp,arg1,arg2,arg3) とすると、それぞれが決まったレジスタに入って、 -多い分は配列にあると思われる。ふむふむ... +fp 羝<argument 吾鴻帥ф検 +障 + +return return type 絎臂紊 + +f(fp,arg1,arg2,arg3) 羆冴障c吾鴻帥ャc +紊泣泣... fp->xx -でアクセスすれば、そのまま局所変数になる。全部、配列で -送っても良い。 +с≪祉鴻違障上紊違 +c .set label,value -で as は値をセットするようですね。 - -関数コールの後は戻って来ないから後始末の心配はしなくてよい。 -frame pointer を使ったら自分で面倒を見ること。 - -だと + as ゃ祉с + +∽違潟若緇祉cャ緇紮綽 +frame pointer 篏帥cч√荀 + + a = atoi(s); -みたいなことはできない... - -普通のCの定義と交じると間違いやすい。 - -とすると、struct と同様に、 +帥с... + +C絎臂篋ゃ + +struct 罕 protocol code interface state -を用意するわけね。時間あるのかぁ? - -とりあえず、register 渡しのfunction 定義とgoto文を実装する。 +? + +register 羝<function 絎臂goto絎茖 code name(register "%ebp" void *arg) { goto name(arg); } -ぐらいかな? で、first argument が必ずregisterにのるようにしないと -いけない。register storage class を入れて、 +? сfirst argument 綽register +register storage class ャ register "%ebp" void *arg -とかするわけね。 - -ってことは、まず、レジスタを実装しないといけないわけね。 - -で、stack を使った演算は、一応、そのままにする? それでも動くはず。 -式の途中でgotoは使えないんだから、それでいいはず。 - -で、それから、これを拡張していく。 + + +c障吾鴻帥絎茖 + +сstack 篏帥c羲膊筝綽障障? с +綣筝goto篏帥с + +с≦宍 interface c { register "%ebp" void *arg; } code name(interface c) { - goto name(c.arg); // c. は省略可能 + goto name(c.arg); // c. ュ } -とかね。さらに、 + protocol name { interface c { @@ -415,28 +415,28 @@ } } -などとするわけか。なんと、これが C と共存するわけね。うーん。 + 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 сャ祉? segment? action? + +吾鴻水ャc宴optional荐宴 + +interface 罕篏... 罕篏с? +罕篏翫... malloc ? 若malloc +free ? + +ャ紕? multi-thread с違 +multi thread с倶吾鴻睡宴障thread local +綽荀static thread local +紊у紊違蚊c<с障 + +interface 篋ゃ障сゆ検 + self arg +с + +絨≦宍潟潟ゃ code name (c,a) struct state *c; struct arg *a; @@ -444,62 +444,62 @@ goto name(arg); } -local 変数は? この互換性の問題かぁ。 - -KL/1 を意識して、interface は heap に置くことにしても良い。 -GC は言語に入れておくべきだが、interfaceは machine independent -であるべき。だとすれば use/forget みたいものはいるだろう。 -でも今のところは考える必要はない。 - -えーと、 +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を選択できるようにする。 +筝紊i? 堺吾鴻水蚊綵... +篏睡? 若紊ц緇≧頳障c宴heap蚊綵< +膂≦с... + +祉紊違罨<callс綽荀< + +吾鴻水違綽荀с? + +GC 荐茯荐荐鴻API 荀鎘 +違GC御с Sat Jan 1 22:40:22 JST 2000 -とーにかく、 storage class register を実装しよう。 +若 storage class register 絎茖 stmode=REGISTER -で、local storage とおなじ扱いとする - static register? は、ない。 - -symbol table に storage class をたせば? dsp==EXTRN で判定しているから、 -local 変数が36以上あるとおかしくなるぞ? - -sc は GVAR/LVAR だけど、register は LVAR の特殊な奴だから、 -sc に入れるほうが正しいか... +сlocal storage 宴 + static register? + +symbol table storage class ? dsp==EXTRN уゅ +local 紊違36篁ヤ? + +sc GVAR/LVAR register LVAR 号絅眼 +sc ャ祉罩c... Sun Jan 2 01:47:17 JST 2000 -register 変数はできました。けど、register を二つ使うと、 -一杯になってしまうので、REGISTER6 でコンパイルしないと -結構ひどい。が、register 変数を%esi,%edi に割り当てれば -いいか。 +register 紊違с障register 篋や戎 +筝c障с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" @@ -520,27 +520,27 @@ .size code,_5-code .ident "Micro-C compiled" -う、すごい。 - -goto 文がめんどくさい。stack をたたんで、jmp すれば -よいだけだが.. + + +goto stack сjmp +.. Sun Jan 2 11:17:50 JST 2000 -普通のcallをcontinuation baseにすることができる? +callcontinuation baseс? Sun Jan 2 20:28:45 JST 2000 -goto 文だけど、やはり、一度、expr で生成してから、top level -で jump code を生成しよう。 +goto 筝綺expr хtop level + jump code Tue Jan 4 03:32:55 JST 2000 -code をtypeにしないと、 +code type code *p; -とか書けないね。 +吾 int *p(); -と同じだけどさ。 + main(ac,av) @@ -562,21 +562,21 @@ Tue Jan 4 04:56:56 JST 2000 -うーん、なんかレジスタにつむ順序が違う -これは、adecl がreverseにつむから。 - -code のreturn - -やはりcodeはtypeにしないとだめ。 +若吾鴻帥ゃ綺 +adecl reverseゃ + +code return + +codetype main() { goto code1(); } -とかだと、main に戻って来れない。もちろん、code1() 以降で、 -return するわけにはいかない。(main の disp をcode1 は知り得ない) -goto label をcode1の引数に送れば? +main 祉cャ<code1() 篁ラс +return (main disp code1 ャ緇) +goto label code1綣違? main() { @@ -584,20 +584,20 @@ ret: } -これだと、ret がforward labelかどうか分からないけど? - -code1 中で使う中間変数を stack 上にとるのは悪くない。しかし、それを -%ebp 経由でアクセスするということは、main の中間変数を壊すということ。 -それを防ぐには、main 中のgoto codeで、%ebp を修正してやれば良い。 -(今は戻って来ないので問題ない) - -code1 のgoto では、戻って来ないから、その必要はない。しかし、 -label をcode1 中で渡されると、ちょっと気まずい。 - -とすると、それは禁止して、main() 中でstackをたたんでからgotoするか? -そうすると、無限後退して、結局、帰れないことになる... うーん。 - -main() 中のlocal code を許せば、それは解決するが.. +ret forward label? + +code1 筝т戎筝紊違 stack 筝 +%ebp 腟宴с≪祉鴻main 筝紊違紕 +蚊main 筝goto codeс%ebp 篆罩c域 +(篁祉cャу馹) + +code1 goto с祉cャ綽荀 +label code1 筝ф検<c羂障 + +胼罩≪main() 筝stackсgoto? +♂緇腟絮絽違... 若 + +main() 筝local code 荐宴違茹f浦.. main() { @@ -607,10 +607,10 @@ } } -みたいな感じ。でも、そうするとscope rule を変える必要があるので厳しい。 -ま、悪くはないけどね。 - -continuation を明示する方法もある。 +帥сscope rule 紊綽荀уウ +障 + +continuation 腓冴号 main() { @@ -622,17 +622,17 @@ goto *ret; } -かな? call/cc ? - -label へのgotoを許すのもいいけど、 -でも、label を許すと、すごくspaghettiにならない? +? call/cc ? + +label 吾goto荐宴 +сlabel 荐宴spaghetti? Tue Jan 4 11:47:24 JST 2000 -continuation じゃなくて、return keyword を使おう。 -(実際、continuation と少し違うし) -type が少し変になるけど、まあ良い。 +continuation return keyword 篏帥 +(絎continuation 絨) +type 絨紊障 int main() @@ -645,33 +645,33 @@ goto *ret(3); } -だな。prototype も付けないといけないか。 +prototype 篁 Tue Jan 4 12:21:44 JST 2000 -これだとmethodがすべてstatic になってしまう。dynamic なmethod -呼び出しにするには? dispatcher を自分で作ることになる。かなり -めんどくさいが... +method鴻static c障dynamic method +若喝冴? dispatcher т +... code method(obj,arg) { } -か、あるいは、inline にするか... #define のかわりに inline ねぇ。 -これはあとで考えて良い。 +inline ... #define inline +ц Tue Jan 4 14:22:19 JST 2000 -main の変数を書き潰すのと、goto (*reg)(123) での値は、 -register 渡しで、current register にのらないので、 -結局、return label は専用に作る必要がある。 +main 紊違吾羹違goto (*reg)(123) сゃ +register 羝<сcurrent register с +腟絮return label 絨篏綽荀 Tue Jan 4 18:14:07 JST 2000 -stack を継ぎ足して、呼び出す方式を取れば、call by value -のregister 渡しを制限する必要は無くなる。 - -複数の値を返すことも容易だ。 +stack 膓莇潟若喝冴劫違call by value +register 羝<狗綽荀< + +茲違ゃ菴絎号 .file "tmp.c" .version "01.01" @@ -692,7 +692,7 @@ .size code,_5-code .ident "Micro-C compiled" -おお?! +?! %esp new %esp = old %esp - 12 -4 %ebp-4 = g %esi = a @@ -703,16 +703,16 @@ %ebp+12 = e %ebp+16 = f -interface は付けよう! というか、 +interface 篁! goto name(struct {xxxx}) -みたいな感じで良いわけね。どれをregisterにいれるかと言う問題はあるが。 - -で、どうやってcallすればいいわけ? emit_pushするかわりにpush -する? - -うう、これでは、だめか。code argument の数が変わると、 -ebp をいちいち動かすことになる。そこにはold sp があるから -そいつもコピーする必要がある。 +帥цregister荐馹 + +сccall違? emit_pushpush +? + +сcode argument 違紊 +ebp <≦old sp +ゃ潟若綽荀 %esp new %esp = old %esp - 20 %ebp-20 = g @@ -724,7 +724,7 @@ %ebp-4 = f %ebp = old %esp 0 -そうか、function からcallする時には、local 変数を書き潰して良い。 +function calllocal 紊違吾羹違 # goto name(a,b,d,e,f); @@ -744,135 +744,135 @@ %ebp = %esp 0 %eip 4 <- arg_offset -となる。ということは、pushl %ebp は、間違い。 - -だけど、%ebp をそのまま使うのは良くない。disp_offset がかかっているから。 -だから、もう一度 pushl %ebp したほうがよい。しかし、push する先は、 -上の、(*)。 +pushl %ebp + +%ebp 障鞘戎disp_offset c +筝綺 pushl %ebp 祉push +筝(*) leave movl %ebp,%esp popl %ebp -じゃなかったか? +c? 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 が値を持つようになる。 +goto c peep hole optimization version +篏? + +continuation label 鴻? +箴水<c羆違 +堺ャ眼医(frame)膓 +綽荀障с... + +label ゃゃ a = label:; -とか。うーん。label:(a,b,c) {}; みたいな形で、parallel 代入を許すと言う -手もあるね。 - -こちらの方がCとの相性は良いが... main() { label:(){ ... } } -みたいなnestを許すかどうかと言う問題がある。 -変数の参照を許さなければ、特に問題はない。 - -a = label: は、二重の意味があるなぁ。 - -言語の名前。DinnerBell II とか? join も入れる? +若label:(a,b,c) {}; 帥綵≪сparallel 篁eャ荐宴荐 + + +<鴻C御с... main() { label:(){ ... } } +帥nest荐宴荐馹 +紊違с荐宴違鴻馹 + +a = label: 篋潟 + +荐茯DinnerBell II ? join ャ? code entry_a().entry_b() {} -ですか? parallel call も? +с? parallel call ? Fri Jan 7 19:53:53 JST 2000 -いまのままだと return が環境を持ってないから、大域脱出できない。 -まぁ、環境を入れてもいいんだけど、どこに置くかと言う問題が -あるね。 - -そうじゃなくて、return 側で判断するか? +障障障 return 医c紊у怨冴с +障医ャ臀荐馹 + + +return 眼уゆ? return(ID) -みたいな形でIDで判断する。そうすれば、return 側でID -を見て判断できる。けど... - -まぁ、はやり、環境を持って歩く方がいいかなぁ。でも、 -引き渡しているから、二つ引き渡して、片方を使われたときに、 -反対側が消えてしまうのはいたいよね。今のままならば、 -そういうことは起こらない。 - -continuation 特有の問題を避けるなら、このままでもいいんだが... -continuation や環境は、このシステムでは自分で作ることが -できるからね。 - -そうなんだけど.... retlabel や retcont は実はオブジェクト -全体に一つあれば良い。 - -引数を渡すときに、そこに環境へのポインタをいれてやれば良いので、 -解決は割と簡単だが、そうすると、例の構造体を引数で渡すと言う -問題を解決する必要がある。 - -でも、今の実装ならば、まったく同じ変数の構成ならばコピーは -実際には起こらないわけだから問題ないはず。特に、それを保証するために、 -interface を実装する必要がある。 +帥綵≪IDуゆ違return 眼ID +荀ゆс... + +障医c罩鴻с +綣羝<篋ゅ羝<鴻篏帥 +絲上眼羔障篁障障違 +莎激 + +continuation 号馹帥障障с... +continuation 医激鴻ст +с + +.... retlabel retcont 絎吾с +篏筝ゃ域 + +綣違羝<医吾ゃ潟帥域с +茹f浦蚊膂≦箴罕篏綣違ф検荐 +馹茹f浦綽荀 + +с篁絎茖違障c紊違罕違潟若 +絎莎激馹鴻篆荐若 +interface 絎茖綽荀 return -> (void *)old bp return address -bp を直接操作できるようにするといいんだけど.... +bp 贋・篏с.... Sat Jan 8 08:49:59 JST 2000 -今は、code 内ではreturnできないわけだけど。実は、return って、 +篁code сreturnс絎return c 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冴? + +doreturn() с retpending 祉control=1 +障障сcode 腟с若checkret +statement 綣違уゆ祉 + +紊у怨冴腟罕鴻羞宴筝鴻? +destructor с筝code若潟 + +bp 障 return 域 +return с腓榊医綣羝< +type void * ц? + +return stack筝莇сс +綽荀茯違returncodeф腓冴域 code return0(i) int i; { return(i); } -を許して、そこで、frame pointer を大域あるいは渡した引数と -比較して処理する? +荐宴с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 で良いわけだが、 -このあたりは、言語外の問題で、それを明示的にしたいから、この言語を -作っているわけなのだから、これを内部で処理するのはおかしい。 +紊若喝冴絽違... +絎絽違c + +return 筝с罸莠 + +馹destructor 羝<宴<self ц +荐茯紊馹с腓榊荐茯 +篏cу code return0(i) int i; { return(i); } -これだと、return の型が合わないと言う問題が生じるな。簡単には -チェックできない。 +return 荐馹膂≦ +сс int main() { code a() { @@ -881,7 +881,7 @@ return(i); } } -にすれば、check はできるようになる。でも、これだと、 +違check сс int main() { a: { @@ -890,149 +890,149 @@ return(i); } } -と差がない。module 化を言語外でやるというのが主旨なのだから、これでは -まずい。これは高級アセンブラなのだから。 - -あそうか、return と、大域脱出時のabortとは、状況が違う。だから、 -別なcode を呼び出さないとだめ。あるいは、値で区別するか。これは、 -logic programming のfail/success と似ている。 +綏module 荐茯紊с筝紙с +障蕭膣≪祉潟 + +return 紊у怨堺abort倶 +ャcode 若喝冴ゃу阪ャ +logic programming fail/success 篌若 main() { } abort { ... } -でもいいけど? +с? main() { code abort { ... }; code return { ... }} -かな? - -本来、subroutine call自体が、かなりの省略形なわけだから、これは -仕方がない。今のままで通常のsubroutine callをシミュレートできるのか? +? + +ャsubroutine call篏ュ就 +篁鴻篁障障ч絽吾subroutine call激ャ若с? code (struct arg {...},void *sp) { struct env; push(sp,arg); push(env,arg); } -できるけど、ちょっと重い。やはり、frame pointer を直接操作しないと -だめ。 - -goto 文のほうに、env を一緒に送るものを作ったほうがいいのかも。 +с<cframe pointer 贋・篏 + + +goto 祉env 筝膩篏c祉 goto (*ret)(),environment; -かな。type は? (void *)? +type ? (void *)? goto ret(),environment; -にはならないの? そうすれば、自分でthreadを制御できる。environment -の正当性を評価しなくて良いの? まぁ、ねぇ。 - -これは実装は容易だが... goto といちいち書くのが本当にいいのか? -env に対するoperationがあった方がいいなぁ。push とか? +? 違thread九勝сenvironment +罩eс荅箴<? 障 + +絎茖絎号... goto <≧吾綵? +env 絲障operationc鴻push ? code return0(i) int i; { return(i); } -を認めれば、return 擬変数はいらなくなる。 - -でも、実は、return は、caller の引数の数と一致してないといけない -わけだから、 code return0(i) int i; { return(i); } はだめ。env -と一致してないといけない。ということは分離するとまずいんじゃない? -あれ? そんなはずないな。 +茯違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 の、 +帥ゃ障DinnerBell self message: arg -と同じ。self->func(arg); でも良い。が、function callと区別が付かないのは -良くない。 - -そうすると、type code はsize int でなくなる。 +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 -に積んでいるわけだから。 - -いずれにせよ、 +сcurrent environment pushl %ebp stack = current env +腥с + + struct p = q; -は実装する必要がある。localな、 +絎茖綽荀local code p = {func,env}; -も動くはずだが... +... code (*p)(); goto (*p)(arg); -はだから少しおかしい。これは、goto がenv を補っていると考えるべき。 - -このようにすると、常に、 +絨goto env 茖c鴻 + +絽吾 func,env -の組をcodeとみなすことになる。これは、object と呼ぶべきだ。 -ただ、既存のobjectとは別だよな。actor の方が良い? - -うーん、これでjoinを入れれば、完璧なDinnerBellだな。並列送信はないけど。 +腟code帥object 若吟鴻 +√objectャactor 鴻? + +若joinャ違絎сDinnerBell筝篆< Sun Jan 9 01:40:05 JST 2000 -local 変数の初期化はallocation の後に遅らせる必要がある。 -nptr に入れられるはずだよね? nptr に初期化フラグを足すか? - -文途中で出現するlocal変数の初期化。ちゃんと動いているの? - -構造体のcopyは、lcheck を修正すべきでない。 +local 紊違allocation 緇綽荀 +nptr ャ? nptr 違莇潟? + +筝у榊憗local紊違<? + +罕篏copylcheck 篆罩c鴻с Sun Jan 9 08:49:43 JST 2000 -うーん、なんか修正が多いなぁ。あと、関数呼び出し、goto 文の -構造体への対応か。 +若篆罩c紊∽医若喝冴goto +罕篏吾絲上 goto (*code)(); -が、self env を使うのか、code の先の値を使うのかを区別する -必要がある。もし*を使わないとするとlabel(FNAME)との区別が -つかないぞ。あ、でも、環境を持ち歩くことにしたから、label -へもjumpしようと思えばできるね。 - -並列送信はなくても、この構成ならばstatement単位の並列性を検出するのは -容易だろう。 - -やればできるけど、この修正の量だと1日じゃ終らないかなぁ。 -不動小数点も入れるのでしょう? +self env 篏帥code ゃ篏帥阪ャ +綽荀*篏帥label(FNAME)阪ャ +ゃс医≧label +吾jump違с + +筝篆<罕statement篏筝с罎冴 +絎号 + +違с篆罩c1ャ腟 +筝絨亥鴻ャс? Mon Jan 10 09:00:12 JST 2000 -引数に構造体を許すには、必ずANSI-Cにする必要がある。難しくは -ないが... - -goto 文には label, code, continuation の3つが来る。 +綣違罕篏荐宴綽ANSI-C綽荀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 は? - -一応、できたけど、やっぱり汚い。 +code/label сenv 絎鴻違с育∝純 +箴≦ゃ? + +code , env ≪障演冴goto +演冴? 鴻膂≦膂≦c<号 +鴻? 若 + +return ∽遺絖с鴻 +筝ゃpop 馹ц... + +ret env絎祉leave 綽荀 +cpush %ebp 後lea -disp(%ebp),%sp +фサjump function箴絖 + + +с羆read only絮сhardware supportс違 + +sched_yeilds() 後吾? lock ? + +筝綽сc宴羆 Wed Jan 12 16:12:27 JST 2000 -あは。ANSI prototype はめんどい。 +ANSI prototype bexpr() -で、関数での引数の順序と、そのあとの宣言の順序が変わることがある。 -そうすると、うしろの方が優先されてしまう。これは、こまる。 - -そうか、code_arg_offset のような方法だと、ANSI style では、 -困ってしまう。 +с∽違с綣違綺絎h綺紊 +鴻障障 + +code_arg_offset 号ANSI style с +違c障 Thu Jan 13 04:46:12 JST 2000 @@ -1058,34 +1058,34 @@ Thu Jan 13 13:38:24 JST 2000 -だいたいできたけど、test/tmp7.c のprintf のtype mismatch は -なんなんだろう? ASNI の副作用だろうなぁ。 - -これだと、プロセスの切替えのときには、結構な量のデータを -コピーすることになる。それでもいいんだけど... - -それごと、どっかにとって置く。continuationへの参照みたいなもの -ができないかな。 - -コピーができれば、environment/return の組は動くわけだから、 -それへの参照と切替えがあっても良いよね。 +сtest/tmp7.c printf type mismatch +? ASNI 篏 + +祉鴻帥腟罕若帥 +潟若с... + +cc臀continuation吾с帥 +с + +潟若с違environment/return 腟 +吾с帥c Fri Jan 14 12:03:35 JST 2000 -Libretto のkeyboardが壊れた... control key が効かない... - -printf の参照の問題は解決しました。list2 がlocalなheap -に割り当てているのがいけなかったね。 - -return の処理は、goto 文で処理するより、environment に -returnto する方が良くはないか? - -environment は実は送り先でそれなりの準備が必要。 -new-environment() みたいなlibrary があれば、thread にできる。 - -join は? - -funcall を用意すると良いね。 +Libretto keyboard紕... control key 鴻... + +printf с馹茹f浦障list2 localheap +蚊綵c + +return goto уenvironment +returnto 鴻? + +environment 絎с羣綽荀 +new-environment() 帥library 違thread с + +join ? + +funcall Mon Jan 17 15:23:34 JST 2000 @@ -1093,8 +1093,8 @@ return bb; } -みたいなのは? 関数の型か代入の型を見て、crn にpointerを渡して、 -あとでcopyしてから stack を畳む。 +帥? ∽違篁eャ荀crn pointer羝< +copy stack 潟 # bb=f1(aaa); movl $bb,%eax @@ -1107,21 +1107,21 @@ addl $400,%esp # return a1; -あ、でも、それだと、local変数を返したときに困るね。leave; ret; -してはいけなくて... - -あ、やっぱり、こういう場合はコピー先をmain2に引き渡しているみたいね。 +сlocal紊違菴違leave; ret; +... + +c宴翫潟弱main2綣羝<帥 void f1(struct aa *ret) { *ret = bb ; return; } -と同じか。これは簡単。 +膂≦ f1().a[55] -みたいな場合は、局所変数に強制的に取ってしまうみたいね。それはそうだ... -が、うちの実装だとちょっと厳しいか。 +帥翫絮紊違綣桁句c障帥... +<絎茖<cウ leal $-sizeof(struct),%esp pushl %esp -なんだけど、関数呼び出しの途中ではできないから.... +∽医若喝冴筝сс.... # main(ac,av) # int ac; @@ -1144,28 +1144,28 @@ # j = 3; subl $20,%esp -このsublを後から指定してやればOk。 - -でも、それだと jump の時にずれない? ずれるか? ずれるね。うーん。 -実行時にチェックしてやるのも変だし。 - -まぁ、それほど必要な機能ではないんだけど。 - -これもcontinuationを渡してやると言う手法が使えないことはないんだが... - -関数呼び出しの最初にやってやればいいか。それでできるかな? +subl緇絎Ok + +с jump ? ? 若 +絎茵с紊 + +障祉綽荀罘純с + +continuation羝<荐羈篏帥... + +∽医若喝冴c違сс? Sun Feb 20 23:59:16 JST 2000 -MIPS のcall frame +MIPS call frame $sp = $fp local variables saved register (including $31 = return address) -mask は使用したレジスタのbit pattern - -4 は何? +mask 篏睡吾鴻帥bit pattern + -4 篏? 18 .mask 0xc0000000,-4 19 .fmask 0x00000000,0 @@ -1191,88 +1191,88 @@ 38 0044 3000BD27 j $31 39 .end main -これと同じようにするならば、regiterの使用数を最初に調べる必要が -あるのだけど、one path compiler である micro-C では、それは -できない。したがって、enter は後ろでする方が良い。 +違regiter篏睡違茯帥鴻綽荀 +one path compiler с micro-C с +сcenter 緇с鴻 Mon Jan 20 18:25:27 JST 2003 -3年間さわってないのかよ。何やってんだ? - -goto 文のバグをとらないといけない。 - -まず、関数引数の構造体の展開。これは、どうってことないはず。 +3綛顔c篏c? + +goto 違 + +障∽医違罕篏絮c goto (*code)(i+1,j,...) -まず、いじらなくてすむ変数を摘出する。 +障紊違冴 foreach arg compare -単純演算 ( op+const , pointer , const assign ) などは、ここで検出する。 -大半は、そのようになるはず。 -レジスタに乗せる分があるから... それには触らないとして... - -複雑なものは、前もって計算しておく。(get_register する) -スタック上かレジスタ上に作る。 - -残りは並列代入となる。再帰的に計算する。 - -えーと、大きな順にやるんだっけ? 小さな順にやるんだっけ? +膣羲膊 ( op+const , pointer , const assign ) ф冴 +紊у +吾鴻帥箙... 茹... + +茲c荐膊(get_register ) +鴻帥筝吾鴻推篏 + +罧筝篁eャ絽亥荐膊 + +若紊сc? 絨c? 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 の移動先を見て、 - 空いていれば、移動してOk。しかし、c - なので、 c を見る。と b になるので、ループするのがわかるので、 - b を get_register する。 - で、c が移動できる。で、aを移動して、とっておいたbを代入。 +帥ゃ + + 腱糸筝ゆ冴 + 腱糸綽荀腱糸(絽) + 篁eャ + +с? 若? 若 +get_register + +箴 + + g(b,c,a) b + b篁eャ潟若冴a 紕 + a 綽荀茯帥鴻綣違鴻荀違 + a 腱糸a 腱糸荀 + 腥冴違腱糸Okc + с c 荀 b с若с + b get_register + сc 腱糸ссa腱糸cb篁eャ Tue Jan 21 22:45:09 JST 2003 -とりあえず、jump は複雑すぎる。もっと簡単にすることを考える。 -parser 側である程度処理できない? +jump 茲c膂≦ +parser 眼с腮綺с? goto f(a+3,b(),c); -などを、 + a = a+3; b = b(); goto f(a,b,c); -程度に簡略化する。この時、f(a,b,c) は(できるだけ)、元の -関数の引数リストに近付ける。のは無理なので、単純変数 -まで落す。 - -あまり関係ないか。一時変数はどうせいるわけだし。ってこと -みたいね。 - -だとすると、元のコードと、そう変わらんね。前のも、そんなに -悪くないってことか。 +腮綺膂∞ュf(a,b,c) (с) +∽違綣違鴻菴篁∞с膣紊 +障ц純 + +障≫筝紊違c +帥 + +潟若紊 +c Wed Jan 22 14:33:12 JST 2003 -やっぱり、途中で局所変数を増やしたいよね。 +c宴筝у紊違紜 Fri Jan 31 20:30:36 JST 2003 -なんか #ifdef / #if がないとだめだな。実装する? -しました。 + #ifdef / #if 絎茖? +障 Tue Feb 4 01:04:12 JST 2003 @@ -1284,89 +1284,89 @@ addl %ecx,%edx movl (%edx),%edx pushl %edx - xchg %edx,%eax .... edx に$10が入る (なんでxchg?) + xchg %edx,%eax .... edx $10ャ (xchg?) call getc addl $4,%esp - movl %eax,-20(%ebp) c に代入 + movl %eax,-20(%ebp) c 篁e movl $chptr,%ecx pushl %ecx popl %ebx - movl (%ebx),%ecx ecx にchptrの中身 + movl (%ebx),%ecx ecx chptr筝荳 addl $1,(%ebx) movb %al,(%ecx) subl %edx,%eax eax-edx ($10) je _1119 -が壊れる理由なんだけど... - -edx,ecx が破壊されちゃうみたいね。 +紕宴... + +edx,ecx 翫<帥 Tue Feb 4 12:17:07 JST 2003 -ようやっと直したよ... - -use_pointer って、なにもしなくていいんだよね? eax,ebx を避ける -ってことらしいけど。 - -inline/引数付き #define 欲しくない? 置き換えは、local name stack に積んじゃう。 -展開は function で行う。 - -getch を工夫する必要はあるが。置き換えスタックが必要。 +c眼... + +use_pointer c? eax,ebx 帥 +c + +inline/綣遺 #define 罨蚊? 臀local name stack 腥 +絮 function ц + +getch 綏ュか綽荀臀鴻帥綽荀 Wed Feb 5 01:16:00 JST 2003 -大域で定義された struct field が大域変数と重なっていると落ちる。 -そりゃそうだけど。どうするの? (直した記憶があるんだけどなぁ...) -struct 毎に field 名とoffset/type の組を持てばい良いんだよね。 - -なんだけど、タグ無しの構造体もあるから、型名の方に付ける必要 -もある。というのは、型名のない構造体もあるから。タグ名には、 -一応、リストがついている。なんかに使う必要があったんでしょう -ね。あ、めんどう。無条件にやっても大域変数名を汚すのを直すの -が難しい。 - -ちょっと、あれだけど、「型名.フィールド名」で登録してしまうのはどう? -型名が後で出て来るところが気まずいが... - -def で登録するときに、nptrにdispを代入せずに、struct field list -(大域変数) に入れて、type の方に、field list (list3(nptr,offset, -type)) を入れれば良い。 - -あとは、strop の方でtypeのlistを見るようにすれば良いわけだ。 - -これなら、簡単に直せるはず。LUSTR/GUSTRなどの区別もなくなるし。 +紊уу臂 struct field 紊у紊違c純< +? (眼荐吟...) +struct 罸 field offset/type 腟違 + +帥亥<罕篏鴻篁綽荀 +罕篏帥医 +筝綽鴻ゃ篏帥綽荀cс +≧>散c紊у紊医羆眼 +c + +<c.c若х脂蚊障? +緇у冴ャ羂障... + +def х脂蚊nptrdisp篁eャ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 を生成する方法を用意する。 +羌絨亥鴻絎ANSI C紊ус +羌絨亥鴻 + +code generation part 蚊 +茲違潟若絲上 +祉掩 + +Sample C code 潟潟ゃ腟() +Micro CbC code generation part 号 Thu Feb 6 11:47:03 JST 2003 -Code Segment を単位として使うときに、大域変数はどういう -ように分けるの? static なんかは意味ないよね。 - -もちろん、自然にグループ分けされるわけだけど。 - -あとデータフローだよね。データフローに関しては、 -あんまりやってないなぁ +Code Segment 篏篏帥紊у紊違 +? static 潟 + +<吟違若 + +若帥若若帥若≪ +障c Fri Feb 7 14:36:15 JST 2003 -inline では、必らず、局所変数の増加がある。また、inline -は普通の関数として展開しておく必要もあるらしい。(何故?) - -#define ねぇ。 +inline с綽絮紊違紜障inline +∽違絮鏆荀(篏?) + +#define #define c(a,b) g(a+1,b+1) #define g(a,b) printf("%d %d\n",a+1,b+1); @@ -1377,41 +1377,41 @@ c(a,b); } -local #define がいるんだよね。g の中で a が出て来た時には、 -c のa の置き換えは起こってはいけない。ということは、c -の置き換えはg が始まる前に終っている必要がある。dynamic -scope なんだから、assoc の上乗せで良いはず。 -macro のlevelを定義して、あるレベルでは、それ以前の展開 -を行わないという手法が良いかな。 +local #define g 筝 a 冴ャ +c a 臀莎激cc +臀g 紮障腟c綽荀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") -みたいな感じ? - -やっぱり関数解析でマクロ処理をやらせるのは無理かな? 先読みされちゃうし。 +帥? + +c宴∽域Вс∞? 茯帥< Sat Feb 8 00:53:52 JST 2003 -macro は途中まで書きました。置き換えをマクロが呼び出された -時点で cheap に置くと、それを解消するタイミングがない。 -ここだけmallocしても良いが.. - -chptrsave はlistにする必要がある。list で良い。 - -やっぱりmacro levelを見て、自分と一致したassoc valueまで -手繰って置換するんでしょう。そうすれば、置き換える必要は無い。 -ということは、local_define にmflagsを格納する必要がある。 +macro 筝障ф吾障臀若喝冴 +鴻 cheap 臀茹f帥ゃ潟違 +malloc.. + +chptrsave list綽荀list ц + +c宴macro level荀筝眼assoc value障 +膵違c臀с違臀綽荀< +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 は、もとのとは別に用意する必要がある。 +macro nptr 罧c吾菴 +吾sc 翫障clocal macro +local table 羆cc +macro table ャ綽荀 #define c(a,b) g(a+1,b+1) #define g(a,b) printf("%d %d\n",a+2,b+2); @@ -1431,7 +1431,7 @@ #endif } -うーむ。ややこしい。 +若 main() c(a,b) mflag++ @@ -1439,11 +1439,11 @@ 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 となる。 +c mflag level n у mflag level n-1 Sat Feb 8 18:13:43 JST 2003 -いちおう、mflag まではデバッグしたが.... mflag を戻してないんじゃないの? +<mflag 障с違.... mflag 祉? ---c(a,b)----------------------- mflag ==1 a=>hoge, b=>hoga (mflag==1) @@ -1452,22 +1452,22 @@ ----printf(a,b)---------- mflag ==3 a=>poge, b=>poga(mflag==3) -g が呼び出されると、ac,bc は mflag==1 でのみ置換される。 - -あるテキストを置き換えると、それは置き換えたマクロのmflag level -(つまり一つ少ないレベル)になる。 -置き換え終ったら、元のlevelに戻す。 - -mflag==2のlevel では、mflag==2のlocal macroの展開しかしない。 - -置き換えると、mflag level 1 になるので、そこで mflag==1 のlocal -macro を展開する。mflag==0 は常に展開を行う。 +g 若喝冴ac,bc mflag==1 с睡舟 + +鴻臀臀mflag level +(ゃ障筝ゅ) +臀腟clevel祉 + +mflag==2level сmflag==2local macro絮 + +臀mflag level 1 с mflag==1 local +macro 絮mflag==0 絽吾絮茵 Sun Feb 9 11:35:23 JST 2003 -うーん、なんかtypeが、list とCHARなどと入混じっているじゃん。 +若typelist CHARユ祁c int save = chptrsave; -で、chptrsave が、$chptrsave になってしまう。 +сchptrsave $chptrsave c障 Sun Feb 9 22:33:36 JST 2003 @@ -1476,64 +1476,64 @@ #define cadr(e) (heap[((int)(e))+1]) car(cadr(e)) -だろ。 + car -> #define e cadr(e) (mleve=1) cadr -> #define e e (mleve=2) -むぅ。これ、うまくいかないんじゃん。こまったなぁ。 +障障c #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 のように -作ればいいはずなんだけど。 +c<泣若lisp interpreter +篏違 Mon Feb 10 08:10:25 JST 2003 -結局、list base のinterpreter を実装しました。きちゃないが。 -前の方法でも、頑張ればできるんでしょうけどね。 +腟絮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に -値があるかどうかを記憶する必要がある。 +struct copy ... ∽違struct菴綣違c +腥ссゃ潟若障с +鴻帥х舟障 + +function call 綣違с + +type -1 heap綣違羞桁ゃ.. +c宴障? + +temporal struct сdisp紊眼с +違鋎紊с違鋎祉潟 +(絽違cャゃ吾ゃ潟帥篏帥 +.... ャ祉ゃ荳贋・ return +吟) + +腟絮弱阪眼с腆坂綣羝<障号 +篁eャ篋綺潟若綽荀 + +register 篏睡絎creg/dreg +ゃ荐吟綽荀 Wed Feb 12 11:09:22 JST 2003 -それだけどさ... やっぱりアドホックに実現するのは難しいんじゃないの? - -まぁねぇ。register の場所の確保と、寿命は別だから、それで -いいんだけど、regs flag だけでなんとかならないのかな。 -こういう変更ははまるが虚しい。 +... c宴≪絎憗c? + +障register 贋腆坂絲水純ャ +regs flag с +紊眼障 Thu Feb 13 18:37:36 JST 2003 -さて、そろそろ jump にとりかかりますか。 - -構造体の引き渡しのシークエンスに使う局所変数の位置がgccと違う... - -そろそろ register は構造体にすべきだね。 + jump 障 + +罕篏綣羝<激若潟鴻篏帥絮紊違篏臀gcc... + + register 罕篏鴻 struct register { int used; int valued; @@ -1543,61 +1543,61 @@ int type; /* register variable or not */ int number; } -virtual/real は、どうする。 +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() のtypeをrvalueに引き渡せな -い。でも、type を大域変数にすると、rvalueを異なるタイプで呼 -び出すときにtypeを変更する必要がある。このrvalueのtype の扱 -いは、かなりはまったことがあるので、rvalue(int e,int type)の -方が良いことは確かなんだが... - -struct_push のregisterの扱いが複雑すぎ。なんか、もっと -簡単にならないの? +fdecl_struct 罕綣違榊憗茵int *f(int +a) с* 荅箴<腟int a荅箴<障*obj +obj 荅箴<腟f帥ゃ腆阪int*f()[] +翫(?) сgcc +arg fdecl_struct 茵号ссfdecl 筝с +篆罩c鴻 + +fix 綣違鴻絖! + +varargs 絎茖... + +rvalue(expr(),type) сexpr() typervalue綣羝< +сtype 紊у紊違rvalue違帥ゃу +喝冴type紊眼綽荀rvaluetype +障cсrvalue(int e,int type) +鴻腆冴... + +struct_push register宴茲c +膂≦? Sun Feb 16 07:58:23 JST 2003 -代入しなくて良いからと言って、ソース -のリストから除いては、上書きを防げない。 +篁eャ荐c純若 +鴻ゃ筝吾蚊 Sun Feb 16 22:55:58 JST 2003 -vdisp ってなんだったんだ? +vdisp cc? Mon Feb 17 12:35:39 JST 2003 -並列代入は出来たみたい。代入は小さいものを先にすべきなのか? -まぁ、できりゃいいんだけど、横に避けるものが大きいのはいや -だよね。 +筝篁eャ堺ャ帥篁eャ絨鴻? +障с罔帥紊с + Tue Feb 18 11:56:10 JST 2003 -overlapped 用の emit_copy +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は、局所変数と同じ -扱いでマイナス符号で処理した方が良い。 - -できたみたい。でもさ、 +code argument 膃垩荵≪list2(LVAR,offset) +offset≪鴻劫筝眼 +經с罕篏主綺障... + +... def(n) codeargument絮紊違 +宴сゃ合垩у鴻 + +с帥с int main( int ac, char *av[]) { @@ -1605,46 +1605,46 @@ goto arg1(0,1,2,3,4,return,environment); } -って、きっと return 文がないと、文句を -言われるよね。むむむ。 - -post processing する時にoverlapしてないという保証がない。 +cc return ャ +荐 + +post processing overlap篆荐若 Wed Feb 19 15:38:55 JST 2003 -自分自身とのoverlapを見てないので、 +荳overlap荀с struct a a,int i int i,struct a a -みたいな時に自分自身を壊してしまう。なので、emit_copy -が、ちゃんと方向を見て壊さないように処理する必要がある。 - -call bcopy でいいじゃん。まね。 +帥荳紕障сemit_copy +<劫荀紕綽荀 + +call bcopy с障 Wed Feb 19 20:42:07 JST 2003 -楊さんの C2CbC と CbC2C を、micro C に取り込む。各所に、 -conv->func(); を埋め込む。conv は、構造体。 +罐 C2CbC CbC2C micro C 莨若 +conv->func(); 莨若conv 罕篏 conv: original c2cbc cbc2c -とする。なるほど。 +祉 Thu May 6 08:32:05 JST 2004 -やっぱり library も自分で作らないとね。そうすれば、 -CbC only で作れるから。 - -conv は、あんまり良いアイデアではないみたい。取るか。。。 +c宴 library т違 +CbC only т + +conv 障≪ゃ≪с帥 Thu May 13 12:59:16 JST 2004 -byte code interpreter を CbC 自身で書いたら? - -それでもやっぱり動かないから、あんまり意味はないんだけど... - -C で書いてもいいか。 +byte code interpreter CbC 荳ф吾? + +сc宴障潟... + +C ф吾 Wed Dec 22 15:17:49 JST 2004 @@ -1652,28 +1652,28 @@ shift; } -ねぇ。 なんで、return 構文にしたのか。しかも別々にしたのか。 + сreturn 罕ャ goto ret(value),env; -まぁ、ねぇ。 +障 try { .... goto event .... } catch (event) { } -をいれてもいいんだけど。 - -うーむ、いまいちだな。 - -inline function のreturn,env を実装するっていう技もあるけど。 - -やっぱり。setjmp = return みたいにする? それはそれで、 -やさしいんだけど.... + + +若障< + +inline function return,env 絎茖c + +c宴setjmp = return 帥? с +.... Fri Jan 6 20:26:24 JST 2006 -environment = interface frame の切替えを用意しないとね。 +environment = interface frame 帥 Mon Jan 30 21:53:11 JST 2006 @@ -1719,20 +1719,20 @@ goto f(a,...); } -syntax が汚い... type の指定はなんとかしないとだめだね。 +syntax 羆... type 絎 ... int a, -ずれたときのコストがなぁ。良く見えないんだよね。 - -可能だとは思うんだけど。 +潟鴻頳 + +純 __meta goto { } -みたいな感じ? +帥? Sun Nov 26 21:14:57 JST 2006 @@ -1740,7 +1740,7 @@ v----> argument local <--|-----v caller_arg -ではなくて、 +с | previous $fp |<-intr_size---><--------r1_offset----------->| @@ -1748,16 +1748,16 @@ v<--- interface-+---- local ----->|<--------->v <0 >0 caller_arg -なら、いいんじゃない? caller_arg は sp 相対で積めば良い。 -local 変数は max_caller_arg が不定なので sp 相対では積めない。 - -これだと、frame pointer がgoto で可変になる。interface がarugment -扱いになるので、限りなくsubroutine call に近くなるけど。 -(まぁ、そうだよな、そういう狙いだし...) - -だったら、完全にfunction callに合わせることも可能なんじゃないか? -可変長引数の場合とまったく同じになる。gcc の(予定ししてる実装と同じ) -これだと、C-- の paraterized goto と、まったく同じになる。 +? caller_arg sp 後障х域 +local 紊違 max_caller_arg 筝絎 sp 後障с腥 + +frame pointer goto у紊interface arugment +宴сsubroutine call 菴 +(障...) + +c絎function call純? +紊桁違翫障cgcc (篋絎絎茖) +C-- paraterized goto 障c | previous $fp |<-intr_size---><-------------r1_offset------------>| @@ -1768,30 +1768,30 @@ v<--- interface----+-------|--- local ----->|<-------->v <0 >0 xxx caller_arg -caller_arg はsp上に積むと。そうすれば、alloca も問題ない。 - -これを採用しなかったのは、たぶん、fp を移動しなければならな -いのを嫌ったんだろうな。今は、parse tree 作ってから、code -生成も可能なので、そうしても良いんだが。 - -でも、めんどくさいよ。めんどくさい。めんどくさいです。 -でも、やるしかない。 - -これを、やれば、C からの変換もかなりやさしくなるかも知れない。 +caller_arg sp筝腥違alloca 馹 + +。c吟fp 腱糸違 +絆c篁parse tree 篏ccode +純с + +сс +с + +違C 紊ャ Sun Nov 26 19:41:38 JST 2006 -max interface みたいなのが必要で、そうすれば、local 変数との -相互作用は避けられる。逆に言えば、利用は出来ない。 - -でも、max_interface は1 path では決まらない。だから、long offset -の時は、ちょっとはまる。特にARMの場合。やっぱり、max_interface -は決め打ちがいいのかな? そうすると、function call から呼ぶ -ときにはまるが... - -offset を 0 側からにすれば、max_interface はfp設定時のみに -なるが、そうすると、interface を変更したときのcopyが発生しやすく -なる。いや、そんなことはないのかな? +max interface 帥綽荀с違local 紊違 +娯篏帥荐違堺ャ + +сmax_interface 1 path с羆冴障long offset +<c障鴻ARM翫c宴max_interface +羆冴<? function call 若 +障... + +offset 0 眼違max_interface fp荐絎帥 +interface 紊眼copy榊 +? __code f(int a,int b) { goto g(int c,int b,int a); @@ -1804,10 +1804,10 @@ v<--- interface-+-------|--- local ----->|<-------->v goto g a,b,c -みたいな感じですか? 後ろをそろえるわけね。その方が自然か。 - -これだと、やっぱり、max_interface が問題になる。やっぱり、それで、 -fp を下にしてあるんだろうな。 +帥с? 緇鴻吟 + +c宴max_interface 馹c宴с +fp 筝 __code f(int a,int b) { goto g(int c,__code *f,int a,int b); @@ -1831,10 +1831,10 @@ v<--- interface---------|--- local ----->|<-------->v goto n a,b -えーと、goto n(...); で、どうやってfp を元に戻すの? ... の位置で、 -前の fp を覚えておけば良い。(*) - -これだと、function call を、そのまま実現できそうだけど? みたいだね。 +若goto n(...); сcfp 祉? ... 篏臀с + fp 荀域(*) + +function call 障上憗с? 帥 __code f(int a,int b,...) { goto g(int c,f,int a,int b,...); @@ -1844,13 +1844,13 @@ goto n(int d,int e,int g,...); } -とかすると、無限にstackが延びる。ふーん。 +♂stack綮吟潟泣若 __code g(int c,__code *n(...),...) { goto n(int d,int e); } -は、どうする? fp は、そのままなんだろうね。 +? fp 障障 |<----------------------------r1_offset------------>| |frame pointer | stack pointer @@ -1866,8 +1866,8 @@ v<-interface-+----|-- local --->|<---------v g d,e -で、fp は上書きか。それは、良くない。なので、fp の分ずらす。 -というよりは、fp の次を指すようにするのが良いのか。 +сfp 筝吾сfp +fp 罨< __code f(int a,int b,...) { goto g(int c,__code *f,int a,int b,...); @@ -1892,63 +1892,63 @@ v---- interface-+----------|-- local --->|<---------v goto n a,b -というわけか。frame pointer のオプションがあった方が良いわけだね。 - -これだと、全体の変更も少なくて済みそうだ。(ほんとうか?) - -g の ... の位置を前もって知ることが必須。かなりコードが繁雑に -なるけど。 +frame pointer 激с潟c鴻 + +篏紊眼絨羝帥(祉?) + +g ... 篏臀cャ綽潟若膵 + __code g(int c,__code n,...) { -の方が良いが、それだと、型のチェックが出来ない。実際には、 -かなり繁雑な型を書く羽目になる。typedef すればいいんだけどね。 - -__code は暗黙のtypedef にする? - - -これを許すとmax_interfaceの制限は現実的ではない? でもないか... -そのcodeでアクセス限界だからね。だったら、max_interface を -作って、(1024程度?) いや、やっぱり fp は動かさないとだめ -なので、良くない。 - -fp を積む場合と、戻す場合との区別は? 結構微妙か。 - goto 側の定義 ...が先に(か同時に)来たら戻す - goto 側の定義 ...が実引数より後に来たら積む -で、いいわけね? - -ちょっと、Semantics が複雑になりすぎる。可能なんだけど。 -environment での goto でたまにリセットしないとおかしくなりそう。 -Stack 増えている場合は、Warning ぐらいだした方がいいかも。 -大域的に見ないとわからない。有限かどうかも。 - -全部、tail recursive call でやるのと、あまり変わらないかな。 -そうすると、c-- のparametarized goto と差がないかも。 - - -あ、そうか。 +鴻с堺ャ絎 +膵吾靸順typedef 違 + +__code 藥typedef ? + + +荐宴max_interface狗憜с? с... +codeс≪祉拷cmax_interface +篏c(1024腮綺?) c宴 fp +с + +fp 腥翫祉翫阪ャ? 腟罕緇絋 + goto 眼絎臂 ...()ャ祉 + goto 眼絎臂 ...絎綣違緇ャ腥 +с? + +<cSemantics 茲純 +environment с goto с障祉 +Stack 紜翫Warning 鴻 +紊у荀 + +tail recursive call с障紊 +c-- parametarized goto 綏 + + + __code g(int c,__code *n(int a,int b,...),...) { goto n(int d,int e,int g,...); } -の n は、自動的に定義された方が便利だろう。 + n 絎臂鴻箴水 __code g(int c,...) { goto __cotinuation(int d,int e,int g,...); } -みたいな感じ。 +帥 go g(int c,int b,...) to hoge(...); -ですか? それは、だめか... だめでもないんだけど、型の設定が -難しすぎる。 - -K&R style の宣言の方が綺麗なのか... +с? ... с荐絎 +c + +K&R style 絎h鴻膓咲... Sun Nov 26 21:53:05 JST 2006 -(*) interface の大きさの増減は、自分のinterface を見れば -わかるはずだよね? だから、fp のsaveは必要ないはずだが... +(*) interface 紊с紜羝interface 荀 +? fp save綽荀... __code f(int a,int b,...) { goto g(int c,__code *f,int a,int b,...); @@ -1958,89 +1958,89 @@ goto n(...); } -確かにわかるんだけど、宣言を間違えたときに、おじゃんになる。 -どうせ、だめではあるんだが。引数の型は一段階までしか、 -チェックしないので、だめだね。 - - -このあたり、理論的な問題があるみたいだな。 - - stack を含めた有限な型付け - と、その表現 - -って問題があるわけね? - -そうか、parallel assignment では、同じ部分を前もって探した -方が効率がよいわけか。(どうせ、やっていることだが) +腆冴絎h +с綣違筝罧級障с +сс + + +茫馹帥 + + stack 篁 + 茵 + +c馹? + +parallel assignment сc「 +鴻合(c) Sun Nov 26 23:22:12 JST 2006 -fp のsave は必要。何故かと言うと、 +fp save 綽荀篏荐 goto f(a,b,...) -で、後ろの部分がどれだけあるかは、間接的な引数での -宣言ではわからないから。 - -stack 上に全部 interface があるなら、良いが、 -部分は register に乗っている。 +с緇・綣違с +絎hс + +stack 筝 interface + register 箙c goto f(a,b,c,...) -としたときに、... の一部はregisterに乗っている。どれだけ -乗っているのかを知る必要があるが、それをfpから推察する -ことはできない。浮動小数点とかの異なる型が散在している -から。 - -... で引き渡す引数は、メモリに乗っている必要がある。 -型が明解なら、レジスタ上でもだいじょぶなはずだが。 - -明示的な引数に大域的には変換できるはずだけど、open -な環境では、それはできない。 - -だとすれば、 +... 筝register箙c +箙cャ綽荀fpィ絲 +с羌絨亥鴻違e + + +... у羝<綣違<≪箙c綽荀 +茹c吾鴻推с吟 + +腓榊綣違紊у紊сopen +医сс + +違 __code f(int a, int b : int h, ...) { ... goto g(a,b,c : d,e,f,...) } -みたいな形で、stack 上に乗せる引数を明示する必要がある。 - -これは、なんなの? - - : の前の引数は可変に出来ない - : の後までは可変に出来る - -っていうことか。 - -構造体は、メモリ上に取るとしても.. - -まぁ、... のところまでレジスタで、それ以降は、メモリでも -十分だけどね。いずれにせよ、複雑すぎることは確か。 +帥綵≪сstack 筝箙綣違腓冴綽荀 + +? + + : 綣違紊堺ャ + : 緇障с紊堺ャ + +c + +罕篏<≪筝.. + +障... 障с吾鴻帥с篁ラ<≪с +茲腆冴 __code g(int c,__code (*n)(int a,int b,int d,...),...) { goto n(int d,int e,int c,...); } -で、この... は、すべて、同じものに置き換わるはず。 ... が -入る場合もあるが。 - -受け側が +с... 鴻臀 ... +ャ翫 + +眼 __code c(int d,int e,int c,int k,int j) {} -で定義されているときに、k,j がレジスタに乗っているかも知れず、 -乗っていたらダメダメ。なので、可変になる部分を明示する必要がある。 +у臂k,j 吾鴻帥箙cャ +箙c<<с紊腓冴綽荀 Mon Nov 27 11:17:39 JST 2006 -結局、このn の定義と、実際のn の定義がずれることが問題なんだよね。 +腟絮n 絎臂絎n 絎臂馹 __code c(int d,int e,int c,...) {} -で、受けることもあれば、 +с違 __code c(int d,int e,int c,int k,int j) {} -で受けることもある。あるいは、 +у __code c(int d,int e,int c,int k,int j,...) {} -とかも。 - -implements というか、accetps というか、そんな形の別な -宣言がいいのかな。 + + +implements accetps 綵≪ャ +絎h __code f(int a, int b : int h, ...) { -でもいいんだが... +с... Mon Nov 27 11:34:33 JST 2006 @@ -2053,63 +2053,63 @@ } -g に入るときに、fp は、n の頭になければならない。これを -移動するのは、f の役割。出て行くときには、b の頭に -合わせる必要がある。これは、g の役割。g は、元の頭(fp) -を知らないから、これは取っておく必要がある。差では -判断できない。g 側で取っておくことは可能だが、その -時にも、f 側からずらす大きさを渡す必要がある。 - -明示しても良いんだけどね... +g ャfp n 違 +腱糸f 綵劫蚊冴茵b +綽荀g 綵劫蚊g (fp) +ャc鏆荀綏с +ゆсg 眼уc純 +f 眼紊с羝<綽荀 + +腓冴... goto g(int c,__code *f,__environment,interface &rest), __envronment+sizeof(interface); __code g(int c,__code (*n)(...),(void*)parent,...) { goto n(...),parent; } -みたいな形でさ... その方がいいのかな。繁雑だけど。: よりかまし? - -: を使う方法だと、: が fp みたいな感じになる。 - -難しいね。きれいなsyntaxにならない。 +帥綵≪с... 鴻膵: 障? + +: 篏帥号: fp 帥 + +csyntax Wed Jul 25 14:48:16 JST 2007 -inline code __goto みたいな形にすると、 +inline code __goto 帥綵≪ __goto hoge(); -goto を reflection 出来る。 - -meta な、interface はどうするの? - -デフォルトで、,.... が入っていると思う方が良い。 +goto reflection 堺ャ + +meta interface ? + +с,.... ャc鴻 goto hoge(hoge.... , __code (*cont)(i) : meta ...); goto cont(i); -> goto cont(i: meta...); -という感じか? これがないと、記述がかなり面倒。subroutine とは -違うの? - -env の切替えで明示出来ないの? 出来るけど、繁雑なのか。 - -gcc との相性が良くないのだが... - -__code の先行宣言つらすぎる。script で生成するか、compiler で -自動解決する方が良い。 - -tcc の方が goto f(); ではなくて、goto (*f)(); を -強制する。これは、けっこう、めんどくさい。 - - ... ってのは大域変数みたいなものだよね? ただ、stack scope がある。 -なので、sub routine と同じなのでは? - - - - - - - - - - +? 荐菴違√subroutine +? + +env 帥ф腓阪堺ャ? 堺ャ膵 + +gcc 御с... + +__code 茵絎hゃscript хcompiler +茹f浦鴻 + +tcc 鴻 goto f(); сgoto (*f)(); +綣桁吟c + + ... c紊у紊違帥? stack scope +сsub routine с? + + + + + + + + + +