計算機的最底層指令是動態類型(dynamic typing)的還是靜態類型(static typing)的?


是無類型的。

對寄存器中數據內容的解釋是用不同指令實現的,如 addb addw addl addq 是四個完全不同的指令。在編譯的時候會根據變數的類型選擇合適的指令寫進代碼里。


寄存器和內存里存儲的數據對於CPU來說都是沒有類型的,他們都是一些二進位串。

但是當CPU執行指令的時候,會把這些東西當做某一種類型(不一定是程序語言里的類型)來運算。

虛構一個例子:

64位寄存器A和64位寄存器B可以64位執行整數加法放回A,也可以執行雙精度浮點乘法放回A,也可以當做兩個32位整數執行SIMD加法放回A。

也就是說,運算時這些二進位位當做什麼「」

類型」,是由執行的指令來確定的,而且這些「類型」不一定對應高級語言的類型。

====

如果題目描述「計算機的最底層指令是動態類型(dynamic typing)的還是靜態類型(static typing)的?」 沒有說錯的話,我上面寫的都是關於「數據「的。

非要說指令的話,CPU里所有運算指令可以看作是靜態類型的。


沒有類型,只有數值。要非說有類型,都是整型值,因為都知道一切數值,不管正負、浮點,甚至於機器指令,在底層都以二進位形式表示,寄存器和內存存儲單元也只能存儲這樣形式的值。


CPU的內存訪問是沒有類型的,它讀寫特定數量的位元組。但是計算操作是有類型的:你用什麼指令,它就把當前寄存器里的數據作為那個類型去操作。


CPU裡面並不說什麼動態不靜態,所有的數據類型都是寫死的

參照

http://sandpile.org/x86/datatype.htm

不過,不同的操作數,定址方法對應的指令可以不同

比如x86的四種無條件跳轉指令

8位相對短跳 EB xx

16位相對短跳 E9 xxxx

32位相對短跳 E9 xxxxxxxx

16位跨段跳 EA xxxx : xxxx

32位跨段跳 EA xxxx : xxxxxxxx

間接跳 FF xxxx

FF xxxx : xxxx

FF xxxxxxxx

FF xxxx : xxxxxxxx

這些指令中,EB E9 EA三個就根據其操作數類型不同而完全不同

x86算術乘除指令,左右移位指令也是分為有符號和無符號兩種


信息都是01串,代表什麼意義在於你怎麼去解釋。

至於是字元,整型,浮點,雙精度,指針,指令,寄存器標號,地址還是其它,要看上下文(context),結合相應地規則。

想像一下用紙帶打孔寫程序的時代。


範疇錯了。根本談不上動和靜。


推薦閱讀:

想教五歲的女兒學編程,什麼語言比較適合?
棧式虛擬機和寄存器式虛擬機?
計算機會認為(-b)是(0-b)還是((-1)*b)?
怎麼從零學起成為一名黑客?
寫代碼上癮是一種什麼樣的體驗?

TAG:計算機 | C編程語言 | 彙編語言 | 計算機科學 | 計算機歷史 |