[obsidian] vault backup: 2025-09-25 14:38:57[
Some checks failed
Build / build (push) Failing after 12m59s
Some checks failed
Build / build (push) Failing after 12m59s
This commit is contained in:
@@ -48,6 +48,62 @@ $$
|
|||||||
|
|
||||||
## コンパイル
|
## コンパイル
|
||||||
|
|
||||||
|
評価をしながら副作用としてMIRを書き込んでいくような感じ
|
||||||
|
|
||||||
|
Valueとして、次のようなものがあり得る
|
||||||
|
|
||||||
|
```rust
|
||||||
|
struct VRegister(usize);
|
||||||
|
struct StackSlot(usize);
|
||||||
|
enum Value{
|
||||||
|
Static(usize),
|
||||||
|
Global(usize),
|
||||||
|
Function(usize),
|
||||||
|
ExternalItem(usize),
|
||||||
|
Register(VRegister),
|
||||||
|
StackSlot(StackSlot),//引数とかはこれで処理して良い
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
原則、Letが出てくればStackSlotに確保、そうでない一次変数はRegisterに確保でよい
|
||||||
|
LetだけどRegisterに逃がせるとか、RegisterからStackへスピルするとかはオプティマイザの範疇
|
||||||
|
基本的にはFuncProtoはValueに依存しない構造にしたい
|
||||||
|
|
||||||
|
今はmir::ValueにmirgenとBytecodeGen両方が依存しているが、Valueは本来Expr→MIR生成時に使われるだけの中間的な値であるべき
|
||||||
|
|
||||||
|
```rust
|
||||||
|
struct MIR{
|
||||||
|
name:Symbol,
|
||||||
|
static_data:Vec<StaticData>
|
||||||
|
externals:<ExternalItems>
|
||||||
|
functions:Vec<FuncProto>
|
||||||
|
}
|
||||||
|
struct Operation{
|
||||||
|
dest:Option<VRegister>,
|
||||||
|
inst:Instruction
|
||||||
|
}
|
||||||
|
struct UpIndex(usize)
|
||||||
|
struct UpIndexStorage(Vec<StackSlot>)
|
||||||
|
|
||||||
|
impl UpIndexStorage{
|
||||||
|
fn get_upv_index(&self,i:UpIndex)->Option<StackSlot>{
|
||||||
|
self.0.get(i.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
struct FuncProto{
|
||||||
|
upindexes:UpIndexStorage,
|
||||||
|
instructions: Vec<Operation>
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Instruction{
|
||||||
|
Load(StackSlot,Type)
|
||||||
|
Store{dest:StackSlot,src:Register,Type}
|
||||||
|
GetUpValue(UpIndex,Type)
|
||||||
|
//その他、プリミティブな命令はfrom Register to Register
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
fn eval(e:ExprNodeId,env:Env<Value>)->(Value,Type){
|
fn eval(e:ExprNodeId,env:Env<Value>)->(Value,Type){
|
||||||
match e.to_expr() {
|
match e.to_expr() {
|
||||||
|
Reference in New Issue
Block a user