Что означает «Тип» физически? - PullRequest
8 голосов
/ 10 августа 2010

Я много слышал о " type system", "сильно typed language" и так далее. В настоящее время я работаю над проблемой взаимодействия .NET COM, которая решает проблему «маршалинга». И AFAIK, маршалинг - это всего лишь преобразование между типами .NET и типами COM.

Во многих сценариях, таких как язык программирования, когда речь идет о типах , нас беспокоит логическое значение.

Теперь мне интересно: что означает "тип" физически ? В некотором смысле мы можем смотреть и трогать.

В настоящее время я понимаю, что «тип» - это не что иное, как представление в памяти объекта вычисления.

Большое спасибо за ваши ответы.

Добавление-1

Некоторые цитаты из MSDN :

Маршаллинг простой, тупой структуры через сначала управляемая / неуправляемая граница требует, чтобы управляемые версии каждого родная структура должна быть определена. Эти структуры могут иметь любое юридическое название; нет никакой связи между родная и управляемая версия двух структуры, отличные от их данных раскладка. Поэтому жизненно важно, чтобы управляемая версия содержит поля одинакового размера и одинакового размера заказ как родная версия. (Есть нет механизма для обеспечения того, чтобы управляемые и нативные версии структура эквивалентна, так несовместимости не станет очевидно до времени выполнения. Это ответственность программиста за обеспечение что две структуры имеют одинаковое макет данных.)

Итак, что касается Marshaling, то это имеет значение.

Ответы [ 10 ]

15 голосов
/ 10 августа 2010

Я думаю, что есть три аспекта «типов» в программировании (и они, вероятно, частично совпадают, поэтому не воспринимайте это как жесткое и быстрое разделение):

  • A type является элементом набора типов , и каждая программа / сборка / модуль определяет такой набор. Это наиболее теоретическая идея, которую я могу придуматьи, вероятно, наиболее полезно для логиков и математиков.Он очень общий и позволяет определить идею системы type поверх нее.Например, среда программирования может определять отношение для этих типов, например, отношение is-assignable-to .

  • тип - это семантическая категория. Это лингвистическая или когнитивная идея;другими словами, это наиболее полезно для людей, которые думают о том, как программировать компьютер.Тип заключает в себе то, что мы считаем «вещами, которые принадлежат к категории».Тип может быть определен общей целью сущностей.Эта категоризация в соответствии с назначением, конечно, произвольна, но это нормально, поскольку объявление типов в программировании тоже произвольно.

  • A type это спецификация того, как данные размещаются в памяти. Это самая низкоуровневая идея, которую я могу придумать.С этой точки зрения тип ничего не говорит о назначении или семантике данных, а только о том, как компьютер собирается их сконструировать, обработать и т. Д. В этой идее тип несколько больше похоже на кодировку данных или протокол связи .

Какое значение type вы идетезависит от вашего домена.Как уже указывалось, если вы проводите исследование о том, как доказать свойства программы, первое определение будет более полезным, чем третье, поскольку расположение данных (как правило) не имеет отношения к доказательству.Если вы разработчик аппаратного обеспечения или программист низкоуровневой системы, такой как CLR или JavaVM, то вам нужна третья идея, и вам не очень важна первая.Но к обычному программисту , который просто хочет выполнить свою задачу, вероятно, применяется средний.

3 голосов
/ 10 августа 2010

Во многих языках физически типы существуют только во время компиляции.Это особенно верно для старых языков.Я предполагаю, что в C есть такие типы, которые вообще никогда не существуют в памяти , каким-либо образом во время работы программы.

В других языках - особенно тех, которые допускают тип времени выполнениядоступ к информации (например, C ++ с RTTI , или C #, или любым динамическим языком, таким как Python) - типы являются просто метаданными.Двоичное описание типа.Вы знаете, что вы получите, если попытаетесь сериализовать данные в двоичный поток.

2 голосов
/ 10 августа 2010

Тип - это метаданные о битах и ​​байтах, которые определяют, как манипулировать ими значимым и безопасным способом.

2 голосов
/ 10 августа 2010

Я бы сказал как раз наоборот.Это языковое представление битов и байтов в памяти.

1 голос
/ 10 августа 2010

«Тип» - это набор, члены («объекты») которого имеют дискретное конечное представление и полезный набор общих атрибутов.

Фактическое представление объекта в памяти не обязательно является частьюопределение типа.То есть, что один объект может иметь несколько представлений в памяти.Важно то, что объект не может быть бесконечным или аналоговым.

Общие атрибуты типа могут быть чем угодно.В объектно-ориентированной системе атрибуты будут включать (на низком уровне) данные и поведение.Уведомления о событиях также распространены.Некоторые атрибуты могут быть условными без нарушения определения типа (если логический атрибут X равен true, тогда атрибут Y также существует), если правила согласованы для всех объектов в типе.

«Подтип»подмножество типа, члены которого имеют более широкий набор общих атрибутов.

Такой подход к типам очень отличается от того, что вы задаете в вопросе, и я считаю, что это различие важно.

Если кто-то видит типы как представление в памяти, то это представление будет рассматриваться как существенная особенность типа, и оно будет восприниматься как должное.Взаимодействие будет достигаться за счет низкоуровневых преобразований и реинтерпретации существующих байтовых последовательностей.Это может привести к проблемам в некоторых случаях, когда это представление изменяется.

Если, однако, каждый видит типы с точки зрения их атрибутов, тогда преобразования из одной системы типов в другую будут включать высокоуровневые преобразования полей данных междусоответствующие объекты.Определение совместимости объектов будет основано на их существенных атрибутах, и проблемы станут менее вероятными.

Даже в мире взаимодействия не следует полагаться на знание внутренних деталей типов.То есть возможности реализации типа, которые не являются частью определения этого типа, не должны использоваться так, как если бы они были частью этого типа.

1 голос
/ 10 августа 2010

Я бы сказал, что тип может иметь несколько значений.

Я склонен предпочесть его значение в качестве ограничений интерфейса.(Хорошо написанный объектный код определяет все данные в памяти как частные).

И в этом случае тип абсолютно НЕ связан с представлением в памяти.Наоборот, это всего лишь контракт на методы-члены.

0 голосов
/ 10 августа 2010

Тип - это связанное слово.Когда вы знаете тип чего-либо, вы знаете, сколько памяти оно занимает, как хранятся его фрагменты, но, что более важно, вы также знаете, что вы можете с этим делать.Например, есть несколько целочисленных типов, которые занимают столько же памяти, сколько указатель.Однако вы можете умножить один целочисленный тип на другой (например, 3 раза 4), но вы не можете умножить два указателя вместе.Вы можете вызвать метод Foo () для некоторого пользовательского типа (struct или class), у которого есть метод Foo, например, написать x.Foo (), но вы не можете сделать это для другого пользовательского типау этого нет метода Foo.Вы можете разыгрывать между несколькими парами типов, но не между другими, или вы можете разыграть A в B, но не B в A. И так далее.В некоторых языках также есть различия, например, является ли оно постоянным или нет.

Компиляторы и среды выполнения содержат большое количество информации, которая в целом соответствует типу элемента.Физичность того, сколько байтов он занимает (или что-либо еще, что вы могли бы правдоподобно утверждать, что оно материально), на самом деле не имеет значения.

0 голосов
/ 10 августа 2010

Тип - это читаемый человеком логический план того, как данные должны быть представлены и организованы в памяти.Это способ, позволяющий людям разделять способы стандартного преобразования концепции в цифровую последовательность.Машина и компилятор действительно не заботятся о разнице между строкой, целым числом, fooClass.Эти «типы» просто согласованы организационными единицами, чтобы все программисты-люди могли переводить логические концепции в рациональные структуры данных в памяти.

0 голосов
/ 10 августа 2010

Языки строгого типа IIRC применяют типы объектов во время компиляции, например число должно быть типа int, float и т. д. В слабо типизированных языках можно сказать, что жираф = 1 + лягушка * $ 100 / «1 мая», и типы разрешаются во время выполнения. И вы обычно получаете много ошибок во время выполнения.

В ситуациях обмена данными (таких как COM, CORBA, RPC и т. Д.) Очень трудно применять типы из-за двоичной совместимости (с прямым порядком байтов, с прямым порядком байтов) и форматов (как вы представляете строки и даты при переходе от одного языка к другой, каждый с разными компиляторами?). Отсюда и маршалинг, чтобы попытаться разрешить типы каждого параметра. ASN.1 была одной из многих попыток построить структуру «универсальных типов» при обмене данными между машинами.

0 голосов
/ 10 августа 2010

Это зависит от парадигмы программирования, с которой вы работаете.В ОО типы могут представлять объекты реального мира, другими словами, все данные объекта реального мира, которые может представлять компьютер (или части, которые вас интересуют в любом случае).

...