前からパーサ書き直すとか言ってて、最近やっと作業を始めたんだけど、

  tree a_list_rests = seqp(build_list(1, optp(seqp(build_list(2,comma,call_toplev_expr),
						   ret2,ilog_null),ilog_null)),
			   ilog_null,ilog_null);
  
  list_expr = seqp( build_list(4,l_bracket,call_toplev_expr,a_list_rests,r_bracket),
		    build_ilog_native_function((ilog_native_func_t)list_expr_action,4,"list_expr_action"),
		    ilog_null );

  cons_expr = seqp( build_list(5,l_bracket,call_toplev_expr,colon,call_toplev_expr,r_bracket),
		    build_ilog_native_function( (ilog_native_func_t)cons_action, 5, "cons_action" ),
		    ilog_null );

  paren_expr = seqp( build_list(3,l_paren,call_toplev_expr,r_paren), ret2, ilog_null );
  term = selp( build_list(5,
			  digit,str_const,paren_expr,cons_expr,list_expr), ilog_null,
	       build_ilog_native_function( (ilog_native_func_t)term_error, 1, "term_error" ) );

なんかこんなコードになってしまって、ちょっと色々厳しいような気がしてきたのでやっぱり、このネタはお墓行きに決定。これだけ書くのに昨日、今日の二日分のエネルギー使ってます。
lang.lexerとか、lang.parserとかがあるんだけど、それは名前だけで、どこにも使われてないという微妙な状態に。


問題があるのは構文木の構造のほうなので、別にパーサを書き換える必要はなかったんだが。何を目的として実行しようとしてたんだろうか。忘れたな。まあいいか。


んで、構文木書き換えたら、バイトコード出してみたいんだけど、バイトコードに変換して得られる効率ってどのくらいになるんだろうか。と、いうのが最近の疑問。実はそんなに変わらないんじゃないか、って気がしてきた。なんも工夫しないで、単純に計算する木をスタックマシンの計算に置き換えるだけだったら、命令のキャッシュ当たりが良くなるのと、ポインタ巡るのが減るとか、そのぐらいのような。まあ、キャッシュ当たりの違いはかなり大きいかもしれんが。
面倒になってきたから、ちょっとした細工で画期的に速くなるとかじゃないんならやめとこうかなぁ…と。


そういえば、IoのVMバイトコードとかの類いじゃないんだよなぁ。もし、本当にあれで速度が出るというのならば、VMの実行方法じゃなくて、ハッシュテーブルの構造やら、オブジェクトの構造やら、プロトタイプチェインの巡り方とかをなんとかしたほうがいいのかもしれない。というか、それ以前にプロファイルとってから始めるべきかもしれない。
それ以前に、実は今の速度でも問題無いのかもしれない。


どうしようか。