Сравнение языков программирования по системе типов - Comparison of programming languages by type system
Это сравнение характеристик системы типов и проверка типа из нескольких языки программирования.
Краткие определения
- А система номинального типа означает, что язык определяет, являются ли типы совместимыми и / или эквивалентными, на основе явных объявлений и имен.
- А система структурного типа означает, что язык решает, являются ли типы совместимыми и / или эквивалентными, на основе определения и характеристик типов.
- Проверка типа определяет, проверяются ли типы и когда. Статическая проверка означает, что об ошибках типа сообщается на основе текста программы (исходного кода). Динамическая проверка означает, что об ошибках типа сообщается в зависимости от динамического поведения программы (во время выполнения).
Язык | Безопасность типов | Выражение типа | Совместимость типов и эквивалентность | Проверка типа |
---|---|---|---|---|
ActionScript 3.0 | сильный | неявный с необязательной явной типизацией | статический | |
Ада | сильный[TS 1] | явный | номинальный | статический |
Алдор | слабый | скрытый | статический | |
АЛГОЛ 58 | сильный | явный | статический | |
АЛГОЛ 60 | сильный | явный | статический | |
АЛГОЛ 68 | сильный | явный | структурный | статический и отмеченные союзы |
APL | сильный | динамичный | ||
AutoHotkey | бессмысленный | н / д | н / д | н / д |
Ateji PX | сильный | явный | номинальный | статический |
Баш | ? | ? | ? | ? |
БАЗОВЫЙ | сильный | явный | номинальный | статический |
БЛАЖЕНСТВО | бессмысленный | н / д | н / д | н / д |
BeanShell | сильный | номинальный | динамичный | |
Бу | сильный | неявный с необязательной явной типизацией | статический с необязательной динамической типизацией | |
братан | сильный | неявный с необязательной явной типизацией | номинальный | статический |
C | слабый | явный | номинальный | статический |
C ++ (ISO / IEC 14882 ) | слабый | явный с необязательной неявной типизацией (с использованием auto в C ++ 11) | номинальный | статический[TS 2] |
C # | слабый[TS 3] | неявный с необязательной явной типизацией | номинальный | статический[TS 4] |
Чистый | сильный | скрытый | статический | |
Clojure | сильный | неявный с необязательной явной типизацией | динамичный | |
КОБОЛ | сильный | явный | номинальный | статический |
Холодный синтез (CFML) | сильный | скрытый | динамичный | |
Common Lisp | сильный | неявный с необязательной явной типизацией | структурный для неявной типизации, номинальный для явной типизации | динамическая, некоторая статическая проверка (в зависимости от реализации) |
Завиток | сильный | номинальный | ||
Cython | сильный | неявный с необязательной явной типизацией | номинальный (типы расширения) и структурный (Python) | динамический с дополнительной статической типизацией |
D | слабый[TS 3] | явный | номинальный | статический |
Дилан | сильный | динамичный | ||
Эйфель | сильный | номинальный | статический | |
Эликсир | сильный | скрытый | динамичный | |
Erlang | сильный | скрытый | динамичный | |
Эйфория | сильный | явный, неявный с объектами | номинальный | статический, динамический с объектами |
F # | сильный | скрытый | номинальный | статический |
Четвертый | бессмысленный | н / д | н / д | н / д |
Фортран | сильный | явный[TS 5] | номинальный | статический |
Гамбас | сильный | явный | номинальный | |
GLBasic | сильный | явный. Неявные объявления доступны через параметры проекта | номинальный | статический |
Идти[1] | сильный | неявный с необязательной явной типизацией | структурный | статический |
Госу | сильный | частично неявный (вывод локального типа) | номинальные (подклассы) и конструктивные | статический |
Groovy | сильный | неявный с необязательной явной типизацией | динамический с дополнительной статической типизацией | |
Гавань | сильный | неявный с необязательной явной типизацией | динамичный | |
Haskell | сильный | неявный с необязательной явной типизацией | номинальный[2][3] | статический |
Haxe | сильный | неявный с необязательной явной типизацией | номинальная (подклассификация) и конструктивная | статический с необязательной динамической типизацией |
Ио | сильный | скрытый | динамичный | |
ISLISP | сильный | динамичный | ||
J | сильный | динамичный | ||
Ява | сильный[4] | явный | номинальный | статический |
JavaScript | слабый | скрытый | н / д | динамичный |
Юля | сильный | неявный с необязательной явной типизацией[5] | структурный для неявной типизации, номинальный для явной типизации | динамичный |
Радость | сильный | динамичный | ||
Котлин | сильный | частично неявный (вывод локального типа) | номинальный | статический |
LabVIEW | сильный | |||
Lua | сильный | скрытый | динамичный | |
Клен | сильный | динамичный | ||
Mathematica | сильный | динамичный | ||
MATLAB М-код | сильный | динамичный | ||
Модула-2 | слабый[TS 3] | явный | номинальный | статический |
Модула-3 | слабый[TS 3] | явный | структурный | статический |
МАМПЫ (М) | бессмысленный | н / д | н / д | н / д |
Оберон | сильный | явный | номинальный | статические и частично динамические[TS 6] |
Цель-C | сильный | явный | номинальный | динамический с дополнительной статической типизацией[6] |
OCaml | сильный | неявный с необязательной явной типизацией | номинал для рекордов,[7] структурный для объектов[3][8] | статический |
Object Pascal | сильный | явный | номинальный | статический |
Опа | сильный | неявный с необязательной явной типизацией | структурный | статический |
Кислород | слабый | скрытый | статический | |
Оз-Моцарт | сильный | скрытый | структурный | динамичный |
Паскаль | слабый[TS 3] | явный | номинальный | статический |
Perl 5 | скрытый | динамичный | ||
PHP | неявный с необязательной явной типизацией | номинальный | динамичный | |
Плюс | сильный | явный | структурный | статический, динамический (необязательно) |
Пролог | динамичный | |||
Чистый | динамичный | |||
Python | сильный | неявный (с необязательной явной типизацией с 3.5) | н / д | динамичный |
Раку | частично неявный[TS 7] | динамический с дополнительной статической типизацией | ||
REBOL | сильный | скрытый | динамичный | |
Rexx | бессмысленный | н / д, неявно по числам | н / д | статические + динамические по числам |
РПГ | слабый | статический | ||
Рубин | сильный | скрытый | н / д | динамичный |
Ржавчина | сильный | явный с необязательной неявной типизацией[9] | в основном номинальный | статический |
S | динамичный | |||
Сленг | сильный | скрытый | динамичный | |
Scala | сильный | частично неявный (вывод локального типа) | номинальная (подклассификация) и конструктивная | статический |
Схема | сильный | скрытый | динамический (скрытый ) | |
Семя7 | сильный | явный | номинальный | статический |
Симула | сильный | статический[TS 8] | ||
Болтовня | сильный | скрытый | динамичный | |
Быстрый | сильный | частично неявный (вывод локального типа) | номинальные (подклассы) и конструктивные | статический |
Стандартный ML | сильный | неявный с необязательной явной типизацией | структурный | статический |
Tcl | динамичный | |||
Машинопись | ? | необязательный | структурный | статический |
Visual Basic | сильный | неявный с необязательной явной типизацией | номинальный | статический |
Visual Basic .NET | слабый[TS 3] | явный | статический | |
Визуальный пролог | сильный | частично неявный | номинальный | статический |
Язык Wolfram Language | сильный | динамичный | ||
Windows PowerShell | сильный | скрытый | динамичный | |
XL | сильный | номинальный | статический | |
Xojo | сильный | явный | номинальный | статический |
XPath /XQuery | сильный | частично неявный | номинальный | динамический с дополнительной статической типизацией |
Дротик | сильный[10] | постепенный набор текста | номинальный | статический с необязательной динамической типизацией |
Язык | Безопасность типов | Выражение типа | Совместимость типов композитов | Проверка типа |
Рекомендации
- ^ Небезопасные операции хорошо изолированы префиксом «Unchecked_».
- ^ с необязательным приведением динамического типа (см. динамический состав )
- ^ а б c d е ж Это почти безопасно, небезопасные функции обычно не используются.
- ^ с необязательным динамическим типом (см. динамический поиск членов )
- ^ При желании набор текста может быть явно подразумевается по первой букве идентификатора (это называется неявной типизацией в сообществе Fortran).
- ^ динамическая проверка расширений типов, то есть унаследованных типов
- ^ явный для статических типов
- ^ необязательно для формальных и виртуальных процедур
- ^ Спецификация языка программирования Go
- ^ Лё, Андрес. «Почему в Haskell нет записей со структурной типизацией?». Переполнение стека. В архиве из оригинала от 14.03.2016. Получено 2020-04-13.
- ^ а б Король, Алексис (19.01.2020). «Нет, системы динамического типа не являются более открытыми по своей сути». lexi-lambda.github.io. В архиве из оригинала 2020-03-01. Получено 2020-04-13.
- ^ Шэн Лян, Гилад Браха. Динамическая загрузка классов в виртуальной машине Java. Том 33, выпуск 10 уведомлений ACM SIGPLAN, октябрь 1998 г.
- ^ https://docs.julialang.org/en/latest/manual/types/
- ^ Developer.apple.com В архиве 10 июня 2009 г. Wayback Machine
- ^ «Запись · Причина». причинаml.github.io. В архиве из оригинала 31.03.2020. Получено 2020-04-13.
- ^ «Система структурного типа», Википедия, 2019-03-29, получено 2020-04-13
- ^ "rust-lang / rustc-dev-руководство". GitHub. Получено 2020-04-08.
- ^ «Система типа Дарт». dart.dev. Получено 2020-04-08.