Каковы некоторые подходы для сбора и передачи ошибок компилятора - PullRequest
2 голосов
/ 30 сентября 2011

Самый простой подход - просто создать исключение с информацией об ошибке при первом появлении ошибки.Возможно, другой подход заключается в передаче изменяемого аргумента списка через функции анализа.Но я заметил, что компилятор F #, например, будет постепенно накапливать ошибки в области ошибок Visual Studio на протяжении всей компиляции.Будет ли использование TraceListener вариант?Каковы некоторые плюсы и минусы различных подходов.

Меня особенно интересуют подходы для компиляторов, ориентированных на .NET, с использованием функционального языка, такого как F #, но я был бы признателен за подходы (которые могут отличаться)контексты.

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Вы всегда можете посмотреть на код компилятора F # в качестве одного примера (хотя в реальном мире код всегда немного беспорядочный :)):

https://github.com/fsharp/fsharp/blob/master/src/fsharp/ErrorLogger.fs

У нас естьИнтерфейс ErrorLogger с предупреждениями и «приемниками» ошибок, а также различными частями ошибок и предупреждений компилятора «приемников» для активного регистратора через интерфейс.

При обнаружении ошибки может быть сложно решить, следует ли выкидывать(и отказаться от локального потока управления) или войти и продолжить (чтобы получить больше информации, но рискуете больше каскадных ошибок).Есть много стратегий, чтобы справиться с этим, но все заканчивают тем, что были хитрыми, так как ваш типичный промышленный компилятор имеет тысячи диагностических средств, и люди могут писать неправильный код, по-видимому, бесконечным количеством способов и универсальным подходом для всех.Решение вряд ли обеспечит наилучший опыт для каждой ошибки или даже для каждой распространенной ошибки.

Как кто-то сказал, компиляторы универсально записывают вывод в stdout / stderr в каноническом формате.MSBuild и Visual Studio анализируют выходные данные сборки, чтобы высветить список ошибок и ошибки в интерфейсе IDE.Для инкрементной обратной связи при наборе (а не построении) VS также «размещает» внешний интерфейс компилятора в процессе и читает сообщения об ошибках непосредственно из «приемников».

Пока выпо крайней мере, у одной границы абстракции (например, функции LogWarning и LogError, которая может быть даже глобальной, просто убедитесь, что ее используют все предупреждения / ошибки), тогда вы всегда сможете реорганизовать систему для удовлетворения меняющихся потребностей / проектов.

1 голос
/ 30 сентября 2011

Любой компилятор, который я использовал, включая .NET, немедленно выводит сообщение об ошибке на консоль.Довольно важное соображение заключается в том, что это позволяет программисту набирать Ctrl + C, чтобы быстро положить конец множеству ошибок, которые генерируются из-за ошибки в объявлении.В наши дни это не очень актуально, но никто не делает это по-другому.

...