В современном мире программирования появляются все новые инструменты и языки, позволяющие разработчикам работать быстро, эффективно и безопасно. Одним из интересных проектов, который заслуживает внимания, является AGL — экспериментальный язык программирования, который компилируется в Go. Он был создан с целью предложить более простой и удобный синтаксис при сохранении преимуществ самой Go, включая высокую производительность и богатую стандартную библиотеку. AGL, расшифровывающийся как AnotherGoLang, можно назвать языком „игрушкой“, однако его потенциал значительно шире. Он во многом повторяет синтаксис Go, поскольку парсер и лексер созданы на его основе, но при этом вводит ряд нововведений, повышающих удобство и выразительность кода.
Одной из ключевых особенностей AGL является изменение принципа возврата значений из функций. В традиционном Go функции могут возвращать несколько значений, чаще всего — основной результат и ошибку. В AGL же функции возвращают только одно значение, но при этом поддерживаются специальные типы-обертки Option[T] и Result[T]. Такие типы позволяют работать с вариантами возврата «удачного результата» или «ошибки» внутри самого типа, что упрощает чтение и обработку ошибок. Для удобства работы с несколькими значениями в AGL введен тип Tuple — кортеж, позволяющий составлять сложные возвращаемые значения, например Result[(u8, string, bool)].
Это новшество обеспечивает гибкость, сохраняя при этом простоту интерфейса. AGL также ориентирован на использование в качестве скриптового языка. Поддержка «шебанга» позволяет запускать файлы AGL прямо из консоли без дополнительной компиляции, что существенно упрощает его применение в сценариях быстрой автоматизации или прототипировании. В языке сделан акцент на безопасность и лаконичность кода. Переменные и структуры по умолчанию являются неизменяемыми, что помогает избежать ошибок случайного изменения состояния.
Такой подход стимулирует разработчика явно указывать, когда объекты должны быть изменяемыми. Одним из наиболее привлекательных и уникальных нововведений AGL являются операторы автоматической передачи ошибок. Символы ? и ! используются для распространения ошибок или отсутствующих значений, что делает код намного чище и позволяет избавиться от классических проверок ошибки после каждой операции. Это решает типичную для Go задачу обширного использования конструкции if err != nil и упрощает развитие программ с каскадом вызовов функций, возвращающих результат с ошибкой. Поддержка оператора сопоставления с образцом (match) расширяет возможности работы с результатами типов Option и Result.
Через конструкцию match можно удобно реализовать ветвления по разным вариантам возвращаемых значений, что делает код больше декларативным и максимально близким к функциональным языкам программирования. AGL позволяет писать анонимные функции в кратком виде с использованием специального долларового синтаксиса для обращения к параметрам ($0, $1 и т. д.). Это существенно уменьшает объем кода при работе с методами обработки коллекций, таких как Filter, Map, Reduce или Sum, встроенными непосредственно в стандартный набор инструментов языка.
Благодаря этому пользоваться высокоуровневыми функциями для работы с данными становится очень просто и удобно. Еще одна интересная особенность языка — возможность расширять встроенные типы, включая слайсы, с помощью добавления методов. Это позволяет создавать собственные полезные методы, например метод фильтрации четных чисел для вектора, что значительно упрощает работу с коллекциями и повышает выразительность кода. Разработчики AGL не забыли и про интеграцию с существующей эко-системой Go. Можно использовать любые библиотеки Go, импортируя их через пространство имен agl1.
Это позволяет легко расширять функциональность проектов, используя богатые возможности стандартной и сторонних библиотек, сохраняя при этом преимущества нового синтаксиса AGL. Такой подход снижает порог вхождения для разработчиков Go, которые хотят опробовать AGL, а также упрощает переход между языками. Можно создавать компоненты на AGL, которые после компиляции превращаются в привычный Go-код, что обеспечивает максимальную совместимость и гибкость. Еще среди функциональных возможностей стоит выделить богатые средства работы с перечислениями (enum) и структурами, а также поддержку деструктуризации. Это дает возможность легко распаковывать сложные значения и писать более читаемый код.
Циклы в AGL имеют расширенный синтаксис, позволяя использовать привычные диапазоны и коллекции, а также ключевые слова for in с очень удобной семантикой. Также существует поддержка специальных операторов or_break и or_continue, которые позволяют прерывать циклы при возникновении None или Err, что отлично вписывается в концепцию автоматического распространения ошибок. AGL имеет поддержку расширенной системы типов, включая числовые подтипы (int, i8, i16, i32, i64, uint, u8, u16, u32, u64, f32, f64), что позволяет точнее контролировать поведение программ и оптимизировать использование памяти. Немаловажным дополнением является наличие расширения для VSCode и реализации Language Server Protocol. Такой комплект инструментов делает язык удобным для ежедневного использования, предоставляя подсветку синтаксиса, автодополнение, быстрый поиск и навигацию по коду, а также рефакторинг.
Проект AGL активно развивается и поддерживается сообществом через Discord, где разработчики и пользователи могут обсуждать идеи, помогать друг другу и вносить предложения по улучшению. Благодаря открытому исходному коду и лицензии MIT любой желающий может внести свой вклад или использовать язык для собственных проектов. AGL может быть интересен разработчикам, желающим использовать мощь и стабильность Go, одновременно получая некоторые удобства для разработки, которые присущи более современным языкам. Его особенности по облегчению обработки ошибок, лаконичности синтаксиса и удобству работы с коллекциями делают его отличным инструментом для быстрого прототипирования, написания скриптов и создания чистого кодового базиса. Использование AGL может помочь лучше понять возможные направления развития языка Go и стать мостиком между классическими подходами разработки и новыми концепциями, вдохновленными более функциональными языками.
Подводя итог, AGL – это не просто игрушка, а зрелая идея нового подхода к программированию на базе знакомого и популярного Go. Его способность компилироваться в Go-код, поддержка современных языковых концепций, встроенная обработка ошибок и удобный синтаксис делают его достойным вниманием проектом, который может найти свое место в арсенале программиста.