[recovery mode] Pony — убийца...?
Всем известны такие прогрессивные новички в программировании, как — «Go, Rust, Nim, Crystal» и, все они очень круты в своих определенных областях.
К примеру:
- Go был рожден, как супер простой и промышленный язык для быстрого решения поставленных задач с идеями, которые всем прекрасны известны, но некоторые из них прибиты к другим языкам гвоздями (На 5мм).
- Второй наш оппонент — это Rust, победитель по жизни, но из-за своей сложной жизни в развитии он стал для сообщества, как будущая и модная замена C++. Для меня его судьба пока не понятна, так как с зелеными потоками и IO под них там пока туго, то я его ставлю на место в ряд с C для микроконтроллеров, драйверов и операционных систем.
- Crystal… Прямо и четко говорю, что это супер производительный клон Ruby. Больше сказать нечего, весь он пропитан его духом.
- Nim (Он же Нимушка или Нимрод) и его похожесть на скриптовые языки создают ему особую атмосферу, однако внутри он достаточно сложный организм и для меня сия сущность, как Haxe с такими же ощущениями при программировании на нем.
А Pony — это моя любимая и маленькая поняшка. С виду и по названию языка можно лихо пройти мимо… В общем, приглашаю вас под капот статьи.
Это только начало
Предварительно расскажу немного о себе, чтобы создать вам особую атмосферу для понимания языка и его возможных применений.
- Я — Nyarum, известен, как простой пользователь языка Go. Часто задвигаю иронию с Растом и являюсь соавтором Slack сообщества гоферов.
- Мои петпрожекты всегда связаны с эмулированием онлайн игр. От реверса до воспроизведения серверной части.
- И я очень люблю Аниме.
Теперь вы знаете все мои секреты, можно и продолжить нашу интересную историю в мир прекрасного Pony.
Язык и краткий ликбез
Это тот самый жизнерадостный кормилец и он больше похож на кролика
Pony — объектно-ориентированный язык программирования, построенный в первую очередь на модели акторов и прозрачной конкурентности. В его дополнительных плюсах трутся такие понятия, как — «Open-source, производительность, интересные идеи». Основной упор идет на многоядерный системы, современную разработку без мыслей о низком уровне и очень производительную конкурентность.
Возможности
- Типобезопасность. Подтвержденная математическим бекграундом.
- Безопасная работа с памятью. Хоть это и является следствием из типобезопасности, но нельзя упускать данный пункт. В нем вы не найдете повисших указателей, переполнение буффера или в самом частом случае — вам не придется знать, что такое null.
- Безопасная работа с экзепшенами. Все они определяются на семантическом уровне и никаких рантайм неожиданностей.
- Скажем нет гонкам данных! Никаких атомиков, мьютексов или таймеров. Система типов с проверками во время компиляции дают высокую гарантию сего понятия. Пишите конкурентный код и не переживайте за остальное.
- Никаких дедлоков. Следствие из отсутствия любых операций с блокировками.
Краткая спецификация по языку
Система типов:
- Класс, стандартен из ООП мира. Поля, конструкторы и функции в вашем распоряжении.
class Habra let _name: String new create(name': String) => _name = name' fun name(): String => _name
- Актор, идентичен классу, но имеет возможности определения ассинхронных функций. Это относится к прозрачной конкурентности.
actor Habro let name: String var _hunger_level: U64 = 0 new create(name': String) => name = name' be eat(amount: U64) => _hunger_level = _hunger_level - amount.min(_hunger_level)
- Примитив, тоже идентичен классу с 2-я различиями. Он не может иметь полей и в процессе работы программы создается только 1 инстанс на определенный вами примитив. Используется для многих вещей, но чаще, как особый вид дженерика с возможностью в None тип, чтобы проверять приходящие из FFI мира значения, не равняется ли оно пустоте.
primitive _Habras
- Трейт и интерфейс (Являются подтипами, однако определяются так же, как и класс). Многие ЯП имеют только 1 из них одновременно, но в Пони они задействованы оба. Различие в том, что трейт является условной проверкой принадлежности, а интерфейс проверяет соответствие структурно.
// Trait trait Family fun age(): U64 => 5 class Habravi is Family // Interface interface Habrovik fun name(): String class Habrovichek fun name(): String => "Model #1"
- Алиасы для типов. Не буду говорить тут про них много, мощная система и требует самостоятельного изучения.
// Enumeration primitive Red primitive Blue primitive Green type Colour is (Red | Blue | Green) // Complex interface HasName fun name(): String interface HasAge fun age(): U32 interface HasAddress fun address(): String type Person is (HasName & HasAge & HasAddress)
- Кортеж есть последовательность типов, которые могут быть определены в одной переменной.
var x: (String, U64) x = ("hi", 3)
- Юнион очень похож на кортеж, только используется для обобщения возможных типов. Особый вид дженерика.
var x: (String | U64) x = "hello habr" // or x = 5
- Пересечение почти является противоположностью юниона и может описывать одно значение для нескольких типов одновременно. В примере ниже видно, как карта может содержать одновременно ключ двух разных типов.
type Map[K: (Hashable box & Comparable[K] box), V] is HashMap[K, V, HashEq[K]]
- Все выше описанные выражения типов могут комбинироваться
// Tuple in Union which in Array var _array: Array[((K, V) | _MapEmpty | _MapDeleted)]
Стандартные выражения:
- Это всем очень хорошо знакомые — «Переменные, знаки операций, проверки, циклы, методы, экзепшены, etc..». Оставляю на самостоятельное изучение.
Возможности:
Привлекательность языка
Сборщик мусора
На борту мы имеем очень крутой GC, который является полностью конкурентным и не имеет Stop the World. На самом деле там их 2, один является сборщиком ссылок для каждого созданного актора и один глобальный.Скорость акторов
Благодаря такому парню, как Дима Вьюков, который внес огромный вклад в lock-free алгоритмы и Go — появилась база, на которую делал упор Pony при разработке общения акторов. И именно поэтому сейчас скорость передачи между акторами достигает 20кк в секунду, а создание может достигать 1кк в секунду.Прозрачная конкурентность
Это понятие дал я сам и был удивлен, когда для того, чтобы сделать код конкурентным — нам потребуется всего лишь поменять название функции. Этот способ еще более современней, чем предоставил Go со своими горутинами.Пейперы
Статус и дополнительные ссылки
Язык находится в статусе далекой беты, сейчас версия языка 0.2.1. Разработчики на данный момент заканчивают остальные планируемые фичи, исправляют баги и стабилизируют язык. Плагины есть почти под все популярные редакторы.
Благодарен, что вы прочли статью и возможно заинтересовались языком.