История Python и Zope

Лекция, прочитанная Олегом Бройтманом на встрече МЛУГ 18 февраля 2001г. Оригинал статьи находится по адресу http://moscow.lug.ru/python-n-zope.html

Автор: Олег Бройтман.
Авторские права: © 2001 Олег Бройтман и Московская Группа Пользователей Линукса.

Транскрипт подготовили: Константин Суржин и Александр Жегалло.
При использовании материалов ссылка на источник обязательна.


История...

Все началось примерно году в 90-м или 91-м, когда сотрудник голландского института CWI, тогда еще мало кому известный Гвидо ван Россум участвовал в проекте создания языка ABC. Язык был предназначен более или менее для обучения студентов программированию, основным концепциям, такой современный Паскаль.

Как-то Гвидо надоело заниматься этим на работе, он пошел домой и в течении пары воскресений на своем домашнем Mac'e написал интерпретатор некого простенького язычка, который ему самому понравился. Он в общем-то позаимствовал некоторое количество идей из ABC. Язык по каким-то причинам понравился ему больше, чем ABC, может быть, просто потому, что свой :) и Гвидо стал его распространять. То, что получилось тогда, еще нельзя было назвать версией 1.0. Он его и не назвал сразу, если честно. :)

Каким-то образом вокруг этого образовалась некоторая компания людей, которые понимали толк в языках программирования, в разработке, реализации идей, лежащих в основе языков программирования, в том числе на раннем этапе подключился довольно известный в интернете человек Стив Маевский, который до 1996 года вел в интернет страничку "сравнительная критика языков программирования". Он тоже был фанатом "макинтоша", может быть это их сблизило с Гвидо, и до сих пор он работает на Маке и по существу он - главный ответственный за патчи в питоне, связанные с Макинтошем, а в последнее время с МAC ОС X... это не совсем Макинтош, это PowerPC с FreeBSD внутри. :)

Гвидо еще с давних времен был фанатом комедийной серии BBC "воздушный цирк Монти Пайтона" (www.pythonline.com, www.montypython.net, и вообще Интернет полон цитат и ссылок); одно время у нас показывали, в течении нескольких лет, полная версия шла на RenTV по субботам или воскресеньям. Я лично не скажу, что я ее большой фанат, может я этот юмор не очень понял. Гвидо его очень любил и большое количество цитат оттуда раскиданы в mail-листе и где-то даже в исходниках встречаются. Язык назван в честь Монти Пайтона или Питона по нашему, а не в честь известной змеи.

(Позднее примечание) Кстати, слово spam, безотносительно к питону, тоже пришло оттуда же: Spam. Ну, то есть это, по-видимому, пародия на настоящий Spam :)

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

Я подключился сам к этому довольно поздно, я вообще в интернет попал в году 92 или 93 и долгое время писал на C и поэтому ничего не знал об интерпретируемых языках того времени, а потом как-то заинтересовался. Стала передо мной задача изучить что-нибудь такое более современное, и первый язык про который я услышал был, конечно, Perl. Тогда это был perl 4.036. Я прочел первую книжку "Лама" O'Reilly, как-то даже заинтересовался под воздействием людей к тому же, которые меня окружали и писали на перле, и пытался сам что-то написать и совершенно не смог. С первой программы у меня возникли проблемы, и мне посоветовали "не попробовать ли тебе питон, тебе он, наверное, больше подойдет". Очень хорошо! Как раз, буквально за несколько дней до этого вышла версия 1.4. Это была первая версия, которую я поставил и которой заинтересовался. И с первых же шагов, с первой же программы у меня все в общем-то с ним пошло удачно. И так за него я и держусь. Это не значит, что Perl плохой, а Python хороший. Это значит, что способ мышления авторов Perl отличается от моего, и наоборот, способ мышления авторов Python на мой походит. То есть каким-то людям хорош Perl, каким-то Python, и когда я говорю, что мечтаю перевести всех программистов на Python, то это я, конечно, сильно преувеличиваю :) Некоторых известных мне людей с перла на питон перевести не удается - у них постоянно проблемы и наоборот, многих людей с питона на перл перевести не удается также. Каждому стилю мышления свой язык, и нет в этом ничего особенного. Довольно долго я не очень активно пользовался питоном, потому что были другие задачи, не было времени, не было интереса, писал на C, потом стал потихоньку переходить, научился писать CGI'шки, это стало мне в общем нравиться, и я ушел с программирования служебных и системных утилит на C для UNIX'а в web-программирование, и с тех пор этим занимаюсь, и благодаря питону в первую очередь очень всем этим доволен.

Не помню когда произошел переход с python 1.4 на 1.5 и совершенно не помню что там поменялось, помню что что-то было, потому что я часть своих программных библиотек, наработанных к тому времени на 1.5, переписывал с 1.4. Там не было ничего несовместимого, то есть я мог оставить все без изменений, но что-то мне там такое понравилось, чем я захотел воспользоваться. С версии 1.5 я полностью перешел на Python и другими языками уже не пользовался, в лучшем случае какие то кусочки дописывал на C к питоновским модулям. Это год наверное 95.

До этого времени развитие Python шло примерно следующим образом: Гвидо уже к тому времени уехал из Голландии в Америку. Работал в корпорации CNRI. Работал он там в основном используя Python для тех работ, которыми занималась корпорация, а в более или менее свободное рабочее время развивал язык и интерпретатор.

Шаг в сторону. Интересной особенностью питона как интерпретатора, то что к нему почему-то очень мало патчей; если к Perl новые версии с багфиксами выходят достаточно часто, то к python хорошо если маленький патч пробегает раз в несколько месяцев, а версии типа 1.4, 1.4.1, 1.4.2, появлялись, по моему, примерно один раз в год и так это до версии 1.5.2 продолжалось, когда у Гвидо в жизни начались пертурбации, потому что корпорация, где он работал, оставляла все меньше и меньше времени ему на развитие питона, и это его перестало устраивать. Он оказался довольно упертым фанатом собственного языка :) К тому времени в интернете сложилось немалое сообщество. Он решил пожертвовать частью может быть зарплаты. Стал искать спонсора, который позволил бы ему работать именно над развитием языка и интерпретатора. И к тому времени образовавшаяся фирма BeOpen решила его подхватить, он ушел и попытался выпустить... версию 1.6 он еще выпустил в CNRI, это была, кстати сказать, контрактная версия, которую он должен был выпустить в предыдущей корпорации. В BeOpen он выпустил версию 2.0.

Версия 2.0 - это довольно большой шаг вперед, но в первую очередь в социальном плане. В этой версии самое главное, что процесс развития языка и интерпретатора стал более открытым. Гвидо перевел все исходники на SourceForge. Дерево CVS закрытое, конечно, но существует большое количество людей с которыми можно общаться, место куда можно сдавать свои патчи, bug-report.

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

Вообще, кроме этой социальной активности много чего нового; появился Юникод; это очень большой шаг вперед, на самом деле я пока этого не вижу, но вот Зоповцы думают, что следующая большая версия 2.4 будет целиком на Юникоде, вообще откажутся от ASCII, во всяком случае думают; как оно будет на самом деле - пока не понятно, потому что еще только 2.3. 2.3 вышла только что и 2.3.1 скоро выйдет.

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

Через некоторое время и в BeOpen начались проблемы. Они тоже решили, что Гвидо хорошо бы зарабатывать деньги, а не заниматься всякой фигней :) а Гвидо это не понравилось, он опять уволился и стал искать, куда бы ему деться, что довольно большой шаг для него, потому что при переходе из корпорации CNRI в BeOpen он одновременно женился. Поэтому в следующий раз уволиться ему было бы тяжелее.

(Позднее примечание) Вместе с Гвидо два раза увольнялись и переходили на новую работу еще человек 5 - команда разработчиков питона, такие же упертые и влюбленные в язык - Tim Peters, Jeremy Hilton, Barry Warsaw...

Тем не менее, он это сделал. Уволился и опять стал искать место, где бы он мог развивать язык, не обращая внимания, или как можно меньше обращая внимания на коммерческие проблемы, и тут Digital Creations - авторы Zope, решили его подхватить и, как в это время выяснилось, они его в пятый или шестой раз уже приглашали, и Гвидо сказал, что, наверное, пора уже дать им шанс, такая у него была формулировка :) и все решили, что наверное уже пора, что авторам Zope самим Python очень нужен, и чтобы его не терзать и они дадут ему возможность. Возможность у него, по-видимому, есть, потому что на горизонте виден питон 2.1, а это тоже очень большой шаг по сравнению с питоном 2.0, настолько большой, что я не понимаю, почему это не питон 3.0.

То есть там появились объекты из языков программирования под названием closures... Ну то есть правильнее было бы сказать - статически вложенные функции, что следует наверное объяснить в терминах языка скорее Pascal, потому что в языке C такого не было, были только функции и переменные верхнего уровня или локальные; в Perl тоже такого нет, хотя вложенные функции есть. В питоне появилась иерархия: можно функции вкладывать друг в друга, и они будут иметь доступ к переменным окружающих функций, и это большой шаг вперед. Он сильно меняет язык, хотя синтаксически не видно чтобы он сильно менял язык, на самом деле он сильно меняет многие подходы, и многие способы программирования будут сильно меняться, как только это будет, а это будет, потому что уже соответствующий патч есть в последних альфах. Его уже можно потестировать, как это выглядит. В общем, движется все вперед довольно интенсивно в последнее время... так что упертость Гвидо сделала свое дело :) несмотря на два увольнения и, видимо, какие-то проблемы может быть и возникают в личной жизни, но до нас ничего не доходит, а его работа видна хорошо. В этом смысле он молодец.

(Позднее примечание) Гвидо решил, что это слишком большой шаг вперед, и он не будет его форсировать в 2.1. Статические вложенные функции будут в 2.1 optional, чтобы авторы могли спокойно потестировать и адаптировать свой код.

Ну о Python, пожалуй, все. Немножко назад вернемся. История возникновения фирмы Digital Creations и Zope. Digital Creations подхватила Python довольно рано. Году, наверное, в 94, то есть, в общем, примерно тогда же, когда и я. И стали стали они заниматься web девелопментом коммерческим, обычная маленькая фирма, ничего интересного из себя не представляющая.

Году в 96 к фирме присоединился Джим Фултон, ничего, по-видимому, не знающий о web девелопменте, но довольно хорошо разбирающийся в питоне, в тонкостях реализации, и вообще - человек, хорошо понимающий языки программирования, разные тонкие концепции объектно-ориентированные. Большой любитель объектно-ориентированного программирования, он хорошо его понимает и хорошо умеет его использовать.

Одно из первых с чего он начал, ему предложили где-то прочитать лекцию по протоколу CGI, а он ничего об этом не знал, и пока они летели в самолете Пол Эверит, начальник Digital Creations, прочел ему лекцию о CGI, с этой лекцией в голове Джим поехал на конференцию, где он должен был эту лекцию прочесть, успешно ее прочел, а после лекции подошел к Эвериту и к другим возможно членам Digital Creations, ужаснулся и сказал "что это такое, это что за протокол такой!" Его поразил протокол CGI своей, чрезмерной простотой. Хотя надо сказать, что именно благодаря этой простоте WEB стал тем, что мы имеем сейчас :)

Но к тому времени Джим решил, что это уже стыдно - иметь такие протоколы, и надо писать что-то объектно-ориентированное, и был задуман первый брокер объектных запросов, который расшифровывал URL и не просто следовал каким-то простым заданным правилам, но честно в дереве объектов искал нужный объект и вызывал его на выполнение. Так появился первый объектный брокер. И Digital Creations создала два продукта - один коммерческий, который они использовали внутри, а часть этого продукта они сделали более или менее с самого начала Open Source, назывался он BоBo Object Publisher.

Долгое время все что они делали развивалось у них внутри, они занимались коммерцией, делали сайты или продавали свою коммерческую программу, делали по ней консультации, за счет этого делали деньги, в основном ориентировались на новостевые сайты, на потоки новостей, как-то у них так сложилось. Потом они решили, что наверное пора и остальную часть коммерческого софта, который у них есть, открывать, и, по-моему, в середине где-то августа 99 года они опубликовали то, что стало Zope версии... по-моему они с самого начала это назвали 1.9. Видимо, это у них внутри довольно давно развивалось. Они решили что на подходе будет версия 2.0, которая будет совсем открыта.

Так оно и оказалось, потому что 1.9 была под более строгой лицензией, довольно свободной, но там было обязательно иметь на сайте ссылку на Digital Creations. А в 2.0 было уже необязательно, просто рекомендовано, то есть исходники стали совершенно свободными, бери Zope, ставь его, используй и вперед - наслаждайся жизнью :) Они тоже не сразу все открыли, они открыли довольно большую часть Zope, но некоторые значительные компоненты, которые на самом деле в маленьких сайтах особо не нужны, а нужны только для крупных сайтов, долгое время не открывали - компонент ZTable, для манипуляций с большими таблицами данных, компонент Zope Enterprise Option для кластеризации нескольких Zope в один большой сайт. Через некоторое время ZTable, по-моему, совсем перестали развивать, а Zope Enterprise Option был открыт, то есть его также можно скачать, как все остальное и использовать.

Сейчас, по-моему, совсем не осталось каких-то не открытых частей. Все исходники раздаются, а деньги они делают за счет создания сайтов или консультаций по своим продуктам, поэтому для них какая-то часть работы над кодом, какая-то часть консультаций в mail-листах не обсуждается вообще. Вопросы, скажем, про DCOracle - переходничек между питоном и Оракловыми библиотеками, они никогда не обсуждают; пользователи обсуждают, задают вопросы между собой, а DC никогда никому не помогают в этом вопросе, потому что это важный компонент, видимо, для их коммерции, и они не помогают народу его использовать, что зря, потому что, может быть, если бы они его развивали и тщательнее прислушивались к мнению народа, они бы и сами получили от этого больше выгоды. Говорят же они сами, что с тех пор, как они открыли Zope, их бизнес увеличился в 3 раза!

Значит, при переходе от версии 1.9 к 2.0 кроме лицензии, по-моему, мало что изменилось. Году в конце, в самом конце 99 года. Но в течении 2000 года народ довольно быстро подхватил исходники, стал их развивать, и версия за версией вышли 2.1 и 2.2. Довольно значительные изменения появились, появился и новый язык шаблонов... если старый язык шаблонов у них больше похож на апачевский SSI (типа <!--#var foo-->), то новый больше похож на XML (<dtml-var bar>), он проще для набора, легче для пальцев и, видимо, они решили, что он легче для разбора, потому что они явно советуют переходить на него, и старый язык через некоторое время совершенно перестанут поддерживать.

Точно не помню уже, что было при переходе от 2.1 к 2.2... В 2.3 сделан совсем большой шаг, появился виртуальный хостинг; если раньше для виртуального хостинга надо было извращаться с Apache, ставить сложные модули - мой модуль pcgi или FastCgi, то сейчас виртуальный хостинг можно сделать на чистом Zope; там тоже не хватало немножко, в версии 2.3.0 можно было сделать виртуальный хостинг только на корне сервера. Я некоторое время попереписывался с автором компонента для виртуального хостинга, уговорил его внести необходимые изменения и вот на днях выходит 2.3.1 со всеми новыми прибамбасами, с новым очень хорошим виртуальным хостингом, продвинутым по полной программе... ну, пожалуй, все.

Дополнение

В этой лекции я ничего не сказал про JPython, поэтому допишу в транскрипт. Сам я этим ЯваПитоном не пользуюсь, поэтому и забыл его упомянуть. JPython - довольно позднее изобретение. Первая версия появилась уже после выхода python 1.5.2. JPython - это пакет, состоящий из двух частей. Часть первая - интерпретатор Питона, написанный на Яве. И вторая - компилятор Питона в явский байт-код. То есть если мне понадобится писать Java-апплеты, я их тоже буду писать на Питоне :) Один раз, в порядке эксперимента, я и написал HelloWorld, но потом забросил - не понадобилось. Я пишу CGI, а на клиентской стороне - JavaScript.

Вопросы

В чем отличается Perl от Python? Perl от Python - ни в чем! Два практически идентичных языка - они отличаются в основном синтаксисом... Я скажу честно - Perl я знаю не очень хорошо. Вообще у меня программирование на Perl как-то никогда не получалось. Был печальный случай, когда меня заставляли писать на нем, поскольку не было другой работы в связи с кризисом 98-го года, кроме как программирование на Perl. Я так его толком и не освоил. И как только предоставилась возможность уйти в программирование на Python, я немедленно ушел. У Perl большая проблема с синтаксисом в объектно-ориентированном программировании - его классы с точки зрения синтаксиса странны.

Я никого не знаю, кто бы на самом деле писал на Perl классы. Если кто-нибудь пробовал писать объектно-ориентированно на Perl, то у него возникнут проблемы - с ходу такие классы не напишешь, придется брать чужие тексты и переделывать их по-своему. А в Python - стандартный синтаксис, который похож на Pascal и на C++.

Потом у Perl, как и у UNIX - огромное количество рычагов и масляных трубочек торчат наружу, и иногда из них очень сильно подтекает... но это тоже часть проблемы синтаксиса, а у Python из этих трубочек не течет. Они, в общем, все упрятаны довольно глубоко. При этом они доступны не меньше, чем в Perl, но они в синтаксисе не мелькают в тех местах, где не должны.

Например, если ты пишешь в Perl механизм наследования и объявляешь: этот класс является наследником того, то у тебя вот прямо есть отдельный массив ISA (что означает is-a) в котором ты должен написать, что этот класс является наследником того. В Python синтаксис наследования проще, а при этом этот массив, который в Python соответствовал массиву ISA тоже существует. Понятно, что если в Perl есть такой массив, то ты через некоторое время можешь на ходу программы поменять, не по ходу разработки, а по ходу работы программы - можно менять механизм наследования. В Python такой механизм тоже есть, но поскольку само изменение механизма наследования используется нечасто, то этот массив упрятан глубоко внутрь, но при желании до него можно добраться легко. Я бы не сказал, что это существенное отличие.

CPAN для Python? Есть, но пока там только ссылки на модули и описания, но сейчас вот, буквально несколько дней назад закончился очередной этап дискуссии "как нам реорганизовать рабкрин", я в ней тоже участвовал,потому что я, конечно, очень хочу, я сам Perl не люблю, но считаю, что CPAN - очень правильная вещь, и что Python тоже нуждается в такой штуке, и я участвую в том, чтобы что-то такое появилось в большем масштабе.

С переходом Гвидо в Digital Creations возникает интересная тонкость - дело в том, что Zope добавил в Python интересный механизм. В Python существует дихотомия между типами данных и классами. От классов можно наследовать обычным способом, от типов наследовать нельзя, и это иногда раздражает. Допустим, нужен какой-то особенный класс-список, но от типа "список" унаследоваться нельзя, поэтому приходится применять хитрый и очень неудобный механизм делегирования.

А в Digital Creations тот самый Джим Фултон написал механизм ExtensionClass, который залезает глубоко в интерпретатор Python и позволяет от типов наследоваться. Не совсем обычным образом, правда, то есть это все еще не совсем наследование. Но, по крайней мере, так, примерно наполовину, решение проблемы. С переходом Гвидо в Digital Creations, наверно, этот механизм будет доведен до ума и дихотомия между типам и классами исчезнет совсем и все объекты станут нормальными классами.

Строки станут более или менее нормальными объектами, имеющими методы. Это по разным причинам произошло: как по причине появления юникода, например, появились два разных объекта строка - простая и юникодовая строка. Хочется, чтобы над ними осуществлялся более или менее одинаковый набор операций. Поэтому объект строка - строка.join, строка.split, строка.encode - преобразование ascii в unicode осуществляет.

Ссылки по теме