Почему мы используем явные типы данных?(с точки зрения низкого уровня) - PullRequest
0 голосов
/ 16 декабря 2018

Когда мы посмотрим на некоторые фундаментальные типы данных, такие как char и int, мы знаем, что char - это просто беззнаковый байт (в зависимости от языка), int - это просто подписанное dword, bool - это просто char, которыйможет быть только 1 или 0 и т. д. Мой вопрос состоит в том, почему мы используем эти типы в скомпилированных языках вместо простого объявления переменной типа byte, dword и т. д., поскольку операции, применяемые к упомянутым выше типам, в основном всеТо же самое, когда вы различаете подписанные и неподписанные данные и данные с плавающей запятой?

Чтобы расширить контекст вопроса, в языке C операторы if и while могут принимать в качестве входных данных логическое значение, которое обычнохранится как символ, который оправдывает необходимость явного логического типа.

На практике 2 двоичных кода должны быть эквивалентны на двоичном уровне:

int main()
{
    int x = 5;
    char y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

-

signed dword main()
{
    signed dword x = 5;
    byte y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Язык программирования определяет «абстрактную» модель данных, которую компьютерный разработчик может реализовать самостоятельно.Например, ничто не обязывает хранить логическое значение в байте, оно может быть «упаковано» как один бит вместе с другими.И если вы внимательно прочитаете стандарт C, вы заметите, что символ не имеет определенного размера.

[Анекдотически, я вспоминаю старое время, когда переменные FORTRAN, включая целые числа, числа с плавающей запятой, но также и логические значения, хранились на 72биты на машинах IBM.]

Разработчики языка должны наложить небольшие ограничения на архитектуру машины, чтобы оставить возможности для приятного дизайна.На самом деле языки не имеют «низкого уровня», они неявно описывают виртуальную машину, не привязанную к конкретному оборудованию (это может быть реализовано с помощью зубчатых колес и канатов).

Насколько я знаю, только язык ADAподошел к моменту подробного определения всех характеристик арифметики, но не к тому, чтобы навязать количество битов в слове.


Игнорирование логического типа было одним из самых печальных проектных решений вязык Си.Я интегрировал его в C99: - (

) Еще одно печальное решение - перестать рассматривать тип int как тот, который естественным образом вписывается в машинное слово (и должен был стать 64-битным в современных ПК)..

0 голосов
/ 16 декабря 2018

Цель языка высокого уровня - обеспечить некоторую изоляцию от деталей машины.Итак, мы говорим о «целых числах», а не о каком-то конкретном количестве байтов памяти.Затем реализация отображает типы более высокого уровня на то, что кажется наиболее подходящим для целевого оборудования.

И есть разные семантики, связанные с разными 4-байтовыми типами: для целых чисел знаковый и беззнаковый важен для некоторых классовпрограммы.

Я понимаю, что это вопрос C, и можно поспорить о том, насколько высок уровень C или нет;но он, по крайней мере, предназначен для переноса между машинными архитектурами.

И, в вашем примере, вы предполагаете, что int - это 32 бита.Ничто в языке не говорит, что это должно быть правдой.Это не всегда было правдой и, конечно, не было правдой в оригинальной реализации PDP-11.И в настоящее время, например, возможно, целесообразно иметь 64-битное значение int на 64-битном компьютере.

Обратите внимание, что в языках нет таких типов, как "целое число" и т. Д. BLISS, aязык на том же концептуальном уровне, что и C, имеет машинное слово как единственный встроенный тип данных.

0 голосов
/ 16 декабря 2018

Мой вопрос: почему мы используем эти типы в скомпилированных языках

Чтобы сделать код независимым от цели.Некоторые платформы имеют только эффективные 16-битные целые числа, и принудительное использование 32-битных переменных сделает ваш код медленным без причины при компиляции для таких платформ.Или, может быть, у вас есть цель с 36-битными целыми числами, а строгий 32-битный тип потребует дополнительных инструкций для реализации.

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

Еще более поздние языки, разработанные в эпоху x86, были широко распространены на настольных компьютерах и серверах и были разработаны для переносимости на другие языки.другие ISA, такие как 8-битный AVR, где 32-битный int будет принимать 4 регистра против 2 для 16-битного int.

...