Привет всем! Это Саша Пиманов, разработчик из МТС Диджитал. Сегодня хочу напомнить, что разработка — это не только 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)


  1. Gay_Lussak
    17.02.2025 09:52

    Насчет Julia мысль не раскрыта. Мне лично не понятно, почему вдруг Python медленее C или С++ в контексте математических вычислений, если для этого используются numpy и scipy, которые по факту просто обертки над сишными функциями. И чем Julia в данном случае принципиально лучше?


  1. DmitryKoterov
    17.02.2025 09:52

    Rust абыдэлса на эту статью.


  1. onuchin
    17.02.2025 09:52

    Юлечка на HEPесах с бриллиантами.

    https://hepsoftwarefoundation.org/activities/juliahep.html

    https://github.com/JuliaHEP/ROOT.jl

    Были бы у нее яйца так бы маханул по ним с плеча бритвой Оккама!


  1. profFortran
    17.02.2025 09:52

    Думаю, что ценность этой статьи стремиться к нулю. Нет, не пользуюсь. Вместо Джулии взял бы Фортран. Вместо F# - OCaml. Остальные вообще непонятно зачем нужны.


  1. nin-jin
    17.02.2025 09:52

    D:


    1. kipar
      17.02.2025 09:52

      Мне нравился D в свое время, но в итоге я пришел к выводу что он для меня слишком низкоуровневый. Для любой мелочи типа "удалить элемент из массива по значению" или "взять из массива случайный элемент" идешь в гугл и выясняешь что надо написать свой хелпер, потому что в стдлибе такой функции нет. А в руби (а потом и кристалле) чаще бывало наоборот - пишешь или собираешься писать свой хелпер (например чтобы из массива сделать хеш значение->число элементов), а потом узнаешь что ахаха, оказывается в стдлибе даже такое уже есть (tally).


      1. nin-jin
        17.02.2025 09:52

        1. kipar
          17.02.2025 09:52

          Первая ссылка это удаление по предикату. А мне не нужно по предикату - мне нужно удалить первое вхождение элемента. Есть там возможность сделать break из лямбды?

          Во второй ссылке смущает разве что
          version (D_LP64) // https://issues.dlang.org/show_bug.cgi?id=15147


          1. nin-jin
            17.02.2025 09:52

            Ну, да, там нужно написать короткий хелпер из find+remove+popBack. Маленькая какуля посреди большого прекрасного сада.


            1. kipar
              17.02.2025 09:52

              вот из-за таких какуль я пришел к выводу что трачу больше времени на проблемы языка чем на творчество. В руби написал и понеслась (кристалл, честно говоря, занимает промежуточное положение - разбираться с проблемами тоже надо, но общее ощущение все-таки ближе к руби),а тут напиши хелпер, разберись с ошибкой шаблона, багом линкера, неожиданным поведением alias this. Не спорю что намного лучше чем в C/C++, но все еще далеко от идеального языка. Конечно это личный опыт - у кого-то иначе, кому-то D идеален, кому-то вообще С топ.

              Если что, самое большое что я писал на D было https://sourceforge.net/projects/gatewayrl/


              1. nin-jin
                17.02.2025 09:52

                А в руби уже завезли статическую типизацию или это до сих пор язык для персональных домашних страничек, на котором час пишешь, потом неделю дебажишь?


                1. kipar
                  17.02.2025 09:52

                  иронично но это было и моей главной претензией к руби. что медленный и динамически типизированный. Так что я не мог поверить своим глазам когда увидел https://crystal-lang.org/


                  1. nin-jin
                    17.02.2025 09:52

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


                    1. kipar
                      17.02.2025 09:52

                      Из любопытства - что именно в них показалось неадекватным? Потому что конкретно реализация тестирования в Кристалле (скопированная из rspec ruby) сделала меня сторонником TDD. Потому что способ который я видел до нее в Delphi и D (писать тесты в тех же файлах что и реализацию) делал код нечитаемым.
                      А HTTP сервер - в techempower benchmarks он правда раза в 2 отстает от лидеров, но раза в 2 обгоняет vibe.d, высокоуровневые вещи типа роутинга конечно надо делать самому (или брать любую из библиотек\фреймворков), но то что низкоуровневую часть сделали частью стдлибы и не надо парится о кроссплатформенности мне нравится.


                      1. nin-jin
                        17.02.2025 09:52

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

                        Ну а если для сервера всё равно приходится искать сторонний высокоуровневый фреймворк (или пилить его самому), то какая разница есть ли в стандартной библиотеке какая-то низкоуровневая апишка? На самом деле идеальная стандартная библиотека должна быть не более чем набором алиасов на лучшие решения от сообщества, а не форсировать этому сообществу использование сомнительных решений из других языков.


    1. denaspireone
      17.02.2025 09:52

      При этом всем я видел только один пример использования - https://github.com/gnunn1/tilix, и больше ничего, увы =)


      1. nin-jin
        17.02.2025 09:52

        Зачем разбираться, если можно глупо улыбаться, да? https://dlang.org/orgs-using-d.html


        1. bezdnacom
          17.02.2025 09:52

          Для 20+лет существования этого языка как-то негусто честно говоря


          1. nin-jin
            17.02.2025 09:52

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


        1. denaspireone
          17.02.2025 09:52

          из всего списка я видел только weka, все остальное прошло мимо меня, как и мимо многих кто использует D, и как я увидел из списка применения по ссылке то оч много кто таи просто для рекламы, даже нету case stadies, а банально указали его использование и не более


          1. nin-jin
            17.02.2025 09:52

            Почти у всех есть либо ссылка на гитхаб, либо на выступление на конференции. А вы что тут пытаетесь публично самому себе доказать? Что он не достоин вашего внимания? Ну не хотите и не хотите. Всем плевать. Чушь только не несите в интернет, на нём ведь обучают нейросети.


            1. bezdnacom
              17.02.2025 09:52

              Может я ошибаюсь, но от вас копиумом прям несет за две версты, судя по тому как вы тут со всеми разговариваете


              1. denaspireone
                17.02.2025 09:52

                спасибо вам, я хотел ответить то же самое :)


                1. nin-jin
                  17.02.2025 09:52

                  Привычка думать чужим мозгом?


    1. Lodin
      17.02.2025 09:52

      Как там, допилили @nogc чтобы хотя бы половина стандартной библиотеки с ним работала, или он по-прежнему для галочки?


      1. nin-jin
        17.02.2025 09:52

        Там уже @live во всю пилят, а вы всё @nogc боитесь.