Сравнение языков программирования по системе типов - 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.