Perl 6

Габор Сабо. Массивы в Perl 6

Габор Сабо подготовил серию видеоуроков, посвященных основам Perl 6. Вашему вниманию предлагается русский перевод второй части — про массивы. Оригинальный скринкаст на английском языке доступен на ютубе.

Привет! Меня зовут Габор Сабо, и сейчас будет вторая часть презентаций о Perl 6. На этот раз я расскажу про массивы. Если вам интересны темы, связанные с Perl 6, посмотрите на ссылки на странице szabgab.com/perl6.html.

Рассмотрим первый пример.

use v6;
 
my @names = ("Foo", "Bar", "Moo");
 
say @names;

Как и в Perl 5, символ @ означает массивы. То есть здесь мы объявляем массив и помещаем в него три значения — три строки. Чтобы распечатать содержимое массива, достаточно напечатать say и имя массива.

Я переключаюсь в другое окно, с интерактивным режимом, в котором мы работали в первой части, и там печатаю:

eval slurp '01.p6'

FooBarMoo

Как видите, печатаются значения, правда, одно за другим. Границы между ними не видны, что не очень удобно для отладки.

Лучше всего — воспользоваться методом .perl на массиве:

say @names.perl;

Здесь возвращается строка, и если ее выполнить (через eval), то получится исходная структура данных.

["Foo", "Bar", "Moo"]

Действительно удобно для отладки.

Если требуется напечатать только один из элементов, например, второй, индекс которого — 1, его нужно указать в квадратных скобках после имени массива:

say @names[1];

Если это выполнить, напечатается второй элемент.

Bar

Пользователи Perl 5 заметят, что сигил при этом не изменился. Это потому, что в Perl 6 сигилы не изменяются. Массив всегда будет сопровождаться символом @.

На самом деле, индекс необязателен, можно оставить скобки пустыми, что будет означать весь массив:

say @names[]

При выполнении опять получаем те же три значения:

FooBarMoo

Кроме того, в отличие от Perl 5, скобки вокруг массива не обязательны:

my @names = "Foo", "Bar", "Moo";

По-прежнему создается массив, и по-прежнему печатаются значения:

FooBarMoo

А что если мне захочется интерполировать массив?

use v6;
 
my @names = "Foo", "Bar", "Moo";
 
say "Hello @names how are you?";

Выполняем второй пример:

eval slurp '02.p6'

Hello @names how are you?

Как видите, @names оказывается на печати. В Perl 6 массивы автоматически не интерполируются. Чтобы этого добиться, нужно поставить квадратные скобки — тут они очень пригодятся.

say "Hello @names[] how are you?";
Hello Foo Bar Moo how are you?

На этот раз Perl понимает, что мы, на самом деле, имели в виду массив по имени @names, и вставляет все значения из массива внутрь строки, разделяя их пробелами.

Аналогично, я могу указать индекс, и проинтерполируется соответствующее значение:

say "Hello @names[1] how are you?";
Hello Bar how are you?

Существует и другой способ интерполировать значения: поставить вокруг переменной фигурные скобки:

say "Hello {@names} how are you?";

Выполнив, получим все три значения из массива:

Hello Foo Bar Moo how are you?

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

use v6;
 
my @names = "Foo", "Bar", "Moo";
 
say "Hello { join('; ', @names) } how are you?";

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

Выполняем этот вариант.

eval slurp '03.p6'

Hello Foo; Bar; Moo how are you?

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


Когда надоест печатать кавычки и запятые при создании массива, то можно применить угловые скобки:

use v6;
 
my @names = <Foo Bar Moo>;
 
say "Hello {@names} how are you?";

Это работает аналогично qw в Perl 5: из трех значений создается список из трех элементов.

На последнем примере посмотрим, как можно в цикле пройтись по элементам массива.

use v6;
 
my @names = <Foo Bar Moo>;
 
for @names -> $n {
   say $n;
}

Я воспользовался циклом for, он получает массив, а затем, после стрелочки, скаляр. Как видите, этот скаляр не обязательно объявлять с помощью my, потому что перл автоматически создаст его для нас внутри области видимости следующего блока, так что там не придется беспокоиться о $n.

В примере for пройдется по всем значениям в @names, помещая в $n Foo, потом Bar, потом Moo и печатая каждое из них.

Надеюсь, этот рассказ вам понравился, будет и продолжение. До свидания.

array, for — 29 июля 2010

От Perl 5 к Perl 6 — введение

Perl 6 еще недостаточно документирован. Не удивительно, потому что (в отличие от спецификации) написание компилятора для Perl 6 представляется гораздо более приоритетной задачей, чем написание документации, ориентированной на пользователя.

От Perl 5 к Perl 6 — Строки, массивы, хеши

Perl 6 — почти как Perl 5, только лучше. Инструкции разделяются точками с запятыми. После последней инструкции в блоке или после закрывающей фигурной скобки в конце строки точка с запятой не обязательна. Имена переменных, как и раньше, начинаются с сигилов (например, $, @, %), и многие встроенные функции Perl 5 почти не были изменены в Perl 6.

Карл Мэсак про Ракудо

Тех, кто уже сегодня соберется использовать Rakudo, ждет несколько сюрпризов. Сейчас доступны совсем немногие возможности Perl 6. Но некоторые из них уже сами по себе являются поводом для того, чтобы развернуть Rakudo, а некоторые по-настоящему приводят в восторг — настолько, что кажется, что писать обычный код уже никогда не будет интересно.

Интервью с Дамианом Конвеем

Конференция O’Reilly по программному обеспечению с открытым кодом, OSCON, столь же славится умными беседами в кулуарах и за обедами, сколько и семинарами, заседаниями и программными выступлениями. Терри Камерленго пригласил на ненавязчивую беседу Дамиана Конвея, автора «Perl Best Practices» и «Perl Hacks», чтобы узнать о его мыслях касательно самых разных тем, начиная с подробностей про Perl 6 и заканчивая тем, что по его мнению важно для следующего поколения ученых в области компьютерных наук.

Вышел Rakudo Star

github.com/rakudo/star/downloads

rakudo — 29 июля 2010

Габор Сабо. Скаляры в Perl 6

Габор Сабо подготовил серию видеоуроков, посвященных основам Perl 6. Вашему вниманию предлагается русский перевод первой части — про скаляры. Оригинальный скринкаст на английском языке доступен на ютубе.


Привет! Меня зовут Габор Сабо. Это первая часть серии презентаций о языке Perl 6. Сегодня я расскажу о скалярах.

Я пользуюсь Rakudo, самой мощной реализацией Perl 6. Rakudo можно загрузить с его сайта либо в бинарном виде, либо в исходниках и затем собрать самостоятельно.

Если потребуется помощь, то лучшее место для этого — IRC-канал #perl6 на irc.freenode.net. Там много полезных людей, я тоже там, под ником szabgab.

После загрузки и установки Rakudo в командной строке можно написать perl6, нажать Enter, и вскоре попасть в интерактивный режим Perl 6. Это можно сделать и на линуксе, как у меня, или на Windows, или на Mac OS X. И, вероятно, и на других юникс-машинах тоже.

В интерактивном режиме можно печатать разные команды на Perl 6. Первым делом я хочу увидеть ключевое слово say:

say 42

42

Оно получает значение и печатает его на стандартном выводе. Аналогично, можно передать строку, и она будет напечатана.

say "hello"

hello

Perl 6 объектно-ориентирован, поэтому вместо say "hello" я могу написать "hello", затем точку и say:

"hello".say

hello

Это вызовет тот же метод на объекте — строке "hello".

Остальные примеры сохранены в файлах. Чтобы их показать, я воспользуюсь функцией Perl 6 slurp, которая примет значение — строку — имя файла, и прочитает содержимое файла. Поскольку мы в интерактивном режиме, результат вызова функции будет напечатан, и мы увидим содержимое файла.

slurp '01.p6'

use v6;
say "Hello world";

Первая строка — use v6;. Она не обязательна, но очень полезна, потому что если напечатать perl и имя скрипта, то запустится Perl 5, и он попытается выполнить скрипт как программу Perl 5. Без use v6; появятся странные ошибки из-за того, что Perl 5 не понимает кода. С use v6; сообщение об ошибке будет полезным — о том, что версия перла не достаточно новая, чтобы выполнить этот код.

Вторая часть кода — просто say со строкой.

Чтобы проверить этот пример, я опять вызываю slurp, но теперь, вместо печати на экран я вызываю функцию eval на результате работы slurp. То есть eval получит содержимое файла, скомпилирует его и выполнит.

eval slurp '01.p6'

Hello world

Hello world появляется на экране.

Второй пример, как можно видеть, содержит такую же строку, а затем выводит приглашение (prompt) ко вводу значения в командной строке.

slurp '02.p6'
use v6;
my $name = prompt "Please type in your name: ";
say "Hello $name, how are you?";

Таким способом в Perl 6 возможно задать вопрос, а затем считать ответ со стандартного ввода (с клавиатуры). Prompt напечатает строку, дождется, когда пользователь что-либо введет и нажмет Enter. Содержание пользовательского ввода попадет в скаляр $name.

В Perl 6, точно так же, как и в Perl 5, имена переменных-скаляров начинаются с символа доллара, а переменные могут содержать или число, или строку, или любое одиночное значение.

В Perl 6 каждую переменную нужно объявлять до использования. Поэтому здесь мы используем для этого ключевое слово my.

Итак, имея переменную и ее содержание, я могу вновь воспользоваться say, чтобы напечатать строку, и поместить $name внутрь строки в двойных кавычках. В отличие от многих других языков, напечатается содержимое переменной $name, а не доллар и name. Это называется интерполяцией, как и в Perl 5.

Запускаем этот код:

eval slurp '02.p6'

Нас спрашивают имя:

Please type in your name: 

Я печатаю свое имя:

Please type in your name: Foo

И печатается «Как дела?»:

Hello Foo, how are you?

Пользователей Perl 5 может удивить, что после Foo нет перевода строки, даже несмотря на то, что я не отрезал его от введенной строки. Это из-за того, что prompt, как и большинство других способов ввода в Perl 6, автоматически убирает перевод строки.

Запускаем следующий пример:

eval slurp '03.p6'

When were you born? 

Программа спрашивает о дате рождения, поэтому я набираю 2000, потому что это легко набрать :-)

When were you born? 2000

И получаю ответ:

You are younger than Perl by 13 years

Очевидно, что 13 вычислено из значений 2000 и года, когда был создан Perl. Давайте посмотрим, как это работает.

slurp '03.p6'

use v6;
 
my $year = prompt "When were you born? ";
if $year > 1987 {
    say "You are younger than Perl by { $year - 1987 } years";
}

Вторая строка уже знакома — здесь выводится приглашение и считывается ответ в переменную $year.

Затем — условие if $year > 1987 (год, когда был выпущен Perl 1.0). Как видите, в Perl 6 вокруг условия не нужны скобки. Но по-прежнему нужны фигурные скобки вокруг блока, который будет выполнен, если условие было истинным.

Затем, внутри условного блока, — только одна строка. Не две (строка и выражение). В Perl 6 возможно внедрить любое выражение внутрь строки в двойных кавычках, просто поместив выражение в фигурные скобки. Perl 6 заметит, что здесь есть выражение, выполнит его, а результат будет подставлен в строку.

В следующем примере мы вновь задаем пользователю тот же вопрос:

slurp '04.p6'

use v6;
 
my $year = prompt "When were you born? ";
if 1995 > $year > 1987 {
    say "You are younger than Perl 1 but older than Perl 5";
}

Но на этот раз мы проверяем два условия: 1995 > $year > 1987; год $year находится между двумя числами. Как видите, не требуется делать две раздельные проверки и соединять их ключевым словом and. В Perl 6 разные условия возможно объединять в цепочки.

В последнем примере я опять спрашиваю число:

slurp '05.p6'

use v6;
 
my $luck = prompt "What is your lucky number? ";
 
if $luck == 3 or $luck == 7 or $luck == 13 {
    say "Oh, that's like mine";
}
 
if $luck == 3|7|13 {
    say "Oh, that's like mine";
}

А затем проверяю, совпадает ли счастливое число с 3, 7 или 13. Обычно это делается так:

if $luck == 3 or $luck == 7 or $luck == 13

В Perl 6 этого не нужно: можно просто спросить, является ли $luck тремя, семью или тринадцатью:

if $luck == 3|7|13

Это называется объединением (junction).

На сегодня все. Надеюсь, это вам понравилось и вы начнете пользоваться Perl 6. До свидания.

scalar, eval, slurp, prompt, if, say — 29 июля 2010

Июньский релиз Rakudo — «Kiev»

30-й релиз Rakudo Perl 6 вышел под кодовым названием «Kiev».

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

Сейчас компилятор проходит 33 378 тестов из спецификации, что составляет около 83% их общего числа.

rakudo, kiev — 18 июня 2010

Daily dose of Perl 6

Aaron Sherman начал публикацию ежедневных заметок с примерами кода на Perl 6 и объяснениями.

www.google.com/profiles/AaronJSherman#buzz

snippet, code, example, explanation, sherman — 29 мая 2010

Дамиан Конвей про Perl и его будущее

Три товарища — Дейв Кросс, Грег Маккарол и Джозетт Гарсия — встретились прошлым летом на YAPC::Europe в Лиссабоне и решили поведать миру о том, что сейчас происходит с перлом. Поскольку Дамиан Конвей, один из ключевых дизайнеров Perl 6, делал на конференции доклад, они подумали, что могли бы задать ему несколько вопросов. Чтобы собрать вместе все вопросы и ответы и закончить интервью потребовался — в духе разработки Perl 6 — почти год, но на прошлой неделе все, наконец, было готово.

Оригинальный текст под заголовком «Damian Conway on Perl and its future» опубликован на сайте O’Reilly GMT 25 мая 2010 г.
Перевод Андрея Шитова.


Perl мертв

Дэйв: Мы часто слышим, как говорят: «Perl — мертв». Я полагаю, что вы не согласны, но что вы отвечаете людям, которые говорят вам это?

Дамиан КонвейОбычно я отвечаю: «Я согласен. Жаль, не так ли?». После этого сумасшедшие тихо сливаются, а я могу опять загрузить новый или улучшенный перл-модуль, увеличивая нынешние семь гигабайт открытого кода на спане (как это каждый месяц делают более 700 других разработчиков), или поехать на десятки перл-конференций и воркшопов, которые ежегодно проводятся во всем мире, или посетить одну из 250 PM-групп в 58 странах, или пообщаться с тысячами единомышленников, помогающих друг другу на главном сайте про изучение перла perlmonks.org, или принять участие в онлайновой социальной и образовательной деятельности (например, в соревновании Perl Iron Man), или обновиться до нового релиза Perl 5 и Perl 6 (оба они теперь выходят ежемесячно), или внести вклад в активный процесс разработки либо одной из двух реализаций Perl 5, либо в одну из четырех — Perl 6, или обучить десяткам новых возможностей, которые добавлены в Perl 5.10 и Perl 5.12 за последние три года, или заняться разной деятельностью по омоложению перла (enlightenedperl.org и modernperlbooks.com) или просто почитать замечательный обзор Тима Банса о том, насколько, на самом деле, мертвый перл жив, как никогда.

Я могу только надеяться, что когда сам умру, то буду таким же энергичным и активным, и стану так же быстро расти, как перл сейчас.

Грег: Многие сталкиваются с руководителями, которые считают перл умирающим языком, не говоря уже о переходе на новую работу, какой совет вы бы дали им, чтобы поддержать язык?

Ну, прежде всего, см. выше.

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

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

Такая бизнес-составляющая может включать в себя большое число великолепных программистов, которые пишут на перле, их знакомство и умения в существующих командах, огромные ресурсы свободного ПО на спане, большое число зрелых, мощных и масштабируемых фреймворков, которые сейчас доступны для перла, скорость, с которой на перле удается создавать и разворачивать системы, то, как высокоуровневая сущность перла упрощает частые низкоуровневые задачи, число больших организаций, которые на перле успешно сделали критически важные системы (например:  www.perltraining.com.au/whyperl.html#who, www.perlfoundation.org/perl5/index.cgi?companies_using_perl, www.london.pm.org/advocacy, www.proudtouseperl.com или blog.listcentral.me/2009/05/22/companies-that-use-perl).

Продать перл руководству — значит объяснить перл теми понятиями, о которых оно заботится: стабильность, надежность, мощь, эффективность, дешевизна, обслуживаемость, хорошая поддерживаемость и ориентированность на будущее.

Джозетт: Недавно Мартин Драшков написал статью «Why Perl lost it». Что вы думаете о заключительном утверждении: «Будет ли перл продолжать движение вниз, сказать трудно, но я сильно сомневаюсь, что он когда-либо вернет себе прежнюю славу — похоже, что и Perl 5, и Perl 6 не много могут предложить тем, кто перл уже не любит»?

При уважении к Мартину, чьей другой работой я восхищаюсь, я думаю, что его изначальное утверждение (о том, что перл двигается вниз) весьма сомнительно, и его последнее наблюдение сильно противоречит той реакции, которую я вижу, когда рассказываю людям о Perl 6.

Мне кажется, что последние версии и Perl 5, и Perl 6 на самом деле предлагают много того, что нравится тем, кто уже любит перл, но я думаю, что у Perl 6, по крайней мере, огромный объем того, что привлечет тех, кто прежде считал Perl 5 неудовлетворительным. От крайне передовой ОО-модели до невероятно мощных встроенных грамматик, до легкого в использовании встроенного параллелелизма, до весьма удобной множественной диспетчеризации, до хорошо интегрированным первоклассным макровозможностям, до невероятной поддержке для создания предметно-ориентированных языков, мне кажется, что Perl 6 может предложить много чего для всех разработчиков. Мы потратили десятилетие, заимствуя лучшие идеи из лучших языков программирования, и сделали их простыми и практичными для рядовых разработчиков. Я думаю, результат должен привлечь многих.

Кстати, процитированную статью все равно стоит прочесть, особенно комментарии к ней, которые более или менее развенчивают каждое утверждение, сделанное Мартином.

Грег: Многие перл-программисты сталкиваются со старой кодовой базой, полной разных стилей кодирования, часто для нее сложно написать юнит-тесты, а есть ли у вас какая-нибудь идея — серебряная пуля или хотя бы просто мысли о том, как понимать и работать с этим устаревающим кодом?

Никаких серебряных пуль, а один простой и сбивающий с толку принцип: «Начинайте изменяться... сегодня!»

Рефакторинг большого объема неоднородного кода обычно невыполним и даже не полезен (хочется сказать, что он привносит баги), но, по крайней мере, можно перестать добавлять проблемы при добавлении кода.

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

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

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

Задержка Perl 6

Дэйв: На YAPC в Лиссабоне Патрик сообщил, что первая версия Perl 6 (названная Rakudo Star) будет выпущена весной 2010. Чего вы ждете больше всего от выхода Perl 6?

Все просто: я больше всего жду, что меня перестанут спрашивать, когда выйдет Perl 6.

А серьезно, я действительно жду, что на Perl 6 будет возможно писать промышленные системы. На этом языке одно удовольствие кодировать, и очень обидно вот уже несколько лет иметь возможность программировать на нем лишь в голове. Теперь, когда Ракудо можно использовать, я переключу большую часть своей разработки на Perl 6, это как выход из заключения, о котором я даже не подозревал, что нахожусь в нем (точно так же, как это было, когда я впервые переключился с Паскаля на C, а затем с C на перл).

Еще я очень ожидаю увидеть то, что большое перл-сообщество будет делать с новым инструментом. У меня обширные планы на собственные новые проекты, но еще более я буду рад увидеть восхитительные, блистательные и самые неожиданные чудеса, которые наше сообщество создаст на основе Perl 6.

Грег: Как вы думаете, в каком году Perl 6 станет использоваться в серьезных приложениях в бизнесе, скажем в десяти крупных (с оборотом больше пяти миллионов евро) компаниях, и будут ли это разработки с нуля или на основе существующего кода на перле?

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

Что касается даты, я бы сказал, что, вероятно, для достижения нужного уровня проникновения, принятия и доверия, Perl 6 понадобится от трех до пяти лет.

Грег: Какая, по-вашему, лучшая возможность, которую получил Perl 5.x при работе над Perl 6?

Трудный вопрос. Лично мне больше всего нравится самая простая: функция say, вошедшая в Perl 5.10. Она решает то, что в Perl 5 раздражает чаще всего: непрекращающуюся нужду добавлять перевод строки в конце большинства вызовов print. Не то чтобы очень, но это снижает постоянное раздражение, которое преследовало меня по крайней мере двадцать раз на дню.

Еще я очень неравнодушен к смартматчингу и конструкции given/when. Оказалось, в своей текущей работе на Perl 5 я использую ее на удивление часто.

Дэйв: Когда выйдет Perl 6.1? И что в нем будет?

Вероятно, по крайней мере через год после Perl 6.0, который сам появится через полгода-год. Боюсь, я не слишком компетентен в этом вопросе, это полностью зависит от разработчиков.

Что касается того, что мы, скорее всего, добавим в Perl 6 в следующем основном релизе, то там, надеюсь, появится не слишком много. Вся суть дизайна Perl 6 — в попытке предоставить достаточно возможностей, чтобы недостающее было возможно добавить непосредственно из языка, а не через внедрение этого в сам язык.

Надо сказать, что я думаю, нашим интересом в то время будет потоковая модель Perl 6 и параллельные вычисления, и я ожидаю, что Perl 6.1 в этом отношении станет более продвинутым и полным.

Perl / Вычисления вообще / Все остальное

Дэйв: Какой из ваших модулей на спане самый полезный? А какой наименее полезен?

Похоже, наиболее широко используются Parse::RecDescent, Text::Autoformat и Regexp::Common. Не уверен, что это означает, что они самые полезные.

С другой стороны, можно поспорить, что чаще всего используется модуль Switch, поскольку, несмотря на его очевидные недостатки (а, возможно, именно из-за них!), он в итоге привел к тому, что в Perl 5.10 и Perl 6 добавились собственные версии given/when и смартматчинга.

Наименее полезный? Это, конечно, выяснить куда сложнее, чем хотелось бы. Очевидные претенденты — Lingua::Romana::Perligata (перл в грамматике латыни) и Coy (сообщения об ошибках, преобразованные в хайку), хотя я и знаю о том, что оба используются в продакшне.

Так что вероятно Acme::Bleach (перл, написанный одними пробелами). Особенно потому, что я знаю, что люди по ошибке пытались использовать этот модуль для «защиты» кода. Ох.

Джозетт: Мне постоянно говорят, что программы, написанные на перле, часто не могут прочитать другие перл-программисты, и что этой проблемы не возникает с программами, написанными на других языках, таких как питон. Согласны ли вы с этим утверждением и можете ли объяснить, почему так произошло?

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

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

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

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

В общем, плохие программисты будут программировать нечитаемо на любом языке. Перл лишь позволяет им делать это на самом простом и наиболее легком уровне — синтаксическом.

Грег: Если бы не существовало перла, какой язык вы бы выбрали?

Если бы перла не существовало, мне кажется, у меня бы возникла потребность его придумать. Наверное, неудачно.

На самом деле, это более или менее то, чем я занимался, когда обнаружил перл: я работал над дизайном динамического языка OOK (Object-Oriented Kernel). Но я отказался от него сразу как понял, что перл уже предлагает всю ту мощь, удобство и гибкость, к которой я стремился в собственном дизайне.

Если бы мне запретили создавать собственную замену несуществующего перла (и предполагая, следовательно, что не было бы руби), я подозреваю, что остановил бы свой выбор на питоне. Хотя я совсем не уверен, что был бы силой добра в том сообществе.

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

Грег: Какие некомпьютерные книги вы порекомендовали бы прочитать программистам?

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

Так что общий ответ, я думаю, в том, что нужно искать книги, которые расширяют сознание непредсказуемым образом, которые выносят за привычные способы размышления и видения мира, ставят под сомнение собственные предположения и уверенность. Лучшие образцы: «Дизайн привычных вещей» Дональна Нормана, «Фрикономика» Стивена Дабнера и Стивена Левитта, «Ружья, микробы и сталь» Джареда Даймонда, «Государь» Макиавелли, «Поймай меня, если сможешь» Франка Эбигейла, «Затерянные в космосе» Уокера Перси или просто что-нибудь, написанное Дугласом Хофштадтером (к сожалению, многие останавливаются на «Геделе, Эшере, Бахе»).

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

Повседневное программирование во многом монотонно. Необходимо преодолеть эту однообразность, если хочется стать лучшим программистом. А умение мыслить за пределами рамок (и даже просто признать их существование!) для такого роста необходимо.

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

Дэйв: В 2009 году в Лиссабоне вы начали заниматься другим видом обучения — персональными тренировками в тренажерном зале. Какой вид обучения вам больше всего нравится?

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

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

Грег: Представьте, что мы отправляем вас на остров, где можно программировать только на C, но мы разрешим взять с собой одну роскошную возможность из перла, какую бы вы взяли?

Определенно, управление памятью и сборщик мусора. Мне, на самом деле, нравится практический характер программирования на C, кроме утомительной необходимости делать malloc, realloc и освобождать память... особенно для строк.

Джозетт: Самое главное, будете ли вы обновлять свои книги и писать новые, если да, то когда мы можем ждать чего-то нового?

Я только что начал работу над новой книгой... про Perl 6. Надеюсь, она появится где-то в следующем году.

Что касается выхода вторых изданий, я, конечно, хочу пересмотреть «Perl Best Practices». За последние пять лет я столько нового узнал о хорошем программировании. То, как сообщество понимает слово best и имеющиеся у него инструменты, тоже значительно изменилось за это время. Но, если бы я задумался о втором издании, то надо, конечно, отследить еще несколько лет. Есть столько разных проектов, и так мало времени ими заняться.

Джозетт: 11 августа 2010 года вы согласились провести в Лондоне курс «Understanding Regular Expressions». Что получит участник такого курса? Как это поможет в его карьере?

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

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

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

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

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

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

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

Джозетт: Как я понимаю, в апреле-августе вы в разъездах. Поскольку перл-сообщество будет радо встретиться с вами или послушать вас, не могли бы вы обнародовать свой маршрут?

Конечно. Он всегда доступен на странице damian.conway.org/Events.

conway, interview, lisbon, yapc — 27 мая 2010

Карл Мэсак о Perl 6

В мае 2010 в Москве побывал Карл Мэсак, программист из Швеции, который принимает активное участие в развитии Perl 6. Мы встретились и поговорили о нем самом, о новом языке, о том, что с ним происходит и о том, как привлечь к языку большее внимание.

— Почему вы стали изучать Perl 6 и присоединились к его разработке? Это произошло не в 2000-м, а гораздо позже, когда язык был уже довольно зрелым.

— Не помню, когда я впервые услышал о Perl 6, это было где-то в 2003-2004-м. Тогда я начал читать Apocalypses и подписался на списки рассылки. А потом появился Pugs, и я втянулся в то неистовство происходящего с его разработкой. Я внес свой, совсем небольшой вклад, но при этом было очень приятно видеть, как Pugs развивается и крепнет, а Perl 6 оживает.

В 2007-м Pugs прекратил развитие, и я подумал: «Что же теперь? У нас больше никогда не будет Perl 6? Одна попытка и все?» Из-за того, что я не знал, что делать, я начал смотреть на Rakudo. В 2007-м Rakudo был еще небольшим и не мог делать многого, особенно по сравнению с Pugs, но, тем не менее, мы с другом решили его попробовать и создать движок вики. Это было летом 2008-го. То был лишь небольшой проект, который мы задумали сделать летом ради развлечения. И мы его написали :-)

— А сейчас вы создаете свою собственную «еще одну» реализацию Perl 6, Yapsi.

— Да, хотя это больше шутка. Это честная реализация, но мы по сути любители, которые пытаются делать что-то для себя, чтобы поучиться и воспользоваться компилятором для собственных нужд.

— Кто «мы»?

— Над Yapsi вместе со мной работает snarkyboojum, мы двое — основные разработчики.

— Он тоже верит, что Perl 6 когда-либо появится?

— Perl 6 уже появился. Сейчас надо заполнить пробелы. Возможно, несколько противоречиво, но я на самом деле не верю в будущую дату выхода Perl 6. На мой взгляд, он уже выпущен. Настолько, насколько возможно. Конечно, мы можем назначить дату и сказать, что в этот момент спецификация очень-очень стабильна, но это не сильно повлияет ни на меня, ни на мою программистскую жизнь. Я пользуюсь Perl 6 более или менее ежедневно. Он не сверхстабилен, но, по крайней мере, вполне реален.

— Для Perl 5 существует большой CPAN, который является сильным аргументом в разного рода спорах. А будет ли полезен Perl 6 без CPAN?

— Полезность — относительный термин, люди понимают ее по-разному. Однажды я пришел в канал #perl на irc.perl.org, мы говорили о том, полезен ли Perl 6, и мнение участников, в основном, затрагивало вопросы: «Есть ли модуль для работы с базой данных?», «Есть ли CGI?» и т. п., поскольку они так привыкли использовать CPAN, что Perl для них — и есть сам CPAN. Было бы очень большим шагом иметь хороший доступ к CPAN, но мне кажется, что и без этого Perl 6 может быть полезен в меньших задачах. Существует много маленьких скриптов, которые возможно написать на Perl 5 даже без использования CPAN. Вероятно лишь, что их полезность будет в 100 или 1000 раз меньше, так что хвастаться особо нечем.

— Вы были одним из тех, кто пытался реализовать то, что доступно в Perl 5 — модуль CGI.pm — на новом языке. Много ли сегодя подобных разработок? Существует библиотека для работы с датами и временем, доступна возможность вызывать функции libmysql, а есть ли другие проекты?

— Есть целый список проектов, упомянутых на proto.perl6.org, там где-то 30-40 проектов. Я, правда, не знаю, что эти цифры означают, потому что хотя проекты и существуют, не все из них сейчас развиваются. Некоторые, возможно, не обновлялись год. Но в общем, мне кажется, что люди заполняют потребность в коде для своих непосредственных нужд. Так что если у кого-то есть потребность подключиться к базе данных, они хотят найти простой способ это сделать: либо сделать это напрямую из Perl 6, или через Parrot или обертку на Perl 5.

— ОК, сиюминутные нужны как-то охвачены, а что в перспективе? Однажды меня спросили, будут ли новички в программировании выбирать Perl — не важно, пятой или шестой версии — после того, как появится Perl 6. Предпочтут ли они Perl другим языкам?

— Не думаю, что пока Perl 6 сам себе повод выбрать Perl 6 вместо Perl 5. Обычно, когда новички приходят в канал #perl6, они задают этот вопрос. Вопрос типа: «Привет! Я только что прочитал о Perl 6, он супер! Могу ли я не учить Perl 5?». Обычный ответ на это: «Вероятно, стоит хорошо присмотреться к Perl 5, потому что на сегодня Perl 5 куда мощнее Perl 6 и сможет решить задачи быстрее и легче». Пока изучение Perl 6 не означает, что не нужно знакомиться с Perl 5.

— Мне кажется, что изучение Perl 5 до Perl 6 напоминает освоение ламповой схемотехники перед тем, как приступить к транзисторам и микросхемам.

— Да, возможно. Но я хотел бы избежать метафоры, которая позиционирует Perl 6 как более продвинутый язык по сравнению с Perl 5.

— В то же время, Perl 6 — это второй язык в семействе Perl. Может случиться, что Perl-сообщество разделится на две части. Это возможно?

— Да, мне кажется, что мы это уже видим. Такое деление отражается и на комьюнити. Два языка в одной семье, и комьюнити со слегка разными свойствами и особенностями. Это иногда происходит и в November, началось с пары постов в блогах, потом мы с mst разговаривали в IRC. Это также заставило нас задуматься о том, как мы преподносим Perl 6. Не как следующую версию Perl 5. В некоторых случаях это правда, но такое утврждене не слишком верно, потому что это будет означать, что Perl 5 устарел, а это не так: Perl 5 будет жить еще долго.

— Что вы думаете о том, что Perl 5 перенимает некоторые элементы Perl 6, например, say?

— Я очень доволен, что это происходит. Это сближает языки друг с другом, и, кроме того, это вообще хорошая тенденция, что Perl 5 в каком-то смысле наследует фичи из Perl 6.

— Из будущего?

— Не из будущего, оба языка — сегодняшняя реальность. По сути, единственное существенное различие между Perl 5 и Perl 6 — в том, что Perl 6 — моложе и меньше. Он даже не то чтобы более футуристический, он просто делает акцент на других вещах. Мы не говорим об обратном портировании чего-то из Perl 6 в Perl 5, скорее, мы говорим о горизонтальном портировании, о переносе возможностей из одного форка в другой.

— Большое преимущество Perl 6 в том, что он полностью определен спецификацией. Но эта спецификация изменяется каждый день, поэтому невозможно закончить ее читать, не опасаясь того, что к моменту прочтения она окажется сильно измененной.

— Изменения происходят где-то раз в один-два дня. Должен сказать, что большинство изменений довольно незначительны: опечатки, грамматические ошибки, восполнение пробелов, которые нужно заполнить. Иногда, наверное раз в месяц, действительно случаются изменения в семантике, но даже они весьма малы сегодня. Мне кажется, причины изменений продиктованы в основном сегодняшней реализацией. Это очень хороший знак, в том смысле, что у нас не будет спецификации, в которой описано либо что-то невозможное, либо противоречивое, либо слишком сложное в реализации. Мы хотим оставаться практичными. Реализация в той или иной степени говорит спецификации, какой она должна быть. Здесь можно спорить, считать ли это изменениями или просто стремлением приблизиться к реальности.

— Но для новичка не существует простого и быстрого способа знакомства с языком.

— Да, и это проблема! Вот почему мы сейчас в фазе раннего тестирования, потому что нет легкого способа войти в Perl 6: нужно пожертвовать временем и приложить усилия, чтобы познакомиться.

— Есть ли способы это исправить?

— Создание документации, написание книг, руководств — всего того, в чем нуждаются новички, и разместить все это на какой-то центральной странице.

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

— Это особенно верно для Perl 6. Издано несколько книг, и в них описан синтаксис, который сегодня не компилируется. Perl 6 изменился.

— Написать книгу сложно.

— И рисковано.

— И это не даст какой-то ощутимой прибыли. Не думаете ли вы, что сегодня писать бумажные книги, в частности, о Perl 6, бесполезно?

— Я думаю, написание книги — по крайней мере своего рода психологическая победа. Мы прямо сейчас пишем книгу о Perl 6, приуроченную к выходу Rakudo *. Нам пришлось думать о том, как представить Perl 6 новичкам, как структурировать руководство размером с книгу, чтобы объяснить все аспекты Perl 6. Мне кажется, это упражнение важно само по себе. По крайней мере, из Advent-календаря в прошлом году мы видели, что создание руководств и демонстрация простых примеров — очень хороший способ привлечь внимание, способ заставить нужных людей заметить Perl 6, потому что мы описываем там все в очень сжатом виде. Это одна из целей книги.


18 мая 2010, Москва.
Беседовал и перевел Андрей Шитов.

interview, masak, perl6, yapsi, pugs, rakudo — 20 мая 2010

Разбор программы построения множества Мандельброта. Часть I

В октябре 2003 года я рассказывал о синтаксисе Perl 6 на примере программы, которая рисует фрактальное множество Мандельброта. Настало время повторить историю: если прежняя программа входила в состав самого первого прототипа компилятора языка, то теперь появились отдельные небольшие проекты, посвященные тестированию Perl 6. Сегодня речь пойдет о программе mandelbrot, размещенной на гитхабе. Интерес, прежде всего, вызывает сам язык: в прошлый раз он был намного ближе к Perl 5 и содержал лишь островки нового синтаксиса.

Небольшое отступление о том, что такое множество Мандельброта. Это фрактальная область, закрашенная на комплексной поверхности, в каждой точке c которой последовательность zn+1 = zn² + c не уходит в бесконечность при росте n (z начинается с нуля). Другими словами, суть в том, что постоянная добавка от квадрата точки будет либо компенсироваться из-за того, что мнимая единица дает отрицательную величину, либо — при большом расстоянии от начала координат — накопит бесконечную сумму.

На самом деле, математику, стоящую за множеством, придумал Пьер Фату, а Бенуа Мандельброт лишь построил картинку на компьютере, когда они появились (еще задолго до Perl 6).

Программа начинается инструкцией:

use v6;

Раньше было увлечение именовать файл с программой на Perl 6 с расширением .p6, но ведь, действительно, лучше внутри написать use v6, а расширение оставить прежним — .pl.

Далее следуют не очень интересные инициализации переменных:

my $height = @*ARGS[0] // 31;
my $width = $height;
my $max_iterations = 50;

Здесь следует обратить внимание на три факта: аргументы командной строки содержатся в глобальном массиве @*ARGS (на глобальность указывает второй сигил [твигил] звездочка), нумерация аргументов начинается с нуля, а сигил массива остается неизменным даже при обращении к отдельному элементу. Кроме того, в первой строке присутствует оператор defined-or (//), который уже больше двух лет доступен в Perl 5.10.

А дальше начинается срыв башки:

my $upper-right = -2 + (5/4)i;
my $lower-left = 1/2 - (5/4)i;

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

Программа печатает на стандартный вывод данные в формате BPM (второй вариант программы делает цветной PPM) — картинку, сериализованную в обычный текст с координатами цвета в точках.

say "P1";
say "$width $height";

for subdivide($upper-right.re, $lower-left.re, $height) -> $re {
    my @line = subdivide($re + ($upper-right.im)i, $re + 0i, ($width + 1) / 2).map({ mandel($_) });
    my $middle = @line.pop;
    (@line, $middle, @line.reverse).join(' ').say;
}

Встроенная функция say, опять же, доступна и в Perl 5.10.

Дальше идет цикл for с переменной цикла $re. Переменная объявлена после «стрелочки» ->, слева от которой стоит вызов функции, возвращающей список. Здесь же следует обратить внимание на то, что комплексные переменные предоставляют аксессоры для доступа к действительной (.re) и мнимой (.im) частям. Они доступны в переменных типа Complex, как и метод .abs (он встретится далее), возвращающий модуль числа.

Тесты к спецификации по комплексным числам находятся в файле t/spec/S32-num/complex.t.

Дальше — игнорируя алгоритм построения самого множества — код понятен, если держать в голове воплощенный в Perl 6 принцип о том, что на любом значении можно вызывать методы (если это имеет смысл). Соответственно, вместо вызова встроенных (глобальных) функций map, pop, join, reverse и say с соответствующим числом аргументов автор использует ОО-нотацию и вызывает одноименные методы (число необходимых аргументов при этом уменьшается на единицу).


Продолжение будет, но для привлечения внимания вот картинка, построенная описываемой программой:

Множество Мандельброта, построенное программой на Perl 6

mandel, range — 11 мая 2010

Апрельский релиз Rakudo — «Moscow»

28-й релиз Rakudo Perl 6 вышел под кодовым названием «Moscow».

Решение о названии, в частности, принято из-за того, что в апреле в Москву приезжал Джонатан Вортингтон, один из разработчиков Rakudo.

Сейчас компилятор проходит 30 931 тест из спецификации, что составляет около 79% их общего числа.

rakudo, moscow — 22 апреля 2010

Хакатон, посвященный Perl 6

Открылась регистрация на хакатон Perl 6 Hackathon 2010 года, посвященный Perl 6. Мероприятие состоится в Копенгагене 6 марта.

event, hackathon — 27 января 2010

Дальнейшая навигация — по ключевым словам, через поиск или по календарю.

++   --   ..   activestate   advent   array   article   articles   bbc   book   bytes   chars   chr   class   code   compile   compiler   conway   default   demo   массив   education   event   example   explanation   fast   fun   function   funding   future   given   grammar   grant   grep   hackathon   heredocs   if   internet   interpolation   invoke   japh   jnthn   kiev   length   live   lol   lt   mandel   map   masak   match   moscow   november   NQP   скаляр   хеш   operator   operators   ord   p6c   parentheses   parrot   perl   perl510   perl6   perlmova2008   perlukr08   postfix   presentation   print   production   publications   pugs   qq:to   rakudo   range   regexp   release   reverse   say   setup   sherman   site   snippet   sprixel   state   switch   talk   ternary   TPF   tutorial   tv   unicode   uniq   UPW2008   v6   variable   what   when   windows   workshop   x   xx   yapc   yapceu07   yapceu08   ~  

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

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