Представление типа данных

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

Сущность проблемы соотношения типа данных и его представления можно легко увидеть сравнив представления двух вариаций типа число двойной точности с плавающей запятой :

Число половинной точности IEEE-754
знак экспонента (5 бит) мантисса (10 бит)
  ┃ ┌────────┐ ┌───────────────────────────┐
 0   0   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
15 14 10 9 0
 
bfloat16
знак экспонента (8 бит) мантисса (7 бит)
  ┃ ┌────────────────┐ ┌───────────────────┐
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0 
15 14 7 6 0
 

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

Аналогичные, но более тонкие проблемы, в ряде случаев, могут возникнуть и со строковыми типами[1], а также с целочисленными и/или числами с фиксированной запятой. С типами данных, связанными с датой и временем эти проблемы были практически гарантированы. Проблемы также возникали в части обращения с "машинными словами", которые, первоначально, имели разнообразные размеры в битах.

По мере развития языков программирования, операционных систем и оборудования разработчики придумывали разнообразные способы решения этой проблемы. Некоторые типы данных были широко стандартизированы[2]. Также операционные системы и языковые среды были оснащены средствами локализации и рефлексии. С одной стороны, это добавило больше гибкости, с другой - дало возможность программе автоматически подстроиться под те или иные настройки и возможности окружения, в котором она работает. Эти средства хотя и дали больше возможностей для создания кода, устойчивого к переносу, всё же не решили проблему универсальным образом. Оказалось, что всеобъемлющее решение проблемы портирования кода слишком сложно и объёмно по затратам ресурсов[3].

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

ПримечанияEdit

  1. Например, но и не только, это проблемы с корректной сортировкой строк.
  2. Таким образом появился упомянутый выше стандарт представления числе с плавающей запятой IEEE-754, глядя на который разработчики ПО могут, в принципе, рассчитывать, что числа, при выполнении программы, будут представлены именно в нём. Хотя и это, на самом деле, не гарантированно до конца.
  3. Ну и, на практике, не очень нужно. В конце концов, если задуматься, например, о том, какая часть реального ПО требует обеспечения корректной сортировки строк в соответствии со всеми распространёнными вариантами эфиопской письменности, очень быстро приходишь к выводу, что в абсолютном большинстве случаев её учёт не нужен. Да и не только её.