Сильная и слабая типизация
Сильная и слабая типизация или строгая и нестрогая типизация[1][2][3] — характеристика системы типов языка программирования, отражающая существенные ограничения на приведение типов при присваиваниях и операциях. Языки, в которых такие ограничения менее строгие, называют — слабо типизированными.
Впервые понятие введено в 1974 году Лисков и Зиллесом в работе по Клу, назвавшими сильно типизированными языки, в которых «при передаче объекта из вызывающей функции в вызываемую тип этого объекта должен быть совместим с типом, определённым в вызываемой функции»[4]. В контексте такого определения «в сильно типизированном языке всякая ячейка данных будет иметь уникальный тип и всякий процесс будет провозглашать свои требования по взаимосвязи в терминах этих типов»[5]. Другое определение дал Лука Карделли[англ.], связавший сильную типизацию со своей концепцией полнотипового программирования[6]: система типов называется «сильной», если она исключает возможность возникновения ошибки согласования типов времени выполнения, иными словами, обеспечивающей типобезопасность (отсутствие неконтролируемых ошибок приведения типов времени выполнения) на уровне языка[7].
Выбор подхода к ограничениям при преобразованиях типов при разработке языка программирования — продукт множества решений и компромиссов, и о сильной или слабой типизации обычно говорят лишь в сравнении между разными системами типов и не всегда в формальном смысле. Более точно языки характеризуются наличием или отсутствием безопасности согласования типов и безопасности доступа к памяти, а также характерным временем осуществления такого контроля (в статике или в динамике).
Примеры
Яркими примерами языков со слабой типизацией являются языки семейства Си и C++. Их характерными чертами являются понятия приведения типов и каламбуров типизации. Эти операции поддерживаются на уровне компилятора и часто вызываются неявно. Операция reinterpret_cast
в C++ позволяет представить элемент данных любого типа как принадлежащий любому другому типу при условии равенства длины их низкоуровневой реализации (битового представления)[] и изменить его состояние образом, недопустимым для исходного типа. Неосторожное использование таких операций нередко является источником крахов программ. Несмотря на это, в учебной литературе по C++ его система типов описывается как «сильная», что, с учётом определения Карделли[6] можно интерпретировать как «более сильную, чем в Си».
В противоположность этому, в языках, типизированных по Хиндли — Милнеру, понятие о приведении типов отсутствует в принципе. Единственным способом «преобразовать» тип является написание функции, которая алгоритмически строит значение требуемого типа на основе значения исходного типа. Для тривиальных случаев, таких как «преобразование» целого без знака в целое со знаком и наоборот, такие функции обычно входят в состав стандартных библиотек. Наиболее часто используемым случаем такого рода функций являются специальные определяемые функции с пустым телом, называемые конструирующими функциями или просто конструкторами.
При этом система типов Хиндли — Милнера обеспечивает чрезвычайно высокий показатель повторного использования кода за счёт параметрического полиморфизма. Сильная, но неполиморфная система типов может затруднить решение многих алгоритмических задач, как это было отмечено в отношении Паскаля[8].
Есть мнение[], что сильная типизация является непременным элементом обеспечения надёжности разрабатываемых программных средств. При правильном применении (подразумевающем, что в программе объявляются и используются отдельные типы данных для логически несовместимых значений) она защищает программиста от простых, но труднообнаруживаемых ошибок, связанных с совместным использованием логически несовместимых значений, возникающих иногда просто из-за элементарной опечатки.
Подобные ошибки выявляются ещё на этапе компиляции программы, тогда как при возможности неявного приведения практически любых типов друг к другу (как, например, в классическом Си) эти ошибки выявляются только при тестировании, причём не все и не сразу, что порой очень дорого обходится на этапе промышленной эксплуатации.
Слабая типизация является типичным решением для языков с динамической типизацией, но в некоторых случаях для динамических языков используется сильная система типов (например, в Python)[9].
Примером языка с крайне строгой типизацией является Ада — в нём приведение типов в принципе невозможно, разные типы изначально считаются несовместимыми (уникальная типизация)[2]. Бестиповые языки (различные ассемблеры, Форт, Рефал) можно отнести к другой крайности — в них какой-либо контроль типов отсутствует полностью, вплоть до отсутствия самого понятия типа.
Примечания
- ↑ Грэхем И. Словарь терминов // Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice Third Edition / пер. с англ. С. Беликова, О. Ядренко, Р. Имамутдинова, Наталья Куссуль. — 3-е изд. — Вильямс, 2004. — С. 791. — 880 с. — (Объектные технологии). — 2500 экз. — ISBN 5-8459-0438-2. — ISBN 0-201-61913-X. Архивировано 1 ноября 2017 года.
- ↑ 1 2 Кауфман В. Ш. 4.2.3. Строгая типизация и уникальность типа // Языки программирования. Концепции и принципы. — ДМК Пресс, 2011. — С. 93. — 464 с. — (Классика программирования). — 1000 экз. — ISBN 978-5-94074-622-5.
- ↑ С термином «строгий» от англ. strong в отношении системы типов может возникать путаница со строгой семантикой вычислений языка (англ. strict evaluation)
- ↑ Liskov, Zilles. Programming with abstract data types. — ACM Sigplan Notices, 1974. Архивировано 28 марта 2014 года.
- ↑ K. Jackson. Parallel processing and modular software construction. — Lecture Notes in Computer Science, 1977. — С. 436–443. — ISBN 3-540-08360-X. (недоступная ссылка)
- ↑ 1 2 Архивированная копия . Дата обращения: 26 мая 2013. Архивировано 23 октября 2011 года. page 3
- ↑ В ранних работах Хоара подобное свойство называлось «безопасностью» (англ. security)
- ↑ Brian Kernighan. Why Pascal is Not My Favorite Programming Language . Дата обращения: 13 марта 2014. Архивировано из оригинала 6 апреля 2012 года.
- ↑ Why is Python a dynamic language and also a strongly typed language — PythonInfo Wiki . Дата обращения: 28 июня 2010. Архивировано 29 марта 2010 года.
Литература
- Лука Карделли[англ.]. Typeful programming ( (англ.)) // IFIP State-of-the-Art Reports. — Springer-Verlag, 1991. — Вып. Formal Description of Programming Concepts. — С. 431–507.
- Pierce, Benjamin C. Types and Programming Languages. — MIT Press, 2002. — ISBN 0-262-16209-1.
- Перевод на русский язык: Пирс Б. Типы в языках программирования. — Добросвет, 2012. — 680 с. — ISBN 978-5-7913-0082-9.