Мой проект, который можно найти по адресу Проект 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.
Спасибо!