Окрім усіх чудових відповідей поки що:
У вас є "упередженість спостерігача". Ви не спостерігаєте помилок, і тому ви припускаєте, що таких немає.
Я думав, як ти. Тоді я почав професійно писати компілятори, і дозвольте вам сказати, там багато помилок!
Ви не бачите помилок, оскільки ви пишете код, який приблизно як 99,999% від усіх решти коду, який люди пишуть. Ви, ймовірно, пишете абсолютно нормальний, простий, чітко правильний код, який викликає методи та виконує цикли і не робить нічого фантазійного чи дивного, адже ви звичайний розробник, який вирішує звичайні бізнес-проблеми.
Ви не бачите жодних помилок компілятора, оскільки помилки компілятора не в простому для аналізу простому звичайному сценарії коду; помилки в аналізі дивного коду, який ви не пишете.
Я, з іншого боку, маю протилежні упередження спостерігачів. Я щодня бачу божевільний код, і тому мені компілятори, здається, забиті клопами.
Якщо ви сіли з мовними специфікаціями будь-якої мови і взяли будь-яку реалізацію компілятора для цієї мови, і дійсно намагалися визначити, чи точно виконаний компілятор, чи сконцентрувався на незрозумілих кутових випадках, досить скоро ви знайдете помилки компілятора досить часто. Дозвольте навести приклад, ось помилка компілятора C #, яку я знайшов буквально п’ять хвилин тому.
static void N(ref int x){}
...
N(ref 123);
Компілятор дає три помилки.
- Аргумент ref або out повинен бути змінною, що може бути призначена.
- Найкраща відповідність для N (ref int x) має недійсні аргументи.
- У аргументі 1 відсутнє "ref".
Очевидно, що перше повідомлення про помилку правильне, а третє - помилка. Алгоритм генерації помилок намагається з'ясувати, чому перший аргумент був недійсним, він переглядає його, бачить, що він є константою, і не повертається до вихідного коду, щоб перевірити, чи позначено його як "ref"; швидше, він припускає, що ніхто не буде досить дурним, щоб позначити константу як реф, і вирішив, що цей номер повинен бути відсутнім.
Не ясно, що таке правильне третє повідомлення про помилку, але це не все. Насправді не ясно, чи правильне друге повідомлення про помилку. Якщо дозвіл на перевантаження не вдасться, чи слід «ref 123» трактуватись як аргумент ref відповідного типу? Зараз мені доведеться подумати над цим і поговорити з командою триаж, щоб ми могли визначити, яка правильна поведінка.
Ви ніколи не бачили цієї помилки, тому що ви, ймовірно, ніколи не зробите щось таке дурне, щоб спробувати передати 123 за посиланням. І якщо б ви це зробили, ви, мабуть, навіть не помітили, що третє повідомлення про помилку є безглуздим, оскільки перше є правильним і достатнім для діагностики проблеми. Але я намагаюся робити такі речі, тому що я намагаюся зламати компілятор. Якщо ви спробували, ви побачите і помилок.