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