自分で答える人のための100の質問

Q1 では、まずはじめにあなたのHNはなんですか?
wo
Q10 その由来は?
woっていうのはキーボードで打つのは楽だけど、発音するとわけがわからなくなると思う。
Q11 半分を過ぎたました!ここまでの感想をひとこと。
すぐだった。
Q100 おつかれさまです。最後にひとこと。
思ったよりも楽だった。

一個しか、質問できなかったとしても、シフト演算子とかを使えば複数の質問を混ぜれるんじゃないか?
質問 ((あなたは男ですか?)<<1) | (ひとりぐらしですか?))
→3
既に真偽値は整数に変換されてるのな。

関数生成

using gcc;


namespace langhook {
	function expand_stmt(stmts) {
		expand_expr_stmt( stmts.value );
	}
};


var gi = get_identifier;

var global_id = gi("global");
var global_decl = build_decl( VAR_DECL, global_id, types.int );

with (global_decl) {
	initial = 4;
	used = true;
	static = true;
	public = true;
	external = false;
}
expand_decl( global_decl );
expand_decl_init( global_decl );
rest_of_decl_compilation( global_decl, null, true, false );

function gen_body() {

	var rhs = build( PLUS_EXPR, types.int, 1, 2 );
	var lhs = global_decl;

	return [ build( MODIFY_EXPR, types.int, lhs, rhs ) ];
}



var x = gi("hoge");

var decl = build_decl( FUNCTION_DECL, x, types.int );

with (decl) {
	result = build_decl( RESULT_DECL, gi("ret1"), types.int );
	type = build_function_type( types.int, [types.int,types.void] );

	arguments = build_decl(PARM_DECL,gi("arg1"),types.int);
	arguments.chain = null;

	saved_tree = gen_body();

	used = true;
	static = true;
	public = true;
	external = false;

	initial = make_node( BLOCK );
}



expand_decl( decl );
expand_decl_init( decl );

tree_rest_of_compilation( decl, false );

これが、

        .file   "test.ilog"
.globl global
        .data
        .align 4
        .type   global, @object
        .size   global, 4
global:
        .long   4
        .text
.globl hoge
        .type   hoge, @function
hoge:
        pushl   %ebp
        movl    %esp, %ebp
        movl    $3, global
        leave
        ret
        .size   hoge, .-hoge
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.1"

こうなる。(長いよ)
http://morihyphen.hp.infoseek.co.jp/files/ilog-20040928.tar.gz

お、

/bin/tar: 空の書庫作成はご容赦願います
もっと詳しい情報は `/bin/tar --help' と入力すれば得られます.

tarのエラーメッセージってこんなのがあるのか。ご容赦されます。

TODO

さて、次はどうするか。
課題は死ぬほど残ってんだよな。5000行書いてまだ半分もできた気がしないのは始めてだ。

  1. 言語としてちゃんとする
  2. expand_hogehoge関数を色々動くようにしてもっと色々生成できるようにする
  3. 動作を安定させる
  4. 色々ライブラリを作って遊ぶ
  5. もう動いたのでなんか十分だからやめる

行番号とか、ループとか、GCからの保護とか、そういう細かいのが面倒なんだよなぁ…小人さんがやってくれないかなあ…
まあ、でも、基盤部分は大体できてるので、ここからはインクリメンタルにくっつけていけるはず。そんなうまくいくはず無いんだけど。



おっと、ネガティブなこと書く予定ぽかったけど、関数生成うまくいってなんかどうでもよくなった。この話はまた次にネガティブになった時のためにとっておこう。