|
這個名詞就算是國內做 compiler 的實驗室成員可能也未必聽過,畢竟國內沒什麼教授有種去帶領自己的團隊寫一套新的 compiler。
這原因除了短視近利等心理因素外,也還牽涉到不得不短視近利(或說隨波逐流)的民生問題。
這個名詞其實也沒有那麼重要,原則上來說只要負責實作 compiler parser 部分的人懂就好了。
實作 compiler 但不負責寫 parser 的人不懂其實也無所謂,只是要做好被外面不懂 compiler 內部分工細節的人取笑的心理準備。
實務上沒有什麼人會真的去寫到非得注意這東西的程式碼,如果真的有的話他的同事會先讓他整個人黏在牆壁上。
簡而言之這東西的用途除了跟 compiler 內部的最佳化機制有關外,在使用方面來說就單純只是測試 compiler 到底是否完全符合語言標準,
以及為了可憐一下那些初學程式設計的新手,而給他們一個可以依歸的準則罷了。
國內最容易讓人重新注意到這類問題的主要亂源,常常是不懂又亂出考題的學校老師和公司的面試官 (雖然我相信有很小一部份是真的故意出來考人)。
其次的亂源,就是自以為把程式寫到讓大家看不懂或容易看錯就代表很強的神經病。
Continue reading sequence point »
今天剛好又遇到有人在問這個。
可能網路上能查到的資料太零散看規格書又查不到,很多人不清楚這東西是幹什麼的,
甚至還有一堆網頁列出了 x86 還是其它硬體架構的組語講了半天都講不到重點,所以還是在這簡單的做個說明好了。
Continue reading strict aliasing »
所以不要衝太快,
編大一點的程式遇到 list::sort(functor) 就炸了,
亂寫的範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#include <list> using namespace std; struct A { int v; }; struct Compare { bool operator()(const A *a, const A *b) const { return a->v > b->v; } }; int main() { list<A *> l; l.sort(Compare()); } |
Continue reading GCC 4.5 的 C++0x mode 還沒到堪用的程度 »
台灣真的是太多老師喜歡亂教了,
結果每年都有學生以為傳 pointer 就是 pass-by-address (即 pass-by-reference)。
後來發現初學者常搞不清楚的原因就是被那些星號給迷惑了,
所以把星號藏起來講就簡單了。
|
#define GET_LVALUE(x) (&x) typedef int *MyType; void foo(MyType var) { } int main() { int var1 = 0; MyType var2 = GET_LVALUE(var1); foo(var2); } |
意思完全一樣,
只是換一種寫法而已。
會說這個不叫 pass-by-value 的人就減少了一大半,
如果我蓋掉最上面的 define 跟 typedef 那幾乎不會有人說 這是 pass-by-address 了。
所以結論就是一堆寫書的亂寫、教書的亂教,
不曉得這能不能當成商品重大瑕疵要求退書錢或學分費?
這麼多年看下來實在是有點火大。
今天用 US$ 39 的價格續購了 Enterprise Architect Corporate Edition 的 Academic License,
基本上也是把學生證掃瞄給他們就可以了,
其實在蠻多國家要搞這個還得辦國際學生證,
但這家公司似乎掃了中文的他們看了也直接採信,
大概嫌麻煩或不差這個單一客戶吧,
另外他們的 sales 說要以教育授權續購的條件是必須在同一個教育單位,
換了的話好像就要重新買一次了。
Continue reading 續購 Enterprise Architect Corporate Edition »
記得發現這東西的時候是剛把自己對 UML 的認識從 1.x upgrade 到 2.0 的時候,
除了讀讀相關的書籍之外,
也在實作過程中翻閱 UML 規格書來確認 classifiers 之間是否可以存在關聯,
當時在查閱 UML Superstructure specification 時,
特別注意到了它在 Interactions 一章中的某兩個範例,
是手邊的書中都沒有提過的。
Continue reading 藏在 UML 規格書中的重要範例 »
這個問題太多人問了,
所以還是先寫下來當成 FAQ 用;
官方文件的 quick start 這一章是類似下面這樣教:
|
parse("ffff 1234 abcde", +hex_p, space_p); |
加上 The Scanner and Parsing 那一小節也提到 pharse-level parsing 有兩種版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
template <typename IteratorT, typename ParserT, typename SkipT> parse_info<IteratorT> parse ( IteratorT const& first, IteratorT const& last, parser<ParserT> const& p, parser<SkipT> const& skip ); template <typename CharT, typename ParserT, typename SkipT> parse_info<CharT const*> parse ( CharT const* str, parser<ParserT> const& p, parser<SkipT> const& skip ); |
導致有人寫出這種 code 來結果編不過在那邊哭:
|
rule<> r = +hex_p; string str("ffff 1234 abcde"); parse(str.begin(), str.end(), r, space_p); |
Continue reading 用 Boost.Spirit 搭 std::string 使用時容易遇到的問題 »
前幾天 VP-UML 邁進了 6.4 版,
它在 Visual Modeling 的功能裡加入了對 design pattern 的支援,
不過限定 $299 的 Standard Edition 才能使用它,
$99 的 Modeler Edition 是無法使用的。
Continue reading 買了 Enterprise Architect Corporate Edition »
在設計 editor、game 或是實現軟體系統中的 heuristic algorithm 等情況下,常需要設計 save/load 或 undo 之類的還原功能。學過 design pattern 的人大都知道 memento 和 command 這兩個 pattern。通常比較簡單的東西靠 command pattern 就能順便做出 undo 功能了,但是在其它比較複雜的狀況下就需要靠 memento pattern 來幫忙,將物件的狀態儲存起來以便隨時復原。有些語言如 Java 提供了將物件本身序列化 (serialize) 的機制,所謂序列化就是把物件狀態變成一串資料儲存起來。這樣就可以做到和 memento 相同的功能,更進一步的話還能將序列化後的資料存在 disk 上或透過網路傳遞。C++ 語言本身沒有支援 serialization 的功能,所以 boost 以 library support 的形式做了一個類似的。內建的支援有 binary、text 和 xml 三種輸出格式。這篇只會出現 text,反正用法都沒差 (唯一要注意的就是 binary 並非 portable)。
Continue reading Boost.Serialization »
很久沒發程式文了。
最近常到處在網路上亂逛,
發現 boost 在台灣真的是沒什麼人在用。
應該說 C++ 普及的程度實在太低了,
看來還是放一點東西比較好...
不過用 1280x1024 解析度 + IE7 來讀這篇大概 code 右半邊會無法顯示,
懶得玩複製貼上的話就乖乖切到 1920x1200 或用 firefox 吧 (字會小一點但是很難看);
不然就等我有空去改改 css。
Continue reading Boost.MultiIndex »
|