Сохраняйте номера строк Python при переводе в Dart

Мой проект, который можно найти по адресу Проект Medusa, направлен на то, чтобы запустить Python намного быстрее, скомпилировав его в Dart и запустив это на виртуальной машине Dart. Все в порядке, и я достигаю увеличения скорости до 1500% по сравнению с обычной реализацией CPython.

Моя следующая цель — предоставить проекту механизм сообщения об ошибках. Когда код Python компилируется в оптимизированный и сжатый код Dart, все номера строк и соответствующая отладочная информация теряются. Таким образом, во время выполнения, если где-то что-то пойдет не так, ошибка возникает из-за виртуальной машины Dart, и, как и ожидалось, виртуальная машина сообщает об ошибках в строке: столбец в сгенерированном файле Dart. Я хочу указать на ошибку в соответствующей строке файла Python.

В настоящее время я перевожу код Python в Dart, используя класс NodeVisitor, предоставляемый модулем ast. Я посещаю каждый узел в AST и генерирую код Drat для узла. Я не знаю, как сохранить номера строк, где я получил код Python. Должен ли я перейти к таблице символов отладки, такой как реализация, которую компиляторы C/C++ используют для целей отладки, или мне следует использовать парсер, написанный от руки?

Пример перевода:

Код Python:

a = input("Enter a number: ")
b = input("Enter another number: ")

print a + b
print a - b
print a * b
print a / b

Соответствующий код дротика:

import'file:///C:/Users/Rahul/.medusa/lib/inbuilts.dart';import'dart:io';var a,b;main(){a=input(str('Enter a number: '));b=input(str('Enter another number: '));stdout.writeln((a+b));stdout.writeln((a-b));stdout.writeln((a*b));stdout.writeln((a/b));}

Предположим, что если здесь b равно 0, я хочу, чтобы ошибка показывала, что если она произошла в строке 7 файла Python, а не в 1:245 файла Dart.

Спасибо!


person Rahul De    schedule 30.05.2014    source источник


Ответы (2)


JavaScript принял исходные карты именно по этой причине: html5rocks

Это не идеальный формат, но он, вероятно, подойдет здесь.

Примечание: виртуальная машина Dart еще не поддерживает исходные карты. Таким образом, вам нужно будет проанализировать трассировку стека (посмотрите на пакет stack_trace для кода, который делает это ), а затем сопоставьте местоположения обратно.

person Florian Loitsch    schedule 30.05.2014

Поддерживать номера строк будет очень сложно, потому что могут быть дополнительные операторы или операторы, которые могут быть лучше написаны в Dart и, следовательно, изменят номер строки, поэтому использование строк Dart вам не поможет.

Прежде всего, почему вы переводите код в одну стрелку?

Лично я бы ловил ошибки и повторно выдавал ошибки с соответствующими номерами строк из python.

С уважением Роберт

person Robert    schedule 30.05.2014
comment
Код дротика сделан в одну строку, чтобы максимально уменьшить его и обеспечить более быстрый анализ виртуальной машиной. Также я кэширую сгенерированный код в постоянном хранилище SQLite, и чем меньше код, тем лучше. - person Rahul De; 30.05.2014