Эту страницу предлагается переименовать в «Сильная типизация». |
Сильная и слабая типизация или строгая и нестрогая типизация — характеристика системы типов языка программирования, отражающая существенные ограничения на (приведение типов) при присваиваниях и операциях. Языки, в которых такие ограничения менее строгие, называют — слабо типизированными.
Впервые понятие введено в 1974 году (Лисков) и Зиллесом в работе по (Клу), назвавшими сильно типизированными языки, в которых «при передаче объекта из вызывающей функции в вызываемую тип этого объекта должен быть совместим с типом, определённым в вызываемой функции». В контексте такого определения «в сильно типизированном языке всякая ячейка данных будет иметь уникальный тип и всякий процесс будет провозглашать свои требования по взаимосвязи в терминах этих типов». Другое определение дал [англ.], связавший сильную типизацию со своей концепцией (полнотипового программирования): система типов называется «сильной», если она исключает возможность возникновения ошибки согласования типов времени выполнения, иными словами, обеспечивающей типобезопасность (отсутствие неконтролируемых ошибок приведения типов времени выполнения) на уровне языка.
Выбор подхода к ограничениям при преобразованиях типов при разработке языка программирования — продукт множества решений и компромиссов, и о сильной или слабой типизации обычно говорят лишь в сравнении между разными системами типов и не всегда в формальном смысле. Более точно языки характеризуются наличием или отсутствием безопасности согласования типов и безопасности доступа к памяти, а также характерным временем осуществления такого контроля (в статике или в динамике).
Примеры
Яркими примерами языков со слабой типизацией являются языки семейства Си и . Их характерными чертами являются понятия (приведения типов) и (каламбуров типизации). Эти операции поддерживаются на уровне компилятора и часто вызываются неявно. Операция reinterpret_cast
в C++ позволяет представить элемент данных любого типа как принадлежащий любому другому типу при условии равенства длины их низкоуровневой реализации (битового представления)[] и изменить его (состояние) образом, недопустимым для исходного типа. Неосторожное использование таких операций нередко является источником (крахов) программ. Несмотря на это, в учебной литературе по C++ его система типов описывается как «сильная», что, с учётом определения Карделли можно интерпретировать как «более сильную, чем в Си».
В противоположность этому, в языках, (типизированных по Хиндли — Милнеру), понятие о приведении типов отсутствует в принципе. Единственным способом «преобразовать» тип является написание функции, которая алгоритмически строит значение требуемого типа на основе значения исходного типа. Для тривиальных случаев, таких как «преобразование» целого без знака в целое со знаком и наоборот, такие функции обычно входят в состав стандартных библиотек. Наиболее часто используемым случаем такого рода функций являются специальные определяемые функции с пустым телом, называемые конструирующими функциями или просто (конструкторами).
При этом (система типов Хиндли — Милнера) обеспечивает чрезвычайно высокий показатель повторного использования кода за счёт (параметрического полиморфизма). Сильная, но неполиморфная система типов может затруднить решение многих алгоритмических задач, как это было отмечено в отношении (Паскаля).
Есть мнение[], что сильная типизация является непременным элементом обеспечения надёжности разрабатываемых программных средств. При правильном применении (подразумевающем, что в программе объявляются и используются отдельные типы данных для логически несовместимых значений) она защищает программиста от простых, но труднообнаруживаемых ошибок, связанных с совместным использованием логически несовместимых значений, возникающих иногда просто из-за элементарной опечатки.
Подобные ошибки выявляются ещё на этапе компиляции программы, тогда как при возможности неявного приведения практически любых типов друг к другу (как, например, в классическом Си) эти ошибки выявляются только при тестировании, причём не все и не сразу, что порой очень дорого обходится на этапе промышленной эксплуатации.
Слабая типизация является типичным решением для языков с динамической типизацией, но в некоторых случаях для динамических языков используется сильная система типов (например, в Python).
Примером языка с крайне строгой типизацией является (Ада) — в нём приведение типов в принципе невозможно, разные типы изначально считаются несовместимыми (уникальная типизация). (Бестиповые языки) (различные ассемблеры, Форт, (Рефал)) можно отнести к другой крайности — в них какой-либо контроль типов отсутствует полностью, вплоть до отсутствия самого понятия типа.
Примечания
- Грэхем И. Словарь терминов // Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice Third Edition / пер. с англ. С. Беликова, О. Ядренко, Р. Имамутдинова, Наталья Куссуль. — 3-е изд. — , 2004. — С. 791. — 880 с. — (Объектные технологии). — 2500 экз. — . — . 1 ноября 2017 года.
- Кауфман В. Ш. 4.2.3. Строгая типизация и уникальность типа // Языки программирования. Концепции и принципы. — , 2011. — С. 93. — 464 с. — (Классика программирования). — 1000 экз. — .
- С термином «строгий» от англ. 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. — . (недоступная ссылка)
- Архивированная копия . Дата обращения: 26 мая 2013. Архивировано 23 октября 2011 года. page 3
- В ранних работах (Хоара) подобное свойство называлось «безопасностью» (англ. security)
- (Brian Kernighan). оригинала 6 апреля 2012 года. . Дата обращения: 13 марта 2014. Архивировано из
- 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. — .
- Перевод на русский язык: Пирс Б. Типы в языках программирования. — , 2012. — 680 с. — .
Для улучшения этой статьи :
|
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер