Скомпилированный язык с динамическим набором текста

Меня немного смущает компилируемый язык (компиляция в собственный код) с динамической типизацией. Динамическая типизация говорит о том, что типы в программе предполагаются только во время выполнения.

Теперь, если язык скомпилирован, во время выполнения не работает интерпретатор; это просто ваш ЦП считывает инструкции из памяти и выполняет их. В таком сценарии, если какая-либо инструкция, нарушающая семантику типов языка, выполняется во время выполнения, нет интерпретатора, который мог бы перехватить выполнение программы и выдать какие-либо ошибки. Как тогда работает система?

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

PS: Некоторые из известных мне динамически типизированных компилируемых языков включают Scheme, Lua и Common Lisp.


person Bharat Khatri    schedule 19.07.2014    source источник


Ответы (1)


Компилятор для языка с динамической типизацией просто генерирует инструкции, проверяющие тип там, где это необходимо. Фактически, даже для некоторых статически типизированных языков это иногда необходимо, например, в случае объектно-ориентированного языка с проверенными приведениями (например, dynamic_cast в C ++). В языках динамических типов чаще всего просто нужно.

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

person sepp2k    schedule 19.07.2014
comment
Значит, вы имеете в виду, что проверка типа входит в машинный код? В этом случае, даже если языки с динамической типизацией скомпилированы, у них будут проблемы с производительностью при динамической типизации, верно? Кроме того, правильно ли я предполагаю, что программа завершится в случае нарушения семантики типа? - person Bharat Khatri; 20.07.2014
comment
@BharatKhatri Значит, вы имеете в виду, что проверка типов входит в машинный код? да. В этом случае, даже если языки с динамической типизацией скомпилированы, у них будут проблемы с производительностью при динамической типизации, верно? Пока оптимизатор не может избавиться от проверок с помощью вывода типа, да. Кроме того, правильно ли я предполагаю, что программа завершится в случае нарушения семантики типа? В общем да. То есть при правильном компиляторе скомпилированная программа будет вести себя так, как того требует спецификация языка, что обычно означает прерывание, если выражение недопустимо в соответствии со спецификацией. - person sepp2k; 20.07.2014