Как компиляторы, написанные на языке, который они компилируют, имеют дело с ошибками? - PullRequest
1 голос
/ 29 января 2020

Скажем, у меня есть C компилятор, написанный на C. Затем этот C компилятор будет скомпилирован с использованием более ранней версии этого компилятора или сам по себе (сначала скомпилировав исходный код с более старой версией, а затем снова с новым компилятором).

Что если реализация что у C компилятора будет ошибка? Это означало бы, что компилятор C создает двоичные файлы, которые могут быть некорректными. Если бы я исправил ошибку, этот код все равно пришлось бы скомпилировать с использованием ошибочной версии компилятора, что снова привело бы к компилятору, который, возможно, работал бы неправильно.

Если ошибка была обнаружена сразу, я могу посмотрите, как с этим справиться, просто используя более старую версию компилятора. Но что, если ошибка не обнаруживается в течение ряда итераций? Мне кажется почти невозможным отследить источник ошибки в этот момент, поскольку неправильное поведение могло быть результатом любой из предыдущей версии этого компилятора, которая распространялась через различные итерации.

Ответы [ 2 ]

4 голосов
/ 29 января 2020

Существует несколько возможностей:

  1. Если есть другие реализации компилятора, вы можете использовать одну из них для перекомпиляции вашего компилятора. Большинство языков имеют несколько реализаций, поэтому часто это вариант.

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

  3. Monkey-patch the компилятор, чтобы "исправить" ошибку, затем перекомпилировать. Или сделайте это вручную в отладчике, если во время компиляции ситуация с ошибками не возникает слишком много раз.

Кстати, ваша проблема не отличается от более коварной (теоретической) проблемы, которая был описан Кеном Томпсоном в его лекции премии Тьюринга Размышления о доверительном доверии . Он описал ситуацию, когда у компилятора есть преднамеренный код, который определяет, когда он компилирует ОС, и вставляет уязвимости безопасности; он также определяет, когда он перекомпилирует компилятор, и вставляет код обнаружения.

0 голосов
/ 30 января 2020

«Язык» - это абстрактное понятие; компилятор - это конкретная c, настоящая, работающая программа, которая реализует язык. Компилятор вполне может быть написан на том же языке, на котором он компилируется, но он компилируется конкретной c версией конкретной c реализации этого языка, поэтому работа с ошибками c определяется именно этой реализацией.

Он может быть скомпилирован с реализацией языка из какого-либо другого источника, или из более ранней версии самого себя, или из ограниченной версии самого себя, например. Код вполне может содержать обходные пути для ошибок в этом другом компиляторе. Но опять же, такие ошибки существуют в определенных c реализациях, а не в абстрактном языке, и они обрабатываются так же, как если бы вы работали с ошибками компилятора в любой другой программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...