Я не планую найближчим часом писати компілятор; все-таки мене дуже цікавлять технології компіляції, і як можна покращити цей матеріал.
Починаючи з компільованих мов, більшість компіляторів мають два рівні помилок: попередження та помилки, перший з яких є більшістю часу не фатальних матеріалів, які слід виправити, і помилок, що вказують більшу частину часу на неможливість створення машинного (або байтового) код з вводу.
Хоча це досить слабке визначення. У деяких мовах, таких як Java, певних попереджень просто неможливо позбутися без використання @SuppressWarning
директиви. Крім того, Java трактує деякі не фатальні проблеми як помилки (наприклад, недоступний код на Java викликає помилку з причини, яку я хотів би знати).
У C # немає однакових проблем, але їх є кілька. Здається, що компіляція відбувається в декілька проходів, а відмова пропуску убереже подальші пропуски від виконання. Через це кількість помилок, які ви отримуєте, коли ваша збірка не вдається, часто буває заниженою. На одному запуску це може сказати, що у вас є дві помилки, але, як тільки ви виправите їх, можливо, ви отримаєте 26 нових.
Перекочування до C та C ++ просто показує погану комбінацію діагностичних слабкостей компіляції Java та C # (хоча, можливо, точніше сказати, що Java та C # просто пройшли шлях із половиною проблем). Деякі попередження дійсно повинні бути помилками (наприклад, коли не всі кодові шляхи повертають значення), і все ж вони попереджають, тому що, я думаю, в той час, коли вони писали стандарт, технологія компілятора була недостатньо хорошою для створення подібного роду чеки обов'язкові. У цьому ж ключі, компілятори часто перевіряють, чи не більше стандартного, але все ж використовують "стандартний" рівень помилок попередження для додаткових висновків. І часто компілятори не повідомлять про всі помилки, які вони могли б знайти відразу; для позбавлення від усіх може знадобитися кілька компіляцій. Не кажучи вже про критичні помилки компілятори C ++, які люблять плювати,
Тепер додамо, що багато систем побудови налаштовуються, щоб повідомляти про збої, коли компілятори надсилають попередження, ми просто отримуємо дивну суміш: не всі помилки є фатальними, але деякі попередження повинні; не всі попередження заслужені, але деякі явно придушуються без подальшої згадки про їх існування; а іноді всі попередження стають помилками.
Нескладені мови все ще мають свою частку несанкціонованого повідомлення про помилки. Про помилки друку в Python не повідомляться, поки код фактично не запуститься, і ви ніколи не зможете виправити більше однієї помилки одночасно, оскільки сценарій припинить виконання після його зустрічі.
PHP, зі свого боку, має купу більш-менш значних рівнів помилок та винятків. Помилки синтаксичного аналізу повідомляються одна за одною, попередження часто такі погані, що вони повинні перервати ваш сценарій (але не за замовчуванням). Повідомлення дійсно часто показують серйозні логічні проблеми, деякі помилки насправді недостатньо погані, щоб зупинити ваш сценарій, але все-таки так, і, як завжди, це стосується PHP, там є справді дивні речі (чому, до біса, нам потрібен рівень помилок для фатальних помилок, які насправді не є фатальними? E_RECOVERABLE_E_ERROR
Я говорю з вами).
Мені здається, що кожна реалізація звітності про помилки компілятора, яку я можу придумати, порушена. Це справжній ганьба, адже те, як усі хороші програмісти наполягають на тому, як важливо правильно боротися з помилками, але ще не можуть отримати власні інструменти для цього.
Як ви вважаєте, що має бути правильним способом повідомляти про помилки компілятора?