Перевод Python для виртуальной машины

В настоящее время я работаю над проектом, включающим новую более быструю среду выполнения / виртуальную машину для Python в Linux. Исходный код Python преобразуется в промежуточный AST, анализируется, а код для целевой виртуальной машины генерируется JIT и кэшируется. Из-за JIT-характера предлагаемой машины скорость имеет важное значение, и я пишу ее как можно нативнее. В настоящее время он полностью реализован на C, кроме одного интерфейса Python для модуля компилятора. В настоящее время я могу создать AST с помощью модуля компилятора Python и сохранить его в памяти.

Например код:

class Test:
    def testFunc(arg1):
        print 'Arg is ' + arg1

генерирует АСТ

Module(None, Stmt([Class('Test', [], None, Stmt([Function(None, 'testFunc', ['arg1'], [], 0, None, Stmt([Printnl([Add((Const('Arg is '), Name('arg1')))], None)]))]), None)]))

Что я хочу знать, так это эффективный метод для преобразования этого AST в управляемую структуру данных, такую ​​​​как дерево, которое можно пройти и сгенерировать целевой код. Я не понимаю, стоит ли использовать генератор синтаксических анализаторов, такой как Bison или Lemon, или вручную токенизировать и анализировать его. Поскольку AST получается после обширных проверок ошибок, нет смысла в дальнейших проверках ошибок, поэтому я считаю, что генератор синтаксического анализатора излишен. Сам Python предоставляет обходчики AST, но замедляет его. Но тогда я действительно не слишком уверен, как расшифровать это вручную. Я был бы очень признателен за любой алгоритм или предложение или, если возможно, за реализацию на родном языке.


person Rahul De    schedule 21.12.2013    source источник
comment
Возможно, вы захотите переместить этот вопрос на cs.stackexchange.com.   -  person thefourtheye    schedule 21.12.2013
comment
T в ast означает tree. Это уже дерево, по которому вы можете пройти, например, Простой пример использования ast.NodeVisitor? или другой простой пример: Извлечение «лишних» строк документации из кода Python?   -  person jfs    schedule 21.12.2013
comment
Я имею в виду, что я получил это как текстовую строку из модуля компилятора Python и хочу преобразовать ее в дерево в памяти, желательно на родном языке. Я попробовал ходок AST python, но он несколько медленный для действительно огромных кодов. Что мне нужно, так это простая система, которая анализирует это и дает мне имя узла и значения.   -  person Rahul De    schedule 21.12.2013
comment
И позволить Python сгенерировать свой AST и вывести его в строковое представление — это не медленно? Тогда вам, вероятно, следует сначала попробовать выполнить обход самостоятельно (возможно, с использованием кода C, но Python будет легче прототипировать и может помочь) вместо использования интерфейса посетителя. И в качестве отступления: возможно, вам следует заняться сложной и инновационной частью сначала, а именно созданием более быстрого компилятора VM + JIT. Поскольку это не зависит от того, как именно вы превращаете исходный код Python в инструкции виртуальной машины, будет легко оптимизировать эту часть позже/одновременно.   -  person    schedule 21.12.2013


Ответы (1)


В Python уже есть быстрый парсер (см. Parser/parser.c в исходниках Python ). Вы создаете парсер, вызывая PyParser_New и отправляете ему токены. вызвав PyParser_AddToken. Он строит дерево из node объектов (см. Parser/node.h):

typedef struct _node {
    short        n_type;
    char         *n_str;
    int          n_lineno;
    int          n_col_offset;
    int          n_nchildren;
    struct _node *n_child;
} node;

Поэтому, если модуль ast работает слишком медленно, используйте интерфейс C и обработайте синтаксический анализ. дерево напрямую.

person Gareth Rees    schedule 22.12.2013
comment
Именно вещь. И благодаря вам все это на C без зависимостей Python! Спасибо! - person Rahul De; 23.12.2013