こんなのがコンパイラを通るんだね

コンパイラインタプリタの差がよく分からない。

だとして、例えばソースを一度全部眺めて関数定義を全部メモしておくけど、コードの実行は一行ずつ読む。なんて場合は何というのだろうか?
C言語は呼び出される関数が呼び出しよりも先に定義(宣言でもいいが)されてないと動かないように、インタプリタもまだ読んでいない部分に関数が宣言されていたとしても、読むまでは分からない。これじゃ不便なので関数定義だけは先にざっと探してメモしておく俺言語を作ってみたいのだが、これはコンパイラなんだろか。

//ActionScript風インタプリタだと思って下さい。
var num:int 10;

//上から一行ずつ読んでいる場合
//この時点ではまだ関数add10が何者か分からない。
num = add10(num);//エラー。そんな関数ないよ!
function add10(n:int):int{
	return n + 10;
}

まぁそんなことはどうでも良い。俺様言語VirtualMachineとしてしまえばどっちでも通りそうだからこの話はキニシナイでおこう。
当たり前なのかもしれないけど、今日、こんなコードがAS3で通る事を知りました。

var num:int = 0;
var abc:int = 0;
abc = 1 + (num = 1 + 2);

//abc = 1 + num = 1 + 2;//ちなみにこっちは通らない。

trace("num:" + num + " abc:" + abc);//num:3 abc:4

//なんもしない式たち。でもコンパイラは通る。
10;
num;
(1);
(abc);

C言語でも通る。()の中身は別の式として処理しているからなんだろか。
確かに自分でスクリプト言語作っていくとこれが問題ない式だと思えるところが何とも不思議だけど、
言語処理の勉強でこういうところに気がついて行けるのはとても楽しいね。