Если работа компилятора по существу переводит исходный код в код машинного уровня, может ли быть какой-то сбой в компиляторе, то есть ошибочный «перевод»?
То же самое касается переводчика: может ли он иногда не выводить требуемое содержимое?
Я не слышал о каких-либо ошибках в компиляторах / интерпретаторах, но они существуют?
compiler
bug
interpreters
Witch-King
источник
источник
Ответы:
да
Вы склонны чаще находить их в языках, которые активно разрабатываются, чем в тех, которые являются относительно зрелыми (и поэтому не видят много изменений на частой основе). Вероятно, поэтому большинство языков выпускаются на разных «этапах» стабильности. Ночная сборка гораздо менее стабильна, чем кандидат на релиз , которая сама по себе менее стабильна, чем полностью выпущенная и активно используемая версия.
К счастью, большинство из этих языков (особенно те, которые имеют открытый исходный код) имеют общедоступную систему отслеживания ошибок, на которую вы можете отправлять отчеты.
По своему опыту я столкнулся с довольно неясной, но серьезной ошибкой в Scala на Windows . Я отправил свои результаты в систему отслеживания ошибок, и проблема была решена довольно быстро. В этом случае разработчики языка были достаточно умны, чтобы включить полезную заметку в вывод журнала ошибок, предполагая, что на самом деле я столкнулся с ошибкой компилятора, и сказали, куда отправлять отчет.
источник
По словам непрофессионала:
Все программы могут иметь ошибки.
Компиляторы - это программы.
Ergo, компиляторы могут иметь ошибки.
источник
Могут быть ошибки даже в оборудовании; известный пример - ошибка Pentium FDIV . Без сомнения, существует вероятность того, что компиляторы содержат ошибки.
источник
Компиляторы и интерпретаторы также являются программным обеспечением, и, следовательно, они не свободны от проблем другого программного обеспечения.
Это пример компилятора, недавно выпущенного как MSVC 11 (2012) , и вот статья о том, как они тестируют бэкэнд .
источник
Конечно, потому что компиляторы программные.
В 2005 году у меня произошел сбой кода в критически важном программном обеспечении, которое я написал для большой компании. Поскольку компании пришлось заплатить буквально миллионы долларов, они, конечно, начали расследование с большим задом.
К счастью (с моей точки зрения), проблема оказалась проблемой компилятора в Delphi. В блоке try finally возвращаемое значение функции было уничтожено, что привело к абсолютно случайным результатам для вызывающей стороны. Это было задокументировано и подтверждено Borland.
Хорошо известно, что .NET буквально сотен различных утечек памяти, особенно в его ранних реализациях.
Я бы сказал, что нет такой вещи, как программное обеспечение без ошибок. Компиляторы не являются исключением. Они, однако, проверены более тщательно, чем большинство бизнес-программ, и потребляются умными, критичными и спорными людьми, поэтому их послужной список в целом был довольно хорошим.
источник
Не только ошибки, но и преднамеренное вредоносное ПО.
Троян «входа», реализованный Брайаном Керниганом в исходный компилятор Unix C, является наиболее известным из них; статья http://cm.bell-labs.com/who/ken/trust.html имеет некоторые предпосылки по этому вопросу.
источник
Да, конечно, как и у любого программного компилятора, есть ошибки, например, список ошибок gcc здесь
источник
Да.
Кроме того, не только с компиляторами, но также с интерпретаторами / отладчиками и любым сторонним программным инструментом.
В настоящее время мы используем стороннее программное обеспечение, и у нас возникли некоторые проблемы. Иногда они благодарят нас за поиск и сообщение об ошибке. :)
Некоторые из них также имеют некоторые утечки памяти, что приводит к сбою. Важный вопрос здесь может заключаться в том, как определить, есть ли в стороннем инструменте или в компиляторе ошибки для правильной работы вашего приложения?
источник
Компилятор - это программа, которая читает программу, написанную на одном языке (исходном языке), и переводит ее в другую эквивалентную программу на другом языке (целевом языке), главным образом на машинном языке.
Существуют разные фазы компилятора, через которые ваш исходный код языка сканируется построчно. Существует таблица символов, которая отслеживает все ключевые слова, которые сканируются в исходном коде языка.
Этап 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 недостатков.
источник
Конечно, компиляторы - это просто программы, а их авторы тоже идиоты :). Даже в спецификации языка может быть ошибка. Пример: c # + foreach + лямбда .
Или в Python, ошибка в интерпретаторе: компиляция злой аст сбой интерпретатора .
Хорошо, если вы хотите посмотреть на ошибки в компиляторе / интерпретаторе -> посмотрите на php. Существует известная ошибка с целочисленным переполнением. Первое исправление началось с
if (size > INT_MAX) return NULL;
. Продолжение истории .источник