Составитель тестов или как проверить компилятор
компиляторы, как и все программное обеспечение, также будут подвержены ошибкам, логическим ошибкам.
Как проверить вывод, сгенерированный компилятором. Как правило, мой вопрос(являются)
Как проверить правильность созданного машинного кода?
Как обеспечить что произведенный код машины согласно спецификации языка.
имеет ли смысл просто выбрать проект с открытым исходным кодом (в C, если вы также пишете компилятор в C), чтобы просто скомпилировать его через "компилятор". В этом случае также, как судить, что компилятор ведет себя, как ожидалось.
существуют ли какие-либо формальные тестовые случаи (литература), предоставленные комитетом по языковым стандартам, которые должен удовлетворять компилятор, соответствующий языку?
-
каковы уверенные "отдачи", что проблема в программе, скомпилированной компилятор ошибка компилятора и не программная ошибка.
- любые примеры, когда основные компиляторы путаются и компилируют код неправильно?
ссылки на любую литературу буду признателен.
7 ответов
существует несколько наборов тестов компилятора. Нам повезло с использованием Сливы Зале тестов для компилятора C. Он состоит из большого набора кода C, специально написанного для тестирования против языкового стандарта. Он проверяет, что компилятор может обрабатывать синтаксис и семантику языка.
хорошие наборы тестов для реальных языков дороги для создания и обслуживания. Есть причина, что набор тестов Plum Hall, который является отраслевым стандартом для ANSI C, так чертовски дорого.
Джордж Некула проверка перевода - блестящая идея, но и довольно дорого реализовать.
единственное, что дешево и легко это: поддерживать набор регрессионных тестов, и каждый раз, когда вы исправить ошибку в компиляторе, поместите подходящий тест в свои наборы регрессии. С компиляторами невероятно, как легко снова и снова вводить одну и ту же ошибку. Дисциплинированные дополнения к вашему набору регрессии предотвратят это, и они не стоят много.
общая практика заключается в создании большого набора небольших программ, каждая из которых демонстрирует один из аспектов компилятора. Они будут включать как программу, которая компилируется, так и те, которые не должны. Общие ASM, выходящий из задней части, не проверяется, а программа запускается, и ее вывод проверяется. Что касается того, как убедиться, что в тестовых случаях нет ошибок: сделайте их маленькими, как в 5-10 строках каждый.
эти наборы тестов могут быть очень большими, как в сотнях до тысяч тестов (например: устаревший набор тестов для языка программирования D) и обычно включают один или несколько тестовых случаев для каждой ошибки никогда не сообщается.
идеи для компиляции большого проекта с открытым исходным кодом:
вы можете взять проект, который несет в себе набор тестов. Затем вы компилируете проект и его набор тестов и смотрите, проходят ли тесты. Чтобы проверить эти результаты, вы компилируете проект и набор тестов с другим компилятором и снова запускаете тесты.
было более ранний вопрос, связанный с этим для C, но это сводится к тщательно написанному набору тестов компилятора.
Что касается того, когда компиляторы получают код неправильно, я ударил это достаточно часто в моей профессиональной карьере, спасибо. Со временем это происходит все реже и реже, но я нашел ошибку в компиляторах MS c++, ориентированных на CLI на этой неделе.
компилятор Eiffel является открытым исходным кодом и имеет обширную библиотеку тестовых случаев и внутренних контрактов на проектирование.
GCC имеет довольно большой набор тестов (https://gcc.gnu.org/onlinedocs/gccint/Testsuites.html#Testsuites). Он доступен на SCM:https://github.com/gcc-mirror/gcc/tree/master/gcc/testsuite