A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | AA | AB | AC | AD | AE | AF | AG | AH | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Надежность | Функциональность | Безопасность | |||||||||||||||||||||||||||||||
2 | Устойчивость к ошибкам человека Исключение неоднозначностей при компиляции. Читаемость, защита от опечаток копипасты, определенный порядок вызовов, отсутствие похожих операторов | Юникодные строки и исходники, тип строк (защита от перерасхода памяти), датавремя | Контроль приведения типов, переполнений, потери точности | Контроль границ массивов, коллекций итп | Контроль памяти (null-area), стека, GC, защита от фрагментации | Обработка ошибок, исключения, коды, трапы, ADT (nullable), RAII | Модульность [иерархическая] | ООП, Параметрический полиморфизм (дженерики) | ФП | Контракты, юниттесты | Доступ к железу, обработчики прерываний | Многопоточность, акторы, почтовые ящики, микросервисы | Сетевые ф-ции, Веб | ГУИ | Файловый в/в | Контроль времени исполнения | Очистка освобожденной, получаемой памяти | |||||||||||||||||
3 | Active Oberon | регистрозависимые идентификаторы, автоинициализации переменных нет (кроме объектов в куче и массивов) | строки asciiz rw-массивы, дат нет, есть UTF8 | есть | есть | GC | коды возврата, но аварийные сигналы дают возможность очистки и перезапуска сбойной процедуры | неиерархическая | есть интерфейсы, делегаты, полиморфизм делать руками с помощью RTTI, генериков нет | нет | нет | да, сисфункции, ассемблерные вставки | Многопоточность, примитивы синхронизации | Часть системы Оберон | Часть системы Оберон | Часть системы Оберон | нет, но потоки с высоким приоритером не вытесняются ГЦ | да | ||||||||||||||||
4 | Ada | есть, но писать многобукофф | строки - мутабельные массивы, датавремя и юникод есть | есть | есть | есть, not null типы параметров и данных, есть защита от фрагментации | исключения | иерархия, но не файловая | да | да | Контракты, юниттесты возможны в дочерних пакетах | да | Многопоточность, примитивы синхронизации, обмен | нет | сторонние - GtkAda | да | да | нет, можно делать кастомный аллокатор для типа | ||||||||||||||||
5 | BetterC (dlang subset) | лучше С - определен порядок выражений и вычисления параметров, автоинициализация, есть сложные выражения | только С - строки, юникод есть | float+core.checkedint | есть | как в С, но есть @safe | RAII + ADT (Nullable с предв.значением) | да | ООП ограничено структурами без наследования, интерфейсы и дженерики есть | нет, требует GC | есть | да | только С - системными вызовами | нет | Нет | c.stdio | нет | нет | ||||||||||||||||
6 | D (для сравнения с betterC) | --//-- | строки иммутабельные в std, на GC | float+core.checkedint | есть | GC + @safe + @nogc, Nullable | исключения, RAII, ADT | да | да | да | есть | да, но прерывания конфликтуют с GC | есть | да, web библиотека vibe-d | библиотеки - несколько | да | нет | получаемой да, освобождаемой только в отладочной сборке GC, деструкторы | ||||||||||||||||
7 | IEC 61131-3 ST | да | да, есть UTF16 | есть | есть | не требуется | вызывается пользвательский обработчик | да, хранение от реализатора | ООП, интерфейсы | нет, но есть ф-ции с сохранением состояния | нет | да, специфика ПЛК | есть, синхронизация семафорами | сеть - библиотеки, веб иногда в ПЛК | нет | сторонние библиотеки | да | нет динамич.памяти | ||||||||||||||||
8 | Safe-C | лучше С - определен порядок выражений и вычисления параметров | мутабельные строки, дата в библиотеке | только float | есть | полный контроль, refcount для доп. контроля, допустимо #unsafe | коды возврата, но ф-ции могут возвращать несколько параметров | есть +пакеты | дженерики | нет | нет | да | есть, минимум | есть, минимум | есть, минимум | да | нет | получаемой да, для затирания есть clear | ||||||||||||||||
9 | Extended Pascal ISO 10206 - черновик | порядок вызовов и вычислений неопределен | строки неюникодные, датавремя есть | нет | есть | нет, ручное упраление | коды возврата, но ф-ции могут возвращать несколько параметров и структуры | неиерархическая | нет | нет | нет | нет | нет | нет | сторонние | да | нет | нет | ||||||||||||||||
10 | Delphi | порядок вызовов и вычислений неопределен | есть, но со строками бардак (одни CoW, ARC - другие без) | Integer $Q, float как С | есть, $R | нет, ручное упраление | исключения, RAII в виде finally | неиерархическая | есть, старые object и новые class, дженерики | нет | нет | есть, но ограничены платформы - "тяжелый" софт | Многопоточность, примитивы синхронизации | да | да | да | нет | нет | ||||||||||||||||
11 | Rust (в основе по анализу @TargetSan) | Многовато спецсимволов, сложная идеология, синтаксис еще меняется, идентификаторы регистрозависимые, порядок вычисления и аргументов определяется заимствованиями ??, проблемы с FFI | Строки RW UTF8 на хипе, слайсы | есть, с выбором необходимости | есть | есть | ADT, RAII | да | дженерики, инкапсуляция, AST-макросы | да | Юниттесты | да | да, каналы обмена | да | сторонние - Gtk | да | нет | нет, можно делать глобальный кастомный аллокатор | ||||||||||||||||
12 | C++ | дефолтный уровень, сложный местами неоднозначный синтаксис | да, строки мутабельные | float + boost/safe_numerics + SafeInt | для std:: | для std:: | да | с++20 | да | да, но (*) | Контракты экспериментальные С++20, юниттесты сторонние | да | std::thread и сторонние акторы | сторонние | сторонние | да | нет | кастом аллокаторы, деструкторы | ||||||||||||||||
13 | Go | хорошо. регистрозависимые идентификаторы, автоинициализация переменных, порядок вычислений однозначен | да, строки иммутабельные | переполнения не контролируются | есть | GC | ADT, defer | да, дорабатывается версионирование | ООП ограничено нет виртуализации, есть интерфейсы, дженерики ожидаются в 2.0 | да, но (**) | Юниттесты | да, но прерывания конфликтуют с GC | есть | да | сторонние, заточка под Веб-сервисы | да | нет | только получаемой, для безопасности сторонний memguard | ||||||||||||||||
14 | Oxygene | хорошо. контроль регистра идентификаторов, автоинициализация переменных, порядок вычислений однозначен | строки UTF-16, мутабельные, похожи на Delphi WideString, датавремя есть | переполнения целых могут проверяться, float - нет | есть | GC, ARC, Manual - в зависимости от платформы, но GC основной | да | да | да, кроме шаблонов | да | есть | нет | locked | от целевой платформы | от целевой платформы | да | нет | получаемой | ||||||||||||||||
15 | Swift | хорошо. контроль регистра идентификаторов, контроль инициализации переменных, порядок вычислений однозначен | строки UTF16, мутабельные CoW, датавремя есть | переполнения целых проверяются, float - нет | есть | ARC для Apple, GC для RemObj | Исключения, defer, Nullable, RAII | да | да, кроме шаблонов | да | Контрактов нет, юниттесты есть | нет | библиотеки, разные для платформ | да, для RO от целевой платформы | от целевой платформы | да | нет | получаемой | ||||||||||||||||
16 | ||||||||||||||||||||||||||||||||||
17 | C# | проще С++ и определен порядок выражений и вычисления параметров | да | да | да | GC | да | да | да, кроме шаблонов (но есть T4) | да | есть | нет | да, стронние акторы | да | да | да | нет | при получении, при освобождении только SecureString | ||||||||||||||||
18 | (*) What can C++ offer as far as functional programming? | |||||||||||||||||||||||||||||||||
19 | (**) Functional Go | |||||||||||||||||||||||||||||||||
20 | ||||||||||||||||||||||||||||||||||
21 | Ниже языки, не вошедшие в рассмотрение по причине низкой популярности (а значит и нет библиотек) или по другим, прописанным явно | |||||||||||||||||||||||||||||||||
22 | Crystal | https://crystal-lang.org | нет в Tiobe100 хотя и наследник популярного Ruby (Tiobe11), только вышел март 2021, специализирован для веб | |||||||||||||||||||||||||||||||
23 | Eiffel | https://www.eiffel.org | нет в Tiobe100, древний | |||||||||||||||||||||||||||||||
24 | Haxe | https://haxe.org | нет в Tiobe50, транспилер, специализирован для веб | |||||||||||||||||||||||||||||||
25 | Julia | https://julialang.org | Tiobe50, динамическая типизация, специализирован для математических вычислений | |||||||||||||||||||||||||||||||
26 | Nim | https://nim-lang.org | нет в Tiobe100, только зарелизился 1.4, но еще нестабилен | |||||||||||||||||||||||||||||||
27 | Oberon | http://cas.inf.ethz.ch/projects/a2 | Хотя и рассмотрен, нет в Tiobe100 и практически бесполезен - нет нормального тулчейна | |||||||||||||||||||||||||||||||
28 | OCaml | https://ocaml.org | нет в Tiobe100, сильный уклон в ФП, ML-синтаксис | |||||||||||||||||||||||||||||||
29 | Red | https://www.red-lang.org | нет в Tiobe50, бета | |||||||||||||||||||||||||||||||
30 | Terra | https://terralang.org | нет в Tiobe100, 1.0.0-beta1, развитие прекращено | |||||||||||||||||||||||||||||||
31 | V | https://vlang.io | нет в Tiobe100 еще бета | |||||||||||||||||||||||||||||||
32 | Zig | https://ziglang.org | нет в Tiobe100 еще бета | |||||||||||||||||||||||||||||||
33 | ||||||||||||||||||||||||||||||||||
34 | ||||||||||||||||||||||||||||||||||
35 | ||||||||||||||||||||||||||||||||||
36 | ||||||||||||||||||||||||||||||||||
37 | ||||||||||||||||||||||||||||||||||
38 | ||||||||||||||||||||||||||||||||||
39 | ||||||||||||||||||||||||||||||||||
40 | ||||||||||||||||||||||||||||||||||
41 | ||||||||||||||||||||||||||||||||||
42 | ||||||||||||||||||||||||||||||||||
43 | ||||||||||||||||||||||||||||||||||
44 | ||||||||||||||||||||||||||||||||||
45 | ||||||||||||||||||||||||||||||||||
46 | ||||||||||||||||||||||||||||||||||
47 | ||||||||||||||||||||||||||||||||||
48 | ||||||||||||||||||||||||||||||||||
49 | ||||||||||||||||||||||||||||||||||
50 | ||||||||||||||||||||||||||||||||||
51 | ||||||||||||||||||||||||||||||||||
52 | ||||||||||||||||||||||||||||||||||
53 | ||||||||||||||||||||||||||||||||||
54 | ||||||||||||||||||||||||||||||||||
55 | ||||||||||||||||||||||||||||||||||
56 | ||||||||||||||||||||||||||||||||||
57 | ||||||||||||||||||||||||||||||||||
58 | ||||||||||||||||||||||||||||||||||
59 | ||||||||||||||||||||||||||||||||||
60 | ||||||||||||||||||||||||||||||||||
61 | ||||||||||||||||||||||||||||||||||
62 | ||||||||||||||||||||||||||||||||||
63 | ||||||||||||||||||||||||||||||||||
64 | ||||||||||||||||||||||||||||||||||
65 | ||||||||||||||||||||||||||||||||||
66 | ||||||||||||||||||||||||||||||||||
67 | ||||||||||||||||||||||||||||||||||
68 | ||||||||||||||||||||||||||||||||||
69 | ||||||||||||||||||||||||||||||||||
70 | ||||||||||||||||||||||||||||||||||
71 | ||||||||||||||||||||||||||||||||||
72 | ||||||||||||||||||||||||||||||||||
73 | ||||||||||||||||||||||||||||||||||
74 | ||||||||||||||||||||||||||||||||||
75 | ||||||||||||||||||||||||||||||||||
76 | ||||||||||||||||||||||||||||||||||
77 | ||||||||||||||||||||||||||||||||||
78 | ||||||||||||||||||||||||||||||||||
79 | ||||||||||||||||||||||||||||||||||
80 | ||||||||||||||||||||||||||||||||||
81 | ||||||||||||||||||||||||||||||||||
82 | ||||||||||||||||||||||||||||||||||
83 | ||||||||||||||||||||||||||||||||||
84 | ||||||||||||||||||||||||||||||||||
85 | ||||||||||||||||||||||||||||||||||
86 | ||||||||||||||||||||||||||||||||||
87 | ||||||||||||||||||||||||||||||||||
88 | ||||||||||||||||||||||||||||||||||
89 | ||||||||||||||||||||||||||||||||||
90 | ||||||||||||||||||||||||||||||||||
91 | ||||||||||||||||||||||||||||||||||
92 | ||||||||||||||||||||||||||||||||||
93 | ||||||||||||||||||||||||||||||||||
94 | ||||||||||||||||||||||||||||||||||
95 | ||||||||||||||||||||||||||||||||||
96 | ||||||||||||||||||||||||||||||||||
97 | ||||||||||||||||||||||||||||||||||
98 | ||||||||||||||||||||||||||||||||||
99 | ||||||||||||||||||||||||||||||||||
100 |