Могут ли компиляторы и интерпретаторы иметь ошибки, и что мы (как пользователи) можем сделать для их устранения? [закрыто]


28

Если работа компилятора по существу переводит исходный код в код машинного уровня, может ли быть какой-то сбой в компиляторе, то есть ошибочный «перевод»?

То же самое касается переводчика: может ли он иногда не выводить требуемое содержимое?

Я не слышал о каких-либо ошибках в компиляторах / интерпретаторах, но они существуют?


6
в разработке они наверняка будут существовать, просто посмотрите на багтрекер на любом компиляторе с открытым исходным кодом
ratchet freak

7
Я не слышал о каких-либо ошибках в компиляторах / интерпретаторах, но они существуют? Я нашел список рассылки об ошибках в компиляторе gcc: gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
Это не очень хороший вопрос, он просто спрашивает что-то, что является здравым смыслом.

12
Пока ни один из комментариев или ответов не касается вероятности ошибки компилятора. Не забудьте сначала исключить ошибки в вашем собственном коде.
Дэн Пичельман

6
Краткий ответ: определенно. В то время как IDE и компиляторы, как правило, работают за несколько секунд до того, как они увидят внешний мир, всегда есть где-то угловой случай, который разработчик найдет слишком умным.
KeithS

Ответы:


51

да

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

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

По своему опыту я столкнулся с довольно неясной, но серьезной ошибкой в ​​Scala на Windows . Я отправил свои результаты в систему отслеживания ошибок, и проблема была решена довольно быстро. В этом случае разработчики языка были достаточно умны, чтобы включить полезную заметку в вывод журнала ошибок, предполагая, что на самом деле я столкнулся с ошибкой компилятора, и сказали, куда отправлять отчет.


Надеюсь, ты не возражаешь; Я добавил новый параграф (в ожидании одобрения), который, по моему мнению, может быть актуален. Компилятор может содержать не только ошибки, но и вредоносный код.
Энди

@ И, похоже, один из модераторов отклонил это как нечто, что должно быть комментарием или отдельным ответом.
KChaloux

Не просто «да», а «черт возьми, да!» :-)
Геллион

С одновременно зрелый и активно развивающийся. Так же и C ++. Так же как и Java. и т.д ..
Джечлин

100

По словам непрофессионала:

Все программы могут иметь ошибки.

Компиляторы - это программы.

Ergo, компиляторы могут иметь ошибки.


55
Больше беспокойства: отладчики - это программы. Поэтому в отладчиках есть ошибки.
Даниэль Гратцер

19
@jozefg: Итак, как вы отлаживаете отладчик? Кто смотрит на зрителей?
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner Наблюдатели-наблюдатели.
Джимми Хоффа

9
@JoelFan Так как я написал "может иметь", это исключение покрыто. Если вы говорите «иметь», вы должны указать, что имеете в виду только нетривиальные программы. Говоря «может иметь», вы не должны.
Тулаинс Кордова

8
Программы "Hello world" могут иметь ошибки, если они выполняются компилятором с ошибками.
wtsang02


8

Компиляторы и интерпретаторы также являются программным обеспечением, и, следовательно, они не свободны от проблем другого программного обеспечения.

Это пример компилятора, недавно выпущенного как MSVC 11 (2012) , и вот статья о том, как они тестируют бэкэнд .



4

Конечно, потому что компиляторы программные.

В 2005 году у меня произошел сбой кода в критически важном программном обеспечении, которое я написал для большой компании. Поскольку компании пришлось заплатить буквально миллионы долларов, они, конечно, начали расследование с большим задом.

К счастью (с моей точки зрения), проблема оказалась проблемой компилятора в Delphi. В блоке try finally возвращаемое значение функции было уничтожено, что привело к абсолютно случайным результатам для вызывающей стороны. Это было задокументировано и подтверждено Borland.

Хорошо известно, что .NET буквально сотен различных утечек памяти, особенно в его ранних реализациях.

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


Существует «формально проверенное» программное обеспечение. Это математически доказано, что работает. Иногда даже формально проверенный код имеет ошибки. IIRC Реализация быстрой сортировки Java была официально проверена, но это не учитывало переполнения.
Дэвид Племптон

1
Какое было программное обеспечение? Да ладно :)
Роклан

2

Не только ошибки, но и преднамеренное вредоносное ПО.

Троян «входа», реализованный Брайаном Керниганом в исходный компилятор Unix C, является наиболее известным из них; статья http://cm.bell-labs.com/who/ken/trust.html имеет некоторые предпосылки по этому вопросу.


1
Понятно ли, что это действительно было реализовано?
Кит Томпсон

Это довольно интересная тема, но никак не связанная с этим вопросом.

@delnan Я не согласен; В основе вопроса, кажется, лежит "насколько я могу доверять моему компилятору?"
Энди

1

Да, конечно, как и у любого программного компилятора, есть ошибки, например, список ошибок gcc здесь


0

Да.

Кроме того, не только с компиляторами, но также с интерпретаторами / отладчиками и любым сторонним программным инструментом.

В настоящее время мы используем стороннее программное обеспечение, и у нас возникли некоторые проблемы. Иногда они благодарят нас за поиск и сообщение об ошибке. :)

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


Ваш важный вопрос затем вернется к проблеме остановки
wtsang02

0

Компилятор - это программа, которая читает программу, написанную на одном языке (исходном языке), и переводит ее в другую эквивалентную программу на другом языке (целевом языке), главным образом на машинном языке.

Существуют разные фазы компилятора, через которые ваш исходный код языка сканируется построчно. Существует таблица символов, которая отслеживает все ключевые слова, которые сканируются в исходном коде языка.

Этап 1: Lexical Analyzer - читает все символы в исходной программе и формирует логическое разделение токенов (int, char, float, if-else, for, while и т. Д.)

Фаза 2: Syntax Analyzer - анализ структуры потока токенов. Иерархический разбор выражений, который включает постфикс / префикс и т. Д. (A = b + c * d)

Этап 3: Семантический анализатор - проверка типа токенов (целочисленного или действительного, с плавающей точкой и т. Д.) И многих других вещей, таких как приоритет операторов и т. Д.

Этап 4: Генератор промежуточного кода - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

Этап 5: Оптимизация кода - Различный анализ (поток управления, поток данных, преобразования),
который включает в себя: код избыточности, распространение констант, частично мертвый код, общее подвыражение, инвариантный код цикла

Этап 6: Генерация кода - Генерация целевого кода (в основном языка ассемблера), помещение значений в регистры

Все эти фазы - не что иное, как хорошо написанные программы, и в этом может быть N недостатков.


-1

Конечно, компиляторы - это просто программы, а их авторы тоже идиоты :). Даже в спецификации языка может быть ошибка. Пример: c # + foreach + лямбда .

Или в Python, ошибка в интерпретаторе: компиляция злой аст сбой интерпретатора .

Хорошо, если вы хотите посмотреть на ошибки в компиляторе / интерпретаторе -> посмотрите на php. Существует известная ошибка с целочисленным переполнением. Первое исправление началось с if (size > INT_MAX) return NULL;. Продолжение истории .


Авторы компиляторов не идиоты. Поскольку составители довольно сложны, барьер для выхода на поле также значительно выше. Поэтому мы можем ожидать, что люди, которые их пишут, не совершают ошибок, как обычные парни.
jszpilewski

Функция foreach / lambda не является ошибкой, она сводится к определенному и сознательному решению о дизайне, принятому до добавления лямбд.
Энди

@ Энди, как я знаю, никто не знал, какие проблемы вызовет это решение. Почему не ошибка?
Виктор Лова

@jszpilewski ты видишь улыбку после этого текста?
Виктор Лова

1
Я предлагаю вам перечитать OP, так как его вопрос не в том, могут ли ошибки содержать спецификации, а в том, могут ли ошибки быть в COMPILERS. Поскольку компилятор C # соответствовал спецификации, у компилятора не было ошибки. Я также предлагаю вам перечитать вашу собственную цитату из Википедии "Программная ошибка - это ошибка, ошибка, сбой или ошибка в компьютерной программе"
Энди
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.