Одри Тан в первую очередь известна как создатель и разработчик Pugs, Perl 6 User’s Golfing System, реализации Perl 6 на Haskell, которая появилась 1 февраля 2005 года и была наиболее активно разрабатываемой и наиболее полной реализацией на то время.
Вопросы и ответы в этом документе распространяются по лицензии CC0 и являются общественным достоянием.
Биография
Вы начали изучать Perl, когда вам было 12?
Я познакомилась с Perl по «Книге с ламой» Рэндала Шварца, когда мне было 13. Я внимательно следила за развитием проекта OnePerl во время разработки 5.004-5.005, помогала создавать сообщества, такие как Usenet-группа tw.bbs.comp.lang.perl, и многому научилась от зарождающегося сообщества CPAN.
Был ли он вашим первым языком?
Моими первыми компьютерными языками, в возрасте 8 лет, были GW-BASIC и Logo (вариант LISP). Я программировала на разных языках (LPC для LPMud и т. д.) до того, как в 1994 появился веб.
Помимо Pugs у вас множество модулей для Perl 5, опубликованных на CPAN с 2001 года. Как ваша жизнь была связана с Perl до Perl 6?
После появления веба, Perl практически покрыл все мои программистские потребности на следующие 10 лет. В 1999-2000 годах я мигрировала из EFNet в IRCNet на новый сервер Rhizomatic (также известный как MAGNet, позднее — irc.perl.org), где узнала о глобальной инициативе Perl Monger и более беспечных начинаниях Perl Golf.
В то время мы переводили третье издание «Книги с ламой» на традиционный китайский, так что выглядело логичным сформировать группу Taipei.pm и присоединиться к широкому сообществу CPAN. Я главным образом работала над CPANPLUS, фреймворком «дымовых» тестов CPAN, Module::Signature, а также над инструментом сборки пакетов PAR/pp.
Когда и почему вы решили работать над Perl 6?
Я посетила OSCON 2003, чтобы дать мастер-класс по PAR.pm — хотя большую часть полёта я провела, готовя блиц-доклад, который был очень тепло встречен сообществом. Последним блиц-докладом в той же сессии был Allison's Restaurant, с такими особенно вдохновляющими словами:
Знаете, если один человек, всего один человек, сделает это, они могут подумать, что он больной, и упрятать его в психушку. И если двое сделают это, в унисон, они могут подумать, что оба чокнутые, и упрятать обоих. А если трое сделают это! Можете вы представить — три человека входят, поют строчку из «Perl 6 Development» и выходят? Они могут подумать, что это организация! А можете вы представить пятьдесят человек в день? Я сказал ПЯТЬДЕСЯТ человек в день… входящих, поющих строчку из «Perl 6 Development» и выходящих? Тогда, друзья, они могут подумать, что это ДВИЖЕНИЕ, и так оно и есть: АНТИВОЕННОЕ, КОДООЧИЩАЮЩЕЕ, ВОЗМОЖНОСТЕДОБАВЛЯЮЩЕЕ, ЛЮБЯЩЕЕ PARROT ДВИЖЕНИЕ РАЗРАБОТКИ PERL6!.. и вы все должны присоединиться к нам и спеть в следующий раз.Тогда-то я и решила работать над Perl 6.
До Pugs вы активно участвовали в проекте Parrot. Чем именно вы там занимались?
Я участвовала с Дэном Когаи в дискуссии об инфраструктуре интернационализации в Parrot в списке рассылки perl6-internals.
Помимо этого я просто пробовала новые сборки время от времени и сообщала о проблемах с процессом сборки; я не была активно вовлечена в Parrot в ранние годы, когда проект вели Саймон Козенс и Дэн Сугальски.
Когда вы начали это, думали ли вы о создании и компилятора, и интерпретатора?
Да. 26.02.2005 в Pugs Apocrypha уже говорилось о компиляции в Haskell, Parrot и Perl 5.
-Ofun
Вы автор мема «-Ofun», или «Optimizing for fun» («Оптимизация для удовольствия»). Что это значит для вас и чем это было для остальной команды?
Есть набор слайдов, объясняющий, что это значило для меня:
Для участников сообщества это означало культуру тёплого приёма, регулярных обновлений, внимания к деталям, личной обратной связи, формирования лестницы навыков и помощи друг другу.
Для хакеров программного обеспечения культура «-Ofun» фокусируется на использовании распределённого версионирования, поощрении форков, предпочтении идей общему согласию, обнимании троллей и набрасывании идей с помощью кода.
Каким мог бы быть путь проекта, выбери вы противоположный девиз, например, «Нет преждевременной оптимизации»?
«-Ofun» на самом деле значит то же самое, что и «Нет преждевременной оптимизации», потому что преждевременная оптимизация ограничила бы возможности исследования, и тем самым снизила бы удовольствие.
В случае же логической противоположности, т. е. выбери я «Оптимизацию для скуки» или «Оптимизацию для страдания», я думаю, мы достигли бы локального максимума очень быстро, закончив вполне определённым путём — конкретно, устремившись к ⊥. :-)
Но, серьёзно, компиляция и тестирование ранних версий Pugs занимали буквально часы. Что вы делали, чтобы это ускорить?
Мы ждали, пока подтянется закон Мура, и это неплохо сработало. Кроме того, мы отрефакторили большие, монолитные модули на меньшие части, что сделало инкрементальную компиляцию и тестирование заметно быстрее.
Для релизов Pugs вы использовали приближение π как номера версий. Это тоже часть «-Ofun»?
Несомненно. Это удваивает веселье системы версионирования TeX.
Система версионирования TeX подразумевает, что в будущих версиях не будут вноситься никакие значительные изменения. В реализации Perl 6 у вас было несколько этапов. Насколько близко вы следовали этому списку?
6.0: Начальный релиз
6.2: Базовый ввод-вывод и элементы управления потоком; изменяемые переменные; присваивание
6.28: Классы и типажи
6.283: Правила и грамматики
6.2831: Система типов и компоновка
6.28318: Макросы
6.283185: Портировать Pugs на Perl 6, если нужно
Довольно близко. В Pugs были реализованы два первых этапа согласно Синопсисам, и мы довольно далеко продвинулись на пути к третьему этапу. Ранние реализаторы этапа 6.28 в итоге начали проект Moose, принеся объектную систему Perl 6 в сообщества Perl 5 и JavaScript.
Что касается следующих трёх этапов: хотя Pugs помог начать обсуждение дизайна этих аспектов, потребовалось гораздо больше времени, чтобы Синопсисы для систем грамматик, типов и макросов кристаллизовались, с помощью последующих реализаторов Perlito, Niecza и Rakudo.
Haskell
Цитируя ваш пост, анонсирующий Pugs, это была «попытка написать интерпретатор Perl 6 на Haskell». Почему Haskell?
В то время я изучала Haskell на Haskell-канале irc.freenode.net:
Pugs был моей второй Haskell-программой, изначально написанной как упражнение для книги «Типы и языки программирования» (страница 82 из слайдов выше).
Haskell — чисто функциональный язык программирования, тогда как Perl 6 — нет. Какие части реализации стали проще благодаря этому выбору, а для каких Haskell не очень-то подошёл?
Это было полезно в плане того, что гораздо проще рассуждать о семантиках Perl 6, делая явными все неоднозначности в спецификации, потому что Haskell не отдаёт предпочтение одной семантике перед другой.
Что же касается недостатков, в моей статье 2010 года есть список. Сообщество Haskell было ещё молодо, когда мы начали Pugs, и я рада видеть, что перекрёстное опыление продвинуло оба сообщества вперёд.
Вы часто упоминали монады в своих блогпостах; что вы делали с ними в Pugs?
Интерпретатор — это монада такого типа:
runEvalT :: ContT (EvalResult Val) (ReaderT Env SIO) (EvalResult a) -> Eval a
-- data SIO a = MkSTM !(STM a) | MkIO !(IO a) | MkSIO !a
Это явно выражает семантики продолжения (continuation), тип результата, лексическое окружение времени выполнения, и различает состояния программной транзакционной памяти, эффекты ввода-вывода, так же, как и чистый код.
Парсер — это другая монада, включающая монаду интерпретатора, позволяя блокам BEGIN изменять логику парсинга во время компиляции.
Помогла ли природа Haskell реализовать ключевые слова async и start и все возможности для параллельных и конкурентных вещей в Perl 6?
Определённо. Когда Perl 6 исследовал дизайны на тему параллелизма и конкурентности, сообщество Haskell также разбиралось с операционной семантикой лежащих в их основе абстракций, таких как потоки, события, ограниченные продолжения и так далее. Было очень уместно использовать передовую разработку, чтобы проверить, был ли передовой дизайн хорош.
Как насчёт объектно-ориентированных возможностей Perl 6, включая порядок разрешения методов?
Разрешение мультиметодов, так же как взаимодействие с объединениями (junctions), было среди первых вещей, которые Pugs помог прояснить в дизайне Perl 6. Мы также повлияли на принятие в Perl 5 подключаемого порядка разрешения методов: входящий в базовую поставку модуль mro.pm ссылается на Pugs как своё вдохновение, благодаря Стевану Литтлу, который выполнил начальное прототипирование C3.
Ваша цитата: «Двадцатиминутный хак окупился сполна: в 33 строчках мы получили быструю реализацию поддержки базовых правил Perl 6 на чистом Haskell». Это звучит поразительно, можете объяснить, как это возможно, и как Haskell (или, видимо, какие-то библиотеки) работает внутри с грамматиками и правилами Perl?
Речь здесь о Text.Parser.Rule.parseGrammar, порте PGE Патрика Мишо на Parser Arrows Haskell. Внутренне, абстракция стрелки сделала эффекты, накапливаемые во время парсинга, намного более явными. Позднее Адриан Д. Торстон (независимо) полностью исследовал идею движков парсинга со встроенными правилами возврата/отмены, результатом чего стал язык программирования Colm.
Вы также внесли вклад и в сам Haskell. Конкретно, вы работали в проекте Haskell' (Haskell Prime) над модернизацией стандартов Haskell. Какова была ваша роль там, и изменила ли работа над Pugs ваше видение Haskell и того, как он должен развиваться? Или, короче говоря, повлиял ли Perl 6 на Haskell?
Я работала над предложениями по языку, связанными с Юникодом, такими как SourceEncodingDetection; кроме того, я рассматривала и обсуждала и другие предложения. Pugs был ранним последователем GADT, Delimited Continuations, QuasiQuotation и т. д., и мы давали обратную связь по GHC, чтобы сделать эти возможности более цельными.
Нашим главным влиянием на Haskell, однако, было привлечение к изучению Haskell людей среди по большей части онлайнового объединённого сообщества, вместо его оригинальной академической установки «Powered by PhDs». Люди, которые познакомились с Haskell через Pugs, — такие как Эдвард Кметт — продолжали оживлять сообщество Haskell с тем же духом интенсивной совместной разработки.
В том же 2005 году вы начали изучать Erlang. Считаете ли вы, что было возможно написать компилятор Perl 6 на этом языке? Отличалось ли бы это от реализации на Haskell?
Определённо возможно. Главная разница в том, что Haskell — благодаря способности делать все эффекты явными — помог прояснить набор семантик Perl 6, «родной» для Perl 6, что делало его уникальным среди других функциональных языков в то время.
Если не Haskell или Erlang, какие другие функциональные языки могли бы быть кандидатами для создания компилятора или интерпретатора Perl 6?
OCaml также был бы разумным выбором, с его акцентом на производительности времени выполнения и хорошей поддержкой многостадийного программирования.
Среди современников Perl 6, Scala, Clojure и C# 3.0+ (на котором построен Niecza) — прекрасные функциональные языки для реализации Perl 6.
Компиляция проекта на Haskell требовала не только терпения, но и наличия таких зависимостей, как GHC, компилятор Haskell. Это могло остановить тех, кто хотел всего лишь поиграться с Perl 6. Что вы рекомендовали такой аудитории?
Да: я рекомендовала тестовые серверы Perl 6, deb-подобные пакеты, такие как Haskell Platform и MinGHC, и Perl 6 IRC-бота.
Команда
В течение нескольких недель после запуска Pugs в проекте было полдюжины контрибуторов, а через год — больше 200. Как так получилось, что проект на языке, совершенно отличном от Perl (я имею ввиду Haskell, не Perl 6 :-)), привлёк столько людей?
Уже существовал значительный интерес сообщества к Perl 6, и Pugs получил пользу от щедрости сообщества. Например, Скотт Уолтерс, написавший книгу Perl 6 Now в 2004 году, любезно пожертвовал в публичную собственность фрагменты кода на Perl 6, которые стали одними из наиболее ранних материалов в репозитории Pugs.
На самом деле, относительно немного людей работало над кодовой базой на Haskell. Ввиду сильной культуры «сначала тесты» с самого старта, большинство людей в IRC вносило свой вклад написанием кода на Perl 6 — примеров, тестов, модулей — так что языковой барьер не был таким уж сдерживающим.
Сколько было активных контрибуторов?
Был 131 активный комиттер в течение первого года, и 395 человек всего содержит список в репозитории perl6/mu.
Сколько из них задержалось надолго?
Многие комиттеры или остались в канале #perl6, или подписались на связанные с Perl 6 новости и блоги, но степень вовлечённости оценить сложно.
Тем не менее, поскольку после 2007 года в Perl 6 стало больше коммиттеров, чем было в 2005-2006 гг., очевидно, что сообщество Perl 6 успешно самозагрузилось.
Вы известны как координатор проекта, который легко раздаёт права на коммиты. Что вы делали, когда кто-то коммитил нечто, полностью отличающееся от вашего видения разработки проекта?
Обычно я изменяла своё видение соответственно — и совещалась с дизайнерами языка, чтобы изменить их видение соответственно. В этом отношении IRC-канал был действенным инструментом для объединения видения разных людей.
Есть ли у вас какие-то правила для разработчиков?
Единственное требование — что ты знаешь, как хорошо относиться к самым разным людям (и, некоторое количество лет спустя, бабочкам), или учишься хорошо относиться, или хотя бы хочешь научиться хорошо относиться. Как говорит Ларри:
Ты ещё не хочешь быть хорошим, но, возможно, ты хочешь хотеть. Возможно, мы можем помочь и с этим. Если ускорение остаётся положительным, со временем скорость и положение тоже подтянутся.
Вероятно, не каждый член команды Pugs был знаком с Haskell? Легко ли им было работать над проектом?
Как упоминалось выше, большинство участников в IRC вносило вклад путём написания кода на Perl 6.
Для тех, кто хотел поднабраться знаний Haskell, специально для этого мы подготовили файлы READTHEM и READTOO. Изучение Haskell не было особенно простым — тем, кто уже имел опыт императивного программирования, пришлось отучиться от многих привычек, — но мы сделали всё, что могли, чтобы этот процесс был приятным и соответствующим образом подпитанным.
Можете ли вы назвать нескольких членов команды, внёсших наибольший вклад, и рассказать, в чём была их заслуга?
Pugs был полностью совместным проектом. Если я перечислю тех, кого помню, вместе с их значимым вкладом, ответ на этот вопрос будет длиннее, чем вся остальная часть интервью!
Однако я бы сказала, что эта согласованность не появилась бы так быстро, если бы не существующая инфраструктура онлайн-сообщества в виде use Perl;, Perl Monks, Perl Mailing Lists, FreeNode IRC и OpenFoundry Project Hosting — эти пространства, с лежащими в их основе технологиями и операторами, сделали такой вид взаимодействия в принципе возможным.
Продолжение следует...