簡體   English   中英

“類型”在物理上意味着什么?

[英]What does “Type” mean, physically?

我聽過很多關於“ 類型系統”,“強類型語言”等等。 目前我正在研究一些.NET COM互操作問題,它解決了“編組”問題。 而AFAIK,marshaling則是關於.NET類型和COM類型之間的轉換。

在諸如編程語言的許多場景中,當談論類型時 ,我們關注邏輯意義。

現在我想知道: “類型”在物理上意味着什么? 在某種程度上,我們可以觀看和觸摸。

我目前的理解是“類型”只不過是計算實體的內存表示

非常感謝您的回復。

添加-1

來自MSDN的一些引用:

在托管/非托管邊界上編組簡單的blittable結構首先要求定義每個本機結構的托管版本。 這些結構可以有任何合法的名稱; 除了數據布局之外,兩個結構的本機版本和托管版本之間沒有任何關系。 因此,托管版本包含與本機版本大小相同且順序相同的字段至關重要。 (沒有機制確保結構的托管版本和本機版本是等效的,因此不兼容性在運行時才會變得明顯。程序員有責任確保兩個結構具有相同的數據布局。)

因此,就Marshaling而言,布局至關重要。

我認為編程中“類型”有三個方面(它們可能重疊,所以不要將其視為一種快速分離):

  • 類型是一組類型的元素,並且每個程序/程序集/單元定義這樣的集合。 這是我能想到的最理論化的想法,可能對邏輯學家和數學家最有用。 它非常通用,它允許您在其上定義類型系統的想法。 例如,編程環境可以定義這些類型的關系 ,例如is-assignable-to relation。

  • 類型是語義類別。 這是一種語言或認知的想法; 換句話說,對於正在考慮如何編程計算機的人來說,它是最有用的。 類型封裝了我們所認為的“屬於某一類別的東西”。 類型可以由實體的共同目的來定義。 當然,這種根據目的的分類是任意的,但這沒關系,因為編程中的類型聲明也是任意的。

  • 類型是數據如何在內存中布局的規范。 這是我能想到的最低級別的想法。 在這種觀點下,一個類型沒有說明數據的目的或語義,而只是計算機將如何構建它,處理它等等。在這個想法中, 類型更像是數據編碼通信協議

您選擇的類型含義取決於您的域名。 正如已經暗示的那樣,如果你是一位正在研究如何證明程序屬性的邏輯學家,那么第一個定義將比第三個定義更有用,因為數據布局(通常)與證明無關。 如果您是硬件設計人員或CLR或JavaVM等低級系統的程序員,那么您需要第三個想法並且您並不真正關心第一個想法。 但對於那些只想繼續完成任務的普通程序員來說,它可能是適用的中間程序員

在許多語言中,物理上這些類型僅在編譯時存在。 對於較舊的語言尤其如此。 我猜想,C有這種類型的永遠存在於內存中所有,以任何方式 ,在程序運行時。

在其他語言中 - 特別是那些允許運行時類型信息訪問的語言(例如帶有RTTI的 C ++,或C#,或者像Python這樣的任何動態語言) - 類型只是元數據。 類型的二進制描述。 你知道,如果你試圖將數據序列化為二進制流,你會得到的東西。

我會說恰恰相反。 它是內存中位和字節的語言表示。

類型是關於位和字節的元數據,它定義了如何以有意義和安全的方式操作它們。

我會說類型可以有多種含義。

我傾向於將其意義作為接口約束。 (編寫良好的目標代碼將所有內存數據定義為私有)。

在這種情況下,類型絕對與內存中表示無關。 相反,它只是其成員方法的合同。

“類型”是一個集合,其成員(“對象”)具有離散的有限表示和一組有用的共享屬性。

對象的實際內存中表示不一定是類型定義的一部分。 也就是說,單個對象可能具有多個內存中表示。 重要的是物體可能不是無限的或模擬的。

類型的共享屬性可以是任何東西。 在面向對象的系統中,屬性將包括(在較低級別)數據和行為。 事件通知也很常見。 某些屬性可能是有條件的而不違反類型定義(如果布爾屬性X為真,則屬性Y也存在),只要規則在類型中的所有對象中是一致的。

“子類型”是類型的子集,其成員具有更廣泛的共享屬性集。

這種思考類型的方式與你在問題中提出的方式有很大不同,我相信這種區別很重要。

如果將類型視為內存中表示,那么該表示將被視為該類型的顯着特征,並且它將被視為理所當然。 Interop將通過低級轉換和現有字節序列的重新解釋來實現。 在某些情況下,當表示發生變化時,這可能會導致問題。

但是,如果人們根據其屬性看到類型,那么從一個類型系統到另一個類型系統的轉換將涉及相應對象之間的數據字段的高級轉換。 確定對象是否兼容將基於其顯着屬性,並且問題變得不太可能。

即使在互操作的世界中,也不應該依賴對類型內部細節的了解。 也就是說,不應該使用不屬於該類型定義的類型的實現的特征,就好像它們是該類型的一部分一樣。

這取決於您正在使用的編程范例。 在OO類型中,可以表示現實世界對象,換句話說,計算機可以表示的現實世界對象的所有數據(或者您感興趣的部分)。

IIRC強類型語言在編譯時強制執行對象類型,例如,數字必須是int,float等類型。 在弱類型語言中,你可以說giraffe = 1 + frog * $ 100 /'May 1',並且類型在運行時被解析。 而且您通常會遇到很多運行時錯誤。

在數據交換情況下(如COM,CORBA,RPC等),由於二進制兼容性(big endian,little endian)和格式(如何在從一種語言傳遞到另一種語言時表示字符串和日期,每種語言都很難實現類型)與不同的編譯器?)。 因此,編組嘗試解決每個參數的類型。 ASN.1是在機器之間交換數據時構建“通用類型”框架的眾多嘗試之一。

類型是人類可讀的邏輯藍圖,用於表示如何在內存中表示和組織數據。 這是一種允許人類以標准方式將概念如何合理化為數字序列的方式。 機器和編譯器真的不關心字符串,整數,fooClass之間的區別。 這些“類型”簡單地同意組織單元,所有人類程序員都將邏輯概念轉換為內存中的合理數據結構。

類型是捆綁字。 當你知道什么類型的東西時,你就會知道它占用了多少內存,它是如何存儲的,但更重要的是你也知道你可以用它做什么。 例如,有幾種整數類型占用與指針相同的內存量。 但是,您可以將一個整數類型乘以另一個整數類型(例如,3乘4),但不能將兩個指針相乘。 你可以在一些具有Foo方法的用戶定義類型(struct或class)上調用Foo()方法,例如編寫x.Foo(),但是你不能為不同的用戶定義類型執行此操作沒有Foo方法。 您可以在某些類型之間進行轉換,但不能在其他類型之間轉換,或者您可以將A轉換為B而不是B轉換為A.依此類推。 在某些語言中,也存在區別,例如它是否為常數。

編譯器和運行時會攜帶大量信息,所有這些信息都會增加項目的類型。 它占用多少字節的物理性(或者你可以合理地聲稱有形的任何其他東西)實際上並不重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM