Nie planuję pisać kompilatora w najbliższej przyszłości; nadal jestem dość zainteresowany technologiami kompilatora i tym, jak można to ulepszyć.
Zaczynając od języków skompilowanych, większość kompilatorów ma dwa poziomy błędów: ostrzeżenia i błędy, z których pierwszy to najczęściej niekrytyczne rzeczy, które należy naprawić, oraz błędy wskazujące przez większość czasu, że niemożliwe jest wygenerowanie maszyny (lub bajtu) kod z wejścia.
Chociaż jest to dość słaba definicja. W niektórych językach, takich jak Java, niektóre ostrzeżenia są po prostu niemożliwe do usunięcia bez zastosowania @SuppressWarning
dyrektywy. Ponadto Java traktuje niektóre niekrytyczne problemy jako błędy (na przykład nieosiągalny kod w Javie powoduje błąd z powodu, który chciałbym wiedzieć).
C # nie ma takich samych problemów, ale ma kilka. Wygląda na to, że kompilacja zachodzi w kilku przebiegach, a niepowodzenie przejścia uniemożliwi dalsze wykonywanie. Z tego powodu liczba błędów pojawiających się w przypadku niepowodzenia kompilacji jest często rażąco niedoceniana. Przy jednym uruchomieniu może to oznaczać, że masz dwa błędy, ale kiedy je naprawisz, może otrzymasz 26 nowych.
Kopanie w C i C ++ po prostu pokazuje złą kombinację słabości diagnostycznych kompilacji Java i C # (choć może bardziej trafne jest stwierdzenie, że Java i C # po prostu poszły z każdą połową problemów). Niektóre ostrzeżenia naprawdę powinny być błędami (na przykład, gdy nie wszystkie ścieżki kodu zwracają wartość), a mimo to są ostrzeżeniami, ponieważ, jak sądzę, w czasie, gdy pisali standard, technologia kompilatora nie była wystarczająco dobra, aby tworzyć tego rodzaju kontrole obowiązkowe. W tym samym duchu kompilatory często sprawdzają więcej niż mówi standard, ale nadal używają „standardowego” poziomu błędu ostrzegawczego dla dodatkowych ustaleń. I często kompilatory nie zgłaszają od razu wszystkich błędów, które mogą znaleźć; pozbycie się wszystkich może zająć kilka kompilacji. Nie wspominając o tajemniczych błędach, które kompilatory C ++ lubią pluć,
Dodając teraz, że wiele systemów kompilacji można konfigurować w celu zgłaszania awarii, gdy kompilatory emitują ostrzeżenia, otrzymujemy dziwną mieszankę: nie wszystkie błędy są krytyczne, ale niektóre ostrzeżenia powinny; nie wszystkie ostrzeżenia są zasłużone, ale niektóre są wyraźnie tłumione bez dalszej wzmianki o ich istnieniu; a czasami wszystkie ostrzeżenia stają się błędami.
Języki nieskompilowane nadal mają nieprzyjemny raport błędów. Literówki w Pythonie nie będą zgłaszane, dopóki kod nie zostanie faktycznie uruchomiony, i tak naprawdę nigdy nie można wykopać więcej niż jednego błędu naraz, ponieważ skrypt przestanie działać po tym, jak go napotka.
Z drugiej strony PHP ma kilka mniej lub bardziej znaczących poziomów błędów i wyjątków. Błędy analizy są zgłaszane pojedynczo, ostrzeżenia są często tak złe, że powinny przerwać skrypt (ale nie domyślnie), powiadomienia naprawdę często pokazują poważne problemy logiczne, niektóre błędy naprawdę nie są wystarczająco złe, aby zatrzymać skrypt, ale nadal tak, jak zwykle w przypadku PHP, jest tam kilka naprawdę dziwnych rzeczy (dlaczego, do cholery, potrzebujemy poziomu błędu dla błędów krytycznych, które nie są tak naprawdę fatalne ? E_RECOVERABLE_E_ERROR
, mówię do ciebie).
Wydaje mi się, że każda implementacja raportowania błędów kompilatora, o której myślę, jest zepsuta. To wielka szkoda, ponieważ wszyscy dobrzy programiści nalegają na to, jak ważne jest prawidłowe radzenie sobie z błędami, a jednocześnie nie mogą zdobyć własnych narzędzi.
Jak myślisz, jaki powinien być właściwy sposób zgłaszania błędów kompilatora?