Сильный и слабый набор текста - Strong and weak typing

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

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

Слабо типизированный язык имеет более свободные правила типизации и может давать непредсказуемые результаты или может выполнять неявное преобразование типа во время выполнения.[1] Другая, но связанная концепция: скрытая типизация.

История

В 1974 г. Лисков и Зиллес определил строго типизированный язык как язык, в котором «всякий раз, когда объект передается от вызывающей функции к вызываемой функции, его тип должен быть совместим с типом, объявленным в вызываемой функции».[2]В 1977 году Джексон писал: «В строго типизированном языке каждая область данных будет иметь отдельный тип, и каждый процесс будет определять свои коммуникационные требования в терминах этих типов».[3]

Определения «сильный» или «слабый»

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

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

Неявные преобразования типов и "каламбур типов"

Некоторые языки программирования позволяют легко использовать значение одного типа, как если бы оно было значением другого типа. Иногда это называют «слабой типизацией».

Например, Ааз Марух замечает, что "Принуждение происходит, когда у вас есть статически типизированный language, и вы используете синтаксические особенности языка для принудительного использования одного типа, как если бы это был другой тип (рассмотрите обычное использование void * в C). Принуждение обычно является признаком слабого набора текста. С другой стороны, преобразование создает совершенно новый объект соответствующего типа ".[4]

Другой пример: GCC описывает это как набирать текст и предупреждает, что нарушит строгие сглаживание. Тьяго Масейра обсуждает несколько проблем, которые могут возникнуть, когда каламбур компилятор сделать неуместным оптимизации.[5]

Есть много примеров языков, которые позволяют неявные преобразования типов, но безопасным для типов способом. Например, и C ++, и C # позволяют программам определять операторы для преобразования значения из одного типа в другой семантически значимым образом. Когда компилятор C ++ встречает такое преобразование, он обрабатывает операцию так же, как вызов функции. Напротив, преобразование значения в тип C пустота* это небезопасная операция, невидимая для компилятора.

Указатели

Некоторые языки программирования предоставляют указатели как если бы они были числовыми значениями, и позволяют пользователям выполнять с ними арифметические операции. Эти языки иногда называют «слабо типизированными», поскольку арифметика с указателями может использоваться для обхода системы типов языка.

Без тегов союзы

Некоторые языки программирования поддерживают немаркированные союзы, которые позволяют рассматривать значение одного типа, как если бы оно было значением другого типа.

Статическая проверка типов

В Лука Карделли статья Типичное программирование,[6] «Система строгих типов» описывается как система, в которой нет возможности возникновения ошибки непроверенного типа во время выполнения. В других письменных источниках отсутствие непроверенных ошибок времени выполнения упоминается как безопасность или же безопасность типа; Тони Хоар в ранних работах это свойство безопасность.[7]

Динамическая проверка типов

Некоторые языки программирования не имеют статической проверки типов. На многих таких языках легко писать программы, которые были бы отклонены большинством статических средств проверки типов. Например, переменная может хранить либо число, либо логическое значение «false».

Различия между языками программирования

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

  • Ява, Паскаль, Ада и C требовать все переменные иметь объявленный тип и поддерживать использование явного приведения арифметических значений к другим арифметическим типам. Иногда говорят, что Java, C #, Ada и Pascal имеют более строгую типизацию, чем C; это утверждение, вероятно, основано на том факте, что C поддерживает больше видов неявных преобразований, а C также позволяет указатель значения должны быть явно приведены, в то время как Java и Pascal этого не делают. Сама Java может считаться более строго типизированной, чем Pascal, поскольку способы обхода системы статических типов в Java контролируются Виртуальная машина Java система типов. C # и VB.NET в этом отношении похожи на Java, хотя они позволяют отключать динамическую проверку типов, явно помещая сегменты кода в «небезопасный контекст». Система типов Паскаля была описана как «слишком сильная», потому что размер массива или строки является частью его типа, что сильно усложняет некоторые задачи программирования.[8]
  • Болтовня, Perl, Рубин, Python, и Себя все они "строго типизированы" в том смысле, что ошибки ввода предотвращаются во время выполнения, и они мало неявно преобразование типов, но в этих языках не используется статическая проверка типов: компилятор не проверяет и не применяет правила ограничения типа. Период, термин утка печатать теперь используется для описания динамическая типизация парадигма, используемая языками этой группы.
  • В Лисп все семейства языков являются «строго типизированными» в том смысле, что ошибки ввода предотвращаются во время выполнения. Некоторые диалекты Lisp, например Common Lisp или же Clojure поддерживают различные формы объявлений типов[9] и некоторые компиляторы (CMUCL[10] и связанные) используйте эти объявления вместе с вывод типа для включения различных оптимизаций, а также ограниченных форм проверки типов во время компиляции.
  • Стандартный ML, F #, OCaml, Haskell, и Ржавчина проверяются статически, но компилятор автоматически определяет точный тип для большинства значений.
  • Visual Basic это гибридный язык. В дополнение к переменным с объявленными типами также можно объявить переменную типа данных «Variant», которая может хранить данные любого типа. Его неявные преобразования довольно либеральны, например, можно суммировать строковые варианты и передавать результат в целочисленную переменную. Visual Basic слабо типизирован.
  • язык ассемблера, Четвертый можно охарактеризовать как нетипизированный. Нет проверки типа; программист должен гарантировать, что данные, передаваемые функциям, имеют соответствующий тип. Любое требуемое преобразование типа является явным.
  • Tcl можно охарактеризовать как явно типизированный: тип значения определяется исключительно его представлением, оценка которого зависит от контекста.

По этой причине авторы, которые хотят однозначно писать о системах типов, часто избегают термина «строгая типизация» в пользу конкретных выражений, таких как «безопасность типа ".

Смотрите также

Рекомендации

  1. ^ «CS1130. Переход на объектно-ориентированное программирование. - Весна 2012 - самостоятельная версия». Корнельский университет, факультет компьютерных наук. 2005. Архивировано с оригинал на 2005 год. Получено 2015-11-23.
  2. ^ Лисков, Б; Зиллес, S (1974). «Программирование с абстрактными типами данных». Уведомления ACM SIGPLAN. 9 (4): 50–59. CiteSeerX  10.1.1.136.3043. Дои:10.1145/942572.807045.
  3. ^ Джексон, К. (1977). Параллельная обработка и модульное построение программного обеспечения. Дизайн и реализация языков программирования. Конспект лекций по информатике. 54. С. 436–443. Дои:10.1007 / BFb0021435. ISBN  3-540-08360-X.
  4. ^ Ааз. "Печатание: сильное или слабое, статическое или динамическое". Получено 16 августа 2015.
  5. ^ «Наблюдение за типом и строгое алиасинг - Блог Qt». Блог Qt. Получено 18 февраля 2020.
  6. ^ Лука Карделли, "Типовое программирование"
  7. ^ Хоар, C. A. R. 1974. Советы по дизайну языка программирования. В Надежность компьютерных систем, изд. C. Bunyan. Vol. 20 с. 505–534.
  8. ^ InfoWorld. 1983-04-25. Получено 16 августа 2015.
  9. ^ "CLHS: Глава 4". Получено 16 августа 2015.
  10. ^ "Руководство пользователя CMUCL: компилятор". Архивировано из оригинал 8 марта 2016 г.. Получено 16 августа 2015.