Zen - это язык программирования общего назначения, предназначенный для создания простых, надежных и эффективных программ.

Когда я говорю просто, надежно и эффективно, я имею в виду именно это. Синтаксис Дзен разработан так, чтобы быть понятным, а это означает, что код, который вы пишете, говорит сам за себя. Кроме того, архитектура среды выполнения предназначена для надежного и эффективного выполнения ваших программ, независимо от платформы. Вы можете разрабатывать приложения Zen практически в любой среде и развертывать их практически без потери производительности независимо от платформы.

На момент написания этой статьи Дзен находится в стадии разработки. Альфа-версия компилятора и виртуальной машины будут доступны в ближайшее время. Между тем, вы можете просмотреть исходный код.

Я решил создать свой собственный язык программирования, потому что интересовался проектированием компиляторов с 9-го класса. Кроме того, я не нашел ни одного существующего языка, который отвечал бы всем моим потребностям. В этой статье я объясню концепции, которые, как мне кажется, необходимы для динамически типизированного языка программирования, который является одновременно приятным и эффективным. Моя цель - не создать игрушечный язык, а создать полноценный язык программирования. Почему? Потому что я считаю, что создавать язык программирования, который всем нравится, - это круто.

Простой

Синтаксис Zen был намеренно разработан, чтобы ограничить количество способов достижения определенной задачи. Например, в отличие от других языков программирования с динамической типизацией, методы и атрибуты не могут быть введены в объект во время выполнения. Как программист Zen вы будете больше сосредотачиваться на логике своей программы, чем иметь дело с запутанным состоянием ваших объектов.

Количество токенов, необходимых для написания вашего кода, минимально. С учетом этого были удалены токены, такие как точки с запятой для завершения простых операторов, фигурные скобки для заключения блоков и т. д., распространенные в языках программирования C-подобных.

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

Для новичков и новичков дзен невероятно прост в изучении и использовании. Учитывая, что кривая обучения проста, вам не нужно быть экспертом, чтобы применять дзен в повседневной жизни. Zen автоматически позаботится о таких вещах, как сборка мусора и освобождение ресурсов.

Все еще не уверены, что Дзен прост? В таком случае, вот пример алгоритма бинарного поиска, написанного в Дзен:

function search(values, key)
    var start = 0
    var end = values.size - 1
    var result = null
    while start <= end
        var middle = (end - start) / 2
        if values[middle] == key
             result = middle
             break
        else if values[middle] > key
            end = middle - 1
        else
            end = middle + 1
    return result
function main(...arguments)
    var values = array(53, 118, 519, 1216)
    var result = search(values, 27)
    if result != null
        print('Found key 27 at index ' + result + '.')
    else
        print('Could not find key 27.')

Динамически набираемый

Дзен имеет динамическую типизацию, что помогает избежать написания кода поддержки. Однако он был разработан для обнаружения многих ошибок программирования во время компиляции, тогда как другие языки с динамической типизацией сообщают об этих ошибках во время выполнения. Это дает компилятору возможности для оптимизации. Таким образом, вы можете наслаждаться как повышенной эффективностью выполнения, так и удобством разработчика.

Фактически, я начал Zen с целью создать язык программирования, вдохновленный как Python, так и Java. Простой и понятный синтаксис Python был адаптирован для удобства разработчиков. Точно так же архитектура времени выполнения была вдохновлена ​​Java для повышения эффективности выполнения.

Гипотеза состоит в том, что с определенными ограничениями на язык могут быть достигнуты как продуктивность, так и эффективность. Ограничения, налагаемые языком, позволяют компилятору использовать статическую информацию, доступную в исходном коде. Например, в Дзэн атрибуты и методы нельзя динамически вводить в объекты. Кроме того, если статические методы не могут быть вызваны через объекты (например, C #), компилятор может выдать одну инструкцию для вызова статических функций. Точно так же, когда методы вызывают другие методы в том же классе, компилятор может просто выдать инструкцию для вызова целевого метода через таблицу виртуальных методов. Тот же метод можно применить к атрибутам. Вы понимаете, что я пытаюсь сказать?

Переносимость: напишите один раз, запустите где угодно

Программы, которые вы пишете в Zen, скомпилированы в байт-коды, закодированные в специальном двоичном формате, известном как Формат двоичных объектов (FEB). Когда вы запускаете свою программу, виртуальная машина интерпретирует эти байт-коды. Для каждой платформы требуется конкретная реализация виртуальной машины. Однако, как только реализация будет завершена, ваши программы могут беспрепятственно работать на виртуальной машине.

Отсутствие неявных идиом

Неопределенные значения, истинные / ложные значения и многие другие неявные идиомы недоступны в Дзен. Идея состоит в том, чтобы ограничить количество способов, которыми вы можете что-то выразить. Например, логические значения всегда выводятся из выражений отношения и равенства. Неявное преобразование объектов в логические значения отсутствует. Этот выбор дизайна, вдохновленный Java и C #, позволяет писать читаемый и безопасный код.

Лично я считаю, что из-за неявных идиом возникает больше ошибок, чем из-за других типов ошибок. Кроме того, такие ошибки сложно отследить. Например, когда язык программирования обрабатывает разнородные объекты, как если бы они были одинаковыми, это приводит к неожиданному поведению, когда программист пытается их использовать.

Вот пример из JavaScript. Хотя JavaScript не позволял использовать параметры по умолчанию до того, как был выпущен ES6, это был общий шаблон для имитации параметров по умолчанию, как показано:

function example(value) {
    value = value || 1;
}

В этом примере функция обновляет value до 1, если аргумент не передан. Однако, если вы попытаетесь передать 0 в качестве аргумента, правдивый тест в JavaScript завершится неудачно, в результате чего ваша переменная будет содержать 1 вместо 0. Очевидно, есть лучший способ написать это, но у нас вообще не было бы этой проблемы, если бы язык не имел истинных / ложных значений.

Параллелизм

В CPython и MRuby, эталонных реализациях Python и Ruby, соответственно, существует глобальная блокировка интерпретатора (GIL). GIL защищает внутреннее устройство интерпретаторов от состояний гонки, которые могут повредить данные. В многопоточном контексте эта блокировка позволяет только одному потоку выполнять код в любой момент времени. Например, если у вас есть четыре потока, работающих на четырехъядерном компьютере, только один поток и одно ядро ​​будут активными в любой момент времени.

В Дзен виртуальная машина реализует потоки как первоклассные граждане. Различные внутренние компоненты (включая сборщик мусора, JIT-компилятор, загрузчик классов) являются поточно-ориентированными. Следовательно, глобальная блокировка интерпретатора не существует. Это означает, что ваши программы могут использовать все преимущества многоядерных систем.

Быстрое время компиляции

Упрощенный дизайн Zen, как с точки зрения синтаксиса, так и семантики, позволяет быстро компилировать исходные коды. Это верно, даже если компилятор выполняет несколько проходов.

Кроме того, управление зависимостями в Zen элегантно. Компилятор обрабатывает только классы, которые напрямую импортированы. Программы, которые вы пишете в Zen, компилируются в компактный двоичный формат, известный как Формат двоичных объектов (FEB). Когда скомпилированные классы импортируются из исходного кода, компилятор использует простой загрузчик символов, который отбрасывает ненужную информацию и загружает только необходимые символы.

Заключение

Я понимаю, что статья была довольно длинной. Тем не менее, он представляет собой широкий обзор некоторых из наиболее важных функций языка программирования Zen. Многие из обсуждаемых здесь функций сейчас недоступны в Zen. Однако в этой статье описывается общее видение дзен.

Я считаю, что создание Дзен того стоило. В худшем случае я бы за три года научился писать компилятор и виртуальную машину с удовольствием. И, возможно, я создам язык программирования, который оценят другие. Наконец, я очень надеюсь, что после прочтения этой статьи у вас появится мотивация изучить дзен и узнать, как он может помочь в ваших собственных проектах.

Следует отметить, что я не специалист по проектированию компиляторов. Я понимаю, что аргументы, которые я выдвигаю в этом посте, легко победить. На самом деле, я могу ошибаться в некоторых упомянутых мною вещах. Пожалуйста, не стесняйтесь выражать свои мысли в разделе комментариев.

Спасибо за прочтение.

Если вы хотите связаться или внести свой вклад, вот мой адрес электронной почты: [email protected].