Pull to refresh

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

Reading time 5 min
Views 7.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
Comments 20
Comments Comments 20

Articles