Posted on 2008-05-21 11:45
dennis 閱讀(1948)
評論(4) 編輯 收藏 所屬分類:
動態語言 、
涂鴉 、
計算機科學與基礎
轉眼間,來廣州快半年了,感覺還不錯。廣州如死魚所說的那樣,是個包容并且很有活力的城市,習慣了周末煲湯,去天河公園跑跑步,這生活還是挺舒適的,除了比較潮的天氣。
最近跟公司鬧了點不愉快,在轉正時間上,其實不是多大的事,只是心里不舒服罷了,干起活來也沒什么激情了,呵呵。當然,手頭的工作咱還是要高效率地完成,做完兩個游戲后,現在轉到棋牌類,棋牌類游戲核心就兩個算法:隨機發牌和出牌判斷。隨機發牌算法,學習了云風的blog上提到的方法,感覺還可以接受;出牌規則判斷,倒是沒想象中的復雜,建立牌型的OO模型,一切都很簡單了。另外一個發現,用jdk6跑jruby1.1.1,比用jdk5跑效率(包括內存和CPU)好上很多,例如我們一個游戲進程,在使用jdk5時,CPU穩定在15%,內存85M,而改用jdk6后,cpu降到了%5以下,內存也縮減到70多M。
搞完了之后,時間有點空閑,就想學點新東西,最后選擇了Prolog。Yep,非常地有趣,真正的聲明式編程語言。Prolog本質上就是兩個東西:規則和事實,由事實和規則出發,Prolog的推理系統將回答你的查詢(query)。有點類似現在流行中的規則引擎的概念,在對效率不是很考慮的場景中,嵌入一個Prolog引擎做規則引擎完全是可以的,java中有個tuProlog項目,可以關注一下。然后就是一直在讀的sicp,延時求值模擬無窮級數實在是相當地cool,大開眼界。這兩天一直在理解continuation這個概念,小有所得。一個表達式的求值可以分為兩個階段:“What to evaluate?”和“What to do with the value”,“What to do with the value”就是計算的Continuation。例如,scheme求值下列表達式:
(if (null? x) (quote ()) (cdr x))
先求值表達式(null? x),(null? x)就是“What to evaluate”,當(null? x)求值后,需要根據這個值來決定是執行(quote ())還是(cdr x),這個根據值來決定的過程就是Continuation。如果在每次函數調用時,同時傳入當前的continuation,那么就完全可以不要堆棧。call/cc就提供了這樣的一個語法糖,call/cc全稱就是call-with-current-continuation,要求參數是一個過程,調用這個過程,并且向這個過程傳入當前的continuation(一般稱為k,kont,或者Ruby中一般是c,cont),這就是call/cc為我們做的。call/cc是實現Continuation的方式之一,coroutine/fiber/yield也是實現continuation的方式。《The Scheme Programming Language》給出的輕量級進程機制的例子比較有趣:
(define lwp-list '())
(define (lwp thunk)
(set! lwp-list (append lwp-list (list thunk))))
(define start
(lambda()
(let ((p (car lwp-list)))
(set! lwp-list (cdr lwp-list))
(p))))
(define pause
(lambda()
(callcc (lambda(k)
(lwp (lambda () (k #f)))
(start)))))
(lwp (lambda () (let f () (display "h") (pause) (f))))
(lwp (lambda () (let f () (display "e") (pause) (f))))
(lwp (lambda () (let f () (display "y") (pause) (f))))
(lwp (lambda () (let f () (display "!") (pause) (f))))
(lwp (lambda () (let f () (newline) (pause) (f))))
(start)
實現了代碼級的進程調度。