[音樂] [音樂]
[音樂]
[音樂] [音樂]
[音樂]
大家好,我是孔令傑。
那我們 今天呢,要來繼續我們的課程。
今天我們得要在繼續講程式設計之前,得要稍微停一下 我們要先介紹關於 Computer 的基本概念。
那因為寫程式是為了要讓電腦照我們的
意思運作嘛,所以我們必須要對於電腦運作的原理有一些認識,才能讓我們寫出更好的程式來。
那麼呢,我們會提到的相關的知識,有關於形態的,也有關於精確度的。
好 那我們就來開始。
講到電腦大家其實都不陌生,因為幾乎每一個人都用過電腦。
那麼在現代的電腦來說的話呢,它其實都 follow 一個 架構。
好,就是你看到PC啦、 這個筆記型電腦啦等等各式各樣的
其實架構都是一樣的,那這個架構是什麼呢?我們有個術語叫它 von Neumann architecture。
von Neumann 是提出這個架構的人。
那我們來看看這個架構是什麼。
以這個圖來說啊 右手邊有四個東西,對吧?它就是電腦現代有的四個架構。
首先呢,input 就是所謂的輸入裝置,可能是你的鍵盤,可能是你的滑鼠
可能是觸碰式熒幕,可能是麥克風等等,讓你可以輸入一些資訊給電腦。
可能是打字、 可能是用滑鼠,可能是講話等等。
output 包含什麼呢?包含所謂的輸出裝置,比如說螢幕啊 這個喇叭啊、
printer 啊等等,所以你之前寫程式的時候 其實已經用過 input、
output 了,只是那個時候你就只是用鍵盤輸入 螢幕輸出,但如果你願意的話,以後你也可以寫成是從滑鼠
輸入,然後喇叭輸出,或者是印表機輸出等等都是有可能的。
那麼呢,在 input 跟 output 中間,我們有時候會用到所謂的 storage。
storage 以現代來說啊,通常是指所謂的 non-volatile 的 storage,也就是非揮發性的。
那意思就是電腦關機這些資料依然存在,比如說你們的電腦裡面的硬碟,或者是現在 不太容易看到的CD、
DVD 啊,或者是隨身碟等等的,那這個東西主要是幹嘛用的呢?
就是我們目前為止寫的程式都是輸入一些東西、 做點運算 輸出結果、 結束。
但我們以後可能需要把它們存起來,以便 我們的程式反復執行,反復執行的結果是可以被留在硬碟裡面的。
那那個時候當然都需要這個儲存裝置來幫我們的忙啦,不過那也是蠻久以後的事情了。
最後,是關於核心,也就是所謂的中央處理的部分。
那中央處理包含兩大部分,包含CPU是做運算的,以及 Memory 是做儲存的。
那 Memory 呢是所謂的 volatile 的 storage,意思就是說存在
所謂的記憶體裡面的東西,只要你關機,東西就會不見。
就是 volatile 的部分啦,volatile 的部分。
那麼CPU呢會根據 input 的東西來做一些運算,有必要的話,它會暫時存在 memory 裡面。
或者是,如果有一些資訊,其實是存在 storage 裡面的。
它會去硬碟裡,把資訊拿來存在記憶體 然後跟記憶體做一些互動,最後把結果算出來了以後呢,再丟到
output 裡面去,大概是這樣子的架構。
好,那麼現在對架構有概念了以後,我們來回憶一下我們寫過的 program 是在幹嘛。
program 事實上是存儲存著一些原始碼
的檔案,對吧?大家寫過程式,寫的程式你其實是
在文字編輯器裡面輸入許多的程式碼,然後存成檔案。
下次你要的話可以再打開來,那很明顯地,就是存在所謂的剛剛的 storage
裡面,因為你今天寫完、 存檔、 關機
明天打開,檔案還是在那裡好,所以你這個 program 事實上是存在在 storage、 存在硬碟裡面的。
當我們要執行或者是啊,跑一個程式的時候,我們會幹嘛? 我們在電腦裡面的
memory 裡,好,就是剛剛 CPU Memory 那一塊我們會
create 變數,我們會宣告變數嘛,宣告了變數以後讓我們把值可以存進去。
然後呢,我們每一次要做運算的時候,加減乘除,任何形式的運算都好 我們就要把值從
Memory 移到CPU裡面,算出結果來了以後再放回
memory,以便我們可以 等一下要 output 或者是怎麼樣的。
好,所以呢,我們現在來回顧一下剛剛的架構。
我們每一次程式要跑的時候呢,我們會去 storage
裡面把 program 拿出來,拿出來了以後讓它接受 input。
然後在CPU Memory 裡面反復地移動運算了以後,最後可以把結果 output 出去。
我們目前為止都是從 input 讀東西來,然後
輸出到 output 去,好,鍵盤打東西進來,然後呢CPU算一算。
然後把結果輸出到 output,但有一天你會學到更多。
你會,比如說你可能會從 storage 讀取資料, 好,你有一個文字檔,你有一個
Excel 檔,你有一個 whatever 檔,你會從檔案裡面讀取資料。
然後呢,一樣你做運算、 做運算,但最後你輸出說不定也不是輸出到螢幕。
說不定你會輸出到硬碟裡面去,你會儲存你運算的結果到另一個檔案裡面去,好,這個是有- 可能的。
不過不論是多麼千奇百怪的事情,希望大家可以記住這一個架構。
如果你這個架構可以了然於心的話,你做很多事情的時候都會很方便。
那麼呢,我們剛剛就提到了變數和值,大家並不陌生,但是呢,我們還是再講一下
當我們宣告一個變數的時候,我們的電腦裡事實上發生了
什麼事情呢?作業系統也就是你的通常是Windows或者是Mac 作業系統就會在記憶體裡面,好,在記憶體裡面
找一塊空間去存,去存那個變數要存的值,有點像是這裡有一塊空地
好,一塊空地很大,如果我想要宣告一個變數,就像是去買了一塊地一樣,那麼這塊地就- 是我的。
我以後如果把值存上去,就像是我可以在這裡種樹啊 我可以在這裡蓋房子啊,我可以在這邊挖池塘啊等等。
我可以決定這塊地上面要放什麼,就像 我可以決定變數裡面要存什麼東西,存了以後
就好像是把資料寫進去一樣,那當然我也可以讀取,我可以派人去看看,哦,有兩棵樹啊。
或是我可以over written,我可以把上面東西全部用挖土機鏟掉再蓋別的,那就是
那就是一塊空間,我可以把值寫入讀出的概念。
那麼作業系統 它必須要對於這些只有一些編號,或者說是記錄
以便我們在呼叫這些變數的時候可以找得到嘛,所以對於 每一個變數,我們會有名稱。
好,變數名稱是你取的。
那這樣子你才能跟電腦溝通說,現在去幫我找這個名稱為a的變數,哦,在那裡。
那裡是哪裡呢?作業系統必須要知道 memory 的 address,每一個變數都有一個 address。
就像每一戶人家每一塊地都有門牌號碼是一樣的道理,然後裡面存的 value
是多少,電腦當然要記得,對吧。
最後是這個變數的形態是什麼?那 形態的東西我們等一下會詳細講,它的性質有點像,同樣是一塊地
這塊地是農業用途還是工業用途,還是商業用途還是教育用途,會讓這塊地上的東西
合法不合法,有一些差別,對吧。
好,如果這是農地上面可能不能蓋旅館 之類的,所以呢,形態會對於我們使用這個變數有一些影響。
好,不過那個待會兒再說。
所以我們很快的看一個例子,來看看 當我們寫了一個程式,並且很快嘗試要執行它的時候,電腦裡都發生了些
什麼事情?那麼呢,我們這裡這個程式是非常地簡單:num1 等於
13 所以我就宣告了一個變數 num1,然後把 13 assign 給它。
num2 被 assign 成 4,然後把結果加起來 print 出來。
我們來看看依序會發生什麼事情?當我執行第一句話的時候,電腦會
記憶體裡面幫我宣告一塊空間,或是找一塊空間,這個空間會有一個 address。
好,那長得奇形怪狀的,你也不需要太在意,反正就是電腦裡面有一個編號就對了。
然後這空間會有一個識別字 identifier,或者說就是變數名稱。
電腦會說,ok,這塊地叫做 num1。
然後呢,存什麼?存 13 這個值。
所以以後只要你跟電腦說,我要 num1,電腦就會去那個地方把
那個值取出來,接下來你執行的第二句話 num2 等於
4,所以電腦就會去另一個地方 把一塊空地找出來,然後呢?跟你說這塊地叫
num 2,然後呢把 value 是 4 就把它存進去,如果今天電腦要執行
print num1 + num2 那電腦分為兩個動作,首先它要去看看
num1 在哪裡,把值取出來; num2 在哪裡,把值取出來。
因此得到了 17。
17這個東西,它會先暫時存在記憶體裡面的某個地方。
因為它不知道你這個加起來要幹嘛。
不一定是 print 啊,你可能會跟別人做運算啊等等。
它會先暫時存起來,然後因為我們做了print 的這個活動
所以 17 會被丟到你的 console,也就是你的螢幕上,就是你
平常沒事,會看到的那個黑底白字的地方,你就看到 17 啦。
那這個時候你會發現,哎,剛剛這一塊空地現在被清掉了。
所謂清掉了的意思,就是這一塊地別人可以拿去用了,因為這塊地已經完成它的任務了嘛。
好,剛剛我只是暫存而已,我不需要繼續霸佔的那塊空間
讓別人不能用,所以這整個程式執行完了以後,你會在螢幕上 也就是你的
output 看到 17,另外你剛剛宣告的 變數都還存在在記憶體裡面,就是這個 num1 跟 num2。
如果你現在 program 結束,那這兩塊空間也會被清掉,或者是你程式還 沒有結束,但是忽然電腦停電了,跳電。
那電腦被 shut down 關機 那麼這兩塊空間也會被清掉,下次電腦重開13跟4這個數字就已經不見了。
好,那是因為我們的 memory 就是如剛剛所說的,如果電腦關掉
就不見了,所以呢,今天如果你希望這個 4 啊、 13 啊、 17
啊能夠被儲存起來 它就要被寫入到檔案,存在在硬碟裡面去才可以,所以這是這個的差別。