После нашего последнего интервью с Brian McKenna для This is not a Monad tutorial мы взяли интервью у Nenad Rakocevic, создателя языка программирования Red.

С моей субъективной точки зрения Red и Rebol довольно странные создания! Но не поймите меня неправильно, это не значит ничего плохого. Например, я не знаю многих высокоуровневых языков с такими возможностями как встраиваемые DSL для стандартного низкоуровневого программирования или имеющего 50 встроенных типов. Вам следует попробовать его, вы найдете много интересных идеи в программировании на Red.

Пишите мне на твиттер @unbalancedparen свои комментарии или предложения по интервью для This is not a Monad tutorial. Оставайтесь с нами!



Расскажите нам немного о появлении Red. Для чего он был создан?


Я начал программировать микро-компьютеры, Amiga, в моем случае, в молодости. На текущий момент я программирую больше 30 лет. После своего первого опыта я был недоволен существующими языками программирования и инструментами. В основном из-за того, что они небыли достаточно продуктивными или дружелюбными для меня. Так, когда я наткнулся на Rebol в 1999 году, он открыл мне глаза на то, что было неправильно с так называемой «современной» практикой разработки. (В наше время все еще хуже). Борьба со сложностью на всех фронтах программного обеспечения стала логичными образом действий.

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

Каковы главные аргументы в пользу Red?

  • Это первое fullstack-решение для программирования: объединенное в один инструмент, возможность писать высокоуровневый код (GUI-приложения, скрипты и DSL) и быстрый низкоуровневый код (драйвера устройств, операционные системы, нативные интерфейсы и т.д.). Более того, Red так же является обоюдосторонней технологией (для клиента и сервера).
  • Кроссплатформенный компилятор в нативный код: на любой платформе, поддерживающей тулчейн, вы можете компилировать для более 15 других платформ с простой опцией командной строки (-t Windows, -t Linux, -t Darwin, -t RPi, ...).
  • Чрезвычайно легковесный: Red это один файл размером 1MB, никакой установки, никакой настройки, весь тулчейн. Он скачивается за считанные секунды и вы можете тут же начать писать и запускать код, абсолютно ничего не надо настраивать (просто ужасно, что это является исключением, а не нормой...).
  • Решение с батарейками: содержит в себе очень богатую рантайм библиотеку, несмотря на крошечный размер, покрывающую практически все что вам нужно для обычных задач.
  • DSL-ориентированная среда: Red поставляется с множеством встроенных DSL'ей созданных для определенных нужд (как GUI или системное программирование). DSL'и являются очень мощным способом уменьшения сложности, появляющейся от фреймворков или API, и при этом радикально увеличивают продуктивность. Red включает в себя DSL (под названием Parse) для создания DSL'ей.
  • Red (как и Rebol) является производным Lisp'а, но с человеческим синтаксисом (без скобочного ада). Red является форматом данных для самого себя. Весь код считается данными пока вы не начнете выполнять его, сериализация код/данные дается даром.
  • Философия, стоящая за Red (и так же за Rebol) это сделать простое легким, а трудное возможным.

Что сделало Rebol главным вдохновением для Red?

Rebol один из самых инновационных языков программирования, созданных за последние 20 лет. К сожалению, он оставался вне зоны видимости так как имел закрытый исходный код, в то время когда языки с открытым исходным кодом, как Perl, Python и Ruby пробились в индустрию. Подход Rebol подрывает сами основания того, что программисты считают «простым» или «эффективным» в разработке. В общем случае, API, которое в других языках назвали бы «простым», выглядит бессмысленно усложненным когда вы привыкли смотреть на мир через очки Rebol'а. ;-) Вот несколько однострочников для примера (для Rebol2 REPL):

Создать графическое окно с кнопкой, по клику печатающей «Hello» в консоль:

view layout [button “Click Me” [print “Hello”]]


Распечатать содержимое веб-страницы на консоль:

print read http://rebol.com


Достать название веб-страницы:

parse read http://rebol.com [thru <title> copy text to </title> (print text)]


Послать список файлов текущей директории по email:

send user@domain.com mold read %.


Получить все записи из MySQL и распечатать их:

foreach row read/custom mysql://root@localhost/books [“SELECT * FROM authors”] [print row]


Заметьте, что хоть вы и никогда не видели кода на Rebol ранее, вы все равно можете прочитать его и понять что делает большая его часть.

В чем основная разница между Rebol и Red?

  • Red может быть (кросс-)скомпилирован в нативный код, Rebol только интерпретируется. Скомпилированный код работает намного быстрее интерпретируемого.
  • Red дает возможность системного программирования и написания быстрого низкоуровневого кода, Rebol застрял на уровне скриптов.
  • Red полагается на нативные виджеты и нативную поддержку GUI, Rebol имеет собственный движок. С Red ваше графическое приложение будет выглядеть более естественно и лучше интегрировано в ОС пользователя.

Кроме этого языки, сами по себе, очень похожи, где-то на 95%. Если вы знаете Rebol — вы знаете Red.

Red покрывает целый класс абстракций между низкоуровневым и высокоуровневым программированием предлагая диалект Red/System с Си-подобной семантикой и Rebol-подобным синтаксисом. Было ли различие между Red и Red/System в изначальном дизайне? Какие преимущества вы получили используя Red/System?

Безусловно, Red/System был одной из главных причин создания нового языкового стека, вместо дублирования реализации Rebol. Red/System это статически компилируемый язык, предназначенный для нативного кода (как Си). Red/System служит двум главным целям:

  • предоставить встраиваемый DSL пользователям Red для поддержки быстрого кода и нужд системного программирования
  • быть языком промежуточного представления для скомпилированного кода на Red

Насколько мне известно, Red это первый высокоуровневый язык с такими возможностями как встраиваемые DSL для универсального низкоуровневого программирования.

Кто использует Red/Rebol?

Сообщество Rebol было относительно большим в начале 2000ых, но оно сильно сократилось с прекращением развития. Множество пользователей было удивительно разнообразным по шкале навыков. Многим нравилась простота для простых задач и кросс-платформенный движок для GUI, других больше интересовала глубина (динамическое связывание, легкое создание DSL'ей, серьезные возможности мета программирования, ...).

С тех пор только хардкорные фанаты или компании, построившие свои системы на нем, продолжают использовать и продвигать его. Во многом это одни и те же люди, и они сформировали первых приверженцев Red вместе с многими другими людьми, которых интересовал Rebol, но не устраивала его проприетарная природа. Некоторые из них пишут библиотеки для Red, другие — маленькие игрушки, или даже драйвера для устройств для Windows! :-) Как только Red станет готов для продакшена, мы уверены, гораздо больше людей присоединится к ним и получит удовольствие от использования Red.

Для каких задач, по-вашему, подходит Red?

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

  • скриптование / связывание кода
  • графические интерфейсы (в грядущей v0.6.0)
  • приложения для Android (в v0.6.1)
  • обработка данных
  • парсеры грамматик / создание DSL
  • системное программирование
  • драйвера устройств
  • программирование устройств для интернета вещей (работающих на Intel или ARM)

Как только мы достигнем 1.0 (в следующем году), Red так же будет очень хорош для:

  • веб приложения
  • создание серверов
  • 2D игры
  • робототехника

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

Rebol и Red имеют более 50 типов данных с рантаймом чуть больше 500KB. Среди них две трети имеют специальную литеральную форму (напр. money, email, url, time, date, colors, ...), что дает вам, из коробки, богатый набор литералов для создания встроенных DSL'ей.

Другой плюс заключается в том, что большинство возможностей необходимых для повседневных задач уже здесь, как первоклассные объекты, отлично интегрированы с остальным, работают в точности одинаково на каждой поддерживаемой платформе. Это очень сильно поднимает продуктивность и делает изучение/использование языка намного более приятным (нет необходимости делать «импорты» для каждой простой задачи). Такие языки прагматичны и нацелены на уменьшение стоимости создания ПО.

Как Red реализован в общих чертах? Написаны ли все компоненты (парсеры, генераторы кода, сборщики мусора и т.д.) руками? Какие зависимости у Red?

За исключением доброй части модульных тестов, которые генерируются скриптом, все остальное написано руками. Мы развертываем Red используя Rebol, так что тулчейн (компиляторы, линкер, сборщики) написан на Rebol2. У Rebol есть DSL для парсинга, который очень эффективен и в сочетании с мощными возможностями мета программирования необходимость в использовании других инструментов просто пропадает. Скрипты Red могут интерпретироваться из REPL'а или компилироваться в нативный код, используя Red/System как промежуточное представление. Рантайм библиотека состоит из смеси кода на Red и Red/System.

Исполняемый файлы Red обычно имеют размер около 0.5MB и не имеют зависимостей.

Насколько полноценен Red на середину 2015 года?

Очень много уже реализовано, поэтому я лучше опишу чего пока не хватает. Прямо сейчас мы завершаем поддержку кросс-платформенного GUI с первым бекендом для Windows. Бекенды для Android, Linux и OS X будут следующими. Ввод/вывод пока ограничен простыми файловыми операциями и HTTP-клиентом. Модульная компиляция, полноценный сборщик мусора и поддержка конкурентности — главные цели до релиза 1.0. Мы планируем выпустить 1.0 в 2016 году.

Каким вам видится будущее у Red?

У Red есть потенциал соблазнить множество разработчиков (особенно свободных разработчиков у которых есть свобода выбора) которых не устраивают существующие инструменты (даже так называемые «простые»). Я ожидаю что Red широко распространится в ближайшие пару лет, помогая программистам решать множество разнообразных проблем с удовольствием и делая их жизнь легче. Red расширится многими мощными DSL'ями под разные области, предлагая отличные замены для прямого использования существующих библиотек. Например, мы будем продвигать его в сферы робототехники и ИИ.

Какие самые важные выводы вы сделали из разработки Red?

  1. Открытый исходный код это наилучший способ создания качественного ПО (Red просто еще раз подтвердил этот факт).
  2. Работать «в открытую» не всегда хорошо, иногда нужно изолировать себя от окружающего «шума» чтобы завершить сложную задачу (в основном в вопросах дизайна). По мере роста проекта сделать это становится все труднее.
  3. Необходимость взаимодействовать с возрастающим сообществом пользователей съедает много времени. Очень важно найти людей для этой задачи.
  4. Дизайн хорошего синтаксиса намного более сложен, чем дизайн хорошей семантики. Этот момент упускают многие создатели языков, что приводит к отличной семантике но ужасному синтаксису.
  5. Написать компилятор в нативный код для статически типизированного языка на самом деле не трудно, большинство программистов с минимальными знаниями в информатике способны на это, они просто не вкурсе что они это могут.
  6. Преждевременная оптимизация может (часто) ударить тебя сзади. Знание, что твоя оптимизация преждевременна — из разряда черной магии.
  7. Любой большой проект следует начинать командой из как минимум двоих очень мотивированных и одинаково квалифицированных разработчиков. Работать в одиночку над большими проектами это безумие, а не гарантия лучших результатов.
  8. Если вы работаете над проектом с открытым исходным кодом, который достаточно привлекателен и набирает последователей, вы можете жить на пожертвования пользователей (я жил так два года, покрывая все мои основные жизненные расходы). Я не думал что это возможно когда начинал и совсем не рассчитывал на это. Возможно мне просто повезло, что у Red такое великолепное сообщество.

Что вы посоветуете почитать для написания первого языка программирования?

Хороший обзор всех необходимых вещей есть в книгах типа Modern Programming Languages: A Practical Introduction. Если вы хотите пойти глубже и нырнуть в более абстрактные категории, "Книга Дракона" все еще лучшая (издательство Вильямс недавно выпустило перевод последней редации — прим. переводчика).

Но самый полезный способ — это изучить реализации нескольких небольших языков, это даст вам лучшие понимание того, как это сделать самому. Для примера, релиз Red 0.1.0 всего 24KB в zip-архиве, но имеет уже работающий компилятор/линкер для Red/System и многие возможности (включая FFI). Скачайте его тут: https://github.com/red/red/releases/tag/v0.1.0

За какими языками и технологиями вы наблюдаете?

  • Go: это самый быстрорастущий язык за последние годы, понимание причин этого может быть ключом к тому, чтобы Red тоже стал расти быстрее. Модель конкурентности в Go, похоже, привлекает пользователей, поэтому стоит изучения.
  • Lua: пытаюсь понять куда оно движется и как оно растет.
  • Python 3.x: пытаюсь понять куда оно движется, однако не уверен что я понимаю его планы.
  • Webassembly: основание для будущего веб программирования.
  • MagicLeap: будущее человеко-машинных интерфейсов!


От переводчика: Я практически не видел упоминаний на хабре и вобще в IT пространстве СНГ языка Rebol, поэтому дам немного вводной информации о нем.
Carl Sassenrath — создатель Amiga OS, принесшей многозадачность на персональные компьютеры, программирует на таких языках как Ada, Pascal, Smalltalk, Lisp, Forth, SPL. Работал в исследовательском подразделении Apple с многими IT легендами, включая Alan Kay, Larry Tessler, Dan Ingalls, Bill Atkinson, которые помогли сформировать его представление о языках и системах. В 1996 году, когда популярность начали набирать Java, Perl и Python он решил поделится с миром своими идеями, результатом чего стал язык REBOL (relative expression-based object language). Однако, как упоминается в интервью, язык был проприетарным, распространялся в разных «комплектациях», и некоторые из них были доступны только по лицензии. В последствии Карл сделал REBOL3, с изначально открытым исходным кодом, но он очень далек от возможностей REBOL2 и по состоянию на сегодня не развивается. В это время уже активно разрабатывался Red.

Заинтересовавшимся настоятельно рекомендую поиграться с REBOL2, скачать на официальном сайте http://www.rebol.com/download.html версию 2.7, попробовать этот мегабайтный бинарник с сетевым стеком, графическими интерфейсами и прочим, получить разрыв шаблонов на предмет того, насколько компактно можно написать столько много вещей и начать изучать Red/REBOL =)

Комментарии (18)


  1. dim_s
    30.08.2015 11:45
    +3

    Я бы не отказался заменить этим языком bash скрипты.


  1. NeoCode
    30.08.2015 14:55

    Всегда приветствую статьи по языкам программирования на Хабре. Спасибо!
    Хотя описания самого языка в статье крайне мало, но оно и понятно — это интервью, а не обзорная статья.


  1. Asen
    30.08.2015 20:15

    Интересно, такой высокий уровень абстракции(выше, по крайней мере, точно не доводилось видеть) не помешает дальнейшему развитию языка? Судя по приведенным сниппетам, синтаксис практически эквивалентен человеческому языку. Высочайший уровень абстракции!


    1. lair
      30.08.2015 22:47

      Вообще-то, синтаксис слабо связан с уровнем абстракции. Абстракция — это семантика, а не синтаксис.

      (Ну и да, о близости приведнных примеров к «человеческому языку» я бы поспорил)


      1. loz
        30.08.2015 23:12

        Все так, однако многие ли будут пользоваться мощнейшими абстракциями, если их синтаксис будет тупо неудобен? Удобство очень важная штука, поэтому в Red стараются работать над ситаксисом.

        Насчет близости с «человеческим языком» — именно в контексте создания DSL'ей большее значение имеет возможность писать код в терминах предметной области, с наиболее простым синтаксисом, и быть похожим такому языку на «человеческий» совсем не обязательно.


        1. lair
          30.08.2015 23:39

          Удобство очень важная штука, поэтому в Red стараются работать над ситаксисом.

          Удобство — важная штука, но оно ничего не говорит об уровне абстракции.

          быть похожим такому языку на «человеческий» совсем не обязательно.

          Не обязательно. Собственно, Red и не похож.


      1. Asen
        31.08.2015 13:02

        Вот здесь готов поспорить: именно синтаксис передает абстракции. Их «уровень» также передается синтаксисом языка(сравните Assembler с Red`ом).


        1. lair
          31.08.2015 13:03

          Правда?

          Вот вам два разных уровня абстракции: «Петя толкнул Васю» и «материальное тело передало часть энергии другому материальному телу». Синтаксически они идентичны.


          1. Asen
            31.08.2015 13:12

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


            1. lair
              31.08.2015 13:13

              Чем они синтаксически отличны? Если вас смущает второе дополнение, так это в рамках синтаксической вариативности. Я могу сделать и полностью синтаксически идентичные предложения, как вы понимаете.


    1. NeoCode
      31.08.2015 20:36
      +1

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


      1. loz
        31.08.2015 21:09
        +1

        Лямбды тут на самом деле не используются, то что внутри квадратных скобочек это так называемый блок, который может интерпретироваться в зависимости от контекста. Это во многом похоже на цитирование в лиспе, а лямбда состоит из двух блоков — блок с аргументами и блок с кодом. То есть они, так сказать, даже более первоклассны чем в языках где lambda (или аналог) является ключевым словом.


        1. NeoCode
          31.08.2015 21:27
          +1

          А напишите обзорную статью по языку, с описанием всех интересных фич. Думаю, многие здесь с удовольствием прочитают, и возможно будет интересная дискуссия:)


          1. Asen
            31.08.2015 22:12
            +1

            Кстати, хорошая идея. Хоть и вероятно, что на все интересные фичи не удастся сделать обзор, но расширить набор многих «киллер-фич» было бы здорово. Не то, что бы все прям-таки рванутся осваивать Red, но для сравнения с популярными высокоуровневыми языками было бы очень познавательно ;)


          1. loz
            01.09.2015 00:30
            +1

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

            Этот перевод был больше нацелен на то, чтобы Red появился на радарах у интересующихся людей и при словах Red/Rebol возникали какие-то ассоциации) А может кто-то как раз искал чего бы такого экзотического изучить, или интересовался DSL'ями, DSL для написания DSL'ей (называется parse) это занятнейшая штука, уверяю вас)


  1. xonix
    30.08.2015 20:43

    В чем киллер-фича этого ЯП?
    Ну там С(++) — эффективность, Erlang — акторы/конкурентность, Go — хипстерский С++ с GC, Java — ну понятно… А тут что (кроме нового синтаксиса)? DSL, Lisp-like? А оно практически нужно как самоцель? Если он метит в нишу Lisp, то вряд ли это будет популярным…
    За статью спасибо, может быть интересно как пример дизайна/имплементации ЯП.


    1. loz
      30.08.2015 21:53
      +1

      Основная киллер-фича которую продвигают создатели — это fullstack programming language. То есть не писать низкоуровневые драйвера на C, конкурентность на Erlang, бизнесс-логику на Java/Python, а фронтенд на JS, а писать все на одном языке. Тут надо понимать «на одном языке» не совсем в привычном смысле, потому как для системного программирования предназначен Red/System — это, в терминологии Rebol, диалект, который может, в разной степени, менять синтаксис и семантику языка.

      >Если он метит в нишу Lisp

      Очень интересно, а где ниша Lisp?)

      >А оно практически нужно как самоцель?

      Определенное количество людей считает, что возможности DSL'ей практически не раскрыты сегодня. Вот тут www.moserware.com/2008/04/towards-moores-law-software-part-3-of-3.html можно прочитать как Alan Key и сотоварищи сделали парсер протоколов TCP/IP в 200 строк кода. Вкратце они написали парсер-генератор для схем из RFC и по ним сгенерели парсер протокола.


      1. potan
        31.08.2015 13:11

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