2009年1月18日 星期日

CPU部分功能新解

最近和人在網路上討論CPU設計。我寫出了對於堆疊(stack)及中斷(interrupt)的認知。


2004年在學了CPU設計同時,我也一併學到編譯器設計及作業系統原理。這段時間不是很長,大約一年,且一個月才有一天機會。

不過從退休教授那所學的,卻和一般書本完全不同。我學的Forth語言,本身就包含有語言及作業系統的組合。這和一般書分開的不同。

所以我必須一邊了解Forth系統,一邊比對。和現在書上的分類及技術上的不同。

不過也許是同時學,才發現CPU設計上一些功能上設計原理。


1.對於Stack的加入

  因Compiler原理看不懂,改看Yacc的應用,發現所有的Compiler是可以從Yacc中做出來。而Yacc其技術便是使用Stack。

  後來又看了Automata Theory,討論了簡單電腦語言。其中對於自動機(Automata)能做到的事給予描述。

  一個計算器(Computer)能因運作元件可以做到多少事加以證明。從一開始的字詞辦識,僅需使用記憶單元及運算單元。

  但對於Context Free Language來說,必須引入Stack元件。而所謂CFL(Context Free Language)是C語言之類的電腦語言工作之範圍。

  其實書本看到這裏我就有點看不是很懂,但可以知道,所謂電腦語言語法,有其工作能力及可以計算問題的範圍。

  當時我正好學會Verilog,心想其實如果FPGA的容量夠大,可能不需使用CPU這樣的結構就可以工作,那為何要將電腦語言濃縮成CPU。

  其實答案很明顯,節省硬體。也就是我們給定計算程序用來解問題,除了計算程序,結果必須有硬體,硬體要克服實現計算,將必須使用的功能濃縮,就是CPU。

  也就是計算器本身不一定由電子電路實現,也有可能由機械、水力、光能來實現計算及記憶。但加入Stack功能便可以寫入高階電腦語言(如C)來執行。

  由於Stack的能力,使得我對於電腦語言及CPU的演算能力有新的認知。原來電腦語言與電腦本身都是實行運算能力的一部分,而非分開發展的。
 

  a.對於無Stack CPU程式的撰寫

    這算是一個自我練習的題目,但很快的我找到了現實的CPU,那就是PIC微控器。
    沒有Stack那就表示,沒有subroutine可以用。結果程式不就只能寫成長長一條。

    可是還是有人可以在上面寫出程式功能塊,可以重覆使用,並引入參數。其運用技術是使用巨集(MACRO),這是組合語言常用招式。

    巨集實為文章抄寫取代,每次寫出,就會有對應的程式取代,取代完後,程式果真就是長長一條,是符合無Stack CPU來執行。但寫法又可以像一般函式呼叫,只是程式因巨集展開會增大很快。
    
  b.subroutine return stack和data stack的發現 

    主因在於我想解析C語言如何轉成組合語言,發現在X86及68K兩種CPU上不太一樣。X86使用一個Stack,而68K使用二個。

    68k將區域變數另外用一個Stack來存放。這個問題好玩的地方在,萬一程式寫不好,區域變數存取錯誤時,68K的程式仍不會馬上當,X86卻會。

    這使我意識到不同功能Stack最好分開管理,這也是後來RISC CPU要使用多個Stack,方便管理及增加效能。

    而我在看JAVA的虛擬機時,看到採用單一Stack設計,我就會知道一定會像X86一樣效能低且不穩定性高。
 
  我又研究了Lua語言,發現也有使用stack結構來完成虛擬機。一個stack運算機器無疑是完成電腦語言的基本骨架。


2.對於interrupt的加入
  本想,就算沒有這個功能,CPU一樣可以跑。有了也只是對於I/O反應快。
  但在學了作業系統後可不同了。

  有了interrupt,CPU可以在多個程式中轉移,這是多工所需要的。反之沒了interrput,現在作業系統將完全無法移上去。

  現代作業系統的主要功能是產生多工,及電腦資源管理。只要系統大,資源管理是必然。

  但多工的意義呢?我自己寫了一個在8051上的簡單多工系統,發表在8051的版上。
  這個版本的多工因不使用中斷,會使程式寫法大受限制。

  原來多工能力會影響寫程式的樣子,其實程式的寫法不應受CPU的執行力影響。其解法就是CPU必須加入多工,也就是加入interrupt。
 
  a.沒有interrupt時程式的寫法

    這也是自我練習題。結果沒想到竟學到Coroutine技術。其實這是非強制多工作業系統的技術,一個被遺忘的作業系統。

    也就是像一般程式寫法,結構要相同,但不使用interrupt的多工。其主要功能是開發一個coroutine函式,利用它進入及跳出程式。

    因為同一個函式同時可以產生進入及跳出,故名為Coroutine。
    Coroutine的發現,使我完完全全了解了從單晶片電腦到現代PC其上作業系統的演進程序。因為它交代了為何作業系統和單工系統中間的複雜度落差。

    單工系統只需管理共用變數,而作業系統的管理函式一下子暴增。原來是中間有一個被遺忘的作業系統,其管理函式數目介於兩者間。

    Coroutine技術也讓我了解如果純用軟體模擬多工的方法。
   

  b.interrupt和process的相關

    這是多工的反面看。從使用者角度來看。
    由於中斷加入,程式不再受CPU能力而要改寫原始碼。也就是單核心及多核心寫法是沒有差的(有共用變數時則有差)。

    另外一種說法是,使用者可以同時開幾個彼此無相關的程式一同運作,好像每個程式都有獨立CPU。
    這樣的用法不就是平常我們在用的Windows程式,我們一定同時開Word、Excel等程式。Windows要是沒有多工,那不就糟了。

    所以process就是一個利用interrupt產生之CPU的影像。

    也因有了process的觀念,作業系統可以簡單管理多核心CPU。這一切都源於interrupt的發明。


2009年1月5日 星期一

水星領航員

因為看到它的評分很高,不然完全沒有印象它是什麼。封面感覺有點像少女漫畫,所以本來我是不可能主動去看的。

我是先看到動畫版本。有許多人都會快轉片頭,沒想到它沒有固定片頭,我是都有在看片頭及片尾,所以還好。
看了第一集的感覺是劇情好慢,但竟不知不覺看了二集,就是一片DVD。後面還有幕後特集,依一般習慣當然是跳過。
看完了覺得劇情還不錯,就很平順好像也沒有什麼很特別的。因為劇情很慢,所以第二片就順著它的步調慢慢看。
其實這才是這部"水星領航員"真正要觀眾體會的。

沒想到慢慢看後,開始覺得其實看的感覺很舒服,就是一種放鬆,就像是在放假觀光的心情去融入劇情中。
又沒想到的時間就這樣過了,又看完一片,既然步調放慢了,就連幕後特集一併看吧!
看了發覺監制很用心,原來場景是如此考究。
看了二片之後,才開始會了解"水星領航員"為何是歸納為"療傷系"動畫。看了心情真的會好不少。
等我看到第一部最後時,已經又從原先的單純放鬆心情看,到開始受到劇情影響想要看下去。
所以就直接敗了整部"水星領航員第二部"及全套漫畫。

其實漫畫看了是不如動畫版本如此有感覺。這點在看第二部動畫時才了解原因,因為動畫版本在音樂上是很下功夫的。
所以整個劇情的感覺是被音樂整個拉展開來。有許多場景、感覺都是用音樂做了很好的提昇。

而看漫畫時,我也可能受到動畫版本的影響,看得相當投入。
其實漫畫劇情也是不錯,只是因風格及情緒若是沒有投入,只是感覺到很輕鬆的漫畫。

在動畫版本則是不同,會特別強化情感劇情,加上背景音樂帶出的情境,真的很令人感動。
不論是漫畫版或動畫版本,都已經結束了。劇情並不是很長,其實我覺得像這樣的小品,長度不長反而才會讓人有意猶未盡的感覺。

雖然我未看完動畫版本,但也引發我去思考為何這樣的小品作品會引發現代人在情感上的共鳴。
主角所經歷的也是一般人的經歷,學習、成長、成熟及別離。就男生來說,並不會有很強的感覺。
可是在出社會後,一直在拼工作,再加上遇到不好的同事、上司及老闆。漸漸的都會人的感情都變質了。不是很緊張,就是易怒,整天處在戰鬥狀態中。人之間的感覺也都被不好的情緒所環繞著。
對於出了社會一段時間人來說,情感差不多都冷凍了。所以要放鬆心情及情緒是不容易的。
"水星領航員"的世界則是提供都會人情感可以放下的環境,使用音樂放鬆並引入劇情中,讓人去感受樸質的鄉村人文,體會主角純真的情感。
這對都會人來說真的是一劑療傷良方。也難怪會稱為"療傷系"動漫畫,能溫暖了都會人冰凍已久的內心。
在看"水星領航員"時對於主角經歷所激發的情感,在放鬆的心情下,更能因為我們也曾經歷的感覺而產生情感上的共鳴。

另外在製作上,雖然只有電視劇製作成本,不過監制很用心的取材,找個性相似的配音員及音樂聲樂家。
良好的題材使得工作人員用心去製作,配音員也會投入感情。在參與人員的熱心下使得"水星領航員"呈現更為自然的感覺。
算是少數動畫做得比漫畫更有感覺的作品,甚至為了幕後工作的音樂人員,還特別做了一集非漫畫劇情將音樂人員一併畫入。
在製作上的用心,也在小地方影響著觀眾,也是動畫成功的因素之一。

"水星領航員"動畫雖分三部,但劇情很鬆散,就算單獨一集看,也並不會有連貫性問題,所以重看也沒有什麼壓力。反而看過的人,有時還會更想重看,放鬆兼重溫。

說了這麼多,但我是刻意避過劇情的,或是說看的感覺比劇情來得重要。
所以要放鬆心情去看這部好作品。

就個人來說,看了曾有幾天週遭人都看得出我心情超好,不過工作也沒做很好也是。哈哈...

取山泉水

住家後山上可以裝山泉水。因山路很陡,所以是騎機車上去的。剛好我的機車可以放一個30公升的水箱,於是都會用它來裝泉水。
可以取用的地方有幾處,會用管子打入山壁,泉水會從管子中流出來。第一次去會覺得很神奇,而且山頭就在抬頭不遠的地方,大約20~30米高而已。
照片上取水的地方不算是好的,最好的地方是一處石壁,整片石壁只有管子有水出來,對面有涼亭,所以有人從一早四點就去排了。
因為人太多,所以我只好找比較差的地方裝水。
之前家中泡茶是用逆滲透水,茶水是一般金黃色。可是用山泉水泡,一開始是金黃色,後來顏色會變深。而且山泉水的口感也比較滑順。
我裝了一次回家後,就不習慣使用逆滲透水來泡茶了。
不過也因水質好,久未下雨時水量變少時就很難裝到水了。