В компьютерном программировании один из многих способов классификации языков программирования заключается в том, делает ли система типов языка строго типизированным или слабо типизированным ( свободно типизированным ). Однако не существует точного технического определения того, что означают эти термины, и разные авторы расходятся во мнениях относительно подразумеваемого значения терминов и относительного рейтинга «силы» систем типов основных языков программирования. [1] По этой причине авторы, желающие однозначно писать о системах типов, часто избегают терминов «строгая типизация» и «слабая типизация» в пользу конкретных выражений, таких как « безопасность типов ».
Как правило, строго типизированный язык имеет более строгие правила типизации во время компиляции , что означает, что во время компиляции с большей вероятностью возникнут ошибки и исключения . Большинство из этих правил влияют на назначение переменных, возвращаемые значения функций, аргументы процедур и вызов функций. Динамически типизированные языки (в которых проверка типов происходит во время выполнения ) также могут быть строго типизированными. В динамически типизированных языках типы имеют значения, а не переменные.
Слабо типизированный язык имеет более слабые правила типизации и может давать непредсказуемые или даже ошибочные результаты или может выполнять неявное преобразование типов во время выполнения. [2] Другая, но родственная концепция — это скрытая типизация .
В 1974 году Барбара Лисков и Стивен Зиллес определили строго типизированный язык как язык, в котором «всякий раз, когда объект передается от вызывающей функции к вызываемой функции, его тип должен быть совместим с типом, объявленным в вызываемой функции». [3] В 1977 году К. Джексон писал: «В строго типизированном языке каждая область данных будет иметь отдельный тип, и каждый процесс будет формулировать свои требования к коммуникации в терминах этих типов». [4]
Ряд различных решений по дизайну языка были названы свидетельством «сильной» или «слабой» типизации. Многие из них точнее понимать как наличие или отсутствие безопасности типов , безопасности памяти , статической проверки типов или динамической проверки типов .
«Строгая типизация» обычно относится к использованию типов языка программирования для того, чтобы как зафиксировать инварианты кода , так и обеспечить его корректность, а также определенно исключить определенные классы ошибок программирования. Таким образом, для достижения этих целей используется множество дисциплин «сильной типизации».
Некоторые языки программирования позволяют легко использовать значение одного типа, как если бы оно было значением другого типа. Иногда это называют «слабой типизацией».
Например, Ааз Марух отмечает, что « принуждение происходит, когда у вас есть статически типизированный язык и вы используете синтаксические особенности языка, чтобы принудительно использовать один тип, как если бы это был другой тип (рассмотрим обычное использование void* в C). ). С другой стороны, приведение обычно является признаком слабой типизации. Конверсия создает совершенно новый объект соответствующего типа». [5]
В качестве другого примера, GCC описывает это как игру слов и предупреждает, что это нарушит строгий псевдоним . Тьяго Масиейра обсуждает несколько проблем, которые могут возникнуть, когда каламбур типов приводит к тому, что компилятор выполняет неподходящую оптимизацию . [6]
Существует множество примеров языков, которые допускают неявное преобразование типов , но типобезопасным образом. Например, и C++ , и C# позволяют программам определять операторы для преобразования значения из одного типа в другой с четко определенной семантикой. Когда компилятор C++ встречает такое преобразование, он рассматривает эту операцию как вызов функции. Напротив, преобразование значения в тип C void* — небезопасная операция, невидимая для компилятора.
Некоторые языки программирования предоставляют указатели , как если бы они были числовыми значениями, и позволяют пользователям выполнять с ними арифметические действия. Эти языки иногда называют «слабо типизированными», поскольку арифметика указателей может использоваться для обхода системы типов языка.
Некоторые языки программирования поддерживают нетегированные объединения , которые позволяют рассматривать значение одного типа так, как если бы оно было значением другого типа.
В статье Луки Карделли «Типовое программирование» [ 7] «система строгого типа» описывается как система, в которой нет возможности неконтролируемой ошибки типа во время выполнения. В других текстах отсутствие непроверенных ошибок во время выполнения называется безопасностью или безопасностью типов ; В ранних работах Тони Хоара это называется безопасностью собственности . [8]
Некоторые из этих определений противоречивы, другие просто концептуально независимы, а третьи представляют собой частные случаи (с дополнительными ограничениями) других, более «либеральных» (менее строгих) определений. Из-за большого расхождения между этими определениями в отношении большинства языков программирования можно утверждать, что они либо строго, либо слабо типизированы. Например:
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )