發表文章

目前顯示的是 3月, 2012的文章

jaja vm

圖片
作了幾個重要的修改: 對heap和stack相關的幾條指令作了正規化,更符合stack machine的設計。 新增了一條指令discardx,function return時在沒有使用配製local時可以更簡單的free stack空間。 修正了heap指令的一個大問題,這樣才有辨法正確實作出string模組的功能,如strcpy等。 原本的sample作了修正外,新增了string和stdio模組,實作了幾個簡單的function。 實作簡易stdio.printf時,debugger新增自動dump stack狀態,這樣一來debug就更容易了。此外,在debug過程中也發現了幾個debugger的bug,順便一起修正。 assembly parser也作了一些小修正,現在字串可以使用像是\n的escape字元,ID token也支援原先漏掉的底線_。 jaja vm on java vm順便作了porting,不過還有點小bug,大致上執行起來沒問題。 有二點考慮改進的地方: function return時對於stack裡需要free的空間的處理。 macro的支援。 這二點可有可無,可以跳過。接下來是支援high level language compiler,目前考慮的語言是c,但也可能是lua。將以高階語言寫成的程式編譯成jaja指令集,然後在jaja vm上執行。如果使用lua,目標是將good作出來的程式轉換成可以在jaja機器上直接執行。如果是這樣,指令集需要重新編碼,這部份需要再研究。 ( src )

C/C++ sizeof的陷井

猜猜看下面的程式輸出結果如何? int a = 0; cout << sizeof(a = 10) << endl; cout << a << endl; 答案是4及0,答錯了吧。 其實很簡單,假如你知道sizeof是在編譯時期(compile time)就決定值的話,就可以知道正確答案是多少。 ; 再來看看下面這個程式輸出是什麼。 struct A { }; printf("%d\n", sizeof(struct A)); 答案可能是0,也可能是1。怎麼說? 如果程式是C語言編譯器編譯,那麼輸出會是0。如果程式是C++編譯器編譯,那麼輸出是1。 Standard C++ language definition定義如下: A class with an empty sequence of members and base class objects is an empty class. Complete objects and member subobjects of an empty class type shall have nonzero size. 根據C++的定義,一個空類別的大小不能為0,至少會是1。這是C和C++定義不同的地方。