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

Можете ли вы ждать, пока разработчики программного обеспечения включат в свою программу нужную вам операцию? А что делать, если ее нужно выполнять чуть иначе для каждого из тысячи объектов? Мы назвали «болевые точки»? Значит, вы готовы к следующему шагу в освоении компьютерного пространства — пора познакомиться с такими понятиями, как сценарий (script).

До недавнего времени сценарные языки не находили широкого распространения при работе на персональных компьютерах. Местом их применения были мощные рабочие станции с операционными системами семейства UNIX. Однако сегодня средний ПК — это суперкомпьютер по меркам недалекого прошлого. Уже не так важно, что сам по себе сценарный язык — интерпретируемый и по сравнению с компилируемыми языками программы на нем исполняются медленнее (есть иная точка зрения [1]). Существенно другое: сценарные языки позволяют кратко и выразительно описать требуемые действия, существенно сократив общее время решения проблемы.

Между сценариями и «настоящими» программами граница очень расплывчатая. Сценарий — это та же программа, но управляющая целыми программными компонентами. Любая достаточно сложная программная система имеет возможности для написания сценариев. Разнятся языки, их гибкость и специализация, но остается главное — возможность программного управления средой.

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

Эти языки часто применяются для системной интеграции, чтобы «склеить» разнородные программные компоненты или среды. Для таких приложений не столь важна скорость выполнения программ на сценарном языке, сколько возможность интеграции (расширения, встраивания) в любые программные системы. Существует немало сценарных языков: Perl, Tcl, Python, PHP, Lua, Rep, Ruby, Pike. Одним из наиболее интересных в этом ряду является язык Python.

Особенности языка Python

История языка Python началась в 1991 г., когда Гвидо ван Россум приступил к работе над ним. Впоследствии он назвал его Python (по словам автора, вовсе не в честь змеи, а в честь шоу на BBC «Monty Python?s Flying Circus»). В основу языка были положены следующие принципы:

  • простота и удобство программирования,
  • наглядный синтаксис,
  • объектная ориентация,
  • возможность расширения,
  • встраиваемость,
  • переносимость,
  • свободное распространение.

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

Одним из недостатков языка Python считается невысокое быстродействие написанных на нем программ (однако см. www.bagley.org/~doug/shootout/). Этот недостаток с лихвой компенсируется скоростью разработки программ на Python. Некоторые разработчики замечают, что это единственный язык, на котором они могут писать программы со скоростью мысли, не отвлекаясь на сооружение вспомогательных конструкций, отчасти из-за того, что нет необходимости описывать типы, отчасти благодаря наличию высокоуровневых типов данных, например списка или словаря (хэш, ассоциативный массив).

Задумывался Python и как язык для опытных пользователей-непрограммистов. Этому был посвящен даже проект Computer Programming for Everybody (CP4E, программирование для всех), а сейчас образовательными аспектами Python занимается специальная группа Edu-SIG (Special Interest Group).

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

Этим языком поддерживается несколько парадигм программирования, в том числе функциональное программирование (ФП). Ярким представителем языков этого направления является Лисп. Конечно, никто не заставляет умещать всю программу в одно выражение, но элементы функционального стиля часто используются в программах на языке Python.

ФП приводит к существенному сокращению объема кода программы и при грамотном подходе к построению алгоритма — к большему быстродействию.

Уникальная особенность языка Python — использование отступов для выделения блоков операторов в программе. Автор языка исходил из того, что программисты для наглядности все равно делают отступ, так зачем же заставлять их вводить бесконечные скобки, когда изменение отступа само по себе способно отмечать начало и конец блока. Эту особенность языка обычно сильно критикуют те, кто не писали программы на Python или не привыкли делать отступы.

На Python создано значительное количество полезного ПО. О больших коммерческих проектах, в которых используется Python, можно узнать на www.python.org/psa/Users.html. На языке Python пишут и ПО для систем реального времени.

Примеры программирования на Python

Для начала рассмотрим что-нибудь несложное, например программу для поиска простых чисел от 1 до N (см. листинг 1).

Листинг 1
import math
N = input("Введите N: ")
if N > 1:
print 2,
for number in xrange(3, N+1, 2):
for divisor in xrange(3, math.sqrt(number)+1, 2):
if number % divisor == 0:
break
else:
print number,

Для N=100 получается ряд:

2 3 5 7 11 13 17 19 23 29 31 37 41
 43 47 53 59 61 67 71 73 79 83 89 97.

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

  1. Выделение операторов в блоки осуществляется с помощью отступов.
  2. Цикл for работает с последовательностью. Очевидно, что xrange() строит необходимую последовательность.
  3. Функция xrange(A, B) — и это проявляется везде в Python — порождает числа от A до B, не включая B. Подобный подход (использование полуоткрытых интервалов) может показаться на первый взгляд странным, но на самом деле он очень логичен при программировании.
  4. Функция sqrt (нахождение квадратного корня) берется из стандартной библиотеки.
  5. Оператор цикла for (и это сюрприз!) имеет часть else, которая выполняется только в том случае, когда цикл не был прерван по break, а исполнился до конца. В нашем случае именно это и нужно: если делитель не был найден, мы заявляем, что число простое.

А теперь маленький фокус, требующий отдельного пояснения: при создании программы использован интерактивный режим интерпретатора Python (см. листинг 2).

Листинг 2
>>> a = [1, 2, 3]
>>> b = a
>>> a[0] = 0
>>> print b
[0, 2, 3]

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

В следующей программе (см. листинг 3) мы выделим из текста все URL-ссылки и напечатаем полученный список, сгруппированный по хостам.

В этой программе тоже есть особенности:

  • Python позволяет вызывать функцию для произведения действий над найденным фрагментом. Мы пользуемся этим для занесения хостов в словарь.
  • Используется встроенный высокопроизводительный метод sort().
  • Присваивание может производиться сразу для списка значений. Этот прием применен в программе два раза:
    «host, url = ...» и «for
     (host, urls) in ...».
  • Основная хитрость заключена в составленном регулярном выражении. Python использует регулярные выражения, которые совместимы с утилитой grep от GNU, выражениями языка Perl и поддерживают Unicode.

    В нашем примере регулярное выражение было «скомпилировано», чтобы последующие его применения выполнялись быстрее.
  • Регулярное выражение записано в тройных кавычках. Строки Python можно записывать внутри апострофов, кавычек, тройных кавычек, тройных апострофов. Тройные кавычки (или апострофы) позволяют записывать текст на нескольких строках.
  • Наверное, вы обратили внимание на выражение ""*4. Тот же прием пригоден для других последовательностей.

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

Листинг 4
import os, glob, string
print string.join(filter(os.path.isdir,
 glob.glob("*")), "
")

Метод glob() порождает список файлов, удовлетворяющих шаблону "*", т. е. все нескрытые файлы и каталоги. Функция filter() для каждого элемента этого списка вызывает функцию os.path.isdir(), чтобы проверить, является ли указанное имя именем каталога. Наконец, string.join() объединяет все элементы списка в один текст, используя признак конца строки в качестве разделителя.

А вот как выглядит программа (заимствована из справочника FAQ по языку Python), показывающая, как получить список простых чисел, меньших 1000 (см. листинг 5).

Листинг 5
print filter(None,map(lambda
 y:y*reduce(lambda x,y:x*y!=0,map(lambda
 x,y=y:y%x,range(2,pow(y,0.5)
+1)),1),range(2,1000)))

Конечно, это скорее курьез, но игнорировать элементы функционального программирования в Python — значит не использовать очень мощные средства, подчас делающие программы компактнее, понятнее и быстрее. В этом примере применены три коронных приема функционального подхода: map(), reduce() и filter(). Функция map(f, list) порождает новый список, применив к нему f(). Функция filter(f, list) порождает на основе list список, куда входят только те элементы list, которые дают логическое значение «истина» (в языке Python такими являются непустые и ненулевые значения). Наконец, reduce(f, list) позволяет организовать цепочечные вычисления. Например, вычислить факториал от 1000 можно с помощью следующего оператора:

print reduce(lambda x, y: x*y,
 range(1, 1000), 1L)

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

В языке Python все используемые величины являются объектами, даже функции, классы и модули. Описать собственный класс очень просто. Класс без атрибутов будет аналогом структуры (записи). Соблюдение инкапсуляции объекта лежит на совести программиста: атрибуты являются только открытыми (public), а для акцентирования их приватности (private) имена начинаются с «_» (подчеркивание). Атрибуты, которые начинаются с двойного подчеркивания (но не заканчиваются им!), можно считать аналогом приватных имен, так как доступ к ним затруднен необходимостью указывать имя класса (см. листинг 6).

Листинг 6
————————————————-
class A:
def __init__(self):
self.__secret = 12312
a = A()
# print a.__secret #
 вызывает ошибку, а вот:
print a._A__secret # позволит
 обратиться к __secret

Все методы в языке Python являются виртуальными. Более того, атрибуты можно динамически заменять, добавлять и удалять в уже созданном экземпляре класса. Python поддерживает множественное наследование. Полиморфизм не является отдельным свойством, передаваемым «по наследству»: любой класс, предоставляющий те же методы, что и некоторый другой, будет с ним совместим «по типу» (не вообще, а для определенных операций). Такой подход называют сигнатурным полиморфизмом (signature-based polymorphism). Он позволяет создавать, например, файлоподобный объект, который можно применять везде, где допустимо использовать обычный файловый объект, так как в классе описаны все нужные методы (read, write, close...).

В языке Python также есть средства для переопределения операций. Все встроенные операции можно переопределить, описав методы со специальными именами.

Еще одной особенностью Python является то, что в нем не считается зазорным обращаться напрямую к атрибутам (разумеется, только к тем, о которых договорились, что они открыты для доступа), поэтому текст не засоряется всевозможными get_x/set_x. Это может показаться кощунством с точки зрения канонов ООП. Однако то, что выглядит как обращение к атрибуту, на самом деле может быть работой специального метода, который перехватывает обращения к атрибутам... В силу того что классы тоже являются объектами, есть возможность организации метаклассов, но это уже высший пилотаж объектно-ориентированного программирования.

В примере объектно-ориентированного программирования на Python (см. листинг 7) мы описываем класс Set, моделирующий множество из некоторых элементов. Наверное, нетрудно догадаться, что данный класс имеет несколько методов, в том числе для задания операций, начинающихся и оканчивающихся двойным подчеркиванием «__», а также конструктор __init__ и один атрибут «_dict», который, собственно, и хранит элементы множества. Этот атрибут является словарем — встроенным типом языка Python, по-другому его можно назвать ассоциативным массивом или хэшем. Мы используем именно этот тип данных, так как ключи в словаре всегда уникальные. (Вместо значений используется 1, так как нам важно лишь присутствие или отсутствие ключа, а не его значение.)

Метод __len__() — специальный метод, который вызывается теми, кому нужна длина объекта, скажем, при вызове встроенной функции len(obj). Наверное, вам уже понятно, что __add__() служит для задания бинарной операции «+» над объектом класса Set. Кроме функции __add__ есть еще и __radd__, которая вызывается, если объект стоит справа, а не слева от операции, и «левый» объект не имеет операции __add__. Это позволяет складывать множества и списки, получая в результате множества. Методы __str__ и __repr__ представляют объект в виде строки, например, в операторе print или при явном преобразовании по str(obj) или repr(obj).

Каждый из методов имеет первым аргументом сам объект. По традиции он называется self.

Деструкторы в Python требуются очень редко — только для освобождения каких-либо внешних ресурсов. Объект исчезает, когда исчезает последняя ссылка на него, т. е. del obj удаляет не объект, а всего лишь одну ссылку (конечно, это могла быть последняя ссылка).

Знакомство с языком Python будет неполным, если не привести пример создания пользовательского интерфейса (см. листинг 8). Для этого в Python имеется большой выбор различных инструментов. Используя модуль Tkinter (из стандартной поставки Python), напишем программу, которая будет работать на любой платформе одинаково.

Реализация игры достаточно тривиальна: на сетке (grid) размещаются кнопки, которые, за исключением одной, являются фишками. Атрибут _cells содержит словарь, позволяющий находить объект-кнопку по координате и, наоборот, находить координаты и имя на кнопке по объекту-кнопке. Атрибут _empty_place содержит координаты пустой клетки. С каждой кнопкой связано действие _move_to_empty, выполняемое при наступлении события Button-1 (нажатие левой кнопки мыши). Атрибуты _rows и _cols содержат размеры игрового поля, которое в классическом варианте составляет 4Ё4 (в заголовке определения метода __init__используются значения по умолчанию). Наверное, этого достаточно, чтобы понять логику работы класса Fifteen.

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

В приведенной программе использован метод упаковки grid (). Он удобен во многих случаях. Однако Tkinter предлагает еще два метода: place() и pack(). Первый позволяет располагать объекты в произвольном месте фрейма, а второй — «паковать» объекты с определенными видами привязки друг к другу.

Кстати, вы, вероятно, догадались, что Tkinter — это интерфейс к Tk из Tcl/Tk. В качестве упражнения попробуйте в приведенном листинге найти еще одну полезную мелочь, отличающую Python от других языков программирования. Подсказка: эта мелочь находится в методе Shuffle().

Заключение

Обычные языки программирования очень сложны для пользователя, так как далеки от той области деятельности, которой он занимается. И здесь на выручку приходят сценарные языки. Внедряя сценарии в приложения, пользователь получает возможность гибко управлять программным обеспечением с использованием полноценных алгоритмов.

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

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

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

Об авторе

Сузи Роман Арвиевич — инженер-программист, e-mail: rnd@onego.ru.

Литература
  1. Прехельт Л. Эмпирическое сравнение семи языков программирования // Открытые системы. 2000. № 12, www.osp.ru/os/2000/12/045.htm.
  2. John K. Ousterhout Scripting: Higher Level Programming for the 21st Century //www.scriptics.com/people/ john.ousterhout/scripting.html.
  3. Бройтман О. Драматическая история Python и Zope: Цикл лекций // Софтерра, 2001, www.softerra.ru/review/oses/linux/ 10454/index.html?from=rsp.

Критерии выбора сценарного языка

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

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

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

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

Пользовательская база. Хорошим показателем объема пользовательской базы является активность в группах новостей и списках рассылки. Косвенным признаком может служить число ссылок, выдаваемых поисковыми серверами при введении имени языка, дополненного, например, словом «programming».

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


Язык Perl

Наверное, это самый известный сценарный язык, пользующийся заслуженной популярностью у системных администраторов и Web-мастеров. Perl был создан Ларри Уоллом в конце 1980-х годов (версия 1.0 вышла в свет в 1987 г.). Название Perl происходит от сокращения Practical Extraction and Report Language («практический язык извлечения данных и формирования отчетов»), что достаточно точно отражает его назначение: просмотр и обработка текстовых файлов с извлечением информации и построением отчетов на основе полученных данных. Истории языка Perl посвящен целый сайт http://history.perl.org , где его эволюция дана в контексте других достижений программной индустрии.

В ОС UNIX язык Perl пришел на смену таким инструментам, как sed, awk и sh в задачах, которые, с одной стороны, не совсем тривиальны, а с другой, недостаточно «серьезны», чтобы применять Cи. Сейчас Perl используется за пределами UNIX и не только для обработки текстов. Самое активное применение Perl наблюдается в написании CGI-сценариев для Web-среды. Более того, сама аббревиатура CGI у многих прямо ассоциируется с Perl!

На Perl написано бесчисленное количество модулей, многие из которых свободно доступны через сеть CPAN (Comprehensive Perl Archive Network, своего рода «полное собрание сочинений» для Perl). Но основная сила языка и среды не в количестве и номенклатуре написанного для них ПО. Среда Perl поставляется бесплатно. И это подчас отпугивает некоторых людей, по-видимому полагающих, что хорошее ПО может быть только коммерческим. Они не учитывают, что разработка и особенно поддержка популярного бесплатного продукта может быть поставлена (как в случае Perl), пожалуй, даже лучше многих платных продуктов. Вокруг Perl сложилось довольно значительное сообщество пользователей и разработчиков, пронизанное духом сотрудничества и бескорыстной взаимопомощи. Вы всегда найдете поддержку в списках рассылки, телеконференциях, IRC-каналах, WikiWikiWeb и других местах, посвященных среде Perl.

О самом языке Perl можно сказать, что он очень разнообразен в своих синтаксических проявлениях. Основное кредо Perl: любую задачу можно решить разными путями. По этой причине он, возможно, не самый подходящий язык для начинающих. Язык Perl хорош при создании небольших программ и сценариев с интенсивной обработкой текстов. Секрет мощи Perl в его доступности и в наличии развитого аппарата регулярных выражений. Несмотря на то что язык Perl реализован в виде интерпретатора, на задачах обработки текста он, как правило, работает лишь раза в два медленнее кода на Cи [1]. А если учесть, что при этом код может быть в несколько десятков раз короче, преимущество в скорости создания программ и использовании Perl для таких задач становится очевидным.


Язык Tcl

Говоря о сценарных языках, невозможно обойти стороной язык Tcl (Tool Command Language, «язык команд для инструментария»; произносится «тикль»). Его часто называют Tcl/Tk, дабы подчеркнуть тесную связь с инструментарием Tk, предназначенным для построения графического интерфейса. Создатель языка Джон Устераут (ныне работающий в компании Interwoven) занялся разработкой Tcl с целью получить хороший интерпретируемый язык, который можно было бы встраивать в другие программы для управления ими [2]. До этого каждое программное средство предлагало свой командный язык, часто очень невысокого качества. От Tcl не требовалось слишком многого — минимум переменных, операторов для организации потока управления, функций для работы со строками и т.п. Инструментарий Tk стал следующим детищем автора и задумывался как средство для организации графического интерфейса (столь модного направления в 1990-х годах). Стоит пояснить, что автор поначалу занимался средой Tcl/Tk прежде всего для решения задач своей лаборатории.

Программное обеспечение для поддержки научных разработок обычно строится на основе ядра, которое занимается собственно расчетами (это так называемый back-end), а уже к этому ядру по мере необходимости пристыковываются необходимые интерфейсы оболочки (т. е. front-end). Впрочем, подобный подход используется не только в научном программном обеспечении, но и в разных видах коммерческого и бесплатного ПО. Так, в частности, программа mpg123 для проигрывания MPEG-файлов имеет лаконичный интерфейс командной строки. Однако вы легко можете найти несколько десятков оболочек, разработанных как для текстового (а-ля Turbo Vision или Norton Commander), так и для графического интерфейса. Разумеется, часть этих оболочек выполнена на Tcl/Tk.

Именно для подобных вещей (высокоуровневого управления приложением снаружи или изнутри) Tcl применяется и по сей день, а Tk является одним из стандартов программирования графического интерфейса. В отличие от многих других он остается переносимым и одинаково успешно работает на старых Macintosh и современных UNIX-станциях. Существует объектно-ориентированная разновидность Tcl — incr Tcl (прямая аналогия с Cи++; incr обозначает инкрементирование). Историю Tcl можно найти на http://tcl.activestate.com/doc/tclHistory.html.


Свободно распространяемые продукты для Python

Zope [3] — сервер Web-приложений (аналог сервера Cold Fusion фирмы Allaire), позволяющий создавать и наполнять сайт с активно меняющимся содержимым не только профессиональным программистам, но и редакторам.

www.zope.org, http://zope.net.ru.

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

http://sourceforge.net/projects/numpy/

Scientific — еще одно «научное» расширение Python. Набор модулей, предоставляющих различные сервисы: геометрические объекты (векторы, тензоры и т.п.), статистические процедуры, перевод единиц измерений, визуализацию (в том числе с использованием VRML) и др.

http://starship.python.net/crew/hinsen/scientific.html

4Suite — набор фирмы Fourththought для работы со спецификациями XML, XPath, XSLT, DOM, RDF, ODS.

www.4suite.com

PyXML — пакет для работы с XML, схожий по функциям с 4Suite. Во второй версии появился интерпретатор встроенной поддержки Unicode, что делает Python идеальным средством для работы с XML. Включает SAX, DOM, интерфейс к синтаксическому анализатору Expat и т.п.

http://sourceforge.net/projects/pyxml/

Python Imaging Library (PIL) — пакет для обработки изображений фирмы Secret Labs AB. Позволяет загружать и редактировать изображения в различных (растровых) форматах.

www.pythonware.com/pil/

Sketch — векторный графический редактор, написанный почти целиком на Python (критичные части выполнены на Cи). Кроме функций собственно редактора предоставляет среду для работы с векторной графикой, в которой сценарные функции принадлежат Python. Только для UNIX.

http://sketch.sourceforge.net

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

http://grail.sourceforge.net

Pyne — почтовый клиент и обработчик новостей, написанный на Python. Только для UNIX.

www.yikesstation.freeserve.co.uk/pyne/

Mailman — ПО для организации списков рассылки. Имеет все необходимое для шлюзования с группами новостей, формирования дайджестов, ведения архивов и т.п.

www.list.org

Alice — интерактивная трехмерная графическая среда, создана в университете Карнеги-Меллон. Только для Windows.

http://alice.cs.cmu.edu

ILU — среда унификации языков, совместимая со спецификацией CORBA; создана в исследовательском центре Xerox PARC.

Jython — реализация Python, обеспечивающая компиляцию в байт-коды виртуальной Java-машины. Для тех, кто хочет использовать Python в Java-среде. По мнению пользователей, более удобен при написании графического интерфейса, чем Swing/AWT фирмы Sun Microsystems. Очень хорошо интегрирован с Java (поддерживает прозрачное использование Java-пакетов).

www.jython.org


Полезные ссылки

www.tcltk.com

Инструментарий Tcl/Tk

www.iso.ru/cgi-bin/main/journal.cgi

Язык Perl

www.python.org

http://pythonrus.chat.ru,

http://zope.net.ru

Язык Python

www.rusdoc.ru/python.shtml

Подборка переводных статей о Python.

www.cwi.nl/~sjoerd/PythonVsTcl.html

Сравнение Tcl и Python.

www.iso.ru/cgi-bin/main/journal.cgi

Web-журнал InterSoft; содержит постоянную рубрику, посвященную Python.

www.bagley.org/~doug/shootout/

The Great Computer Language, Shootout — интересный проект, содержащий средства для тестирования большого набора языков программирования.