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

Уже были рассмотрены в части 3. TL;DR:

Лидеры:

  • Ada - полуфиналист для коллективов, ориентированных на специальные надежные задачи, очень исторически многословен, зато есть всё

  • Dlang, BetterC - полуфиналист для небольших систем, хорош во многом, удобен, но уровень поддержки бывает недостаточен

  • Rust - полуфиналист маргиналов, надежен до железобетонности и такой же гибкий

  • Современный С++, без комментариев, просто царь, но и с царскими требованиями

Еще пройдены:

  • Go и C# - языки энтерпрайзного говнокодинга, впрочем достаточно развиты и универсальны для многих применений, см.например TinyGo, Wails и Zerosharp

  • Семейство [Active] Oberon, Modula-2 /3, ISO Pascal - просто, в основном надежно, в разной степени неудобно и без тулсета

  • Safe-C - только лишь proof of concept

  • ISO IEC 61131-3 ST - маст хев во всех ПЛК мира, но и не более того (а Ladder Logic в Tiobe 50)

Временно отстранены от рассмотрения, “неудачники”


  • Delphi, хотя и в Tiobe 9, и особых претензий нет (средняя надежность и функциональность), но дорого, разработка для Линукс (и клиент сервер) требует Enterprise редакции за $3K на лицо, Professional версия за $1K вполне адекватна но без вышеперечисленного функционала, Community версия не пройдёт для работы по условиям лицензии

  • FreePascal - недо-Delphi, зато бесплатно

  • Java, Tiobe 4. Туда же в энтерпрайз. Хотя сейчас персональные компьютеры/телефоны и сравнялись с мэйнфреймами времени создания Явы по производительности, накладные расходы велики и заметны даже сейчас

Языки функциональной парадигмы (ФП)

  • Haskell Tiobe 30

  • Erlang Tiobe 100

  • Elixir Tiobe 47

  • Ocaml Tiobe 100

Практически не распространены в реальном, а не академическом мире разработки, мой комментарий о них.

Нишевые ЯП, но с претензией на надежность 

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

Хотя и можно найти реализации этих языков вне основной платформы и области применения, сложно с тулингом и библиотеками.

  • Swift, рассмотрен в части 5 - специализирован для Apple платформ, хоть и есть независимый компилятор от RemObjects, Tiobe 23.

  • Kotlin, также специализирован для Android, хоть и есть native реализация, в Tiobe 25.

  • Julia, Tiobe 35, надёжность для математических вычислений

  • Crystal,  вошёл в Tiobe 100, специализирован для web, является наследником Ruby, который в Tiobe 21  

  • Hack - Tiobe 100, разработка web - сайтов

А почему и кто остается то?  

Реальные к использованию в боевых задачах, имеющие не супер дорогие компиляторы, более-менее стабилизировавшиеся.

Обязательно - поддерживаемый компилятор для Linux, а лучше еще и для других платформ, потом наличие библиотек для избранных областей. 

Текстовые редакторы как правило имеются, зачастую с LSP-расширениями, а вот отладчики или IDE, если есть - необязательный бонус.

Таблица с областями возможного применения ЯП в предыдущих статьях заменена на теги, надеюсь достаточно самообъясняющие: gamedev, web, desktop, enterprise (db+web OR desktop), math, CLI, mobile, embedded (bios, kernel), system, HFT

Напоследок — обновленная сводная таблица соответствия функциональным требованиям.

Заматеревшие, эволюционировавшие (эволвед) с прошлого обзора, условно стабильные, достойные подробного разбора

Zig 

Сайт. Tiobe 100, Redmonk 87

desktop, math, CLI, embedded, system, HFT

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

  • читаемость - нормальная, слегка многословен и cryptic, но терпимо

  • переменные чувствительны к регистру, можно создать разные one=1 и One=2, но отслеживаются неиспользуемые как ошибка компиляции, переменные требуют явной инициализации, порядок вычислений однозначен, приведение типов аккуратное

  • очень много операторов с явным контролем переполнения, недополнения итд - выбирай на вкус

  • контроль некорректного поведения классифицирован. Здесь оно называется Illegal Behavior, там же перечень проверок при компиляции и во время исполнения

  • есть режим компиляции с оптимизацией, но с включенными проверками - ReleaseSafe. Также проверки можно отключать выборочно на уровне отдельных блоков кода

  • обработка ошибок явная через optional error. Нечто среднее между Go и исключениями, но без накладных расходов последних. Полная обработка многословнее, чем в Go, можно сократить через errdefer. Но также сохранена возможность запаниковать, явно игнорировав ошибку

  • для безопасной многопоточности встроены атомики и TLS

  • есть встроенные юниттесты

  • скрытые вызовы, накладные расходы и неявные аллокации отсутствуют

Минусы в основном исходят из желания все упростить:

  • встроенной в язык работы со строками практически нет - это просто массивы UTF-8, библиотеки прикручивайте сами. С учетом бесшовной интеграции с С, впрочем решаемо на выбор

  • работа с динамической памятью всегда явно требует указания аллокатора, что ведет к многословности. Ручное управление памятью и ресурсами с помощью defer, errdefer. В стандартной библиотеке есть несколько аллокаторов на выбор - libс, arena, fixed buffer, smp_allocator

  • дата/время - тоже самостоятельно

  • модульность очень странная, все инклудится в один файл и потом выборочно (?), компилируется. Масштабируемость на большие проекты под вопросом

  • ООП нет, дженериков нет, есть только инкапсулированные в структуры функции и Duck Typing при вызовах - некоторая шаблонизация

  • DbC нет, только ассерты

  • система сборки сделана библиотекой языка - пишите сами build.zig

Итого, если смотреть как язык для небольших или встраиваемых систем - все очень даже неплохо.  А отсутствие ограничений для использования системных библиотек - это киллер-фича. Для остального язык достаточно новый, и сыроват. 

Oxygene 

Сайт

gamedev, desktop, enterprise, CLI, mobile, system

Коммерческий компилятор с IDE - $200-750, для enterprise вероятно придется докупать Data Abstract для работы с СУБД - $1500

Это мультиплатформенный продвинутый диалект Delphi с GC, но без развитых средств формошлепства.

Подробнее рассмотрен в части 5 

Eiffel (немного некромания)

Сайт

web, desktop, enterprise, CLI, system

Tiobe 100, цена коммерческого компилятора с IDE EiffelStudio $150-$1500, есть бесплатный полуживой Liberty Eiffel Compiler

Автор языка Бертран Мейер, повернутый в хорошем смысле на надежности, автор DbC.

Язык является ровесником Оберона, Алголоподобный синтаксис, вполне читаемый без специальной подготовки и довольно многословный, как тогда было принято.

В плане надежности, я не нашел к чему придраться, разве что это язык со сборкой мусора и нет контроля времени исполнения для систем реального времени. Тут он практически вплотную близок к лидеру - Ada.

V

Сайт. Еще в бете, но уже вошёл в Tiobe 43.

gamedev, web, desktop, enterprise, math, CLI, mobile (Android), system, HFT

Синтаксисом сходен с Go, собственно быстрое представление о языке можно составить по краткому списку отличий от Go.

Использует интересные стратегии использования памяти: основной метод это GC при невозможности стековой аллокации, но есть вариант autofree (пока бетатест), который освобождает объекты ранее, чем отдавать их в GC. Также есть атрибут для принудительной аллокации структур в куче @[heap], уровня функции @[manualfree] для подавления autofree, и есть режимы полностью ручного управления -gc none и полностью предварительных аллокаций для примитивных случаев -prealloc.

В плане надежности минимально улучшает Go (у которого и так все неплохо) за счет явного указания мутабельных параметров, обязательности обработки ошибок с поддержкой SumType и отказа работы с null (кроме unsafe c-interop).

В минусах надежности - не определен порядок при вызове функций, и общая незаконченность языка и библиотек.

Nim 

Сайт. Tiobe 100 

gamedev, web, enterprise, CLI, math, embedded, system

С момента первой статьи уже вышла версия 1.6, и появилась ветка 2.2. 

Язык отступами и приемами работы напоминает Python, только компилируемый через трансляцию в С. Также есть JS-таргет. Очень богатый набор возможностей, например одновременно поддерживает и макросы и дженерики и шаблоны. Фактически, язык расширяемый.

Интересны стратегии использования памяти - основная это ARC с контролем зацикливания (здесь называется ORC), но возможно использование нескольких вариантов GC, а также их комбинации. Пригоден для реалтайм систем, поскольку [де]аллокации имеют гарантированное О(1) и низкую фрагментацию, TLSF алгоритм.

Есть вариант ручной аллокации, также были арены, ныне удалены.

Что касается надежности:

Общее замечание касательно хрупкости кода, построенного на отступах, когда легким движением руки условного индуса, зацепившего Таб, логика летит к чертям. Нивелируется современными средствами разработки и контролем версий, но не полностью.

  • читаемость - хорошая

  • переменные чувствительны к регистру, можно создать разные one=1 и One=2, но переменные требуют явного объявления, есть инициализация по умолчанию, порядок вычислений однозначен, явный отказ от возвращаемого значения, допустимы именованные параметры, приведение типов аккуратное, можно ужесточить приведение с помощью distinct

  • есть контроль переполнений, выхода за границы, нулей итп

  • есть режим компиляции и с оптимизацией, и c отключенными проверками - отдельный от релизного -d:danger. Также проверки можно отключать выборочно на уровне отдельных функций

  • обработка ошибок механизмом исключений или defer, причем можно указывать явный перечень допустимых, так называемые checked с помощью  {.raises.}

  • для безопасной многопоточности встроены атомики и TLS, многопоточные функции могут явно помечаться для проверки компилятора (бета). Не 100% безопасность

  • есть стандартная библиотека юнит-тестирования и контрактного дизайна, есть еще и дополнительные библиотеки

Минусы:

  • уже упомянутая идентация кода

  • неявный возврат из функций, неявный result, return либо последнее выражение??

  • результат вызова мультиметодов при неполной специализации зависит от версии компилятора, видимо баг 2.2.0

  • многопоточность еще не полностью финализирована, threadpool is deprecated, нужно учитывать применяемый аллокатор, есть несколько внешних библиотек

Перспективные - растущие, на след обзор лет через пять 

Odin Programming Language 

gamedev, math, CLI, HFT

ТЛ;ДР: Компилируемый язык на базе LLVM, для Win/Lin/MacOS/WASM+Orca. Компилятор написан на С++. 

Заточен под геймдев, но можно что-нибудь и рассчитать, простой, похож на С с небольшим добавлением синтаксического сахара,  в том числе строками utf8, мапами, динамическими массивами, дженериками, кастомными аллокаторами, обработкой ошибок и defer как в Go. Без жира - GC, ООП, управления пакетом с пакетами. Большинство С-граблей отсутствуют.

Более подробно на английском от автора книги Understanding the Odin Programming Language, в статье Введение в язык программирования Odin | Карл Жилински  

Краткий обзор достоинств и недостатков на английском Odin programming language review

Pony

Язык, посвященный актор-модели. Назначение пока неясно.

The Ring Programming Language 

Tiobe 100

gamedev, web, desktop, CLI, mobile, enterprise

Terra

gamedev, system

Terra + Lua(Tiobe 33), вышел релиз 1.2

Язык более низкого уровня, встраивается в Lua как JIT

Vox 

gamedev

Диалект облегченного D без GC и зависимостей, написан на D, обновлен 04.2025

Для Win/Lin/MacOS, умеет исполняться в JIT как скриптовый.

Вorgo

расширение Go - добавление ADT и обработки ошибок, написан на Rust 

Biron 

system, embedded 

Rox — экспериментальная игрушечная операционная система, написанная на экспериментальном языке программирования Biron.

Написан на С++, с LLVM. Достаточно современный набор возможностей.

Cone  

https://www.reddit.com/r/ProgrammingLanguages/comments/722f99/pivoting_from_acorn_to_cone/   Наследник Acorn, для визуализации 3D-моделей в браузере.

https://github.com/jondgoodwin 

заброшен 3 года

Xojo

web, desktop, enterprise, mobile, embedded 

Tiobe100   - RAD Коммерческая мультиплатформенная реализация бейсика (VB Tiobe8), ранее REALbasic compiler.

Vala/Genie 

desktop

Tiobe100. 

Программирование приложений для GTK. Genie диалект устарел

Haxe 

gamedev, web, desktop, CLI, mobile

ActionScript - подобный транспилер, для создания браузерных игр и не только

Hare 

system

Использует QBE вместо LLVM   https://habr.com/ru/news/920704/ 

Местечковые, Хабр

В статьях авторы сами описывают что, и зачем.

Язык программирования Ü. Введение, мотивация к созданию, цели.

Хабрастатья

https://github.com/Panzerschrek/U-00DC-Sprache/

Управление временем жизни объектов: почему это важно и почему для этого пришлось создать новый язык «Аргентум»

Хабрастатья

Анонс части 7.Бастарды или же диалекты С и C++

Комментарии (30)


  1. bentall
    24.12.2025 22:56

    Eiffel Studio разве не под двойной лицензией распространяется gpl для opensource, коммерческая для всего остального?

    Вроде все исходники доступны через SVN на Eiffel.com и официальное зеркало на GitHub. На сайтах eiffel.com и eiffel.org я что-то не нашёл, чтобы это было написано, хотя текст gpl можно найти и там, и там, но если заходить со стороны GitHub...


    1. bentall
      24.12.2025 22:56

      В общем если кому-то интересно, вот исходный код, публикуется с годовой задержкой, вот описано двойное лицензирование на оф. сайте...

      Да и полностью открытый под MIT License Gobo Eiffel выпускает релизы по 2-3 раза в год, другое дело что собственно компилятор там не реализует стандарт полностью, и они как один из вариантов предлагают использовать компилятор от Eiffel Studio и их библиотеки (под не вирусной лицензией) и пишут что они какую то часть инструментов языка ZIG для своего релиза позаимствовали.


      1. bentall
        24.12.2025 22:56

        Ну и да, Liberty Eiffel до прошлогоднего релиза, в который вошли результаты GSoC, действительно не релизился несколько лет, но это третья из открытых реализаций языка, как и GOBO, под лицензией MIT (даром что это официальный проект GNU) ну и нет, это не фронтенд GCC, как и собственный компилятор GOBO генерирует си-код


        1. Siemargl Автор
          24.12.2025 22:56

          Eiffel интересен, но сейчас начинать писать на нем мало кто будет.

          Почему он не получил развития, непонятно.


  1. Stolentine
    24.12.2025 22:56

    какой смысл в новых языках, если любой джун с gpt на перевес, сейчас способен худо бедно что-то реализовать на любом языке?

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

    можно конечно это оспорить, но какая разница сколько строк занимает синтаксис если он сгенерирован машиной?


    1. Stolentine
      24.12.2025 22:56

      комментарий удален


    1. BobovorTheCommentBeast
      24.12.2025 22:56

      Да нахрен вообще развиваться, это какие то лудиты придумали. Ллм скажу, пусть она сделает.


  1. IUIUIUIUIUIUIUI
    24.12.2025 22:56

    Языки функциональной парадигмы (ФП)

    • Haskell Tiobe 30

    • Erlang Tiobe 100

    • Elixir Tiobe 47

    • Ocaml Tiobe 100

    Практически не распространены в реальном, а не академическом мире разработки

    Не то что «лидер» Dlang или «заматеревший и достойный разбора» Zig, понимаю.


  1. wmlab
    24.12.2025 22:56

    Go и C# - языки энтерпрайзного говнокодинга

    Это точно серьезный разбор языков?


    1. cheshirskins
      24.12.2025 22:56

      Да, очень странно, дело даже не в упоминании говнокодинга, а в том, что концептуально это сильно разные языки


      1. Siemargl Автор
        24.12.2025 22:56

        Концепции разные, область применения - одна.

        На Шарпе ещё встречаются какие то утилиты, но нечасто.


        1. VadimContentHunter
          24.12.2025 22:56

          Так на шарпе делают десктоп игры сайты, могут серверную часть


        1. w5346c
          24.12.2025 22:56

          Не фанат Go, но на нём написан Kubernetes и инфраструктура вокруг него (операторы, etc), что сейчас весьма востребовано. А ещё Terraform.


        1. Spearton
          24.12.2025 22:56

          Это прикол? Шарп буквально огромный кусок веба, довольно серьезный игрок на поле геймдева (минимум unity, cryengine и всякие godot/stripe), дак еще и единственный способ писать нативные UI под винду без боли (но это уже скорее для всех . NET языков применимо)..


          1. Siemargl Автор
            24.12.2025 22:56

            Подробнее рассматривался в части 3.

            Основная область применения, где он хорошо занял позиции это - энтерпрайз.

            Доля в обычном вебе на грани погрешности - 3%. Впрочем легаси Asp.Net они отдельно считают, ещё 4%

            Гемдев возможен, но в том же Юнити компилируется через С++.

            Лагающий нотепад не даст соврать про производительность Гуи =) Нативное УИ под винду это только Винформс.

            В общем применения ему много, но связаны с врожденными неудобствами


            1. IUIUIUIUIUIUIUI
              24.12.2025 22:56

              C#

              Лагающий нотепад не даст соврать про производительность Гуи =)

              Нативное УИ под винду это только Винформс.

              Вот это сейчас прикольно получилось. Кекспертно даже, я бы сказал.

              Winforms — это дотнетовская штука. Возможно, вы имели в виду WinAPI (или MFC, упаси ЛЛММ, или ATL/WTL какой).


              1. Siemargl Автор
                24.12.2025 22:56

                Конечно, винформс это дотнетовская обертка над вин32 апи контролами. Это называют нативными контролами.

                Другие либы на Шарпе, как например ВПФ, рисуют контролы сами.


    1. akhmelev
      24.12.2025 22:56

      Мы ж на хабре, вы чего?


    1. Siemargl Автор
      24.12.2025 22:56

      Серьёзный разбор был в предыдущих статьях, конкретнее в части 3


      1. w5346c
        24.12.2025 22:56

        Ещё бы оглавление частей со ссылками...


        1. Siemargl Автор
          24.12.2025 22:56

          В начале части 3 есть оглавление


  1. gedev
    24.12.2025 22:56

    Про V написано "В минусах надежности - не определен порядок при вызове функций" это что значит?


    1. Siemargl Автор
      24.12.2025 22:56

      add(procx(), fny()) - не определено явно, сначала будет вычислено procx() или fny() перед передачей в add()

      Пример эксплуатации проблемы f(x++, x)

      Возможно, будет определено позже, есть пара issue на эту тему. В настоящий момент реализовано слева направо, но не задокументировано явное поведение в будущем


      1. iklin
        24.12.2025 22:56

        Насколько я помню, в C это тоже не определено.


        1. Siemargl Автор
          24.12.2025 22:56

          И в С++ тоже, из соображений производительности.

          В V закрыли тему задокументировав аналогичное поведение.


      1. v_0ver
        24.12.2025 22:56

        По мотивам вашей сводной таблицы
        В Rust порядок вычисленя аргументов слева на право. Ваш пример f(x++, x) в Rust либо не валиден если x ссылка (невозможно единовременно иметь мутабельную и немутабельную или две мутабельные ссылки на одну переменную) или будет две копии, которые будут вычисляться слева на право, но потом в LLVM их порядок вычисление может быть оптимизирован(если не меняет наблюдаемое поведение программы).


        1. Siemargl Автор
          24.12.2025 22:56

          В этой ветке обсуждался Vlang.

          В Rust же порядок четко определен, такой проблемы нет. В своей таблице явно поправил, спс.

          Выглядит правда это так f({ x += 1; x }, x)


  1. AbitLogic
    24.12.2025 22:56

    Надёжность языков в embedded:

    1) Erlang/Elixir

    2) rust, fpc, vhdl, ada

    3) Си

    Чего вы тут обсуждаете вообще не ясно, вы работали в этом направлении как надёжность в embedded? Какое там нах-н C++, где даже непонятно сколько бит займет int по стандарту, убойный набор конструкторов и пойми что где вызовется в initialization list с такими скобками или с такими, у нас в надёжности принципы DRY, KISS, YAGNI, LL(1), только первому удовлетворяют плюсы, остальные мимо


    1. Siemargl Автор
      24.12.2025 22:56

      Речь не только и не столько про эмбеддед.

      Часть языков такого тега вообще не удостоена.

      Внимательнее надо, а не врываться С шашкой наголо =)

      Ну а С++ сложный, его надо учить, и надо смотреть в применении к своей платформе. И более менее все станет понятно.


      1. AbitLogic
        24.12.2025 22:56

        Что там учить? Если в языке есть приватное наследование, то скорее таких учеников нужно проверять на психическое здоровье