From bb78453c6305f25c9ee633a8d5cbe4d0df7a4529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Thu, 25 Sep 2025 15:39:04 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-09-25 15:39:04[ --- ...miumのMIRコンパイル過程を真面目に考える.md | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/content/mimiumのMIRコンパイル過程を真面目に考える.md b/content/mimiumのMIRコンパイル過程を真面目に考える.md index ae636fbb..d1752719 100644 --- a/content/mimiumのMIRコンパイル過程を真面目に考える.md +++ b/content/mimiumのMIRコンパイル過程を真面目に考える.md @@ -48,12 +48,10 @@ $$ ## コンパイル -評価をしながら副作用としてMIRを書き込んでいくような感じ - Valueとして、次のようなものがあり得る ```rust -struct VRegister(usize); +struct VRegister(usize);//Vregisterは無限に使用できてサイズ可変 struct StackSlot(usize); enum Value{ Static(usize), @@ -78,11 +76,12 @@ struct MIR{ externals: functions:Vec } + struct Operation{ dest:Option, inst:Instruction } -struct UpIndex(usize) +struct UpIndex(FnId,usize) struct UpIndexStorage(Vec) impl UpIndexStorage{ @@ -90,25 +89,44 @@ impl UpIndexStorage{ self.0.get(i.0) } } +struct BlockId(usize) +struct BasicBlock{ + label:Symbol, + entry_v:Vec + op:Vec +} +struct BlockChunk(Vec) +impl BlockChunk{ /*newtype pattern*/ } struct FuncProto{ - upindexes:UpIndexStorage, - instructions: Vec + name: Symbol, + upindexes: UpIndexStorage, + blocks: BlockChunk, + state_tree: Vec //StateTreeは実際のデータを保持しない + meta_labels:BTreeMap //print用メタデータ } enum Instruction{ Load(StackSlot,Type) - Store{dest:StackSlot,src:Register,Type} - GetUpValue(UpIndex,Type) + Store{dest:StackSlot,src:Register,Type}, + GetUpValue(UpIndex,Type), + JmpIf{cond:Register,then:BlockId,else_:BlockId,merge:BlockId}, + ShiftStatePos(isize)//ツリーの子インデックスに対するカーソル移動オフセット + GetState(Type) //その他、プリミティブな命令はfrom Register to Register } ``` +評価をしながら副作用としてMIRを書き込んでいくような感じ + ```rust -fn eval(e:ExprNodeId,env:Env)->(Value,Type){ +fn eval(e:ExprNodeId,env:Env<(Value,Type)>)->(Value,Type){ match e.to_expr() { Expr::Id(name)=>{ - env.lookup(name) + match env.lookup(name){ + (Value::Register(r),t)=>(r,t) + (Value::StackSlot(s),t)=>push_inst(Instruction::Load(s,t)) + } }, Expr::Let(name,e,body)=>{ @@ -127,6 +145,9 @@ fn eval(e:ExprNodeId,env:Env)->(Value,Type){ _=>panic!() } } + Expr::Feed(id,body)=>{ + + } } }