Сертифікований компілятор та оптимізації в Coq / Agda


9

Мене цікавлять перевірені компілятори, формалізовані в теорії типу Мартіна-Лефа, тобто Coq / Agda. На даний момент я написав невеликий приклад іграшки. Цим я можу довести, що мої оптимізації правильні. Наприклад, що доповнення з нулем можна усунути, тобто вирази типу "x + 0".

Чи є оптимізації, які складно виконати звичайному компілятору, які можуть слугувати хорошим прикладом? Чи можливо довести певні властивості програми, які дозволяють оптимізувати, які неможливо виконати за допомогою звичайного компілятора? (тобто без умовиводу, який можливий із доведенням теореми)

Мені були б цікаві ідеї чи приклади, а також посилання на цю тему.

Пов'язане питання: Докази правильності компілятора

редагувати: Як Цуйоші чудово сказав це в коментарях: я шукаю методи оптимізації, які важко реалізувати, якщо компілятор написаний (скажімо) C, але простіший у застосуванні, якщо компілятор написаний у (скажімо) Coq. Коли Agda компілюється в C (через haskell), можна зробити все, що можливо в Agda, також і в C. Мабуть, єдиною перевагою доказів теорем, таких як Coq / Agda, є те, що компілятор та оптимізації можна перевірити.

edit2: За пропозицією Vijay DI написати те, що я читав до цього часу. В основному я зосередився на Ксав'єрі Лерої та проекті CompCert в INRIA (я думаю, що на 80 сторінках є хороший прочитання). Другий інтерес викликала робота Антона Сетцера над інтерактивними програмами. Я хоч це, можливо, його робота може бути використана для доведення властивостей програм IO та бісімуляції програм IO. Дякуємо, що згадали про Sewell. Я чув його розмови "Казки з джунглів" в ICFP і прочитав, можливо, 2-3 його статті. Але я спеціально не дивився на його роботу та роботу його співавторів.
Я ще не дізнався, з чого почати чи шукати папери з оптимізації компіляторів; наприклад, які оптимізації було б цікаво подивитися в налаштуваннях перевіреного компілятора.


1
"Чи є оптимізації, які важко виконати за допомогою звичайного компілятора": Хіба це неможливо? Якщо я видалю доказ коректності з перевіреного компілятора, я отримаю звичайний компілятор. Тому все, що може зробити перевірений компілятор, може зробити і звичайний компілятор. Суть перевіреного компілятора полягає в тому, що він не може здійснити оптимізацію, яка є неправильною. (Мої знання про компілятори та перевірку програми мінімальні. Вибачте, якщо я пропускаю пункт.)
Tsuyoshi Ito

@Tsuyoshi дякую за ваш коментар. Я мав на увазі: Чи можу я довести певні властивості (які гарантовано зберігаються) для програми (наприклад, підпрограма не є учасником і ніколи не може викликати себе), які дозволяють виконувати оптимізацію, яка зазвичай не можлива. Деяким інваріантам може бути важко перевірити програму, і, можливо, ці оптимізації не виконуються часто використовуваними компіляторами. Але, можливо, я абсолютно помиляюся.
mrsteve

1
Ви говорите про компілятор, написаний на Coq / Agda, або про компілятор для Coq / Agda? Я думав, що ваше запитання стосується компілятора, написаного на Coq / Agda, але тоді я не думаю, що компілятор, написаний на Coq / Agda, може довести більше властивостей цільових програм, ніж компілятор, написаний в C.
Tsuyoshi Ito

2
Добре було б до запитання додати те, що ви прочитали. Чи знайомі ви з роботою з перевіреної компіляції - наприклад, з Ксав'єром Лероєм? Або це Пітер Сьюелл та його співробітники?
Vijay D

1
Таких оптимізацій немає, якщо ви додатково не обмежуєте своє питання. У крайньому випадку компілятор C може таємно реалізувати доказ теореми у своїх надрах (а більшість насправді робити це обмежено). Я думаю, незрозуміло, що ви маєте на увазі під "звичайним компілятором".
Андрій Бауер

Відповіді:


5

ця праця Іва Бертота, Бенджаміна Грьоґуара та Ксав'є Лероя будує оптимізуючий компілятор для мови, подібної С, що базується виключно на специфікації Coq. деякі з цієї технології, по- видимому , використовувані в компіляторі CompCert C .

Структурований підхід до доказу оптимізацій компілятора на основі аналізу потоків даних

він розглядає правильність двох оптимізацій, постійного розповсюдження (CP) та загального усунення субдекспресії (CSE), розділ 4. Ці оптимізації є більш досконалими, ніж ті, які пов'язані з компіляторами, що не засновані на Coq, для тієї ж мови. див., наприклад, цю орієнтирову діаграму порівняно з gcc. (Імовірно, компілятор на основі Coq компілюється повільніше, хоча про це рідко згадується!)

Оригінальним аспектом ConCert є те, що більша частина компілятора написана безпосередньо мовою специфікації Coq у чисто функціональному стилі. Виконавчий компілятор отримується шляхом автоматичного вилучення коду Caml з цієї специфікації.

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

вдосконалена оптимізація не є єдиним елементом розгляду тут. Інший аспект полягає в тому, що логіка оптимізації компілятора може зазнавати тонких дефектів esp через її складний характер. протягом багатьох років у GCC було виявлено помилок у численних логічних процедурах оптимізації. наприклад помилка gcc?


3

Чи можу я довести певні властивості (які гарантовано зберігаються) для програми (наприклад, підпрограма не є учасником і ніколи не може викликати себе), які дозволяють виконувати оптимізацію, яка зазвичай не можлива.

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

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

Однак, наскільки я бачу, це було б досить корисно для зміцнення підтипів. - Важко змусити програміста дізнатися, яка властивість у якому місці була б корисною для оптимізатора.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.