計算機的最底層指令是動態類型(dynamic typing)的還是靜態類型(static typing)的?
01-05
是無類型的。對寄存器中數據內容的解釋是用不同指令實現的,如 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 xx16位相對短跳 E9 xxxx32位相對短跳 E9 xxxxxxxx
16位跨段跳 EA xxxx : xxxx32位跨段跳 EA xxxx : xxxxxxxx間接跳 FF xxxxFF xxxx : xxxxFF xxxxxxxxFF xxxx : xxxxxxxx這些指令中,EB E9 EA三個就根據其操作數類型不同而完全不同x86算術乘除指令,左右移位指令也是分為有符號和無符號兩種信息都是01串,代表什麼意義在於你怎麼去解釋。至於是字元,整型,浮點,雙精度,指針,指令,寄存器標號,地址還是其它,要看上下文(context),結合相應地規則。想像一下用紙帶打孔寫程序的時代。
範疇錯了。根本談不上動和靜。
推薦閱讀:
※想教五歲的女兒學編程,什麼語言比較適合?
※棧式虛擬機和寄存器式虛擬機?
※計算機會認為(-b)是(0-b)還是((-1)*b)?
※怎麼從零學起成為一名黑客?
※寫代碼上癮是一種什麼樣的體驗?