Чи можуть компілятори та інтерпретатори мати помилки, і що ми можемо (як користувачі) зробити з ними? [зачинено]


28

Якщо робота компілятора по суті є перекладом вихідного коду в код машинного рівня, чи може бути якийсь збіг у компіляторі, тобто несправний "переклад?"

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

Я не чув жодних помилок у компіляторах / перекладачах, але вони існують?


6
в розробці вони, безумовно, існуватимуть, просто подивіться на випробування будь-якого компілятора з відкритим кодом
ratchet freak

7
Я не чув жодних помилок у компіляторах / перекладачах, але вони існують? Я знайшов список розсилки для помилок у компіляторі gcc: gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
Це не дуже вдале запитання, воно просто задає щось здорове.

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

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

Відповіді:


51

Так

Ви схильні знаходити їх більше в мовах, які активно розробляються, ніж в тих, які є відносно зрілими (і, отже, не спостерігають багато змін на частоті). Можливо, тому більшість мов випускається на різних "етапах" стабільності. Нічна збірка набагато рідше буде стабільною, ніж кандидат на реліз , який сам є меншим шансом бути стабільним, ніж повністю випущена та активно використовується версія.

На щастя, більшість із цих мов (особливо з відкритим кодом) матиме публічну систему відстеження помилок, до якої можна надсилати звіти.

На моєму власному досвіді я зіткнувся з досить незрозумілою, але сильною помилкою у Scala на Windows . Я подав свої висновки в програму пошуку помилок, і проблема була вирішена досить швидко. У цьому випадку розробники мови були досить розумні, щоб включити корисну примітку до виводу журналу помилок, підказавши, що те, що я зіткнувся, насправді була помилкою компілятора, і сказала, куди подати звіт.


Сподіваюся, ви не заперечуєте; Я додав новий абзац (очікуємо схвалення), який, на мою думку, може бути актуальним. Компілятор не тільки може містити помилки, він може містити і шкідливий код.
Енді

@Andy, схоже, один з модераторів відхилив це як щось, що має бути коментарем або окремою відповіддю.
KChaloux

Не просто "так", а "пекло так!" :-)
Hellion

С одночасно зрілий і активно розвинений. Так само і C ++. Так само і Java. і т. д.
djechlin

100

Словами мирянина:

Усі програми можуть мати помилки.

Компілятори - це програми.

Так, компілятори можуть мати помилки.


55
Більш занепокоєння: Налагоджувачі - це програми. Тому у налагоджувачів є помилки.
Даніель Гратцер

19
@jozefg: Тож як ви налагодити налагоджувач? Хто дивиться вахтерів?
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner Дитячі спостерігачі, так.
Джиммі Хоффа

9
@JoelFan Оскільки я написав "може мати", це виключення стосується. Якщо ви говорите "є", ви повинні вказати, що ви посилаєтесь лише на нетривіальні програми. Сказавши "може мати", не потрібно.
Tulains Córdova

8
Програми "Hello world" можуть мати помилки, якщо їх виконує помилковий компілятор.
wtsang02


8

Компілятори та перекладачі теж є програмним забезпеченням, і тому вони не позбавлені жодної проблеми іншого програмного забезпечення.

Це приклад компілятора, недавно MSVC 11 (2012) , і ось стаття про те, як вони тестують бекенд .



4

Звичайно, тому що компілятори - це програмне забезпечення.

У 2005 році у мене виявилася помилка коду у дуже критичній програмі, яку я написав для великої компанії. Оскільки це коштувало компанії буквально мільйонів доларів для виправлення, вони, звичайно, розпочали велике розслідування.

На щастя (з моєї точки зору), ця проблема виявилася проблемою компілятора в Delphi. У блоці спробу нарешті повернене значення функції було знищено, і це призвело до абсолютно випадкових результатів назад до абонента. Це було задокументоване і визнане Борлендом.

У NET було відомо, що він має сотні сотень різних витоків пам'яті, особливо в ранній реалізації.

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


Існує "формально перевірене" програмне забезпечення. Це математично доведено, що працює. Іноді навіть формально підтверджений код має помилки. Реалізація quicksort IIRC Java була офіційно перевірена, але це не враховувало переповнення.
Девід Пламптон

1
Яке було програмне забезпечення? C'mon :)
Rocklan

2

Не лише помилки, а й навмисне зловмисне програмне забезпечення.

Найвідоміший із них - троян "входу", реалізований Брайаном Керніган для оригінального компілятора Unix C; стаття http://cm.bell-labs.com/who/ken/trust.html має деякі відомості щодо цього.


1
Чи зрозуміло, що це було реально реалізовано?
Кіт Томпсон

Це досить цікава тема, але зовсім не пов’язана з цим питанням.

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

1

Так, звичайно, як і будь-які компілятори програмного забезпечення мають помилки, наприклад, список помилок gcc тут


0

Так.

Крім того, не тільки з компіляторами, але і з Інтерпретаторами / налагоджувачами та будь-яким стороннім програмним інструментом.

Наразі ми використовуємо програмне забезпечення сторонніх розробників, і виникли деякі проблеми. Іноді вони дякують нам за те, що знайшли та повідомили про помилку. :)

Деякі з них також мають деякі витоки пам'яті, що призводить до збоїв. Тут може бути важливим питанням, як визначити, чи сторонній інструмент чи компілятор мають помилки, щоб ваша програма працювала правильно?


Тоді ваше важливе запитання повернеться до проблеми зупинки
wtsang02

0

Компілятор - це програма, яка читає програму, написану однією мовою (мова-джерело) і переводить її в іншу еквівалентну програму іншою мовою (цільовою мовою), переважно машинною мовою.

Існують різні фази компілятора, за допомогою яких ваш код вихідної мови сканується по черзі. Існує таблиця символів, яка відслідковує всі ключові слова, на які відскановано код коду мови.

Фаза 1: Лексичний аналізатор - читає всі символи у вихідній програмі та формує логічне розділення лексем (int, char, float, якщо інше, for, while тощо)

Фаза 2: Синтаксичний аналізатор - проаналізуйте структуру потоку лексем. Ієрархічний аналіз виразів, який включає постфікс / префікс тощо (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 + lambda .

Або в Python, помилка в інтерпретаторі: Компіляція злого астма дає збій інтерпретатору .

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


Письменники-укладачі - не ідіоти. Оскільки компілятори досить складні, бар'єр для виходу на поле також значно вищий. Тож ми можемо очікувати, що люди, які їх пишуть, не допускають помилок, як це роблять середні хлопці.
jszpilewski

Foreach / lambda - це не помилка, вона зводиться до конкретного та сумлінного дизайнерського рішення, прийнятого до додавання лямбда.
Енді

@Andy, як я знаю, ніхто не знав, які проблеми спричинить це рішення. Чому б не помилка?
Віктор Лова

@jszpilewski Ви бачите посмішку після цього тексту?
Віктор Лова

1
Я пропоную вам перечитати ОП, оскільки його питання полягає не в тому, чи можуть специфікації мати помилки, а в тому, чи можуть КОМПІЛЕРИ мати помилки. Оскільки компілятор C # відповідав специфікації, у компілятора не було помилок. Я також пропоную вам перечитати власну цитату у Вікіпедії "Програма програмного забезпечення - це помилка, недолік, збій або несправність у комп'ютерній програмі"
Енді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.