
Привет всем! Это Саша Пиманов, разработчик из МТС Диджитал. Сегодня хочу напомнить, что разработка — это не только Python, JavaScript, C++ или Java, и поговорить о не самых распространенных языках программирования. Некоторые из них предназначены для специфических задач, другие можно назвать улучшенной версией популярных языков программирования, а третьи созданы just for fun. Так что если вы как раз хотите изучить что-нибудь новое, забирайте пост в закладки. Поехали!
Zig — современная альтернатива C

Zig появился как ответ на давние проблемы языка C. Какие? Не самая очевидная семантика, сложности управления памятью и отсутствие встроенных механизмов для защиты от распространенных ошибок. Разработчик Zig Эндрю Келли обратил внимание на то, что программисты на C тратят значительное время на устранение багов. Таких ошибок можно было бы избежать, если бы язык работал более предсказуемо и сам контролировал возможные проблемы. Поэтому что? Келли создал свой ЯП.
В нем есть низкоуровневый контроль, который предлагает C, но устранены его скрытые ловушки. Например, в C можно случайно использовать неинициализированную переменную или забыть освободить выделенную память, а это приводит к утечкам. В Zig такие ошибки предотвращаются на этапе компиляции: компилятор строго следит за инициализацией переменных и корректным управлением памятью.
Zig, кроме прочих своих достоинств, — удобный инструмент для работы с существующим кодом на C и C++. Он поддерживает линковку с этими языками без необходимости писать обертки, а также может компилировать код C и C++ напрямую, используя свой компилятор. Соответственно, Zig без проблем интегрируется в уже существующие проекты. К тому же язык предоставляет встроенные возможности для сборки проектов, что устраняет необходимость в сторонних системах вроде CMake или Make. Полезно для небольших проектов или случаев, когда важны простота и минимализм.
Уделяется внимание тестированию: в язык встроена поддержка unit-тестов, что упрощает процесс разработки и повышает надежность кода.
Особенности и преимущества:
полностью совместим с C: можно вызывать C-функции и линковаться с его кодом;
нет скрытых аллокаций: программист сам управляет памятью;
нет стандартной библиотеки в привычном виде, так что можно писать минималистичные, независимые от платформы программы;
поддержка компиляции на другие архитектуры «из коробки».
Zig — хороший вариант для системного программирования, разработки операционных систем, компиляторов и низкоуровневых задач, где важны контроль, предсказуемость и производительность. Если хотите узнать больше о языке, тут есть обзор.
Crystal — почти как Ruby, но быстрее

У Ruby есть серьезная проблема — относительно низкая производительность по сравнению с более низкоуровневыми языками. Все дело в том, что Ruby как джаз: гибкий, свободный, но слегка хаотичный. Он интерпретируется на лету и позволяет менять типы данных как угодно, что делает его удобным, но не самым быстрым. Это узкое место ЯП в больших проектах, особенно в высоконагруженных сервисах. Crystal появился как попытка исправить этот недостаток, сохранив стиль Ruby, но ускорив его за счет компиляции в нативный код и статической типизации.
Главная идея Crystal — предложить разработчикам язык, который «выглядит как Ruby, но работает как C». Это значит, что код остается таким же читаемым и выразительным, но при этом компилируется в машинный код, давая значительный прирост скорости. Crystal использует LLVM для оптимизации. И это дает ему производительность, близкую к C, одновременно сохраняя достоинства Ruby.
Crystal также решает проблему неопределенностей, присущих Ruby. Там ошибки типа (TypeError) возникают только во время выполнения, что может приводить к неожиданным багам. В Crystal типы определяются на этапе компиляции, что делает код более надежным. При этом компилятор Crystal способен выводить типы автоматически, что уменьшает необходимость явно указывать их в коде. Правда, в сложных сценариях программисту все же может потребоваться явное указание типов.
Crystal задумывался как универсальный язык, который можно использовать как для веб-разработки, так и для написания CLI-инструментов и микросервисов. Правда, относительно небольшая экосистема и зависимость от компиляции могут ограничивать его использование по сравнению с Ruby. Тем не менее Crystal активно развивается, сообщество растет.
Особенности и преимущества:
статическая типизация с возможностью вывода типов (почти как в TypeScript);
компиляция в нативный код, а не интерпретация, что делает его значительно быстрее Ruby;
совместимость с C, можно напрямую использовать C-библиотеки;
горутинная модель конкурентности (фиберы), похожая на Go.
Crystal хорош для веб-разработки (есть фреймворк Amber), CLI-инструментов, микросервисов и любых задач, где хочется удобства Ruby, но с лучшей производительностью.
Nim — метапрограммирование и мощный компилятор

Если бы Python и C решили завести ребенка, то это был бы Nim. От Python он унаследовал читаемость и выразительность, а от C — скорость и контроль над ресурсами. Nim задумывался как язык, который дает разработчику максимум свободы: хочешь писать лаконично — пожалуйста, нужен низкоуровневый контроль — тоже без проблем.
Одна из главных фишек Nim — метапрограммирование. То есть ЯП позволяет создавать кастомные DSL (языки внутри ЯП), модифицировать код во время компиляции и гибко управлять типами. Это делает его настоящим «конструктором» для разработчиков, отличая от стандартных языков.
А еще Nim умеет компилироваться в C, C++ и JavaScript, что делает его универсальным инструментом. Можно писать на Nim, а затем получить быстрый C-код, совместимый практически с любой платформой. Поэтому его часто используют там, где нужна высокая производительность, но без сложностей C++.
Особенности и преимущества:
компиляция в C, C++ или JavaScript, что делает его универсальным;
шаблоны и макросы, позволяющие создавать собственные DSL (доменные языки);
высокая производительность, сравнимая с C и Rust;
автоматическое управление памятью, но без сборщика мусора (можно использовать разные стратегии).
Nim хорошо подходит для написания высокопроизводительных приложений, игр, утилит, а также встраиваемых систем. Благодаря своей кроссплатформенности и поддержке различных бэкендов ЯП может применяться для создания веб-приложений и работы с микроконтроллерами.
F# — мощь функционального программирования

Если C# — это швейцарский нож, который подходит для любой задачи, то F# — хирургический инструмент, заточенный для точных и сложных вычислений.
F# создан для тех, кто хочет писать чистый, лаконичный и предсказуемый код. В нем почти нет места багам, связанным с изменяемым состоянием, а вывод типов позволяет избежать кучи ненужных аннотаций. Код получается не только компактным, но и надежным.
Microsoft (именно эта корпорация разработала язык) задумывала F# как альтернативу C# для задач, где важны математическая точность и функциональный подход. И все получилось — сейчас язык стал популярен в банковской сфере, машинном обучении и научных проектах. Хотя F# не так широко распространен, как его старший брат C#, он нашел ценителей среди тех, кто ценит красоту кода и математическую строгость.
Особенности и преимущества:
функциональный стиль программирования, который минимизирует побочные эффекты;
совместимость с C# и .NET, можно использовать библиотеки экосистемы Microsoft;
вывод типов, что делает код лаконичным;
асинхронность и потоки данных встроены в язык.
F# широко используется в финансовых компаниях, где важны точность расчетов и предсказуемость кода, например для моделирования рисков, автоматической торговли и управления активами. В машинном обучении и аналитике данных F# помогает быстро работать с большими объемами данных благодаря краткому и удобному коду без лишних действий. Кроме того, его применяют в разработке сложных алгоритмов — это научные расчеты, прогнозирование и оптимизационные задачи, где важны работа с потоками данных и асинхронные вычисления.
Julia — быстрая математика для ученых

Julia появилась, когда разработчики поняли, что Python и R удобны для науки, но слишком медленны. Ученые, аналитики и инженеры постоянно сталкивались с одной проблемой: код писать легко, но работает он не так быстро, как хотелось бы. Можно, конечно, переписывать критически важные части на C или C++, но это не самое приятное занятие.
Разработчики Julia создали язык, который сочетает удобство Python и скорость компилируемых ЯП. Благодаря JIT-компиляции на базе LLVM Julia умеет исполнять код в разы быстрее интерпретируемых языков, не требуя при этом низкоуровневой оптимизации.
Язык дает возможность сделать научные вычисления, анализ данных и машинное обучение простыми, быстрыми и доступными, без использования сторонних языков для оптимизации. Так что Julia — отличный инструмент для исследователей, работающих с большими массивами данных, моделированием физических процессов и разработкой алгоритмов машинного обучения.
Особенности и преимущества:
JIT-компиляция (Just-In-Time) на основе LLVM делает ее быстрее Python;
легко интегрируется с Python, R и C;
отлично работает с многопоточностью и GPU-вычислениями;
богатая библиотека пакетов для машинного обучения и статистики.
Julia идеально подходит для научных исследований, анализа данных, AI, финансовых расчетов и любых задач, требующих мощных математических вычислений.
Что же, на сегодня все. В подборке показаны языки, которые могут стать вспомогательным инструментом в арсенале разработчика. Если вам нужен низкоуровневый, попробуйте Zig. Хотите писать красиво, но быстро — Crystal. Любите экспериментировать с метапрограммированием — Nim. Если вас привлекает функциональный стиль, изучите F#. А если занимаетесь наукой и анализом данных, то вас порадует Julia.
Что думаете? Пользовались этими языками? Может, есть еще что-то интересное, о чем стоит написать? Делитесь в комментариях!
Комментарии (33)
onuchin
17.02.2025 09:52Юлечка на HEPесах с бриллиантами.
https://hepsoftwarefoundation.org/activities/juliahep.html
https://github.com/JuliaHEP/ROOT.jl
Были бы у нее яйца так бы маханул по ним с плеча бритвой Оккама!
profFortran
17.02.2025 09:52Думаю, что ценность этой статьи стремиться к нулю. Нет, не пользуюсь. Вместо Джулии взял бы Фортран. Вместо F# - OCaml. Остальные вообще непонятно зачем нужны.
nin-jin
17.02.2025 09:52D:
-
Functions
-
Arrays
-
OOP
Single inheritance of implementation/multiple inheritance of interfaces
No built-in dynamic class loading
-
Performance
Direct access to hardware
Independent of VM
Direct native code gen
-
Generic Programming
-
Metaprogramming
-
Reliability
-
Concurrency & Parallelism
-
Types
-
Compatibility
C-like syntax
Use existing debuggers
Generates standard object files
-
Other
kipar
17.02.2025 09:52Мне нравился D в свое время, но в итоге я пришел к выводу что он для меня слишком низкоуровневый. Для любой мелочи типа "удалить элемент из массива по значению" или "взять из массива случайный элемент" идешь в гугл и выясняешь что надо написать свой хелпер, потому что в стдлибе такой функции нет. А в руби (а потом и кристалле) чаще бывало наоборот - пишешь или собираешься писать свой хелпер (например чтобы из массива сделать хеш значение->число элементов), а потом узнаешь что ахаха, оказывается в стдлибе даже такое уже есть (tally).
nin-jin
17.02.2025 09:52kipar
17.02.2025 09:52Первая ссылка это удаление по предикату. А мне не нужно по предикату - мне нужно удалить первое вхождение элемента. Есть там возможность сделать break из лямбды?
Во второй ссылке смущает разве что
version (D_LP64) // https://issues.dlang.org/show_bug.cgi?id=15147
nin-jin
17.02.2025 09:52Ну, да, там нужно написать короткий хелпер из
find+remove+popBack
. Маленькая какуля посреди большого прекрасного сада.kipar
17.02.2025 09:52вот из-за таких какуль я пришел к выводу что трачу больше времени на проблемы языка чем на творчество. В руби написал и понеслась (кристалл, честно говоря, занимает промежуточное положение - разбираться с проблемами тоже надо, но общее ощущение все-таки ближе к руби),а тут напиши хелпер, разберись с ошибкой шаблона, багом линкера, неожиданным поведением alias this. Не спорю что намного лучше чем в C/C++, но все еще далеко от идеального языка. Конечно это личный опыт - у кого-то иначе, кому-то D идеален, кому-то вообще С топ.
Если что, самое большое что я писал на D было https://sourceforge.net/projects/gatewayrl/
nin-jin
17.02.2025 09:52А в руби уже завезли статическую типизацию или это до сих пор язык для персональных домашних страничек, на котором час пишешь, потом неделю дебажишь?
kipar
17.02.2025 09:52иронично но это было и моей главной претензией к руби. что медленный и динамически типизированный. Так что я не мог поверить своим глазам когда увидел https://crystal-lang.org/
nin-jin
17.02.2025 09:52Это уже другое дело, конечно. Но они слишком уж много всего засунули в стандартную библиотеку: от http сервера, до библиотеки тестирования. И первое же, что хочется с ними сделать - выпилить и заменить на что-то более адекватное.
kipar
17.02.2025 09:52Из любопытства - что именно в них показалось неадекватным? Потому что конкретно реализация тестирования в Кристалле (скопированная из rspec ruby) сделала меня сторонником TDD. Потому что способ который я видел до нее в Delphi и D (писать тесты в тех же файлах что и реализацию) делал код нечитаемым.
А HTTP сервер - в techempower benchmarks он правда раза в 2 отстает от лидеров, но раза в 2 обгоняет vibe.d, высокоуровневые вещи типа роутинга конечно надо делать самому (или брать любую из библиотек\фреймворков), но то что низкоуровневую часть сделали частью стдлибы и не надо парится о кроссплатформенности мне нравится.nin-jin
17.02.2025 09:52Карго-культ с подражанием BDD и запуском тестов в недетерминиированном порядке, вместо лаконичных тестовых блоков в D с запуском тестов в порядке, соответствующем коду.
Ну а если для сервера всё равно приходится искать сторонний высокоуровневый фреймворк (или пилить его самому), то какая разница есть ли в стандартной библиотеке какая-то низкоуровневая апишка? На самом деле идеальная стандартная библиотека должна быть не более чем набором алиасов на лучшие решения от сообщества, а не форсировать этому сообществу использование сомнительных решений из других языков.
denaspireone
17.02.2025 09:52При этом всем я видел только один пример использования - https://github.com/gnunn1/tilix, и больше ничего, увы =)
nin-jin
17.02.2025 09:52Зачем разбираться, если можно глупо улыбаться, да? https://dlang.org/orgs-using-d.html
denaspireone
17.02.2025 09:52из всего списка я видел только weka, все остальное прошло мимо меня, как и мимо многих кто использует D, и как я увидел из списка применения по ссылке то оч много кто таи просто для рекламы, даже нету case stadies, а банально указали его использование и не более
nin-jin
17.02.2025 09:52Почти у всех есть либо ссылка на гитхаб, либо на выступление на конференции. А вы что тут пытаетесь публично самому себе доказать? Что он не достоин вашего внимания? Ну не хотите и не хотите. Всем плевать. Чушь только не несите в интернет, на нём ведь обучают нейросети.
bezdnacom
17.02.2025 09:52Может я ошибаюсь, но от вас копиумом прям несет за две версты, судя по тому как вы тут со всеми разговариваете
Gay_Lussak
Насчет Julia мысль не раскрыта. Мне лично не понятно, почему вдруг Python медленее C или С++ в контексте математических вычислений, если для этого используются numpy и scipy, которые по факту просто обертки над сишными функциями. И чем Julia в данном случае принципиально лучше?