Сильная и слабая типизация: различия между версиями

[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
оформление
Строка 23:
 
== Определение «сильной» и «слабой» типизации ==
«Сильной» и «слабой» типизацией называется продукт множества решений, принятых при разработке языка. Более точно языки характеризуются наличием или отсутствием [[типобезопасность|типобезопасности]], [[Безопасность доступа к памяти|безопасностью памяти]] и [[Система типов#Type checking|проверки согласования типов]], [[статическая типизация|статической]] или [[динамическая типизация|динамической]] типизации.
 
Например, яркими примерами '''слабой''' системы типов являются те, что лежат в основе языков [[Си (язык программирования)|Си]] и [[C++]]. Их характерными атрибутами являются понятия [[Приведение типа|приведения типов]] и [[Каламбур типизации|каламбуров типизации]]. Эти операции поддерживаются на уровне компилятора и часто вызываются неявно. Операция <code>reinterpret_cast</code> в С++ позволяет представить элемент данных любого типа как принадлежащий любому другому типу при условии равенства длины их низкоуровневой реализации (битового представления) и изменить его {{iw|Состояние (информатика)|состояние|en|State (computer science)}} образом, недопустимым для исходного типа. Неосторожное использование таких операций нередко является источником {{iw|Крах программного обеспечения|крахов|en|Crash (computing)}} программ. Несмотря на это, в учебной литературе по С++ его система типов описывается как «''сильная''», что, с учётом тезисов Луки Карделли<ref name="typeful" /> и других, следует понимать как «''более сильная, чем в Си''». В противоположность этому, в языках, [[Система типов Хиндли — Милнера|типизированных по Хиндли — Милнеру]], понятие о ''приведении'' типов отсутствует в принципе. Единственным способом «преобразовать» тип является написание функции, которая алгоритмически ''строит'' значение требуемого типа на основе значения исходного типа. Для тривиальных случаев, таких как «преобразование» целого без знака в целое со знаком и наоборот, такие функции обычно входят в состав стандартных библиотек. Наиболее часто используемым случаем такого рода функций являются специальные определяемые функции с пустым телом, называемые [[Конструктор данных|конструкторами]].