Я пытаюсь понять статическую и динамическую типизацию, но мне очень трудно понять, как все сочетается друг с другом.
Все начинается с типов данных. Насколько я понимаю, типы данных - это довольно абстрактные понятия, которые существуют «в» компиляторах, чтобы категоризировать данные, чтобы операции с различными типами данных могли быть проверены (то есть в попытке остановить добавление строки к целому числу ), и чтобы сгенерировать правильный машинный код для аппаратной интерпретации значения. Т.е. скажем, у нас есть следующее:
int myInt = 5;
char myChar = '5';
Console.WriteLine(myInt);
Console.WriteLine(myChar);
Оба в конечном итоге напишут пятерку в окно консоли, но, поскольку представления целых чисел и символов в памяти различны, машинный код, который интерпретирует значение в ячейке памяти, привязанной к переменной myInt
, принимает это значение и отображает его на окно консоли будет отличаться от машинного кода для myChar
. Несмотря на то, что Console.WriteLine()
«выполняет одну и ту же работу», разные представления пяти требуют разного низкоуровневого кода.
Итак, мой вопрос таков: если типы данных «существуют только в компиляторе», то есть после того, как программа была скомпилирована в машинный код, нет информации о том, какой тип данных имеет значение в конкретной ячейке памяти (все равно 1 с и 0s) - тогда как можно выполнять проверку типов во время выполнения? Неужели нет понятия типов данных во время выполнения? Так что, конечно же, динамическая типизация не может иметь ничего общего с проверкой типов во время выполнения?
Где мое понимание ошибочно, и не мог бы кто-нибудь объяснить статическую и динамическую типизацию в отношении аргумента, приведенного выше? Какова общая картина происходящего?
Я пытаюсь понять это для эссе, поэтому ссылки на книги или онлайн-источники были бы полезны :) Спасибо.