Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

Следует отметить, что для простых операций Pyrex применяет C, а для обращения к объектам Python — вызовы Python/C API. Таким образом, объединяется выразительность Python и эффективность C. Конечно, некоторые вещи в Pyrex не доступны, например, генераторы, списковые включения и Unicode, однако, цель Pyrex — создание быстродействующих модулей расширения, и для этого он превосходно подходит. Ознакомится с Pyrex можно по документации (которая, к сожалению, есть пока только на английском языке).

Заключение

В этой лекции кратко рассматривались основные возможности интеграции интерпретатора Python и других систем программирования. Базовая реализация

языка Python написана на C, поэтому Python имеет программный интерфейс Python/C API, который позволяет программам на C/C++ обращаться к интерпретатору Python, отдельным объектам, модулям и типам данных. Состав Python/C API достаточно обширен, поэтому речь шла лишь о некоторых основных его элементах.

Был рассмотрен процесс написания модуля расширения на C как напрямую, так и с использованием генератора интерфейсов SWIG. Также кратко говорилось о возможности встраивания интерпретатора Python в программу на С или OCaml.

Язык Python (с помощью специальной его реализации — Jython) прозрачно интегрируется с языком Java: в Python–программе, выполняемой под Jython в Java–апплете или Java–приложении, можно использовать практически любые Java–классы.

На примере языка Prolog были показаны различные подходы к добавлению возможностей логического вывода в Python–программы: независимая реализация Prolog–машины, связь с Prolog–интерпретатором через конвейер, связь через Python/C API.

Интересный гибрид C и Python представляет из себя язык Pyrex. Этот язык создан с целью упростить написание модулей расширения для Python на C, и использует структуры данных C и подобный Python синтаксис. Несмотря на некоторые смысловые и синтаксические отличия как от C, так и от Python, язык Pyrex помогает существенно сократить время разработки модулей расширения, сохранив эффективность компилятора C и знакомый синтаксис Python.

В данной лекции не были представлены другие возможности интеграции, например библиотека шаблонов C++ Boost Python, которая позволяет интегрировать Python и C++. Кроме того, из Python можно использовать библиотеки, написанные на Фортране (проект F2PY).

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

Ссылки

Библиотека Boost Python для C++ http://www.boost.org

14. Лекция: Устройство интерпретатора языка Python.

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

Лексический анализ

Лексический анализатор языка программирования разбивает исходный текст программы (состоящий из одиночных символов) на лексемы — неделимые «слова» языка.

Основные категории лексем Python: идентификаторы и ключевые слова (NAME), литералы (STRING, NUMBER и т.п.), операции (OP), разделители, специальные лексемы для обозначения (изменения) отступов (INDENT, DEDENT) и концов строк (NEWLINE), а также комментарии (COMMENT). Лексический анализатор доступен через модуль tokenize, а определения кодов лексем содержатся в модуле token стандартной библиотеки Python. Следующий пример показывает лексический анализатор в действии:

Листинг

import StringIO, token, tokenize

prog_example = """

for i in range(100): # comment

if i % 1 == 0: \

print ":", t**2

«"".strip

rl = StringIO.StringIO(prog_example).readline

for t_type, t_str, (br,bc), (er,ec), logl in tokenize.generate_tokens(rl):

print "%3i %10s : %20r» % (t_type, token.tok_name[t_type], t_str)

А

вот что выведет эта программа, разбив на лексемы исходный код примера:

Листинг

Фактически получен поток лексем, который может использоваться для различных целей. Например, для синтаксического «окрашивания» кода на языке Python. Словарь token.tok_name позволяет получить мнемонические имена для типа лексемы по номеру.

Синтаксический анализ

Вторая стадия преобразования исходного текста программы в байт–код интерпретатора состоит в синтаксическом анализе исходного текста. Модуль parser содержит функции suite и expr для построения деревьев синтаксического разбора соответственно для кода программ и выражений Python. Модуль symbol содержит номера символов грамматики Python, словарь для получения названия символа из грамматики Python.

Следующая программа анализирует достаточно простой код Python (prg) и порождает дерево синтаксического разбора (AST–объект), который тут же можно превращать в кортеж и красиво выводить функцией pprint.pprint. Далее определяется функция для превращения номеров символов в их мнемонические обозначения (имена) в грамматике:

Листинг

import pprint, token, parser, symbol

prg = ""«print 2*2»""

pprint.pprint(parser.suite(prg).totuple)

def pprint_ast(ast, level=0):

if type(ast) == type:

for a in ast:

pprint_ast(a, level+1)

elif type(ast) == type(""):

print repr(ast)

else:

print " "*level,

try:

print symbol.sym_name[ast]

except:

print «token.»+token.tok_name[ast],

print

pprint_ast(parser.suite(prg).totuple)

Эта программа выведет следующее (структура дерева отражена отступами):

Листинг

(257,

(264,

(265,

(266,

(269,

(1, 'print'),

(292,

(293,

(294,

(295,

(297,

(298,

(299,

(300,

(301,

(302,

(303, (304, (305, (2, '2')))),

(16, '*'),

(303, (304, (305, (2, '2')))))))))))))))),

(4, ''))),

(0, ''))

file_input

Поделиться:
Популярные книги

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

НОВОСТИ ИЗ КРЕМЛЯ

Зенькович Николай Александрович
Научно-образовательная:
история
5.00
рейтинг книги
НОВОСТИ ИЗ КРЕМЛЯ

История одного гоблина. Два в одном

Болотов Андрей Тимофеевич
2. История одного гоблина
Фантастика:
фэнтези
юмористическое фэнтези
7.00
рейтинг книги
История одного гоблина. Два в одном

Катуков против Гудериана

Прудников Виктор
Сражения Великой Отечественной Войны
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Катуков против Гудериана

Олимпия Клевская

Дюма-отец Александр
Приключения:
исторические приключения
6.80
рейтинг книги
Олимпия Клевская

Красавица Альмиу

Мак Иван
23. Легенды Вселенной
Фантастика:
боевая фантастика
5.00
рейтинг книги
Красавица Альмиу

Кровь обязывает. Трилогия

Обатуров Сергей Георгиевич
Кровь обязывает
Фантастика:
фэнтези
4.55
рейтинг книги
Кровь обязывает. Трилогия

Брат, стреляй первым!

Колычев Владимир Григорьевич
1. Брат
Детективы:
прочие детективы
7.00
рейтинг книги
Брат, стреляй первым!

Кукушка

Скирюк Дмитрий Игоревич
4. Жуга
Фантастика:
фэнтези
8.40
рейтинг книги
Кукушка

Неучтенный элемент. Том 12

NikL
12. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 12

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Антисоветский проект

Кара-Мурза Сергей Георгиевич
Научно-образовательная:
политика
7.00
рейтинг книги
Антисоветский проект

Демон пробуждается

Сальваторе Роберт Энтони
1. Демонические войны
Фантастика:
фэнтези
7.20
рейтинг книги
Демон пробуждается

Журнал "Если" 1999, номер 11

Силверберг Роберт
11. Журнал Если 1999
Фантастика:
социально-философская фантастика
6.25
рейтинг книги
Журнал Если 1999, номер 11