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

Я пытаюсь понять статическую и динамическую типизацию, но мне очень трудно понять, как все сочетается друг с другом.

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

int myInt = 5;
char myChar = '5';

Console.WriteLine(myInt);
Console.WriteLine(myChar);

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

Итак, мой вопрос таков: если типы данных «существуют только в компиляторе», то есть после того, как программа была скомпилирована в машинный код, нет информации о том, какой тип данных имеет значение в конкретной ячейке памяти (все равно 1 с и 0s) - тогда как можно выполнять проверку типов во время выполнения? Неужели нет понятия типов данных во время выполнения? Так что, конечно же, динамическая типизация не может иметь ничего общего с проверкой типов во время выполнения?

Где мое понимание ошибочно, и не мог бы кто-нибудь объяснить статическую и динамическую типизацию в отношении аргумента, приведенного выше? Какова общая картина происходящего?

Я пытаюсь понять это для эссе, поэтому ссылки на книги или онлайн-источники были бы полезны :) Спасибо.


person Lord Cat    schedule 28.11.2015    source источник
comment
Фактически, компилятор оставляет намек на то, что это за «тип». Имейте в виду, что процессор знает целые числа и числа с плавающей запятой. Скомпилированный вывод часто представляет собой вызовы различных подпрограмм, которые знают, как проверять и обрабатывать различные типы. Переменные с динамической типизацией - это «структура», которая содержит данные того типа, которые в настоящее время хранятся в ней, она используется «системой времени выполнения» для определения того, как их обрабатывать.   -  person Ryan Vincent    schedule 28.11.2015


Ответы (1)


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

¹ Это относится не только к языку с динамической типизацией, но и к языкам, которые в основном являются статически типизированными, но позволяют запрашивать информацию о типе во время выполнения (например, _1 _ / _ 2_ и _3 _ / _ 4_ в Java и C # соответственно) или приведениях, которые могут завершиться ошибкой во время выполнения ( как обиженные на ОО-языках).

person sepp2k    schedule 28.11.2015