Без названия и без подзаголовка

История Python. Введение и обзор

Введение

Python, наряду с Perl, Tcl, PHP и новичком Ruby, является одним из самых популярных динамических языков программирования. Несмотря на то что его часто рассматривают язык сценариев, на самом деле это язык программирования общего назначения, как Lisp или Smalltalk (и как все остальные). Сегодня Python применяется очень широко, начиная от скриптов «написал-забыл» до больших масштабируемых веб-серверов, которые предоставляют бесперебойные сервисы 24 часа 7 дней в неделю. Он используется для программирования GUI, баз данных, клиентского и серверного веб-программирования, а также для тестирования приложений. Он используется учеными, пишущими приложения для самых быстрых суперкомпьютеров и детьми для обучения программированию.

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

Благодарности: я признателен Дейву Бизли (Dave Beazley) за большое количество отличных идей для этого блога. (Более подробно о происхождении этого блога смотрите в другом моем блоге).

Python с высоты птичьего полета

Когда кто-то сталкивается с Python, то зачастую он бывает поражен тем, как выглядит код Python. На первый взгляд, он похож на код других традиционных языков программирования, таких как C или Pascal. Это не случайно — синтаксис Python активно заимствован из C. Например, многие ключевые слова (if, else, while, for и др.) такие же как в C; у идентификаторов в Python такие же правила именования как и в C; большинство стандартных операторов имеют такое же значение как в C. Очевидно, что Python это не C, и главная область различий заключается в использовании отступов вместо скобок для группировки составных операторов. Вместо написания групповых операторов в C, например таких как эти:

if (a < b) {
    max = b;
} else {
    max = a;
}

Python вполне обходится без скобок (в большинстве случаев и без завершающих точек с запятой) и использует следующую конструкцию:

if a < b:
    max = b
else:
    max = a

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

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

Для организации программ, Python поддерживает пакеты (группы модулей и/или пакетов), модули (связанный код сгруппирован в один файл), классы, методы и функции. Для управляющей логики, предоставлены if/else, while и высокоуровневое выражение for, перебирающее все значения «перечисляемого» объекта. Для обработки ошибок в Python использует (безвозвратные) исключения. Групповой оператор инициирует исключение, а try/except/finally конструкция определяет то как это исключение будет обрабатываться. Встроенные операторы вызывают исключения, когда сталкиваются с ошибочными условиями.

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

Python имеет богатую стандартную библиотеку, которая является одной из главных причин его популярности. Стандартная библиотека имеет более 100 модулей и постоянно развивается. Некоторыми из этих модулей включают поиск по регулярным выражениям, стандартные математические функции, потоки, интерфейсы операционной системы, сетевое программирование, стандартные интернет-протоколы (HTTP, FTP, SMTP и др.), работу с почтой, обработку XML, HTML парсинг и наборы GUI инструментов (Tcl/Tk).

В дополнение ко всему, есть еще огромное количество сторонних пакетов и модулей, большинство из которых представляют ПО с открытым исходным кодом. Здесь можно найти веб фреймворки (слишком много перечислять!), GUI инструменты, и эффективные численные библиотеки (включая оболочки для многих популярных Fortran-пакетов), интерфейсы к реляционным базам данных (Oracle, MySQL и другим), SWIG (утилита для использования произвольных библиотек C++ в качестве модулей в Python), и многое другое.

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

# Сканирование веба для поиска ссылок

import re
import urllib

regex = re.compile(r'href="([^"]+)"')

def matcher(url, max=10):
    «Печатаем первые несколько ссылок для переданного URL.»
    data = urllib.urlopen(url).read()
    hits = regex.findall(data)
    for hit in hits[:max]:
        print urllib.basejoin(url, hit)

matcher("http://python.org")

Эта программа может быть легко модифицирована для создания поискового робота. В самом деле, Скотт Хассан (Scott Hassan) рассказывал мне что он написал первого робота для Google на Python. Сегодня Google использует миллионы строк Python кода для управления многими аспектами своей деятельности — от автоматизации сборок до управления рекламными объявлениями (Оговорка: в настоящее время я являюсь сотрудником Google).

Под обложкой, Python реализован обычным образом — используя комбинацию байт-код компилятора и интерпретатора. Компиляция происходит неявно при загрузке модулей, и для некоторых языковых конструкций компилятор нужен во время исполнения. Хотя стандартная реализация Python де-факто написана на C и доступна для любой аппаратной/программной платформы, несколько альтернативных реализаций приобрели популярность. Jython — версия, которая работает в JVM, и имеет бесшовную интеграцию с Java. IronPython — вариант для платформы Microsoft .NET, который имеет интеграцию аналогичную другим языкам использующимся в .NET . PyPy оптимизированный компилятор/интерпретатор Python, написанный на нем же самом (проект, финансируемый EU фондом, все еще в разработке). Также есть Stackless Python, вариант реализации на C, уменьшающий зависимость вызовов функций/методов от стека, и позволяющий использовать параллельные последовательности команд, возобновления, и микропотоки.

Оригинал: The History of Python - Introduction and Overview