Как стать автором
Обновить

Язык Odin — прагматичная альтернатива C с привкусом Go

Время на прочтение6 мин
Количество просмотров2.6K
Автор оригинала: Bitshifters

Odin — это универсальный язык для системного программирования, придуманный Биллом Холлом aka «gingerBill». Odin задумывался как современная альтернатива C, и в нём делается акцент на простоте, производительности и удобочитаемости, но при этом не упускается контроль над низкоуровневыми деталями.

На сайте об этом языке Odin охарактеризован как «ориентированный на данные», именно поэтому в нём присутствуют, например, структуры массивов (SOA) и неявная инициализация значения в ноль. Удивительно, что, несмотря на такие приоритеты, в языке есть динамические словари и массивы, встроенные в сам язык. Притом, что памятью всё-таки приходится управлять вручную, такие встроенные вещи встречаются нечасто.

Возможно, вот те самые черты, придающие Odin собственный облик: язык задуман как эргономичный, такой, на котором удобно писать, и поэтому многое предоставляет «из коробки». Также в Odin предусмотрен «вендор», в котором содержатся привязки к разнообразным популярным библиотекам. Поэтому вкатываться в язык очень просто.

Какова философия Odin

Odin заточен на практичные решения реальных задач, встречающихся в программировании — иными словами, прагматизм в нём более выражен, чем идеализм (вернёмся к этому ниже, когда затронем Zig). Odin не вводит сложные фичи, а максимально стремится к чистому удобочитаемому коду, о котором было бы легко судить. В этом он диаметрально противоположен Zig, в котором на полную мощность применяется метапрограммирование.

Кроме того, в Odin принят довольно старомодный подход к типам. Сегодня прослеживается тенденция к нарастающему усложнению языков программирования, так, чтобы всё больше сущностей можно было выразить в типах самого языка. Odin, напротив, напоминает старые языки, где процветали встроенные типы. Поэтому в Odin предлагаются не только вышеупомянутые хеш-таблицы и динамические массивы, но и числовые типы: комплексные числа, векторы, матрицы и даже кватернионы. Благодаря этому удаётся в значительной степени отказаться от перегрузки операторов. Неслучайно, что EmberGen – флагманское приложение, демонстрирующее возможности Odin — это инструмент с широкими математическими и графическими возможностями.

Быстрое знакомство с синтаксисом

С точки зрения начинающего, синтаксис Odin достаточно прост. Язык не докучает вам лишними напоминаниями об изменяемости или константности, просто всё работает так, как и ожидалось.

Объявления, в свою очередь, сделаны во многом по образцу Jai и минимальны. Отчасти Odin всё-таки поддаётся современной моде и убирает традиционный знак;.

Код, который получается на Odin, может прочитать с листа любой программист, привыкший работать с C или другими низкоуровневыми языками. Вот короткая программа «передвижения точки по экрану» с применением Raylib:

package test

import rl "vendor:raylib"

main :: proc() 
{
    rl.InitWindow(1280, 720, "Testing")
    pos : rl.Vector2 = { 640, 320 }
		
    for !rl.WindowShouldClose() {
        rl.BeginDrawing()
        rl.ClearBackground(rl.BLUE)
        rl.DrawRectangleV(pos, {32, 32}, rl.GREEN)
        
        if rl.IsKeyDown(.LEFT) {
            pos.x -= 400 * rl.GetFrameTime()
        }
        if rl.IsKeyDown(.RIGHT) {
            pos.x += 400 * rl.GetFrameTime()
        }
        if rl.IsKeyDown(.UP) {
            pos.y -= 400 * rl.GetFrameTime()
        }
        if rl.IsKeyDown(.DOWN) {
            pos.y += 400 * rl.GetFrameTime()
        }
        rl.EndDrawing()
    }
    rl.CloseWindow()
}

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

Такой консервативный подход из Odin встретил широкий отклик. Например, Дейл Уайлер из JangaFX стал одним из первых использовать Odin в работе. Вот как он высказался об этом в своём блоге:

Odin – это язык для системного программирования, спроектированный гораздо более консервативно, чем другие новые языки его поколения, например, Rust, Zig и Carbon. Идеология, заложенная в Odin — предоставить так назревшие улучшения, которых не хватает в системных языках, сегодня выступающих в качестве лингва-франка, например, в C. Но при этом остаться не сложнее C.

Очевидно, что Odin это удалось: он кажется знакомым, пусть даже синтаксически значительно отличается от C.

Обработка ошибок

Самая небесспорная вещь в Odin — это, пожалуй, выбранная в нём стратегия обработки ошибок. Обработка выполняется через множественные возвраты, в стиле Go. Притом, что Odin гораздо эргономичнее, так как в нём есть or_else и or_return, по сравнению с другими решениями такой подход может казаться неуклюжим.

У меня сложилось впечатление, что это решение неидеально. Кажется, что эту штуку все критикуют. С другой стороны, такая концептуальная простота согласуется с общей прямолинейностью Odin, его фирменной чертой.

Когда программировать приятно

Odin роднит с Jai девиз «joy of programming» (радость программирования), но в Odin это не просто слова. Как высказался один пользователь:

С Odin я вспомнил, как же приятно бывает программировать. Встроенная проверка границ, срезы, выраженная типизация, никакого неопределённого поведения, согласованная семантика в разных режимах оптимизации, минимальные неявные преобразования типов, система контекстов и прямо в стандартной библиотеке — аллокатор, отслеживающий выделение памяти. Всё это в совокупности помогает устранить большинство багов с памятью, с которыми я справлялся в C/C++ только при помощи санитайзеров

А вот ещё одно мнение:

[…] перейти с C на Odin было довольно приятно и, кстати, очень легко. Эти языки довольно похожи, но самые болезненные места в Odin устранены. Odin лучше помогает сосредоточиться на задаче, а не гадать в очередной раз, почему какая-то функция стала чудить

Если просто взять этот язык «погонять» — убеждаешься, что он на вашей стороне и делает именно то, что вы имели в виду. В сущности, это просто приятный в использовании доступный язык.

Сравнение с другими языками

Jai

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

Тогда как на синтаксическом уровне Odin определённо вдохновлён Jai, два этих языка развивались очень по-разному. Джонатан Блоу, автор Jai, в одном видео сказал, что язык получился гораздо более сложным, чем планировалось.

Odin, в свою очередь, определённо прост в изучении и использовании.

Zig

Как Odin, так и Zig призваны модернизировать системное программирование, но их философия явно расходится. В Zig предлагаются обширные возможности метапрограммирования во время компиляции (хотя, в этом отношении ему далеко до Jai), тогда как в Odin сохраняется лишь необходимый минимум функций, необходимых для условной компиляции.

В Odin, как и в Jai, есть рефлексия во время выполнения. В Zig же рефлексия в основном происходит во время компиляции. На практике это выражается в следующем: Zig сильно полагается на метапрограммирование, чтобы, например, выполнять сериализацию через инспектирование типов. В Odin же это можно сделать во время выполнения, поэтому понимать код в разы проще.

Наиболее сильно эти языки отличаются применительно к опыту программиста.  Odin стремится к простоте, так, чтобы программировать на нём было весело и приятно. Его синтаксис прямолинейный и незамысловатый.

Zig, в свою очередь, не сильно расположен к лёгкому восприятию; его выразительность достигается за счёт многословия, а не через удобные абстракции.

Вот как об этих отличиях высказался разработчик:

Zig очень многословен… Odin по сравнению с ним очень лаконичен, хотя, в принципе, не менее информативен

Критика

Притом, что Odin уже довольно давно используется в реальных проектах, его официальная документация остаётся поверхностной, и в ней не хватает примеров. Кроме того, основная дискуссионная платформа его сообщества расположена в Discord, который доступен не для всех.

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

Например, как в Zig, так и в Jai структуры массивов поддерживаются через метапрограммирование, а в Odin эта возможность встроена прямо в язык.

Заключение

Odin — отличный вариант для тех разработчиков, которым интересно попробовать современный, эффективный и удобочитаемый язык для системного программирования. Он успешно зарекомендовал себя в приложениях для интенсивной обработки графики, например, в EmberGen, как надёжный и высокопроизводительный. Притом, что Odin есть куда расти — особенно это касается качества документации и доступности сообщества — сам язык спроектирован прагматично и удобен для разработчика. Поэтому он стал достойной альтернативой C в области современного системного программирования.

Теги:
Хабы:
+3
Комментарии13

Публикации

Работа

Программист С
33 вакансии

Ближайшие события