На чем основан python
Почему существует так много Питонов?
Удивительно, но это довольно неоднозначное заявление. Что я имею ввиду под “Питоном”? Может, абстрактный интерфейс Питона? Или CPython, распространенная реализация Питона (не путать с похожим по названию Cython)? Или я имею ввиду что-то совсем иное? Может, я косвенно ссылаюсь на Jython, или IronPython, или PyPy. Или может я отвлекся так сильно, что говорю о RPython или RubyPython (которые очень сильно отличаются).
Не смотря на схожесть в названиях указанных выше технологий, некоторые из них имеют совсем другие задачи (или, как минимум, работают совершенно иными способами)
При работе с Питоном я столкнулся с кучей таких технологий. Инструменты *ython. Но лишь недавно я уделил время, чтобы разобраться, что они собой представляют, как они работают и почему они (каждая по-своему) необходимы.
В этом посте я начну с нуля и пройдусь по разным реализациям Питона, а закончу подробным введением в PyPy, за которым, по моему мнению, будущее языка.
Все начинается с понимания того, чем на самом деле является “Питон”.
Если у вас хорошее понимание машинного кода, виртуальных машин и так далее, можете пропустить этот раздел.
Питон интерпретируемый или компилируемый?
Это распространенный источник непонимания среди новичков Питона.
Первое, что необходимо понять: “Питон” – это интерфейс. Существует спецификация, описывающая, что должен делать Питон, и как он должен себя вести (что справедливо для любого интерфейса). И существует несколько имплементаций (что также справедливо для любого интерфейса).
Второе: “интерпретируемый” и “компилируемый” это свойства имплементации, но не интерфейса.
Так что сам вопрос не совсем корректен.
В случае с самой распространенной реализацией (CPython: написанный на C, часто называемый просто “Python”, и, конечно, именно тот, который вы используете, если понятия не имеете о чем я толкую) ответ: интерпретируемый, с некоторой компиляцией. CPython компилирует* исходный код на Питоне в байткод, а затем интерпретирует этот байткод, запуская его в процессе.
* Замечание: это не совсем “компиляция” в традиционном смысле. Обычно, мы считаем, что “компиляция” это конвертация из высокоуровневого языка в машинный код. Тем не менее – в некотором роде это “компиляция”.
Давайте изучим этот ответ получше, так как он поможет нам понять некоторые концепции, ожидающие нас в этой статье.
Байткод или машинный код
Очень важно понять разницу между байткодом и машинным (или нативным) кодом. Пожалуй, легче всего ее понять на примере:
— Cи компилируется в машинный код, который впоследствии запускается напрямую процессором. Каждая инструкция заставляет процессор производить разные действия.
— Java компилируется в байткод, который впоследствии запускается на Виртуальной машине Java (Java Virtual Machine, JVM), абстрактном компьютере, который запускает программы. Каждая инструкция обрабатывается JVM, который взаимодействует с компьютером.
Сильно упрощая: машинный код намного быстрее, но байткод лучше переносим и защищен.
Машинный код может отличаться в зависимости от машины, тогда как байткод одинаковый на всех машинах. Можно сказать, что машинный код оптимизирован под вашу конфигурацию.
Возвращаясь к CPython, цепочка операций выглядит следующим образом:
1. CPython компилирует ваш исходный код на Питоне в байткод.
2. Этот байткод запускается на виртуальной машине CPython.
Альтернативные виртуальные машины: Jython, IronPython и другие
Как я говорил выше, у Питона существует несколько реализаций. Опять же, как говори-лось выше, самой популярной является CPython. Эта версия Питона написана на C и считается имплементацией “по умолчанию”.
Но как насчет альтернатив? Одна из наиболее видных это Jython, реализация Питона на Java, которая использует JVM. В то время как CPython генерирует байткод для запуска на CPython VM, Jython генерирует байткод Java для запуска на JVM (это то же самое, что генерируется при компиляции программы на Java).
“Зачем может понадобиться использовать альтернативную реализацию?”, спросите вы. Ну, для начала, разные реализации хорошо ладят с разными наборами технологий.
CPython упрощает написание C-расширений для кода на Питоне потому что в конце он запускается интерпретатором Cи. Jython в свою очередь упрощает работу с другими программами на Java: вы можете импортировать любые Java-классы без дополнительных усилий, призывая и используя ваши Java-классы из программ на Jython. (Замечание: если вы еще не думали об этом всерьез, это довольно безумно. Мы дожили до того времени, когда можно смешивать разные языки и компилировать их в одну сущность. Как заметил Rostin, программы, смешивающие код на Фортране с Cи появились довольно давно, так что это не совсем новинка. Но это все же круто.)
В качестве примера, вот корректный код на Jython:
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51
>>> from java.util import HashSet
>>> s = HashSet(5)
>>> s.add(«Foo»)
>>> s.add(«Bar»)
>>> s
[Foo, Bar]
Можно сказать, что Jython: Java :: IronPython: C#. Они работают на соответствующих виртуальных машинах, есть возможность импортировать классы C# в код IronPython и классы Java в код Jython, и так далее.
Кстати, хоть это и не станет причиной для перехода на другую имплементацию, стоит упомянуть, что имплементации эти на самом деле отличаются поведением. Это касается не только способов интерпретации кода на Питоне. Однако эти отличия, как правило, не-значительны, они исчезают и появляются со временем из-за активной разработки. К примеру, IronPython использует строки Unicode по умолчанию; однако CPython использует ASCII в версиях 2.x (выдавая ошибку UnicodeEncodeError для не-ASCII символов), и при этом поддерживает символы Unicode по умолчанию в версиях 3.x.
Компиляция на лету (Just-in-Time Compilation): PyPy и будущее
Итак, у нас есть имплементация Питона, написанная на Си, еще одна – на Java, и третья на C#. Следующий логичный шаг: имплементация Питона, написанная на… Питоне. (Подготовленный читатель заметит, что это утверждение немного обманчиво).
Вот почему это может сбивать с толку. Для начала, давайте обсудим компиляцию на лету (just-in-time или JIT).
JIT. Почему и как
Напомню, что нативный машинный код намного быстрее байткода. Ну, а что, если бы можно было компилировать часть байткода и запускать его как нативный код? Пришлось бы “заплатить” некоторую цену (иными словами: время) за компиляцию байткода, но если результат будет работать быстрее, то это здорово! Этим и мотивируется JIT-компиляция, гибридная техника, которая совмещает в себе преимущества интерпретато-ров и компиляторов. В двух словах – JIT старается использовать компиляцию, чтобы ускорить систему интерпретации.
Например, вот распространенный подход JIT:
В этом вся суть PyPy: использовать JIT в Питоне (в дополнении можно найти предыдущие попытки). Конечно, есть и другие цели: PyPy нацелен на кроссплатформенность, работу с небольшим количеством памяти и поддержку stackless (отказа от стека вызовов языка Си в пользу собственного стека). Но JIT это главное преимущество. В среднем на основе временных тестов, фактор ускорения составляет 6.27. Более подробные данные можно получить из схемы от PyPy Speed Center:
В PyPy сложно разобраться
У PyPy есть огромный потенциал, и в данный момент он хорошо совместим с CPython (так что на нем можно запускать Flask, Django, и т.д.).
Но с PyPy есть много путаницы. (оцените, к примеру, это бессмысленное предложение создать PyPyPy…). По моему мнению основная причина в том, что PyPy одновременно является:
1. Интерпретатором Питона, написанным на RPython (не Python (я обманул вас до этого)). RPython это подмножество Python со статичной типизацией. В Python, вести тщательные беседы о типах “в целом невозможно” почему это так сложно? рассмотрите следующее:
x = random.choice([1, «foo»])
это корректный код на Python (спасибо Ademan‘у). Какой тип у x? Как мы можем обсуждать типы переменных, когда типы даже не форсируются?). В RPython мы жертвуем некоторой гибкостью, но взамен получаем возможность гораздо проще управлять памятью и много чего еще, что помогает при оптимизации.
2. Компилятором, который компилирует код на RPython в разные форматы и поддерживает JIT. Платформой по-умолчанию является Си, то есть компилятор RPython-в-Си, но в качестве целевой платформы также можно выбрать JVM и другие.
Для простоты описания, я буду называть их PyPy (1) и PyPy (2).
Зачем могут понадобиться эти две вещи, и почему – в одном наборе? Думайте об этом так: PyPy (1) это интерпретатор, написанный на RPython. То есть он берет пользовательский код на Питоне и компилирует его в байткод. Но чтобы сам интерпретатор (написанный на RPython) мог работать, он должен быть интерпретирован другой реализацией Пи-тона, верно?
Итак, можно просто использовать CPython чтобы запускать интерпретатор. Но это будет не слишком быстро.
Вместо этого мы используем PyPy (2) (называемый RPython Toolchain) чтобы компилировать интерпретатор PyPy в код для другой платформы (например, C, JVM, или CLI) для запуска на конечной машине, с добавлением JIT. Это волшебно: PyPy динамически добавляет JIT к интерпретатору, генерируя собственный компилятор! (Опять же, это безумие: мы компилируем интерпретатор, добавляя другой отдельный, самостоятельный компилятор).
В конце концов результатом будет самостоятельный исполняемый файл, который интерпретирует исходный код на Питоне и использует оптимизацию JIT. То, что нужно! Понять сложновато, но, возможно, эта схема поможет:
Повторим: настоящая красота PyPy в том, что мы можем написать себе кучу разных интерпретаторов Питона на RPython не волнуясь о JIT (не считая пары деталей). После этого PyPy реализует для нас JIT, используя RPython Toolchain/PyPy (2).
На самом деле, если копнуть глубже в абстракцию, теоретически можно написать интерпретатор любого языка, направить его в PyPy и получить JIT для этого языка. Это возможно потому, что PyPy концентрируется на оптимизации самого интерпретатора, а не деталей языка, который тот интерпретирует.
В качестве отступления я бы хотел заметить, что сам JIT совершенно восхитителен. Он использует технику под названием “отслеживание” (tracing), которая работает следующим образом:
Узнать больше можно из этой легкодоступной и очень интересной публикации.
Подытожим: мы используем PyPy-компилятор RPython-в-Си (или другую целевую плат-форму), чтобы скомпилировать реализованный на RPython интерпретататор PyPу.
Заключение
Почему все это так восхитительно? Почему стоит гнаться за этой безумной идеей? По-моему, Алекс Гейнор объяснил это очень хорошо в своем блоге: “[За PyPy будущее] потому что [он] более быстрый, более гибкий и является лучшей платформой для развития Питона”.
Дополнение: другие названия, которые вы, возможно, слышали
Python 3000 (Py3k): альтернативное название Python 3.0, основной релиз Питона с обратной совместимостью, который появился в 2008. году. Команда Py3k предсказала, что новой версии понадобится примерно пять лет чтобы полностью прижиться. И в то время, как большинство (внимание: надуманное утверждение) разработчиков на Питоне продолжают использовать Python 2.x, люди все больше задумываются о Py3k.
Numba: “специализированный just-in-time компилятор”, который добавляет JIT в снабженный примечаниями код на Питоне. Проще говоря, вы даете ему подсказки, а он ускоряет некоторые части вашего кода. Numba является частью дистрибутива Anaconda набора пакетов для анализа и управления данными.
IPython: сильно отличается от всего, что мы обсудили. Вычислительная среда для Питона. Интерактивная, с поддержкой GUI-пакетов, браузеров и так далее.
Psyco: модуль расширения Питона, одна из первых попыток Питона в области JIT. Давно помечен как “неподдерживаемый и мертвый”. Главный разработчик Psyco Армин Риго сейчас работает над PyPy.
Привязки к языкам
JavaScript фреймворки
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Python
Python (произносится [ ˈpaɪ.θən ] )является широко используемым языком программирования общего назначения, высокого уровня. Его философия дизайна подчеркивает читаемость кода, а его синтаксис позволяет программистам, выразить понятия в меньшем количестве строк кода, чем было бы возможно в таких языках, как С ++ или Java. Язык обеспечивает конструкции, предназначенные для того, чтобы программы были четкие на обоих малых и больших масштабах.
Python поддерживает несколько парадигм программирования, в том числе объектно-ориентированного, императивном и функциональном программировании или процедурных стилей. Он имеет динамическую систему типов и автоматическое управление памятью и имеет большую и всеобъемлющую стандартную библиотеку.
Компиляторы Python имеются для установки на многих операционных системах, что позволяет выполнять код Python на самых разнообразных систем. Использование сторонних инструментов, таких как py2exe или Pyinstaller. Python код может быть собран в автономный исполняемый файл для некоторых из самых популярных операционных систем, что позволяет распространение программного обеспечения Python основе для использования на этих средах, не требуя установка интерпретатора Python.
CPython, ссылка реализация Python, является свободное и открытое программное обеспечение и имеет модель развития общин, как это делают почти все его альтернативные реализации. CPython управляется некоммерческой компанией Python Software Foundation.
Содержание
История
О происхождении Python, Ван Россум написал в 1996 году:
Python 2.0 был выпущен 16 октября 2000 года, в котором было много крупных новых функций, в том числе цикла обнаружения сборщиком мусора и поддержки Unicode. В этом выпуске процесс развития был изменен и стал более прозрачным и сообщество поддержало.
Python 3.0 (также называемый Python 3000 или py3k), фаворит, в обратном направлении-несовместимые релиз был выпущен на 3 декабря 2008 года, после длительного периода тестирования. Многие из его главных особенностей были портированном к обратной совместимости Python 2.6 и 2.7.
Особенности и философия
Python является языком программирования мульти-парадигмы: объектно-ориентированное программирование и структурного программирования полностью поддерживает, и есть ряд особенностей языка, которые поддерживают функциональное программирование и аспектно-ориентированное программирование (в том числе путем метапрограммирования и магических методов). Многие другие парадигмы поддерживаются с помощью расширений, в том числе дизайн по контракту и логика программирования.
Python использует динамическую типизацию и сочетание подсчета ссылок и цикла обнаружения сборщика мусора для управления памятью. Важной особенностью Python является динамическим разрешение имен (позднее связывание), которое связывает метод и имена переменных во время выполнения программы.
Дизайн Python предлагает некоторую поддержку для функционального программирования в традициях Lisp. Язык имеет map(), reduce() и filter( ) функции; постижений для списков, словарей и множеств,; и выражения генератора. В стандартной библиотеке есть два модуля (itertools и functools), которые реализуют функциональные инструменты, заимствованные из Haskell и Standard ML.
Ядро философия языка обобщены в документе «PEP 20 (Дзен Python)», который включает в себя афоризмы, такие как:
Вместо того, чтобы требовать все нужные функции для встраивания в ядро языка, Python был разработан, чтобы быть максимально расширяемыми. Python также может быть встроен в существующие приложения, которые нуждаются в программируемом интерфейсе. Эта конструкция небольшого языка, основной с большой стандартной библиотекой и легко расширяемой переводчика был предназначен Ван Россум с самого начала из-за его разочарования с ABC (который поддерживал противоположные суждения).
Предлагая выбор в кодировании методологии, философии Python отвергает буйный синтаксис, например, в Perl, в пользу редкого, менее хаотичную грамматику. Как Алекс Мартелли выразился: «Для того, чтобы описать что-то же умный не считается комплиментом в культуре Python.» Философия Пайтона отвергает Perl «Есть более одного способа сделать это» подход к разработке языков в пользу » должен быть один и, желательно, только один очевидный способ сделать это «.
Разработчики языка Python стремиться избегать преждевременной оптимизации, и, кроме того, отвергают патчи для некритических частей CPython, что бы предлагают незначительное увеличение в скорости на стоимости ясности. Когда важна скорость, программист Питона может двигаться критичные по времени Функции модулей расширения, написанные на языках, таких как C, или попробуйте использовать PyPy, компилятор точно в срок. CPython также доступен, который переводит сценарий Python в С и делает прямое API C-уровня призывает в интерпретатор Python.
Важной задачей разработчиков Python сделать Python инстересным в использовании. Это нашло свое отражение в происхождении названия, которое происходит от Monty Python, и иногда игривый подход к учебники и справочным материалам, такие как использование примеров, которые относятся к spam и eggs вместо стандартных Foo и bar.
Общий неологизм в сообществе Python является вещий, которые могут иметь широкий диапазон значений, связанных с стилем программы. Сказать, что это вещий код означает, что он использует Python идиомы хорошо, что это естественно или показывает свободное владение языком, что он соответствует философии и минимализма акцентом Пайтона на читаемость. В отличие от этого, код, который трудно понять или читает, как грубое транскрипции из другого языка программирования называется unpythonic.
Люди и поклонники Python, особенно тех, которые считаются осведомленными или опытными-часто называют Pythonists, Pythonistas и Pythoneers.
Синтаксис и семантика
Python предназначен, чтобы быть очень читаемым языком. Он предназначен, чтобы иметь лаконичную визуальный макет, часто используя английские ключевые слова там, где другие языки использовать знаки препинания. Кроме того, Python имеет меньшее число синтаксических исключений и особых случаев, чем C или Pascal.
Идентификаторы
Python использует отступы пробелами, а не фигурные скобки или ключевые слова, чтобы разграничить блоки; Эта функция также называется правило вне боковой. Увеличение отступа приходит после некоторых заявлений; уменьшение отступа означает конец текущего блока.
Операторы
Набор операторов достаточно традиционен. Вот некоторые из них:
Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют операторные скобки begin/end, как в языке Паскаль, или фигурные скобки, как в Си. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Некоторым такое поведение может показаться неинтуитивным и неудобным.
Выражения
Некоторые выражения Python похожи на таких языках, как C и Java, в то время как некоторые из них уникальны для Python:
В Python, различие между выражениями и заявлений жестко соблюдается, в отличие от таких языков, как Common Lisp, Scheme, или Ruby. Это приводит к некоторому дублированию функциональности. Например:
Методы
Python использует утиную типизацию и типизированные объекты, но нетипизированных имена переменных. Тип ограничения не проверяются во время компиляции; скорее, операции на объекте может не сработать, что означает, что данный объект не подходящего типа. Несмотря на то, динамически типизированных, Python сильно типизированных, запрещающий операции, которые не очень хорошо определены (например, добавление числа в строке), а не молча пытаясь понять их.
Python позволяет программистам определять свои собственные типы, используя классы, которые наиболее часто используются для объектно-ориентированного программирования. Новые экземпляры классов построены путем вызова класса (например, SpamClass() или EggsClass() ), а сами классы являются экземплярами type метаклассов (сама экземпляр себе), что позволяет метапрограммирования и отражение.
До версии 3.0, Python было два вида классов: «старый стиль» и «Новый стиль» [61] классы Старый стиле были устранены в Python 3.0, что делает все классы нового стиля.. В вариантах от 2,2 до 3,0, может быть использован оба вида классов. Синтаксис обоих стилей то же самое, с той разницей, является ли object класса наследуются от, прямо или косвенно (все классы нового стиля наследуются от object и являются экземплярами type ).
«Wikipedia» «»»Spanning multiple lines»»»
bytearray(b»Some ASCII») bytearray([119, 105, 107, 105])
b»Some ASCII» bytes([119, 105, 107, 105])
Библиотеки
Python имеет большую стандартную библиотеку, обычно упоминается как один из самых сильных в языке Python, обеспечивающие инструменты подходят для многих задач. Это преднамеренное и был описан как «батареи, включенных» философии Python. Для интернет-приложений перед, большое количество стандартных форматов и протоколов (например, MIME и HTTP) поддерживаются. Модули для создания графических пользовательских интерфейсов, подключения к реляционных баз данных, генераторы псевдослучайных чисел, арифметике с произвольной точностью знаков после запятой, манипулирования регулярных выражений, и делает модульное тестирование, также включены.
Некоторые части стандартной библиотеки покрыты техническими (например, реализация wsgiref WSGI следующим PEP 333), но большинство из модулей не являются. Они задаются по их коду, внутренней документации и тестов (при наличии). Тем не менее, потому что большинство из стандартной библиотеки является кросс-платформенным код Python, есть только несколько модулей, которые должны быть изменены или полностью переписанные альтернативных реализаций.
Стандартная библиотека не является необходимым для запуска Python или вставлять Python в приложении. Blender 2.49, например, опускает большую часть стандартной библиотеки.
По состоянию на январь 2016 года, Питон индекс Пакет, официальный репозиторий стороннего программного обеспечения для Python, содержит более 72000 пакетов, предлагающих широкий спектр функциональных возможностей, в том числе:
Применение
Эмпирические исследования показали, языки сценариев (такие, как Python) более производительные, чем обычные языки (например, C и Java) для задачи программирования с участием строками и поиск в словаре. Потребление памяти часто был «лучше, чем Java, а не намного хуже, чем С или С ++».
Простой в использовании сопряжения между Python и C ++ можно получить, используя импульс, Python библиотеки.
Крупные организации, которые используют Python включают в себя Google, Yahoo!, CERN, NASA, и некоторые мелкие, как ILM, и ITA.
Python может служить в качестве скриптового языка для веб-приложений, например, с помощью mod_wsgi для веб-сервера Apache. С веб-сервера шлюза интерфейса, стандартный API, развивались, чтобы облегчить эти приложения. Рамки веб-приложений, как Django, Pylons, Pyramid, TurboGears, web2py, Tornado, Flask, Bottle и Zope поддержки в разработке и обслуживании сложных приложений. Pyjamas и IronPython могут быть использованы для разработки клиентской части приложений Ajax-приложений. SQLAlchemy может быть использован в качестве преобразователя данных в реляционную базу данных. Twisted является основой для программирования связи между компьютерами, и используется (например) Dropbox.
Библиотеки, как NumPy, SciPy и Matplotlib позволяют эффективно использовать Python в научных вычислений, со специализированными библиотеками, такими как BioPython и Astropy обеспечения функциональных предметно-ориентированный. Astropy является математическое обеспечение с «блокнот» программируется в Python: его библиотека охватывает многие аспекты математики, в том числе алгебры, комбинаторики, вычислительной математики, теории чисел, и исчисления.
Питон также используется в искусственных задач разведки. в качестве скриптового языка с модулем архитектуры, простой синтаксис и богатых инструментов обработки текста, Python часто используется для задач обработки естественного языка.
Многие операционные системы включают Python в качестве стандартного компонента; языковые поставляется с большинством дистрибутивов Linux, AmigaOS 4, FreeBSD, NetBSD, OpenBSD и OS X, и может быть использован с терминала. Ряд дистрибутивов использовать инсталляторов, написанных на Python: Ubuntu использует установщик Ubiquity, в то время как Red Hat Linux Fedora и использовать установки Anaconda. Gentoo Linux использует Python в своей системе управления пакетами, Portage.
Питон также видел широкое применение в промышленности информационной безопасности, в том числе в разработки эксплойтов.
Большая часть программного обеспечения Sugar для One Laptop Per Child XO, в настоящее время разработана в Sugar Labs, написана в Python.
Сингл бортовой компьютер Raspberry Pi проект принял Python в качестве своей основной язык пользовательского программирования.
LibreOffice включает в себя Python и намерен заменить Java с Python. Python скриптов Провайдер основной особенностью, начиная с версии 4.0 от 7 февраля 2013 года.