2012年3月30日 星期五

jaja vm

作了幾個重要的修改:

  1. 對heap和stack相關的幾條指令作了正規化,更符合stack machine的設計。
  2. 新增了一條指令discardx,function return時在沒有使用配製local時可以更簡單的free stack空間。
  3. 修正了heap指令的一個大問題,這樣才有辨法正確實作出string模組的功能,如strcpy等。
  4. 原本的sample作了修正外,新增了string和stdio模組,實作了幾個簡單的function。
  5. 實作簡易stdio.printf時,debugger新增自動dump stack狀態,這樣一來debug就更容易了。此外,在debug過程中也發現了幾個debugger的bug,順便一起修正。
  6. assembly parser也作了一些小修正,現在字串可以使用像是\n的escape字元,ID token也支援原先漏掉的底線_。
  7. jaja vm on java vm順便作了porting,不過還有點小bug,大致上執行起來沒問題。



有二點考慮改進的地方:

  1. function return時對於stack裡需要free的空間的處理。
  2. macro的支援。
這二點可有可無,可以跳過。接下來是支援high level language compiler,目前考慮的語言是c,但也可能是lua。將以高階語言寫成的程式編譯成jaja指令集,然後在jaja vm上執行。如果使用lua,目標是將good作出來的程式轉換成可以在jaja機器上直接執行。如果是這樣,指令集需要重新編碼,這部份需要再研究。


2012年3月2日 星期五

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++定義不同的地方。
Related Posts Plugin for WordPress, Blogger...