前言
? ? ? ? 前面提到過寫程序的過程:根據各種需求,構建程序模型(邏輯模型),再用代碼實現.本貼關于程序自身的模型以及函數模型,以及推導硬件標準從邏輯到代碼的思路.
程序自身的模型
? ? ? ? 如圖
?應用APP
????????接受輸入---鼠標動作,鍵盤輸入的字符等,得到結果---畫面,顯示數據等.
工具
????????包括框架和編程語言等都屬于編程工具,工具是程序員學習的主要部分.經典描述---程序=數據結構+算法.工具解決的兩大問題:數據的表達,以及邏輯的建立.邏輯表現在函數的定義(函數模型在后面講述).數據和邏輯兩大部分和硬件有著對應關系,機器關注的也是數據和邏輯,只是表現形式不一樣,邏輯被化作指令碼,數據化成地址.所以一個好的程序員對指令集也應該有一定理解.
? ? ? ? 程序的輸出最終會成為硬件狀態的變化.框架封裝硬件標準來控制硬件(后面討論硬件實現的思路).
編譯
????????程序員在IDE(集成開發環境)里寫的內容叫做"代碼",是一個包含空白符(空格,換行符,tab)的字符串,芯片不認識代碼.所以需要用編譯器,使代碼成為具有一定語義的單詞,這個過程就是編譯.編譯的意義之一是認識到所有的語言,或者程序員的寫下的字符都是工具,通過編譯才讓這些字符有了意義.
目標語言
? ? ? ? 可以被芯片識別和執行的指令.物理形式是二進制數(很多和計算機有關的圖片喜歡用一連串的0和1,就是表達在底層起作用的是0和1的組合).內容仍然是數據和邏輯.表示邏輯的二進制數交給PC(程序計數器),表示數據的二進制數表示數值或者地址.地址用于數據傳遞,數值表示結果.
? ? ? ? 機器碼很難讀,所以把他化成較為容易理解的匯編指令.匯編指令也不是很多,常見的有立即數,尋址,跳轉,移動(move),在高級語言如C語言中有對應的定義.除非高級語言中沒有對應定義(如時鐘)再考慮底層的內容.
函數模型
? ? ? ? 函數是把邏輯和實現結合起來的一種形式.函數名稱是程序員要做的事,函數內容是如何實現這件事,函數形參是做這件事需要處理的數據,把他們結合起來就是如何用數據的變化來做成想做的事.
? ? ? ? 函數可能有返回值也可能沒有返回值.返回值和邏輯本身沒有聯系.返回值給調用函數一個結果.這個結果可能會用到下一個函數調用中.
/*偽代碼*/
void fun(){ //函數名表示邏輯,沒有參數傳入/*函數體*/.... //語句---數據變化
}
抽象和推導? ? ? ?
? ? ? ? 筆者把人的思考方式簡單分成抽象和推導兩種.思考能力相應分為抽象能力和推導能力.?
? ? ? ? 抽象是從現象中抽取普遍規律,形成公理,定理或規則的過程.推導與抽象相反,是從已知的公理/定理/規則出發,得到結論,關系,模型的過程.兩者相比,抽象比推導難,科學界的許多成果都是建立在抽象的基礎上(并驗證).
? ? ? ? 思考能力和人的聰明程度是正相關的.學習能力強的人會思考.學習是一種模仿,方法有推導,記憶,有窮假設等.有的人學習時候沒注意這方面能力的培養,單單采用反復記憶加練習(當然即使思維能力強,這兩項也是必須的).推導能力強的人學習效果更好.所以在學習的過程中,時常要訓練自己的思維,讓自己的學習能力變強.
? ? ? ? 從<簡單邏輯學>這本書里,推導有個簡單的公式,離散數學里也有提到
A∈B,B→C,則A→C
? ? ? ? 當A屬于B的范疇,B能得到C,則A也能推導出C?
硬件標準實現的思路
? ? ? ? 以下為筆者推導思路,不保證準確.
? ? ? ? 硬件作為一個程序中的模塊,以文件形式被某種語言的主程序調用.假設硬件標準中有一個畫直線的函數,該如何實現呢?
? ? ? ? 1>從物理結構上看,硬件以含若干根導線的接口和計算機相連接.操作系統可以訪問這些端口并把數據寫入,以達到交換數據控制硬件的目的.那么操作系統是怎么識別到端口的呢?筆者想應該是由硬件驅動程序來完成.硬件驅動程序指明通信的端口,操作系統通信時調用驅動來實現數據傳送.
? ? ? ? 2>端口導線通常不會很多,直接控制寄存器是不夠的.例如8根線的端口只能控制8位.假設硬件有128M空間,那么應該有一種機制來保證數據能傳給這128M空間.假設端口就是8位的,那么和8位端口直連的硬件部分作為數據緩沖區,另外想辦法把緩沖區數據傳遞出去.
? ? ? ? 3>為了實現緩沖區和硬件寄存器區的數據傳遞,在硬件的控制電路中設置一個模式,在這種模式下定義一個硬件標準,先指明傳遞數據的地址,再傳數據過去.
? ? ? ? 假設data_on()函數用于操作系統傳遞數據給硬件,change_on()用于硬件內部傳遞數據.
/*偽代碼*/
//端口地址由驅動給出,可以作為全局變量或局部變量,如果作為局部變量,要在data_on()函數內定義形參
int addr=端口地址; /*把數據傳給緩沖區*/
void data_on(int value){int *p=addr;*p=value;
}
????????change_on()和data_on()互斥,此時操作系統和硬件不能傳遞數據,用于硬件內部數據傳遞.
? ? ? ? 在此基礎上,寫出偽代碼---buf是緩沖區,pointer是硬件內部數據指針
/*偽代碼---標準的實現*/
void line(int x_start,int y_start,int x_end,int y_end){/*第一次傳8位數據給pointer指向的地址*/data_on();change_on();move(buf,pointer);/*第二次傳8位數據給pointer指向的地址*/data_on();change_on();move(buf,pointer+8);
}
? ? ? ? 寫到這里,相信新的問題又給看出來了.pointer這個硬件寄存器的指針如何實現?很容易想到的是在操作系統端實現這個指針.即硬件設計為操作系統操作端口數據,來控制硬件寄存器.
/*主程序端偽代碼*/line(2,3,3,5); //從坐標2,3到3,5畫一條直線
? ? ? ? 這個例子只為了思路鍛煉,不必在意正確與否,或者和實際比較起來會走很多彎路
小結
? ? ? ? 程序自身模型,函數模型的演示,硬件標準如何實現的思路
? ? ? ? ?
????????