2012-04-24 28 views
2

我想知道計算機以1s和0s /低電壓和高電壓形式存儲所有信息,yada yada ...但是當我們編譯程序時,它 - 或者只是存儲在comp上的任何數據 - 都在二進制形式...那麼計算機如何區分2個數據,因爲它包含的是0和1的數據流......爲了讓我的問題更清晰,我們從C中取一個可笑的簡單代碼:計算機如何區分2條數據?

它不會做任何事情 - 只是讓4個變量類型爲int,指向Int,char和指向Char的指針...現在這些將以0和1s的形式存儲在某處...所以,如何計算機是否知道從哪個位開始執行這樣和那樣的變量以及它在哪裏結束?首先,你可能會說計算機有它的地址,沒關係,授予。但是結束呢?...像對象/結構體這樣的複雜數據類型如何?

最後但並非最不重要的是,函數/過程呢?

回答

4

您現在正在閱讀的段落不過是一串字母和標點符號。你怎麼知道一個詞開始和結束的地方?你怎麼知道這些詞的意思?這段文字如何傳達有用的信息?

你可以對數學說同樣的話。當你看到寫在頁面上的數學表達式時,它們只是一系列數字和符號,但它們是以緊湊形式傳達深層次想法的強大方式。然後有音樂。點,旗和線的流如何代表像音樂一樣短暫的東西?

答案當然是有規則的。這些字母不是隨機組合的 - 它們具有特定的順序。當你遵循你和我都知道的規則時,你可以辨別這些詞語,理解他們的個人意義,並將它們結合成想法。

這與二進制數據一樣。區分數據和隨機位的事情是規則的存在,如果遵循規則,允許以有意義的方式解釋這些位。現在,您已經提出了許多涉及各種規則的問題。試圖解釋它們都會佔用更多的空間,而不是像這樣的答案中的合理答案(並且比我願意致力於這項工作的時間多)。但是,如果你拿起一本關於計算機體系結構的書,你會發現對規則的全面討論,它們是如何工作的,它們是如何組織的以及它們是如何實現的。這真的很有趣!

如果您還沒有準備好潛入實際的計算機體系結構的是,一個優秀的書,會給你很多有識之士的是哥德爾,埃舍爾,巴赫:永恆的金色編織通過侯世國。這是一本厚厚的書,並且有很多想法。但它也寫得很好,而且很有趣,你不一定非得從封面閱讀才能學到很多有趣的東西。

1

編譯後的程序將由機器指令組成,這些指令以反映高級類型的模式訪問數據。大多數彙編語言有不同的指令來加載和處理不同大小的數據(加載字節,單詞,長整數等)或類型(有符號和無符號整數,浮點數和長整數等)。由於編譯器在編譯期間具有可用的類型信息,因此它可以發出彙編指令來處理內存中的數據,這些指令全部只是零和1,因爲它們具有適當的結構,通過發出命令來以一致的方式操作數據與類型系統。

對於結構和功能,根據您使用的語言,有很多可能的編碼。去年夏天我教了一門編譯器課程,我們在功能和對象佈局方面進行了兩次講座。前面的鏈接提供了slides for the firstsecond lectures

希望這會有所幫助!

2

它沒有。相同的比特序列可以被解釋爲數字,字符串,代碼,結構,等等。計算機沒有辦法知道一堆比特的意圖是什麼。

試試這個:

int main() { 
    int A = 0; 
    char* pC = (char*)&S; 
} 

你會發現,它的工作原理。它需要整數內存,並說我想把它當作一個字符數組。電腦會高興地跟着這一切。它很少有用,但它可以完成。

對於不同類型唯一不同的東西是它們如何處理。浮游物被視爲不同於整數的方式與字符串不同。如果您查看程序的低級版本,您會發現每個操作都包含特定於某種類型的數據。差異不在於位,在於程序如何操作位。

3

你可以回答所有這些問題(和許多更多關於計算機)通過獲取儘量靠近金屬地:那是,學習assembly.I建議閱讀的書Art of Assembly(免費提供在線)講述了這些主題太。此外,閱讀我的答案上Assembly learning resources。現在,讓我簡單地回答你的問題:

  • 你是正確的,計算機只能看到bits.The操作系統層出不窮呢創建文件系統的工作即使內存可以被認爲是一個非常簡單的文件系統(頁面或段是文件)。現在這意味着操作系統有一個表格,它可以跟蹤每個程序存儲的內容,數據,代碼等。

  • 基本級別的變量不過是bytes.Now ,當編寫聲明如

    A = b + 1

編譯器實際上分配給變量和硬編碼的任意地址(即寫入實際恆定例如0xA3F0)此地址每一個引用它的陳述。

  • 數據結構存儲在許多不同的ways.However,談論C結構時,事情更簡單:他們只是存儲變量,這種結構包含一前一後,如果我們忽略的東西像填充和這樣的這就是爲什麼一個結構的長度總是已知的原因。

  • 函數實際上是存儲代碼的地方。爲了'調用'函數,參數被加載到stack或任何其他全局存儲器空間中,然後跳轉到函數的地址當函數完成時,它跳轉到調用它的地址(地址也被存儲在堆棧中)

  • 理解編譯器完成翻譯代碼的所有工作非常重要以上述方式。高級語言所具有的所有功能都只是爲了讓您的工作更輕鬆,而不過是簡單的抽象。然而,最終它只是位和字節,0和1s,5伏和零伏。

更重要的是,現代建築不要讓OS中持家的itself.Much做所有的東西在硬件層面正在發生的事情太多,比如內存管理,標籤什麼內存地址用於什麼目的等。

+0

感謝這個稍微詳細的答案......但我擔心,看起來你的'大會藝術'的鏈接似乎沒有工作......反正,再次感謝! – 2012-04-25 15:58:43

+0

@ParthThakkar我很抱歉,我修復了它。似乎服務器崩潰了,我發佈時正在工作。 – byrondrossos 2012-04-25 17:53:54

0

用高級語言編寫語言規則和編譯器將該信息嵌入到創建的程序中。 CPU /處理器可以不在意它只是位,它們除了在執行指令的很短時間內沒有意義。對於加法指令,這些位是加法或結果的操作數,對於加載或存儲,它們可能是地址或地址的偏移量等,但在返回無意義位後立即返回。

正如另一篇文章所提到的,您正在閱讀的這些文字只是字母組合中的字母,並且沒有任何含義,對於網頁瀏覽器或顯示像素的視頻卡沒有任何意義,但對於高他們確實有意義。和程序一樣,縮小一點,看整個程序,你會看到指令和位的組合形成了程序序列,這些程序序列實現了你編寫和編譯的變量類型和高級程序序列。

沒有魔法吧

2

計算機不知道,和電腦並不關心。它所做的只是遵循指示。一條這樣的指令可能會說:「從該地址取32位,並從該地址取32位;使用稱爲」二進制補碼相加「的方法將這兩個32位字符串組合;並將結果存儲在第一個32位提到的地址「。每個指令指定:

  • 從其中數據將被讀出並該數據將被寫入

  • 的比特數,以讀取或寫入的地址(ES)

  • 要讀取的位執行的操作

計算機不關心操作是幹什麼的。這只是計算機設計師足以讓操作對我們人類有用。

一個程序,比如你給的這個程序在的高層中是非常真實的。它需要翻譯來生成計算機可以理解的表單。這樣的翻譯器知道什麼是int,什麼int *,並且知道它們在內存中佔用了多少位,以及哪些計算機操作可以有效地應用於它們。

因此,你幾乎回答了自己的問題:

對於開始你可能會說電腦有它的地址,還好,理所當然的。但結局呢?

如果知道開始和結束長度,則結束已知。

更復雜的數據結構通常由單個的,更簡單的部分組成。因此,在翻譯這些代碼時,您需要取得零件,爲它們指定偏移量,確保零件沒有重疊,然後使用偏移量計算用於訪問零件的地址。

程序和功能太複雜,無法在這裏解釋。

但在最後關於您的示例程序的簡短說明。正如你所說,它什麼都不做。一個聰明的翻譯者只會在計算機上寫下一句「什麼都不做」的指示。一個不太聰明的翻譯器會爲你聲明的每個變量分配地址,並寫入兩條指令:「爲這麼多位預留空間;然後什麼都不做」(位數是存儲每個變量所需的空間長度)。在任何時候,計算機都不需要知道程序中的變量。

+0

我會不止一次地提起這個問題。這些0和1的含義是由人類直接或以其編寫的程序的形式真實地給出的。計算機什麼都不知道,它只是執行人類寫的東西,吸收對人類有意義的東西,並可能產生對人類有意義的結果,而不是對人類有意義的結果。它不知道也不理智。所有的知道和推理都是由人類完成的。 – 2012-04-25 08:42:31