Очередной вопрос к опытным участникам: а насколько реально проследить происхождение каждой инструкции в результате компиляции прямо до исходного текста? Имеется в виду, чтобы предоставить программисту комментарии в ассемблерном коде, что вот эти инструкции сгенерированы конкретно из такого-то выражения. Подразумевается, что ассемблер получен после нескольких проходов оптимизатора и планирования инструкций.
При этом, наверное, не важно, в каком формате эта информация собрана. Допустим, в некотором инструменте будет возможность подвести к инструкции курсор, и этот инструмент покажет связанный блок инструкций и выражение в исходном тексте, к которому они относятся.
Какая-то такая фантазия. Это возможно? И дополнительный вопрос: не знает ли кто-нибудь какую-нибудь внятную реализацию Source Maps? А то в ClojureScript трындец.
Это хороший вопрос! Идеальная ситуация -- когда позиции в исходном тексте сохраняются только до завершения стадии семантического анализа. А бывает и так, что компилятор практически готов и вдруг выясняется, что нужно поддержать отладку на уровне исходного текста. Это может очень опечалить разработчика компилятора.
В коде неважно написанных компиляторов для каждого преобразования явно прописывается передача атрибутов исходного текста. Лучший вариант -- скрыть передачу атрибутов за фасадом высокоуровневых конструкций, но если в компиляторе используется несколько разнородных IR, то на стыках явно передавать атрибуты придется. В целом, многое зависит от IR и от характера преобразований. Например, иногда необходимо извлекать соответствующие атрибуты из предков преобразуемой конструкции.
И, конечно же, надо понимать, что при серьезных трансформациях программы информация об исходном тексте точной не будет. Простейший пример. Положим, у нас в коде есть множество констант Int(0), каждая из которых имеет свою позицию в исходном тексте. Далее мы проводим CSE и оказывается, что узел Int(0) теперь в единственном экземпляре. Какую же Location ему назначить? :)