Мой проект, который можно найти на Проект Медуза стремится запустить Python намного быстрее, скомпилировав его в Dart и запустив на виртуальной машине Dart. Все хорошо, и я достигаю повышения скорости до 1500% по сравнению с обычной реализацией CPython.
Моя следующая цель — предоставить механизм сообщения об ошибках для проекта. Когда код Python компилируется в оптимизированный и сжатый код Dart, все номера строк и связанная с ними информация отладки теряются. Таким образом, во время выполнения, если где-то что-то идет не так, ошибка возникает из-за виртуальной машины Dart, и, как и ожидалось, виртуальная машина сообщает об ошибках в столбце Line: в сгенерированном файле 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.
Спасибо!
JavaScript принял исходные карты именно по этой причине: HTML5Rocks
Это не идеальный формат, но он, вероятно, сработает здесь.
Sidenote: Dart VM пока не поддерживает исходные карты. Таким образом, вам нужно будет проанализировать трассировки стека (посмотрите на пакет stack_trace для кода, который делает это), а затем сопоставить местоположения обратно.
Ведение номеров строк будет очень трудным, потому что могут быть дополнительные операторы или операторы, которые могут быть лучше написаны в Dart и, следовательно, могут изменить номер строки, поэтому использование строк Dart не поможет вам.
Прежде всего, почему вы переводите код в одну строчку дротиков?
Лично я бы ловил ошибки и перебрасывал ошибки соответствующими номерами строк из python.
С уважением
Роберт