WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте
Типизация данных

Типобезопасность
Вывод типов
Статическая типизация
Динамическая типизация
Сильная и слабая типизация
Зависимые типы
Утиная типизация

По одной из классификаций, языки программирования неформально делятся на сильно и слабо типизированные (англ. strongly and weakly typed), то есть обладающие сильной или слабой системой типов. Эти термины не являются однозначно трактуемыми, и чаще всего используются для указания на достоинства и недостатки конкретного языка. Существуют более конкретные понятия, которые и приводят к называнию тех или иных систем типов «сильными» или «слабыми».

Примечание: В русскоязычной литературе часто встречается некорректный перевод[1][2] термина «strong typing» как «строгая типизация»; корректный вариант «сильная типизация»[источник не указан 462 дня] используется лишь при противопоставлении «слабой типизации». Следует иметь в виду, что использование термина «строгий» в отношении системы типов языка может вызвать путаницу со строгой семантикой вычислений языка (англ. strict evaluation).

История

В 1974 году Лисков и Зиллес (англ. Liskov and Zilles) назвали сильно типизированными те языки, в которых «при передаче объекта из вызывающей функции в вызываемую тип этого объекта должен быть совместим с типом, определённым в вызываемой функции»[3]. Джексон писал: «В сильно типизированном языке всякая ячейка данных будет иметь уникальный тип и всякий процесс будет провозглашать свои требования по взаимосвязи в терминах этих типов»[4].

В статье Луки Карделли[en] «Полнотиповое программирование»[5], система типов называется «сильной», если она исключает возможность возникновения ошибки согласования типов времени выполнения. Иначе говоря, отсутствие непроконтролированных ошибок времени выполнения называется типобезопасностью; ранние работы Хоара называют это свойство безопасностью (англ. security).

Определение «сильной» и «слабой» типизации

«Сильной» и «слабой» типизацией называется продукт множества решений, принятых при разработке языка. Более точно языки характеризуются наличием или отсутствием безопасности согласования типов и безопасности доступа к памяти, а также характерным временем осуществления такого контроля (в статике или в динамике).

Например, яркими примерами слабой системы типов являются те, что лежат в основе языков Си и C++. Их характерными атрибутами являются понятия приведения типов и каламбуров типизации. Эти операции поддерживаются на уровне компилятора и часто вызываются неявно. Операция reinterpret_cast в С++ позволяет представить элемент данных любого типа как принадлежащий любому другому типу при условии равенства длины их низкоуровневой реализации (битового представления) и изменить его состояние образом, недопустимым для исходного типа. Неосторожное использование таких операций нередко является источником крахов программ. Несмотря на это, в учебной литературе по С++ его система типов описывается как «сильная», что, с учётом тезисов Луки Карделли[5] и других, следует понимать как «более сильная, чем в Си». В противоположность этому, в языках, типизированных по Хиндли — Милнеру, понятие о приведении типов отсутствует в принципе. Единственным способом «преобразовать» тип является написание функции, которая алгоритмически строит значение требуемого типа на основе значения исходного типа. Для тривиальных случаев, таких как «преобразование» целого без знака в целое со знаком и наоборот, такие функции обычно входят в состав стандартных библиотек. Наиболее часто используемым случаем такого рода функций являются специальные определяемые функции с пустым телом, называемые конструирующими функциями или просто конструкторами.

При этом система типов Хиндли — Милнера обеспечивает чрезвычайно высокий показатель повторного использования кода за счёт параметрического полиморфизма. Сильная, но не полиморфная система типов может затруднить решение многих алгоритмических задач, как это было отмечено в отношении языка Pascal[6].

В теории программирования сильная типизация является непременным элементом обеспечения надёжности разрабатываемых программных средств. При правильном применении (подразумевающем, что в программе объявляются и используются отдельные типы данных для логически несовместимых значений) она защищает программиста от простых, но труднообнаруживаемых ошибок, связанных с совместным использованием логически несовместимых значений, возникающих иногда просто из-за элементарной опечатки.

Подобные ошибки выявляются ещё на этапе компиляции программы, тогда как при возможности неявного приведения практически любых типов друг к другу (как, например, в классическом языке Си) эти ошибки выявляются только при тестировании, причём не все и не сразу, что порой очень дорого обходится на этапе промышленной эксплуатации.

Python является одним из примеров языка с сильной динамической типизацией[7].

См. также

Примечания

  1. Грэхем И. Словарь терминов // Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice Third Edition / пер. с англ. С. Беликова, О. Ядренко, Р. Имамутдинова, Наталья Куссуль. — 3-е изд. Вильямс, 2004. — С. 791. — 880 с. — (Объектные технологии). 2500 экз. ISBN 5-8459-0438-2. ISBN 0-201-61913-X.
  2. Кауфман В. Ш. 4.2.3. Строгая типизация и уникальность типа // Языки программирования. Концепции и принципы. ДМК Пресс, 2011. — С. 93. — 464 с. — (Классика программирования). 1000 экз. ISBN 978-5-94074-622-5.
  3. Liskov, Zilles. Programming with abstract data types. — ACM Sigplan Notices, 1974.
  4. K. Jackson. Parallel processing and modular software construction. — Lecture Notes in Computer Science, 1977. С. 436–443. ISBN 3-540-08360-X.
  5. 1 2 Архивированная копия (недоступная ссылка). Проверено 26 мая 2013. Архивировано 23 октября 2011 года. page 3
  6. {{Cite web |url=http://www.cs.virginia.edu/~cs655/readings/bwk-on-pascal.html# |title=[[Керниган, Брайан|Brian Kernighan |accessdate=2014-03-13 |archiveurl=https://web.archive.org/web/20120406094058/http://www.cs.virginia.edu/~cs655/readings/bwk-on-pascal.html# |archivedate=2012-04-06 |deadlink=yes }}
  7. Why is Python a dynamic language and also a strongly typed language — PythonInfo Wiki

Литература

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии