Обчислювальна твердість "реальних" комп'ютерних програм


10

Я часто чув, як вона говорила, що ви не можете написати програму, щоб ловити помилки у веб-браузері, текстовому процесорі чи операційній системі, через теорему Райса: будь-яке семантичне властивість для мови, повного Тьюрінга не можна визначити.

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


ви не можете перевірити нетривіальні універсальні властивості (наприклад, щось утримується для всіх входів) набагато слабших моделей, наприклад, ви не можете перевірити, чи дві обчислювані багатопоточні ТМ обчислюють одну і ту ж функцію (хоча зупинка вирішальна для них, тому що політайм ТМ завжди зупиняється). З іншого боку, якщо область входів обмежена, ви можете перевірити деякі властивості в деяких моделях, наприклад, програма не виходить з ладу на входах розміром менше 1000, принаймні теоретично (на практиці це може бути незрозумілим).
Каве

м'яко пов’язане питання
Артем Казнатчеєв

Відповіді:


14

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

Однак, наївні обмеження на модель обчислення насправді не дуже допомагають тобі в покращенні практичності аналізу програм. Причина полягає в тому, що ви можете отримати програми, які роблять «майже те саме», обертаючи цикли

while P do 
   C

в петлі for з великою постійною ітерацією:

for i = 0 to BIGNUM do 
  if P then 
    C
  else
    break

Тепер ця програма навіть не потребує повної сили примітивної рекурсивної (оскільки for-цикл може бути макророзширений у величезну вкладену операцію if-then-else), але в більшості практичних випадків вона буде вести себе так само, як і раніше. Зауважте, що це допомагає теоретично вирішувати - програма загальна, тому ви можете відповідати на запитання, запустивши програму і побачивши, що відбувається. Насправді ми цього не хочемо, а це отримувати відповіді швидше, ніж запускати програму - введене штучне припинення насправді не допомагає аналізу програми на практиці, оскільки помилки виникають через помилки в реальній логіці програми, а у нас немає ' t взагалі цього не торкнувся.

Крім того, додавання засобів абстрагування до мови програмування може кардинально погіршити складність проблеми аналізу, полегшивши перевірку програм на практиці. Наприклад, доведення закінчення просто типізованого обчислення лямбда з натуральними числами вимагає індукції до , але додаючи поліморфізм типу, ви отримуєте Систему F, доказ якої закінчується настільки ж сильною, як послідовність арифметики другого порядку. Однак на практиці програми, написані на F, набагато простіше перевірити, оскільки модульні властивості кількісного визначення другого порядку значно спрощують написання структурованих програм та підтвердження правильності.ϵ0


Що ви маєте на увазі під "цією програмою навіть не примітивної рекурсивної"?
Райан Вільямс

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

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

Можливо, було б зрозуміліше сказати щось на кшталт "цій програмі навіть не потрібна вся сила примітивної рекурсії".
Макс

@Max: пропозиція прийнята!
Neel Krishnaswami

5

Оскільки ви запитували про коректність програм реальних програм, таких як операційні системи, вас може зацікавити проект seL4 ( журнал , pdf , конференція ).

Команда NICTA взяла мікро-ядро третього покоління з 8700 ліній С та 600 ліній асемблера, реалізованих згідно з абстрактною специфікацією в Haskell. Вони надали офіційний перевірений машиною доказ (у Isabelle / HOL), що впровадження суворо відповідає технічним умовам. Таким чином, доведено, що їхня програма відсутня помилок.

Так що, як і проблема зупинки, хоча вона взагалі не може бути вирішена, вона може бути вирішена для деяких конкретних випадків. У цьому випадку, хоча ви не можете довести, що довільний код C не містить помилок, вони могли б зробити це у випадку мікроклетки seL4.


Зауважте, що сертифікований код все ще вразливий до помилок у його специфікації, тому ви можете лише сказати, що код відсутній помилок відносно специфікації.
nponeccop

@nponeccop, безумовно, правда, але коли ви починаєте сумніватися в специфікації, ви також починаєте дійсно розмивати сумнозвісну лінію про помилки. Щоб назвати щось "помилкою", ви повинні мати на увазі якусь неявну специфікацію, захоплення інтуїцією за такою неявною специфікацією починає копати по-справжньому глибоко, поки ви не потрапите на питання в основах філософії математики (у стилі Brouwer vs. Hilbert) .
Артем Казнатчеєв

Під «специфікацією» я мав на увазі формальну специфікацію, тобто формальні теореми, які ви підтверджуєте. Ви все ще можете помилитися, перетворюючи свої текстові вимоги в теореми. Єдине, що ви отримуєте при сертифікації - це скорочення вашої довіреної кодової бази (слід довіряти лише своїм теоремам, а не коду чи доказів) та узгодженості коду зі своїми теоремами.
nponeccop

Ось цитата з веб-сайту seL4: «Код С мікроядра seL4 правильно реалізує поведінку, описану в її абстрактній специфікації, і більше нічого».
nponeccop

2

Питання, які ви задаєте, насправді зовсім інші.

Однак я не впевнений, наскільки це стосується реальної програми, що подобається операційним системам. Чи потрібні ці типи програм повною мірою повноти Тьюрінга?

Потрібно вкрай мало, щоб модель обчислення була Тюрінгом завершеною. Наприклад, різні моделі з лічильниками можуть імітувати машини Тьюрінга. Якщо ви вважаєте, що для вашого програмного забезпечення потрібно більше двох лічильників, якими ви можете довільно маніпулювати, ви використовуєте повну мову Тюрінга. Хоча машинні цілі числа є аріорі обмеженими, структури даних, виділені купуми, зазвичай не є. Якщо ваше програмне забезпечення потребує списків, дерев та інших динамічно розподілених даних, ви використовуєте повну мову Turing.

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

Важливо визнати, що ми не хочемо перевіряти довільні властивості нашого програмного забезпечення. Перевірка дуже специфічних вузьких властивостей (відсутність переповнення буфера, відсутність відміни нуля-покажчика, відсутність нескінченних циклів тощо) надзвичайно покращує якість та зручність використання програмного забезпечення. Теоретично такі проблеми досі не вирішені. На практиці фокусування на конкретних властивостях дозволяє виявити в наших програмах структуру, яку ми можемо часто використовувати для вирішення проблеми.

Зокрема, ви можете змінити своє оригінальне запитання

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

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

Є додатки, де люди дбають про складні властивості свого обладнання або програмного забезпечення. Апаратні компанії хочуть, щоб їхні чіпи правильно реалізували арифметичні алгоритми, автомобільні та авіонічні компанії хочуть, щоб програмне забезпечення було правильно. Якщо це важливо, вам краще скористатися (навченою) людиною.


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

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

@Vijay: ні, це неправда. Існує безліч теорій типів (наприклад, Agda і Coq), які є надзвичайно експресивними і не дозволяють безмежної рекурсії.
Ніл Крішнасвамі

@Neel: Для уточнення я кажу лише про повноту Тьюрінга. Чи не можливо в цих теоріях імітувати машину Тюрінга?
Vijay D

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