Перейти к навигацииПерейти к поиску
Это сравнение возможностей систем типов и проверки типов на нескольких языках программирования .
Краткие определения
- Система номинальных типов означает, что язык решает, являются ли типы совместимыми и / или эквивалентными, на основе явных объявлений и имен.
- Система структурных типов означает, что язык решает, являются ли типы совместимыми и / или эквивалентными, на основе определения и характеристик типов.
- Проверка типа определяет, проверяются ли типы и когда. Статическая проверка означает, что об ошибках типа сообщается на основе текста программы (исходного кода). Динамическая проверка означает, что сообщения об ошибках типа сообщаются на основе динамического поведения программы (во время выполнения).
Язык | Безопасность типов | Выражение типа | Совместимость типов и эквивалентность | Проверка типа |
---|---|---|---|---|
А + | сильный | динамичный | ||
ActionScript 3.0 | сильный | неявный с необязательной явной типизацией | статический | |
ABC | сильный | |||
ABAP | сильный | номинальный | статический | |
Ада | сильный [TS 1] | явный | номинальный | статический |
Агда | сильный | номинальный | статический | |
Алдор | слабый | частично неявный [1] | статический | |
Алеф | сильный | статический | ||
АЛГОЛ 58 | сильный | явный | статический | |
АЛГОЛ 60 | сильный | явный | статический | |
АЛГОЛ 68 | сильный | явный | структурный | статические и помеченные союзы |
АЛГОЛ W | сильный | статический | ||
Алиса | сильный | неявный с необязательным явным | статический | |
Алма-0 | статический | |||
AmbientTalk | сильный | динамичный | ||
AMOS BASIC | статический | |||
AngelScript | сильный | статический | ||
APL | сильный | динамичный | ||
AppleScript | слабый | динамичный | ||
Дуга | динамичный | |||
AutoHotkey | бессмысленный | н / д | н / д | н / д |
AutoLISP | динамичный | |||
Ateji PX | сильный | явный | номинальный | статический |
AWK | ? | ? | ? | ? |
B | бессмысленный | |||
Балерина | сильный | структурный | статический | |
Баш | ? | ? | ? | ? |
БАЗОВЫЙ | сильный | явный | номинальный | статический |
BCPL | бессмысленный | |||
BeanShell | сильный | номинальный | динамичный | |
БЛАЖЕНСТВО | бессмысленный | н / д | н / д | н / д |
Бу | сильный | неявный с необязательной явной типизацией | статический с необязательной динамической типизацией | |
братан | сильный | неявный с необязательной явной типизацией | номинальный | статический |
C | слабый | явный | номинальный | статический |
C-- | слабый | статический | ||
C ++ ( ISO / IEC 14882 ) | слабый | явный с необязательной неявной типизацией (с использованием auto в C ++ 11) | номинальный | статический [TS 2] |
C * | слабый | явный | статический | |
C # | слабый [TS 3] | неявный с необязательной явной типизацией | номинальный | статический [TS 4] |
Оболочка C | ? | ? | ? | ? |
Caml | сильный | неявный с необязательной явной типизацией | статический | |
Сесил | динамический с необязательной статической типизацией | |||
Чистый | сильный | скрытый | статический | |
Цейлон | сильный | статический | ||
Часовня | неявный с необязательной явной типизацией | статический | ||
ХОЛОД | сильный | статический | ||
ChucK | сильный | |||
Силк | слабый | явный | статический | |
Клэр | сильный | неявный с необязательной явной типизацией | динамический с необязательной статической типизацией | |
Чистый | сильный | статический и динамический ? | ||
Clojure | сильный | неявный с необязательной явной типизацией | динамичный | |
CLU | сильный | |||
КОБОЛ | сильный | явный | номинальный | статический |
Кобра | сильный | явный с необязательной неявной типизацией | статический с необязательной динамической типизацией | |
CoffeeScript | скрытый | динамичный | ||
ColdFusion (CFML) | сильный | скрытый | динамичный | |
COMAL | сильный | |||
Common Lisp | сильный | неявный с необязательной явной типизацией | структурный для неявной типизации, номинальный для явной типизации | динамическая, некоторая статическая проверка (в зависимости от реализации) |
Компонент Паскаль | сильный | статический | ||
Прохладный | сильный | явный | статический | |
КОРАЛЛ | сильный | статический | ||
Кристалл | неявный с необязательной явной типизацией [2] | структурный | статический | |
Клинопись | явный | статический | ||
Завиток | сильный | номинальный | ||
Карри | сильный | неявный с необязательной явной типизацией | статический | |
Cython | сильный | неявный с необязательной явной типизацией | номинальный (типы расширения) и структурный (Python) | динамический с необязательной статической типизацией |
D | слабый [TS 3] | явный | номинальный | статический |
Дротик | сильный [3] | постепенный набор текста | номинальный | статический с необязательной динамической типизацией |
Дилан | сильный | динамичный | ||
Эйфелева | сильный | номинальный | статический | |
Эликсир | сильный | скрытый | динамичный | |
Erlang | сильный | скрытый | динамичный | |
Эйфория | сильный | явный, неявный с объектами | номинальный | статический, динамический с объектами |
F # | сильный | скрытый | номинальный | статический |
Четвертый | бессмысленный | н / д | н / д | н / д |
Фортран | сильный | явный [TS 5] | номинальный | статический |
Гамбас | сильный | явный | номинальный | |
GLBasic | сильный | явный. Неявные объявления, доступные в параметрах проекта | номинальный | статический |
Вперед [4] | сильный | частично неявный ( вывод локального типа ) | структурный | статический |
Госу | сильный | частично неявный ( вывод локального типа ) | номинальная (подклассификация) и конструктивная | статический |
Groovy | сильный | неявный с необязательной явной типизацией | динамический с необязательной статической типизацией | |
Гавань | сильный | неявный с необязательной явной типизацией | динамичный | |
Haskell | сильный | неявный с необязательной явной типизацией | номинальный [5] [6] | статический |
Haxe | сильный | неявный с необязательной явной типизацией | номинальная (подклассификация) и конструктивная | статический с необязательной динамической типизацией |
Ио | сильный | скрытый | динамичный | |
ISLISP | сильный | динамичный | ||
J | сильный | динамичный | ||
Джава | сильный [7] | явный | номинальный | статический |
JavaScript | слабый | скрытый | н / д | динамичный |
Юля | сильный | неявный с необязательной явной типизацией [8] | структурный для неявной типизации, номинальный для явной типизации | динамичный |
Радость | сильный | динамичный | ||
Котлин | сильный | частично неявный (вывод локального типа) | номинальный | статический |
LabVIEW | сильный | |||
Lua | сильный | скрытый | динамичный | |
Клен | сильный | динамичный | ||
Меркурий | сильный | статический | ||
Mathematica | сильный | динамичный | ||
MATLAB M-код | сильный | динамичный | ||
Модула-2 | слабый [TS 3] | явный | номинальный | статический |
Модула-3 | слабый [TS 3] | явный | структурный | статический |
МАМПЫ (М) | бессмысленный | н / д | н / д | н / д |
Неко | динамичный | |||
Nemerle | сильный | скрытый | номинальный | статический |
NetLogo | сильный | скрытый | динамичный | |
NetRexx | сильный | неявный с необязательным явным | динамический с необязательной статической типизацией | |
newLisp | скрытый | динамичный | ||
NEWP | сильный | статический | ||
Новояз | динамичный | |||
NewtonScript | динамичный | |||
Ниал | динамичный | |||
Ним | сильный | частично неявный (вывод типа) | статический | |
Никель | сильный | |||
Nu | динамичный | |||
Оберон | сильный | явный | номинальный | статические и частично динамические [TS 6] |
Цель-C | сильный | явный | номинальный | динамический с необязательной статической типизацией [9] |
OCaml | сильный | неявный с необязательной явной типизацией | номинальный для записей, [10] структурный для объектов [6] [11] | статический |
Object Pascal | сильный | явный | номинальный | статический |
Опа | сильный | неявный с необязательной явной типизацией | структурный | статический |
Кислород | слабый | скрытый | статический | |
Оз-Моцарт | сильный | скрытый | структурный | динамичный |
Паскаль | слабый [TS 3] | явный | номинальный | статический |
Perl 5 | скрытый | динамичный | ||
PHP | неявный с необязательной явной типизацией | номинальный | динамичный | |
Плюс | сильный | явный | структурный | статический, динамический (необязательно) |
Пролог | динамичный | |||
Чистый | динамичный | |||
Python | сильный | неявный (с необязательной явной типизацией с 3.5) | н / д | динамичный |
Раку | частично неявный [TS 7] | динамический с необязательной статической типизацией | ||
REBOL | сильный | скрытый | динамичный | |
Rexx | бессмысленный | н / д, неявно по числам | н / д | статические + динамические по числам |
РПГ | слабый | статический | ||
Рубин | сильный | скрытый | н / д | динамичный |
Ржавчина | сильный | явный с необязательной неявной типизацией [12] | в основном номинальный | статический |
S | динамичный | |||
Сленг | сильный | скрытый | динамичный | |
Scala | сильный | частично неявный (вывод локального типа) | номинальная (подклассификация) и конструктивная | статический |
Схема | сильный | скрытый | динамический ( скрытый ) | |
Семя7 | сильный | явный | номинальный | статический |
Симула | сильный | статический [TS 8] | ||
Болтовня | сильный | скрытый | динамичный | |
Быстрый | сильный | частично неявный (вывод локального типа) | номинальная (подклассификация) и конструктивная | статический |
Стандартный ML | сильный | неявный с необязательной явной типизацией | структурный | статический |
Tcl | динамичный | |||
Машинопись | ? | по желанию | структурный | статический |
Visual Basic | сильный | неявный с необязательной явной типизацией | номинальный | статический |
Visual Basic .NET | слабый [TS 3] | явный | статический | |
Визуальный пролог | сильный | частично неявный | номинальный | статический |
Язык Wolfram Language | сильный | динамичный | ||
Windows PowerShell | сильный | скрытый | динамичный | |
XL | сильный | номинальный | статический | |
Xojo | сильный | явный | номинальный | статический |
XPath / XQuery | сильный | частично неявный | номинальный | динамический с необязательной статической типизацией |
Язык | Безопасность типов | Выражение типа | Совместимость типов композитов | Проверка типа |
Примечания
- ^ Небезопасные операции хорошо изолированы префиксом «Unchecked_».
- ^ с необязательным приведением динамического типа (см. динамическое приведение )
- ^ a b c d e f Это почти безопасно, небезопасные функции обычно не используются.
- ^ с необязательным динамическим типом (см. поиск динамического члена )
- ^ Необязательно, типизация может явно подразумеваться первой буквой идентификатора (известная как неявная типизация в сообществе Fortran).
- ^ динамическая проверка расширений типов, т.е. унаследованных типов
- ^ явный для статических типов
- ^ необязательно для формальных и виртуальных процедур
Ссылки
- ^ Руководство пользователя Aldor (PDF) . Aldor.org. 2002. С. 40, 61 . Проверено 3 июня 2021 года .
- ^ «Кристалл вывода типа» . Справочник по языку Crystal . Проверено 3 июня 2021 года .
- ^ "Система типов Дарт" . dart.dev . Проверено 8 апреля 2020 .
- ^ Спецификация языка программирования Go
- ^ Лё, Андрес. «Почему в Haskell нет записей со структурной типизацией?» . Переполнение стека . Архивировано 14 марта 2016 года . Проверено 13 апреля 2020 .
- ^ a b Кинг, Алексис (19.01.2020). «Нет, системы динамического типа не являются более открытыми по своей сути» . lexi-lambda.github.io . Архивировано 01 марта 2020 года . Проверено 13 апреля 2020 .
- ^ Шэн Лян, Гилад Браха. Динамическая загрузка классов в виртуальной машине Java . Том 33, выпуск 10 уведомлений ACM SIGPLAN, октябрь 1998 г.
- ^ https://docs.julialang.org/en/latest/manual/types/
- ↑ Developer.apple.com. Архивировано 10 июня 2009 г. на Wayback Machine.
- ^ «Запись · Причина» . reasonml.github.io . Архивировано 31 марта 2020 года . Проверено 13 апреля 2020 .
- ^ "Система структурного типа" , Википедия , 29 марта 2019 г. , получено 13 апреля 2020 г.
- ^ "rust-lang / rustc-dev-guide" . GitHub . Проверено 8 апреля 2020 .