Что означает Тип, физически?

Я много слышал о "системе типов", "строго типизированном языке" и так далее. В настоящее время я работаю над некоторой проблемой взаимодействия .NET COM, которая много решает "маршалинг". И, насколько мне известно, маршалинг — это преобразование между типами .NET и типами COM.

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

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

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

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

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

Цитата из MSDN:

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

Так что, что касается маршалинга, важна компоновка.


person smwikipedia    schedule 10.08.2010    source источник
comment
Не могли бы вы уточнить? Хотите узнать значение слова тип? Как типы представлены на уровне памяти в C++/C#? Что-то другое?   -  person JoeG    schedule 10.08.2010
comment
Что имя, умение или любовь означают физически? Не каждое слово соответствует физическому объекту, который вы можете посмотреть или потрогать.   -  person jalf    schedule 10.08.2010
comment
физически? Ты имеешь в виду худощавого, спортивного, "больше любить"?   -  person Neil N    schedule 10.08.2010
comment
@ 0A0D Джефф ясно дал понять, что ни один вопрос не является слишком простым. В частности, наличие хорошего ответа в Википедии не делает вопрос о переполнении стека недействительным. Не то чтобы я вознаграждал такие вопросы голосами или чем-то еще, но они разрешены.   -  person dmckee --- ex-moderator kitten    schedule 11.08.2010
comment
@dmckee: Интересно, я не знал, что в комментариях могут быть именованные ссылки. Я заметил, что кто-то спросил как разместить ссылку в комментарии., но этот вопрос был закрыт и связан с довольно длинная документация о комментировании в целом. Потерпеть поражение. (кстати, я согласен с тем, что отсутствие вопросов - это слишком простое чувство)   -  person Joey Adams    schedule 11.08.2010


Ответы (10)


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

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

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

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

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

person Timwi    schedule 10.08.2010
comment
Да, 1-й и 2-й - это то, что я имею в виду под логикой. 3-й как раз то, о чем я думаю. Я очень ценю ваш ответ. Но позвольте мне пока оставить этот вопрос открытым. Спасибо. - person smwikipedia; 10.08.2010
comment
Тип — это спецификация того, как данные размещаются в памяти. - это просто неправильно. Один и тот же тип может иметь разные схемы памяти в зависимости от используемого компилятора и аппаратной платформы. Видите, int — это int, но на некоторых платформах это 16-битное машинное слово с обратным порядком байтов, а на других — 32-битное машинное слово с прямым порядком байтов. Кроме того, существуют соображения выравнивания/дополнения, так что определение структуры или класса может иметь другую схему памяти, если используется другая версия компилятора. - person IanH; 10.08.2010
comment
@IanH: Если здесь 16-битный BE, а там 32-битный LE, почему вы говорите, что это «один и тот же тип»? - person Timwi; 10.08.2010
comment
@lanH, спасибо за указание. Я думаю, что слово Timwi приняло во внимание разницу в реализации компилятора и деталях платформы. - person smwikipedia; 10.08.2010
comment
+1 за третий ответ. Это наиболее близкое к touch представление типа. Хотя я бы добавил, что помимо размещаемых в памяти данных это могут быть и небольшие функциональные программы (т.е. методы), которые имеют доступ к этим данным в памяти и манипулируют ими любым нужным образом. - person Robert Koritnik; 11.08.2010
comment
@IanH: тип по-прежнему определяет размещение данных в памяти с учетом платформы и компилятора. Конечно. Но на той же платформе и том же компиляторе эта карта памяти будет такой же. - person Robert Koritnik; 11.08.2010

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

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

person Roman Starkov    schedule 10.08.2010
comment
@(Стивен Судит) Конечно, это зависит от реализации, и я слишком упрощаю, но я имел в виду указатель таблицы виртуальных методов. Полагаю, в итоге я написал что-то, что, строго говоря, не соответствует действительности :/ Промежуточный раздел теперь удален. - person Roman Starkov; 10.08.2010
comment
C++ без RTTI, но с виртуальными функциями обеспечивает тип ‹i›dynamic‹/i›, не так ли? Я имею в виду, что вы знаете, что производный класс имеет тип базового класса, но знание этого не дает вам точного макета объекта, не так ли? Итак, правильно ли сказать, что тип не существует во время выполнения? - person Gangadhar; 11.08.2010

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

person Didier Trosset    schedule 10.08.2010
comment
Или, возможно, языковое представление набора (надеюсь, связанной) информации, которая может храниться в памяти. Некоторые языки могут свободно переупорядочивать и упаковывать информацию вместе со многими другими комбинациями, такими как типы, хранящиеся в определенных базах данных объектов. - person Sam Harwell; 10.08.2010

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

person Puppy    schedule 10.08.2010

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

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

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

person Stephane Rolland    schedule 10.08.2010
comment
Объектный код - это тип, который ваш собственный компилятор извергает перед вызовом компоновщика ;-) И, кроме этого, ваше определение, похоже, сосредоточено исключительно на ООП. - person ; 10.08.2010
comment
вы правы :-) Я должен был сказать Хорошо написанный код объектно-ориентированного программирования... ;-) и да, я склонен сосредотачиваться только на интерфейсах. - person Stephane Rolland; 10.08.2010

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

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

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

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

Этот способ мышления о типах сильно отличается от того, что вы ставите в вопросе, и я считаю, что это различие важно.

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

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

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

person Jeffrey L Whitledge    schedule 10.08.2010
comment
Привет, спасибо за ваш ответ. Потребовалось бы некоторое время, чтобы переварить. Кстати, что означает салент? Я не узнаю это слово. - person smwikipedia; 10.08.2010
comment
@smwikipedia - я имел в виду заметный. Я забыл проверить орфографию, прежде чем писать. Теперь это исправлено! :-) - person Jeffrey L Whitledge; 11.08.2010

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

person marr75    schedule 10.08.2010

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

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

person jqa    schedule 10.08.2010
comment
-1 (с задержкой): строго типизированные языки требуют только проверки типов; это не обязательно должно быть во время компиляции. - person Roman Starkov; 10.08.2010

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

person Joel Etherton    schedule 10.08.2010

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

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

person Kate Gregory    schedule 10.08.2010