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

    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
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 20
    • НЛО прилетело и опубликовало эту надпись здесь
      • +6
        Насчет «неправильности» — код приведен самый простейший, без претензий на универсальность. Кроме того, я бы не взял на себя смелость вносить исправления в код, написанный авторам языка ;)
        • 0
          Именно для этого отступы и есть, чтобы был общий стиль читаемости. Почитайте прошлую статью перевод дзен питона, и вы поймете концепцию
          • НЛО прилетело и опубликовало эту надпись здесь
        • +2
          Спасибо Вам! Дико рад, что в последнее время, столько информации о питоне =)
          Кстати, чтобы было чуть симпатичней и наглядней, сделайте подсветку кода. Например, с помощью syhi.stworks.ru/
          • 0
            Честно — я пытался сделать, причем разными сервисами — но почему-то в моем браузере (Opera 9.63 Linux), впрочем, как и в FF, она не видна. Не знаю, в чем причина, оставил, как есть.
            • 0
              Если у вас она сейчас видна — напишите, буду искать проблему у себя.
              • +1
                Удивительно, но у меня тоже не видна. Хотя видел недавно на хабре статью с кодом, там все было видно, надо найти сервис, которым это сделали. Правда, там код был выделен как цитата еще…
              • 0
                У меня тоже не видна, отступов тоже нет. FF 3.0.5
              • 0
                дада, в данной стайтье ойчень много информации.
                про подсветку кода для пары строк — улыбнуло.
                • +1
                  Во-первых, я говорил про все статьи, которые были выложены недавно на хабре. Автор, в свою очередь, выложил не менее интересный материал.
                  Во-вторых, пусть и пара строк, но смотреться все равно будет симпатичнее.
              • 0
                for hit in hits[:max]

                а что это значит? (новенький я)
                разве нельзя сделать просто

                for hit in hits ??
                • 0
                  max задает число выдаваемых URL'ов. В данном случае max=10, поэтому выдаются первые 10, как и отмечено в тексте.
                  • 0
                    простите, каюсь, не заметил параметр в методе, надо наверное уже идти спать…
                    • 0
                      можно еще отметить, что после среза hits[:max], итерация уже производится по новому массиву, а не по hits
                  • 0
                    Возможно нетипизированные языки это удобно, но часто из-за этого возникают большие проблемы.
                    • 0
                      При рабзработке серъёзных приложений приходится использовать QA, например, юнит-тестирование или аудит кода.
                      Поэтому проблемы возникать не должны при правильном подходе.

                      А всяческие языковые «вкусности» помогают рарабатывать быстрее.
                      Каждый язык программирования имеет свою нишу применения. А те, что потеряли свою нишу, тихо умирают.
                    • +1
                      Не понимаю, зачем писать о том, что написано в любом учебнике про питон? Про отступы, про динамическую типизацию, про различные реализации написано в любом введении в питон. Хотелось бы от автора языка услышать более пикантные истории о создании языка, почему поступили так, а не иначе, какие были трудности.
                      Первая статья была намного интереснее. Надеюсь остальные статьи будут лучше.
                      • 0
                        можете оставить комментарий в его блоге. возможно он и напишет что-то такое, что будет Вам интерсно.

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