Pull to refresh

Python, формирование структуры — Guido van Rossum (часть 2)

Reading time5 min
Views7.3K
imageЭто продолжение статьи из официального блога автора любимого всеми нами языка. Поэтому повествование ведется от лица самого Гуидо ван Россума. Первая часть здесь.

Введение и обзор



Вступление.

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

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

Полет над гнездом питона.

Когда пользователи впервые сталкиваются с Python, они бывают сильно удивлены тем, что код, написанный на нем, выглядит, по крайней мере внешне, очень похожим на код, написанный на других традиционных языках программирования, таких, как C или Pascal. Оно и неудивительно — синтаксис Python вырос прямиком из C. Например, многие из ключевых слов (if, else, while, for и т.д.) совпадают по смыслу с такими же из 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, а также высокоуровневые операторы для зацикливания любых “итерабельных” объектов. Для контроля над ошибками в Python используются исключения. Оператор raise вызывает исключение, а операторы try/except/finally определяют его идентификатор. Встроенные операторы приводят к исключениям при ошибках в их описании или использовании.

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

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

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

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

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

def matcher(url, max=10):
  «Print the first several URL references in a given url.»
  data = urllib.urlopen(url).read()
  hits = regex.findall(data)
  for hit in hits[:max]:
    print urllib.basejoin(url, hit)

matcher(«python.org»)

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

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

Guido van Rossum
Tags:
Hubs:
+59
Comments20

Articles