Pull to refresh

Интервью с Nenad Rakocevic о языке Red, преемнике Rebol

Reading time 9 min
Views 15K
Original author: Federico Carrone
После нашего последнего интервью с 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 =)
Tags:
Hubs:
+27
Comments 20
Comments Comments 20

Articles