Представление типа данных
Представление, машинное представление типа данных - способ, которым абстрактное, рассматриваемое программистом значение типа данных отображается непосредственно на машинную архитектуру. В первоначальный период развития программирования типы данных и их представления не различались программистами и разработчиками ЭВМ, что порождало хаос, путаницу и проблемы при переносе программ между разными архитектурами компьютеров, операционными системами и, даже, компиляторами.
Сущность проблемы соотношения типа данных и его представления можно легко увидеть сравнив представления двух вариаций типа число двойной точности с плавающей запятой :
Число половинной точности 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" или проблемные с этой точки зрения места обозначаются в качестве таковых и контроль корректности портирования кода с архитектуры на архитектуру отдаётся на усмотрение программиста.
Примечания[править | править код]
- ↑ Например, но и не только, это проблемы с корректной сортировкой строк.
- ↑ Таким образом появился упомянутый выше стандарт представления числе с плавающей запятой IEEE-754, глядя на который разработчики ПО могут, в принципе, рассчитывать, что числа, при выполнении программы, будут представлены именно в нём. Хотя и это, на самом деле, не гарантированно до конца.
- ↑ Ну и, на практике, не очень нужно. В конце концов, если задуматься, например, о том, какая часть реального ПО требует обеспечения корректной сортировки строк в соответствии со всеми распространёнными вариантами эфиопской письменности, очень быстро приходишь к выводу, что в абсолютном большинстве случаев её учёт не нужен. Да и не только её.