Я не планирую писать компилятор в ближайшем будущем; Тем не менее, я весьма заинтересован в технологиях компиляции и в том, как сделать это лучше.
Начиная с компилируемых языков, большинство компиляторов имеют два уровня ошибок: предупреждения и ошибки, первый из которых состоит в большинстве случаев нефатальных ошибок, которые вы должны исправить, и ошибки, указывающие большую часть времени, что невозможно произвести машинный (или байтовый) код с входа.
Хотя это довольно слабое определение. В некоторых языках, таких как Java, от некоторых предупреждений просто невозможно избавиться без использования @SuppressWarning
директивы. Кроме того, Java рассматривает некоторые нефатальные проблемы как ошибки (например, недоступный код в Java вызывает ошибку по причине, которую я хотел бы знать).
C # не имеет таких же проблем, но у него есть несколько. Кажется, что компиляция происходит в несколько проходов, и сбой прохода будет препятствовать выполнению дальнейших проходов. Из-за этого количество ошибок, которое вы получаете при сбое сборки, часто сильно недооценивается. При одном запуске может появиться две ошибки, но как только вы исправите их, возможно, вы получите 26 новых.
Переход на C и C ++ просто показывает плохую комбинацию диагностических недостатков компиляции в Java и C # (хотя было бы точнее сказать, что Java и C # просто пошли своим путем с половиной проблем каждый). Некоторые предупреждения действительно должны быть ошибками (например, когда не все пути кода возвращают значение), и все же они являются предупреждениями, потому что, я полагаю, в то время, когда они писали стандарт, технология компилятора не была достаточно хороша, чтобы делать подобные проверки обязательны. В том же духе, компиляторы часто проверяют больше, чем говорит стандарт, но все же используют «стандартный» уровень ошибки предупреждения для дополнительных выводов. И часто компиляторы не сообщают обо всех ошибках, которые они могут найти сразу; может потребоваться несколько компиляций, чтобы избавиться от всех из них. Не говоря уже о загадочных ошибках, которые любят компиляторы C ++,
Теперь, добавив, что многие системы сборки можно настраивать так, чтобы они сообщали о сбоях, когда компиляторы выдают предупреждения, мы просто получаем странное сочетание: не все ошибки являются фатальными, но некоторые предупреждения должны; не все предупреждения заслуживают внимания, но некоторые явно подавляются без дальнейшего упоминания об их существовании; и иногда все предупреждения становятся ошибками.
Некомпилированные языки все еще имеют свою долю дерьмовых сообщений об ошибках. О опечатках в Python не сообщается до тех пор, пока код на самом деле не запущен, и вы никогда не сможете по-настоящему выбросить более одной ошибки за раз, потому что скрипт перестанет выполняться после того, как встретит одну.
PHP, со своей стороны, имеет кучу более или менее значительных уровней ошибок и исключений. Об ошибках разбора сообщается по одному, предупреждения часто настолько плохи, что должны прервать ваш скрипт (но не по умолчанию), уведомления действительно часто показывают серьезные проблемы с логикой, некоторые ошибки на самом деле не настолько плохи, чтобы остановить ваш скрипт, но все же и, как обычно, с PHP, есть некоторые действительно странные вещи (почему, черт возьми, нам нужен уровень ошибок для фатальных ошибок, которые на самом деле не фатальны?, E_RECOVERABLE_E_ERROR
я говорю с вами).
Мне кажется, что каждая реализация отчетов об ошибках компилятора, о которой я могу думать, нарушена. Что является настоящим позором, поскольку все хорошие программисты настаивают на том, как важно правильно исправлять ошибки, и в то же время не могут получить для этого свои собственные инструменты.
Как вы думаете, должен быть правильный способ сообщить об ошибках компилятора?