Files
quartz-research-note/content/mimiumのMIRコンパイル過程を真面目に考える.md
松浦 知也 Matsuura Tomoya a1ed1f1f74
All checks were successful
Build / build (push) Successful in 10m47s
[obsidian] vault backup: 2025-09-25 13:38:52[
2025-09-25 13:38:52 +09:00

1.9 KiB
Raw Blame History

date
date
2024-10-20 12:02

#mimium

ツリー形式からBasicBlockのインストラクション形式に変える

Stateのこととupvalueを両方処理しなくてはならない。ワンパスで処理できるのか

StateSize計算とUpvalue計算の両方をtraitとして切り出す方がいいのかな


\begin{align}
v \; ::= & \quad R \\
	| & (\lambda x:\tau.e, [\Gamma, x:e],StateStorage(p,Vec))  \quad & [Closure]\\
\end{align}

\begin{align}
e \; ::=& \quad x \quad x \in \mathbb{V} \quad & [value]\\
     |& \quad \lambda x.e  \quad & [lambda]\\
     |& \quad e \; e \quad & [appglobal,stateful)]\\
	 |& \quad appcls \; e \; e \quad & [appclosure]\\
	 |& \quad fix \; x.e  \quad & [fixpoint]\\
     |& \quad getstate \; e \; I_n \; I_s \quad & [feed] \\
|& \quad delay \; e \; e & [delay]\\
\end{align}

結局The w-calculus a synchronous framework for the verified modelling of digital signal processing algorithmsのStaged Interpreterと変わらんかもな

そうすると型付けの時点でクロージャ相当の項とグローバル関数適用の項は分かれることになる?エフェクトとして考えるのが妥当なのかな


\begin{align}
\tau ::=&\quad R_a \quad & a \in \mathbb{N}\\
      |&\quad I_n \quad &n \in \mathbb{N} \\\
      |&\quad \tau → \tau \quad \\
      % |&\quad \langle \tau \rangle
\end{align}

コンパイル

fn eval(e:ExprNodeId,env:Env<Value>)->(Value,Type){
	match e.to_expr() {
	 Expr::Id(name)=>{
		 env.lookup(name)
		 
	 },
	 Expr::Let(name,e,body)=>{
	     let env = env.extend((name,eval(e,env).0));
		 eval(e,env)
	 },
	 Expr::App(e,args)=>{
		 let (f,ft) = eval(e,env);
		 let argvs = args.iter().map(|e| eval(e,env));
		 match f{
			 Value::Closure(fproto,names,body,env)=>{
			 let kvs = names.iter().zip(argvs.zip()).collect()
			 let env = env.extend(kvs);
			  eval(body,env)
			 }
			 _=>panic!()
		 }
	 }
	}

}