Friday, April 15, 2011

無止境的學習 (一)

很少寫技術文章,或許是過去這幾年其實碰了太多新東西了,今天突然有種衝動想要紀錄一下,順便回顧一下這段時間的成長。

首先是C/C++。公司絕大部份都是寫C++,其實現在回頭看過去這兩年半,對於這個語言的了解似乎又更進一步了,對於一些新的C++0x的功能也因這兩年C++0x的標準化而認識更深;當然總是有人會覺得這些很沒必要,用最基本的C++也可以把程式寫的很好,我完全同意;但我們還是用了非常多C++0x的功能,只是因為有了這些功能,讓C++更簡潔、效能更好、寫起來更簡單,甚至是讓程式碼的架構變的更有彈性;其實我認為這些不是什麼太強大的新功能,只是把原本C++該做的補完罷了,解決了許多C++當初設計上的漏洞。

舉個例子,像是strong-typed enum就解決了enum這種C++時代遺留下來、大小不明確的型別。auto跟decltype就解決了很多複雜的nested template(如boost tuple)很難寫出正確的type然後宣告一個變數的問題。把threading放進語言當中我覺得也簡化了很多multi-core的程式設計,以後就不用再用一堆有的沒的3rd party threading library了(雖然目前應該沒有compiler完全實作全部的C++0x threading,我是早就先偷買JustThread來嚐鮮了XD)

除了C/C++之外,這兩年許多新的語言如雨後春筍般的冒出來,也愈來愈多人用,像是Google Go,Scala等等。其實看這些新語言的設計,不難發現這幾年動態語言流行的一些新東西,像是closure、signal/slot、map/reduce的概念都直接built-in到語言中。

在這麼多新語言中,我認為其中Google Go的設計是我最喜歡的,但是他的語法就不是人人都能接受就是了。另外,許多語言都開始想要在語言設計上支援many-core computing,像是erlang的agent或是stackless python tasklet;當然我其實沒那麼多時間把這些語言全部玩過一次,但簡單看一下其實就看的出他的一些特色。

而除了語言之外,因應web 2.0或是新的many-core computing的大趨勢,有許多有趣的framework被開發出來;像是基於server-side javascript的node.js,我個人認為這個實在是個非常有趣的東西,雖然效能不可能跟native code來比,但是他運用了javascript語言的特性,讓http/json server開發變的超簡單,真的很有潛力。

至於many-core computing,像是zeromq的架構我覺得也是非常好的,只要你願意花個幾個小時trace一下zeromq的設計,就不難發現他lock-free network of queues的強大之處,我們甚至自己也重新實做了一個類似的,用來提昇多核心的效能。

對於像我們在做high performance computing跟cluster computing的人來說,一些cluster membership或group communication的middleware也是非常必要的;例如今年OSDC分享的zookeeper(作者居然親自來了),例如RedHat支持的OpenAIS/Corosync等等,我覺得去認真的讀完一些consensus的paper,再回頭看這些分散式系統的實作,也會非常有幫助。

除了language與middleware之外,這幾年compiler的技術也是一日千里。從以前我在學compiler都還在用lex/yacc的時候,進步到現在用一套ANTLR搞定所有AST,甚至是有神人直接用metaprogramming做出boost::spirit跟yardparser,再加上一套general-purpose的LLVM做為universal IR,連optimizer都不用自己做了,這些都實在是五年前完全想像不到的啊! 而且搞不好再過幾年,clang就可以把gcc幹掉了也說不定呢~因為有這些compiler的技術,我自認為寫compiler已經不再是什麼深奧的學問、神祕的技術了。所以套句食神的話:只要有心,人人都可以寫compiler...(待續)

0 Comments: