Журнал LinuxFormat - перейти на главную

LXF73:Parrot

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Основной текст)

Версия 08:24, 17 марта 2008

Что такое...PARROT?

Изначально спроектированная для выполнения кода Perl 6, эта птица может улететь очень далеко. Эмиас Чэннер (Amias Channer) исследует творение Ларри и группы Perlmongers.

Для начала: что такое Parrot?

Parrot – это новый вид виртуальной машины (VM), специально приспособленный для нужд интерпретируемых языков.

Интерпретируемые языки? Это как ruby и Perl?

Да, это языки, компилируемые в реальном времени непосредственно перед выполнением. В чем суть компилируемого языка, например, C? Чтобы создать программу, вы пишете её исходный код, затем компилируете и связываете с зависимыми компонентами, получая бинарный файл, который и будет потом запускаться. В нашем же случае вы просто загружаете интерпретатор и говорите ему, какой исходный код нужно выполнить. Например: perl test.pl.

Зачем нужна виртуальная машина?

Виртуальная машина работает поверх вашей платформы. Вместо того, чтобы создавать традиционный машинный код, вы компилируете байт-код, который выполняется виртуальной машиной. Такое разделение ценой небольшой потери производительности даёт больший контроль безопасности и общих ресурсов.

В чём разница между байт-кодом и машинным кодом?

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

Меня не волнует, на чём запущен мой код – что виртуальная машина может дать лично мне?

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

Разве я не могу использовать любой язык с существующими системными библиотеками?

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

Смогу ли я распространять свою интерпретируемую программу в бинарном виде?

Байт-код – это не совсем бинарный файл, но если вы имеете в виду распространение без исходных кодов, то да, это возможно. Это хороший повод повлиять на разработку Parrot-версии вашего любимого языка программирования. Если в своём коде вы использовали модули GPL и планируете распространять байт-код, вы должны убедиться, что не нарушаете лицензий этих модулей.

Разве мой код не будет работать быстрее, если под ним не будет виртуальной машины?

«Родной» код, то есть код, написанный под конкретную платформу, будет всегда исполняться быстрее эмулируемого кода. Но, если вы используете язык высокого уровня, особенно интерпретируемый, вы уже фактически сместили свои приоритеты в сторону функциональности, а не производительности, поскольку в этом случае виртуальная машина в каком-то виде всегда будет присутствовать.

Почему это?

Ну, возьмите к примеру такой интерпретируемый язык, как PHP. Это одновременно и язык и виртуальная машина для него.

То есть, вы не считаете, что виртуальная машина замедлит выполнение?

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

До появления Parrot должны были существовать и другие виртуальные машины с открытым кодом. Насколько они хороши?

Не существует других виртуальных машин с открытым кодом, имеющих такие же возможности, и это было одной из причин появления проекта Parrot. Хотя сейчас это кроссплатформенная и многоязыковая среда, программисты задумывали Parrot в первую очередь для исполнения кода Perl 6. Е сли бы была альтернатива – они бы ею воспользовались.

Как насчёт Java и .NET? Это ведь тоже виртуальные машины?

В отличие от них, Parrot – это по-настоящему открытый проект. Это позволяет ему быть кроссплатформенным, поскольку не существует каких-либо предпочтений в плане платформы. Хотя Java и .NET – тоже кроссплатформенные среды, они совсем не обязательно одинаково хорошо работают везде, так что может не получиться поменять платформу. Мы ожидаем, что Parrot превзойдёт как Java, так и .NET, и текущие тесты показывают, что он лидирует в плане производительности. Хотя предстоит написать ещё много кода, так что итоговый расклад может измениться. Кроме того, Java и .NET имеют свои собственные родительские языки...

...собственно Java и .NET?

Точно. Parrot, с другой стороны, более независим от языка. Он спроектирован для интерпретируемых, динамических языков, в отличие от большинства других виртуальных машин, где языки обрабатываются статически.

Что такое статическая и динамическая обработка?

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

Сможет ли Parrot общаться с Java или .NET?

Да, но не сразу. С нашей точки зрения, это может произойти на более позднем этапе, когда интеграция между динамической виртуальной машиной и машиной с проверкой типов станет проще. Прототип транслятора Java в байт-код Parrot уже существует, так что можно считать, что такая возможность есть.

Как вы пришли к имени Parrot?

Имя появилось из первоапрельской шутки, в которой утверждалось, что создатель Perl Ларри Уолл (Larry Wall) и лидер Python Гвидо Ван Россум (Guido van Rossum) собираются объединить Perl и Python в новый язык, названный Parrot. Симон Козенс (Simon Cozens), хакер Perl и автор шутки, был избран лидером проекта, в результате чего это имя окончательно закрепилось за ним, поскольку в каком-то смысле он действительно объединяет Perl и Python.

А я думал, что Perl умер вместе с крахом доткомов?

Нет, Perl всё ещё полон сил. Немало разработчиков языка переключилось на Parrot, и в Perl 5 прибавляется совсем немного кода, однако новые модули CPAN регулярно поступают в репозиторий Perl.

Если люди ненавидят Perl, возможно, они будут ненавидеть и Parrot?

Parrot весьма сильно зависит от Perl, и от его наследия будет довольно сложно избавиться. Вы можете использовать Parrot, не написав ни одной строки кода на Perl, но для этого нужно иметь установленный и настроенный Perl. Большинство дистрибутивов Linux содержат Perl, так что тут не должно быть проблемы. Parrot можно использовать и с другими языками. На самом деле, идея заключается в том, что вы можете использовать один язык, и получать дополнительные преимущества от использования других языков. Вы можете написать код под платформу, для которой вы раньше не могли программировать. Именно для этого вам понадобится компилятор в байт-код Parrot.

Хорошо, а какие другие языки можно компилировать в байт-код Parrot?

Их много, хотя ни один из них пока не обладает особой стабильностью и полнотой, да и не будет обладать, пока ядро Parrot не созреет окончательно. На данный момент, можно попробовать прототипы компиляторов байт-кода для Perl 6, Parrot Assembler (PASM), Java, Jako, Integer BASIC, Scheme, Forth, TCL, Ruby, Python, Ook, Lisp и Befunge. Но не ждите, что они будут очень хорошо работать. Если вашего любимого языка нет в списке, попробуйте поприставать к разработчикам – глядишь, он и появится!

Упс, Ассемблер! Я думал, Parrot относится к высокоуровневым языкам?

Расслабьтесь, это же просто виртуальная машина. В любом случае, нет нужды использовать PASM: в ближайшем будущем появятся более удобные способы создания байт-кода Parrot. PASM просто наиболее полно поддерживается в настоящее время и используется для написания Unit-тестов для виртуальной машины Parrot, а это единственная серьёзная работа, проделанная в Parrot на данный момент. Когда проект станет более зрелым, PASM скроется на задворках Parrot и будет востребован лишь какими-нибудь чернокнижниками хакерского цеха. Скорее всего, вы никогда не будете использовать PASM напрямую, но может оказаться удобным иметь такую возможность. Как говорит Ларри Уолл: «Есть как минимум несколько способов сделать это».

Вы не думаете, что идея Parrot выйдет за пределы сообщества Perl?

Parrot уже приобретает популярность и начинает подключаться к другим проектам с открытым кодом в качестве виртуальной машины и встраиваемой языковой среды, так что можно даже не пытаться пригвоздить его к своему насесту. Лео Тош (Leo Toetsch), текущий pumpking («хранитель тыквы») выпустил версию Wart (0.3.1) в начале ноября и сейчас работа быстро двигается дальше.

Pumpking? Кто это?

Извините, это слэнг Perl. Из группы разработчиков выбирается самый главный, так называемый pumpking. Он контролирует добавление нового кода в главную ветку проекта. Линуса Торвальдса тоже можно считать Хранителем ветки Linux 2.6. Предположительно, фраза произошла от брелка для ключей в форме тыквы, который передавался от одного неизвестного программиста другому во времена цифрового бума. В брелке был USB-ключ, который позволял обновлять резервное хранилище кода, над которым работали эти программисты. Хранителем и был тот, кто владел ключом.

А как насчёт всех этих странных имён и акронимов? Лингвистические шутки сообщества Perl – это наследие мистера Уолла. Он крайне эксцентричный, но фантастически одарённый человек. Помимо прочего, он является экспертом в языкознании, безмерно остроумен и носит пугающе кричащие рубашки. Его остроумие и знания лингвистики привнесли в Perl чрезвычайно гибкий (кто-то может сказать, фатальный) синтаксис, привлекающий разработчиков с отчасти гуманитарным складом ума. В результате, Perl – единственный среди других языков (программирования и не только), регулярно используемый как в поэзии, так и в shell-скриптах, похожих на шум, или в прекрасно структурированных проектах web-автоматизации.

Программисты Perl, похоже, весьма изворотливы?

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

Это «безумие» затронет и Parrot?

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

Но как в результате всего этого создаётся хороший код?

Я думаю, если у вас есть группа веселых людей, наслаждающихся обществом друг друга и постоянно пытающихся превзойти себя в технических знаниях, вы получите хороший код. Атмосфера легкого дурачества и, что самое важное, беззаботный подход делают гораздо более простым разрешение возможных конфликтов. Во времена доткомов Perl отличался тем, что позволял быстро прототипировать и менять код в соответствии с постоянно изменяющимися бизнес-практиками. Более строгий язык не смог бы обеспечить быстрые изменения с такой гибкостью.

Какие новые возможности появятся в Perl 6 ?

Одна из главных возможностей – лучшая объектная ориентированность (ОО). Perl 5 сильно критиковали за его искусный, но «хакерский» подход к OO. В Perl 6 появятся соответствующие ключевые слова для определения классов, так что вам не придётся исправлять опечатки в базовых конструкторах. Это должно сделать ваш код более компактным и организованным. Основная критика Perl 5 состояла в том, что он поощрял некорректный стиль кодирования, с использованием массы ухищрений. В самом деле, стандартной практикой стало включать специальный «строгий» (strict) синтаксис, чтобы отключить наиболее опасные возможности языка. Perl 6 будет использовать этот синтаксис по умолчанию, но вы сможете без труда избежать «строгого режима».

А разве не было некоторых проблем с Perl 6?

Да, были, начальный план по расширению Perl 5 до Perl 6 провалился. Из-за своей высокоуровневой природы, Perl не так хорош для написания компиляторов, поэтому для разработки выбрали Haskell. Это тоже язык высокого уровня, но его формальные инструменты отладки гораздо лучше, что очень важно при разработке чего-то настолько сложного, как компилятор. Этот промежуточный инструмент называется Pugs, он должен играть роль связки, позволяющей разрабатывать грамматику Perl 6. Большинство проектных решений Perl 6 было реализовано в Pugs, и сейчас он находится в поиске своего пути к конкретному применению. Время жизни Pugs ограничено, он достигнет кульминации своего развития к моменту портирования Perl 6 на Parrot. Вы найдёте более детальную информацию на сайте www.pugscode.com

Мои программы, написанные на Perl 5, смогут работать на Perl 6?

Практически полностью, кроме тех случаев, когда вы делаете что-нибудь эдакое, но тогда вы, скорее всего, знаете, почему вы это делаете. Perl 6 будет работать как Perl 5, пока не обнаружит в вашем коде новые конструкции (такие как class и module). Позже вы, возможно, захотите портировать свои программы на Perl 6, особенно если вы пишете объектно-ориентированный код.

Могу ли я установить Perl без всех этих виртуальных машин?

Нет. Разработка Parrot была вызвана новыми возможностями Perl 6. Внутренности Perl 5 были так переплетены, что потребовалась полная переделка. Некоторое время Perl 5 ещё будет доступен, но основная часть разработчиков перейдёт на Perl 6. Большая часть CPAN будет развиваться так, чтобы новые концепции работали только в Perl 6, хотя у Perl 5 столь огромное количество пользователей, что он еще протянет какое-то время.

Parrot написан на самом себе или на Perl 5?

Э... На самом деле, он написан на C.

Почему же Parrot написан на C, если предполагалось что он будет самодостаточным?

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

Разве C не устарел? Я думал Parrot будет чем-то новым?

C слегка состарился, но он всё ещё лучший из имеющихся языков для подобной работы. Он работает на широчайшем спектре платформ, имеет самое большое число талантливых разработчиков и достаточно зрел, чтобы безопасно генерировать небольшой и быстрый машинный код. Ни один другой язык не обладает всеми этими характеристиками. Важно понимать, что код, который на этом уровне имеет значение – это машинный код, а компиляторы и компоновщики C создают его лучше всего.

Я пользуюсь Mod-Perl в apache. Будет ли Parrot хоть как-то мне полезен?

Да. Джефф Хорвитц (Jeff Horwitz) работает над модулем Mod_parrot, но пока его версия 0.3 ещё не дотягивает до уровня промышленного применения. Возможности Mod_parrot огромны. Он позволит разным языкам манипулировать одними и теми же структурами данных внутри одного web-сервера. Вы сможете каждый раз выбирать язык, который лучше всего подходит для решения текущей задачи, вместо общего языка, который вроде бы годится в большинстве ситуаций.

Кто ещё использует Parrot?

На данный момент, использовать Parrot в реальной работе стоит лишь тем, кто всерьез собрался полностью на него перейти. Ходят слухи, что некоторые из разработчиков ядра Parrot используют его в промышленных системах, но поскольку они фактически не вылезают из списков рассылки Parrot, они в курсе того, что работает, а что нет. Если вы подумываете всерьёз начать использовать Parrot, вам нужно прочесть все PDD и подписаться на внутренний список рассылки Perl 6.

Что такое PDD?

Parrot design documents – проектная документация Parrot. Это формальное описание принятых проектных решений и история их разработки в Parrot. Любой, кто не участвует в разработке, может узнать, почему было принято определённое решение. Документы представлены в формате POD, но могут быть легко конвертированы в другие форматы. Почитать их можно здесь: http://dev.perl.org/perl6/pdd

Так что я могу делать с Parrot в данный момент?

Если вкратце, следующее: потрогать, поизучать и ждать своего часа. Parrot пока ещё молод, поэтому сейчас проще вникнуть в его нюансы, пока они не скрыты под дополнительным слоем сложной логики. Кроме того, если вы поймёте, как он работает, то сможете помочь в разработке Parrot-версии для вашего любимого языка или помочь написать документацию. Посетите наш сайт по адресу www.parrotcode.org, и там вы найдёте более подробную информацию об этом проекте.

Персональные инструменты
купить
подписаться
Яндекс.Метрика