Was bedeutet "Typ" physisch?

8

Ich habe viel über " Typ System", "stark typisierte Sprache" und so weiter gehört. Momentan arbeite ich an einem .NET COM Interop-Problem, das viel "Marshalling" anspricht. Und AFAIK, Marshalling ist ziemlich über die Konvertierung zwischen .NET-Typen und COM-Typen.

In vielen Szenarien wie der Programmiersprache, wenn wir von Typen sprechen, machen wir uns Gedanken über die logische Bedeutung.

Nun frage ich mich: Was bedeutet "type" physisch? ? In gewisser Weise können wir sehen & amp; berühren.

Nach meinem derzeitigen Verständnis ist "Typ" nichts anderes als die speicherinterne Repräsentation einer Berechnungseinheit.

Vielen Dank für Ihre Antworten.

Hinzufügen-1

Ein Zitat aus MSDN :

  

Marshalling einfach, blitable   Strukturen über die   verwaltete / nicht verwaltete Grenze zuerst   erfordert die verwalteten Versionen von jedem   native Struktur definiert werden. Diese   Strukturen können einen beliebigen Namen haben;   Es gibt keine Beziehung zwischen den   native und gemanagte Version der beiden   andere Strukturen als ihre Daten   Layout. Daher ist es wichtig, dass   Die verwaltete Version enthält Felder   die sind gleich groß und gleich   Bestellung als die native Version. (Es gibt   kein Mechanismus, um sicherzustellen, dass die   verwaltete und native Versionen der   Struktur sind gleichwertig, also   Inkompatibilitäten werden nicht   offensichtlich bis zur Laufzeit. Es ist der   Programmierer Verantwortung zu gewährleisten   dass die beiden Strukturen gleich sind   Datenlayout.)

Was Marshalling betrifft, ist das Layout wichtig.

    
smwikipedia 10.08.2010, 13:46
quelle

10 Antworten

15

Ich denke, es gibt drei Aspekte für "Typen" in der Programmierung (und sie überschneiden sich wahrscheinlich, also nehmen Sie das nicht als eine schnelle Trennung):

  • Ein -Typ ist ein Element einer Menge von Typen und jedes Programm / jede Einheit definiert eine solche Menge. Dies ist der theoretischste Gedanke, den ich mir vorstellen kann und der für Logiker und Mathematiker wahrscheinlich am nützlichsten ist. Es ist sehr allgemein gehalten und erlaubt Ihnen, die Idee eines type-Systems darüber zu definieren. Zum Beispiel könnte eine Programmierumgebung eine Relation für diese Typen definieren, z. Die Beziehung ist zuweisbar - .

  • Ein Typ ist eine semantische Kategorie. Dies ist eine linguistische oder kognitive Idee; mit anderen Worten, es ist am nützlichsten für Menschen, die darüber nachdenken, wie man den Computer programmiert. Der -Typ kapselt, was wir als "Dinge, die in eine Kategorie gehören" verstehen. Ein Typ kann durch einen gemeinsamen Zweck von Entitäten definiert werden. Diese Kategorisierung nach Zweck ist natürlich willkürlich, aber das ist in Ordnung, da die Deklaration von Typen in der Programmierung auch willkürlich ist.

  • Ein Typ ist eine Spezifikation, wie Daten im Speicher abgelegt werden. Dies ist die niedrigste Idee, die ich mir vorstellen kann. Unter diesem Gesichtspunkt sagt ein -Typ nichts über den Zweck oder die Semantik der Daten aus, sondern nur, wie der Computer ihn konstruieren, verarbeiten usw. In dieser Idee ein -Typ ist etwas mehr wie eine Datenkodierung oder ein Kommunikationsprotokoll .

Welche Bedeutung der -Typ hat, hängt von Ihrer Domain ab. Wie bereits angedeutet, wird die erste Definition nützlicher sein als die dritte, wenn Sie ein Logiker sind, der erforscht, wie Eigenschaften eines Programms zu beweisen sind, da das Datenlayout (normalerweise) für den Beweis irrelevant ist. Wenn Sie ein Hardware-Designer oder der Programmierer eines Low-Level-Systems wie der CLR oder der JavaVM sind, dann brauchen Sie die dritte Idee und Sie interessieren sich nicht wirklich für die erste. Aber für den gemeinsamen Programmierer , der einfach mit seiner Aufgabe weitermachen will, ist es wahrscheinlich die mittlere.

    
Timwi 10.08.2010, 14:01
quelle
3

In vielen Sprachen existieren die Typen physisch nur zur Kompilierzeit. Dies gilt insbesondere für ältere Sprachen. Ich würde vermuten, dass C solche Typen hat, die überhaupt nicht im Speicher vorhanden sind in irgendeiner Weise , während das Programm läuft.

In anderen Sprachen - insbesondere solchen, die den Zugriff auf Informationen vom Typ Laufzeit zulassen (z. B. C ++ mit RTTI ), oder C # oder eine andere dynamische Sprache wie Python) - die Typen sind nur Metadaten. Eine binäre Beschreibung des Typs. Sie wissen, was Sie bekommen würden, wenn Sie versuchen würden, Daten in einen binären Stream zu serialisieren.

    
Roman Starkov 10.08.2010 13:49
quelle
2

Ich würde genau das Gegenteil sagen. Es ist die Sprachdarstellung der Bits und Bytes im Speicher.

    
Didier Trosset 10.08.2010 13:48
quelle
2

Ein Typ ist Metadaten über Bits und Bytes, die definiert, wie sie auf eine sinnvolle und sichere Weise manipuliert werden.

    
Puppy 10.08.2010 13:57
quelle
1

Ich würde sagen, dass Typ mehrere Bedeutungen haben kann.

Ich neige dazu, seine Bedeutung als Interface-Einschränkungen zu bevorzugen. (Ein gut geschriebener Objektcode definiert alle In-Memory-Daten als privat).

Und in diesem Fall ist der Typ absolut NICHT mit der In-Memory-Repräsentation verknüpft. Im Gegenteil, es ist nur ein Vertrag über seine Mitgliedsmethoden.

    
Stephane Rolland 10.08.2010 13:51
quelle
1

Ein "Typ" ist eine Menge, deren Mitglieder ("Objekte") eine diskrete endliche Repräsentation und eine nützliche Menge von geteilten Attributen haben.

Die tatsächliche speicherinterne Darstellung eines Objekts ist nicht notwendigerweise Teil der Definition eines Typs. Das heißt, dass ein einzelnes Objekt mehrere speicherinterne Darstellungen haben kann. Wichtig ist, dass ein Objekt nicht unendlich oder analog ist.

Die gemeinsamen Attribute eines Typs können alles sein. Im objektorientierten System würden die Attribute (auf einer niedrigen Ebene) Daten und Verhalten enthalten. Ereignisbenachrichtigungen sind ebenfalls üblich. Einige Attribute können konditional sein, ohne die Typdefinition zu verletzen (wenn das boolesche Attribut X wahr ist, dann existiert auch das Attribut Y), solange die Regeln für alle Objekte des Typs konsistent sind.

Ein "Subtyp" ist eine Teilmenge eines Typs, dessen Mitglieder einen breiteren Satz von gemeinsamen Attributen haben.

Diese Art, über Typen zu denken, unterscheidet sich sehr von dem, was Sie in der Frage stellen, und ich glaube, dass diese Unterscheidung wichtig ist.

Wenn man Typen als eine In-Memory-Repräsentation sieht, dann wird diese Repräsentation als das hervorstechende Merkmal des Typs betrachtet und als selbstverständlich betrachtet. Interop wird durch Low-Level-Konvertierungen und Neuinterpretationen existierender Bytefolgen erreicht. Dies kann in einigen Fällen zu Problemen führen, wenn sich diese Darstellung ändert.

Wenn man jedoch Typen in ihren Attributen sieht, dann werden Konvertierungen von einem Typsystem zu einem anderen hochgradige Konvertierungen von Datenfeldern zwischen entsprechenden Objekten beinhalten. Eine Bestimmung, ob Objekte kompatibel sind, basiert auf ihren hervorstechenden Attributen, und Probleme werden weniger wahrscheinlich.

Selbst in der Welt der Interop sollte man sich nicht auf das Wissen über die internen Details der Typen verlassen. Das heißt, Features einer Implementierung eines Typs, die nicht Teil der Definition dieses Typs sind, sollten nicht so verwendet werden, als wären sie Teil dieses Typs.

    
Jeffrey L Whitledge 10.08.2010 15:09
quelle
0

Dies hängt vom Programmierparadigma ab, mit dem Sie arbeiten. In OO-Typen können Objekte aus der realen Welt dargestellt werden, mit anderen Worten alle Daten eines realen Objekts, die ein Computer darstellen kann (oder die Teile, an denen Sie trotzdem interessiert sind).

    
marr75 10.08.2010 13:48
quelle
0

IIRC stark typen Sprachen erzwingen die Objekttypen zum Zeitpunkt der Kompilierung, z. Eine Zahl muss vom Typ int, float usw. sein. In schwach typisierten Sprachen können Sie Giraffe = 1 + Frosch * $ 100 / '1. Mai' sagen und die Typen werden zur Laufzeit aufgelöst. Und Sie erhalten normalerweise viele Laufzeitfehler.

In Datenaustauschsituationen (wie COM, CORBA, RPC usw.) ist es sehr schwierig, Typen aufgrund von Binärkompatibilität (Big Endian, Little Endian) und Formaten (wie stellen Sie Strings und Datumsangaben beim Übergang von einer Sprache zu ein anderer, jeder mit anderen Compilern?). Daher das Marshalling, um zu versuchen, die Typen jedes Parameters aufzulösen. ASN.1 war einer von vielen Versuchen, ein universelles Typen-Framework zu erstellen, wenn Daten zwischen Maschinen ausgetauscht werden.

    
james 10.08.2010 13:53
quelle
0

Ein Typ ist ein von Menschen lesbarer logischer Bauplan dafür, wie Daten im Speicher dargestellt und organisiert werden sollen. Es ist ein Weg, den Menschen zu erlauben, zu trennen, wie ein Konzept in eine digitale Sequenz in einer Standardweise rationalisiert werden kann. Die Maschine und der Compiler kümmern sich wirklich nicht um den Unterschied zwischen einer Zeichenkette, einer ganzen Zahl, fooClass. Diese "Typen" sind einfach auf Organisationseinheiten abgestimmt, die alle menschlichen Programmierer logische Konzepte in rationale Datenstrukturen innerhalb der Erinnerung übersetzen.

    
Joel Etherton 10.08.2010 13:54
quelle
0

Typ ist ein Bündelwort. Wenn du etwas weißt, weißt du, wie viel Speicher es braucht, wie die Teile davon gespeichert sind, aber was noch wichtiger ist, du weißt auch, was du damit machen kannst. Zum Beispiel gibt es mehrere Integer-Typen, die die gleiche Menge an Speicher belegen wie ein Zeiger. Sie können jedoch einen Integer-Typ mit einem anderen Typ multiplizieren (zB 3 mal 4), aber Sie können nicht zwei Zeiger zusammen multiplizieren. Sie können die Foo () -Methode für einen benutzerdefinierten Typ (struct oder class) aufrufen, der über eine Foo-Methode verfügt, die beispielsweise x.Foo () schreibt. Dies ist jedoch für einen anderen benutzerdefinierten Typ nicht möglich das hat keine Foo-Methode. Sie können zwischen einigen Typenpaaren, aber nicht zwischen anderen umwandeln, oder Sie können ein A in ein B, aber kein B in ein A umwandeln. Und so weiter. In einigen Sprachen gibt es auch Unterscheidungen wie ob es const ist oder nicht.

Compiler und Laufzeiten enthalten eine große Menge an Informationen, die alle zum Typ des Elements addiert werden. Die Physikalität dessen, wie viele Bytes es belegt (oder irgendetwas anderes, was man plausibel als greifbar bezeichnen könnte), ist wirklich nicht der Punkt.

    
Kate Gregory 10.08.2010 13:54
quelle