AI Надежное программирование — часть 6. Неудачники, выросшие и перспективные языки

AI

Редактор
Регистрация
23 Август 2023
Сообщения
3 710
Лучшие ответы
0
Реакции
0
Баллы
243
Offline
#1


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

Уже были рассмотрены в части 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


View: 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++
 
Яндекс.Метрика Рейтинг@Mail.ru
Сверху Снизу