Що є теоретичною основою імперативного програмування?


48

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

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

Відповіді:


27

Взагалі, коли математика використовується для вивчення деякого X , спочатку потрібна модель X , а потім розробляється теорія, набір результатів про цю модель. Я припускаю , що теорія може бути названа «теоретичною основою» для X . Тепер встановіть X = обчислення. Існує багато моделей обчислень, багато з яких включають "стан". У кожної моделі є своя "теорія", і іноді можливо "перекласти" між моделями. Я вважаю, що важко сказати, яка модель є "базовішою" --- вони просто розроблені з різними цілями на увазі.

Машини Тьюрінга були розроблені для визначення того, що можна обчислити . Тож вони роблять хорошу модель, якщо вам важливо, чи існує алгоритм певної проблеми. Цією моделлю іноді зловживають, щоб вивчити ефективність алгоритмів або жорсткість проблем, під приводом того, що це досить добре, принаймні, якщо ви дбаєте лише про поліном / не многочлен. Модель оперативної пам’яті наближається до реального комп’ютера і тому краще, якщо ви хочете точний аналіз алгоритму. Поставити нижні межі на жорсткість проблем краще невикористовуйте модель, що занадто сильно нагадує сучасні комп’ютери, оскільки ви хочете охопити широкий спектр можливих комп'ютерів, при цьому залишаючись більш точними, ніж просто поліном / не многочлен. У цьому контексті я бачив, наприклад, використану модель клітинного зонда.

Якщо ви дбаєте про правильність , то все ж корисні інші моделі. Тут ви маєте оперативну семантику (яка, як я б сказав, є аналогом обчислення лямбда для державних обчислень), аксіоматичну семантику (розроблену в 1969 році Хоаром на основі індуктивних тверджень Флойда з 1967 року, яку популяризує Кнут у "Мистецтві комп'ютерного програмування" , том 1) та ін.

Підводячи підсумок, я вважаю, що ви після моделей обчислень. Існує багато таких моделей, розроблених з різними цілями на увазі, і багато мають державні, тому вони відповідають імперативному програмуванню. Якщо ви хочете знати, чи можна щось обчислити, то подивіться на машини Тьюрінга. Якщо ви дбаєте про ефективність, подивіться на моделі ОЗУ. Якщо ви дбаєте про правильність, подивіться на моделі, які закінчуються на "семантиці", наприклад, операційній семантиці.

Насамкінець, зазначу, що в Інтернеті є велика книга лише про Моделі обчислень Джона Савиджа. Йдеться переважно про ефективність. Для частки коректності рекомендую почати з класичних робіт Флойда (1967) , Хоара (1969) , Дейкстри (1975) та Плоткіна (1981) . Всі вони досить круті.


4
Я думаю, що оперативна семантика - це дійсно те, що шукає плакат. Трохи більше інформації про wikipedia: en.wikipedia.org/wiki/Operational_semantics
sclv

22

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

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


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

@ Джошуа: Чому ви вважаєте, що державні монади не виражають семантику посилань? Мені не вдається зрозуміти, що може бути запереченням.
Чарльз Стюарт

Монада стану - це в основному синтаксичний цукор для того, щоб мати сукупність функцій, які всі приймають додатковий аргумент (стан) і виводять додатковий вихід (наступний стан). Але чисто функціональною мовою ви фактично не можете змінити стан, щоб отримати наступний стан, вам все одно доведеться копіювати та реконструювати. Я не знаю, чи існують конкретні структури даних, де відомо, що вони не можуть бути ефективно реалізовані чисто функціональною мовою, але, безумовно, є сугестивні докази (наприклад, Pippenger. Pure vs. нечистий Lisp. 1997).
Джошуа Грохов

6
Можна добре засвоїти семантику мутації монадами - див., Наприклад, монаду ST у Haskell. Ми говоримо тут про семантику, а не про реалізацію.
sclv

20

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


8
Монади можуть бути використані для відключення імперативного програмування в суто функціональному світі, але я не можу бачити випадку для того, щоб стверджувати, що вони складають теоретичну основу для імперативного програмування, аналогічного зв'язку між лямбдальним численням і багатьма функціональними мовами. Монади не моделюють обчислення настільки, наскільки вони утворюють абстракцію над класами обчислень (наприклад, чисті обчислення проти обчислень, що включають в себе IO, або обчислення, що спираються на певний набір змінного стану).
blucz

1
Монади - це спосіб написати більш чіткий денотаційний семантичний для ефективних мов, так чому б і ні?
nponeccop

15

Якщо ви шукаєте суворе математичне поводження з імперативною мовою програмування, приклад книги Вінскеля "Формальна семантика мов програмування" (1993).

У книзі він визначає імперативну мову програмування під назвою IMP та надає її оперативну, денотаційну та аксіоматичну семантику.


14

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

Коли я був магістрантом, у нас був чудовий професор математики, який читав нам лекції з історії та розвитку математики. За його словами, математика розвивалася в хвилях "розширення" та "консолідації". Під час фази розширення були розглянуті та досліджені нові, раніше невідомі ідеї. Потім, на етапі консолідації, нові теорії були інтегровані в існуючий масив знань. Однак у 20 столітті, за його словами, розширення та консолідація відбуваються паралельно.

В даний час імперативне програмування - це розширення діяльності з математики. Раніше це було "невідомо". (Це може бути не зовсім правдою. Хоар говорить нам , що Евклід займався чимось на зразок імперативного програмування у своїй Геометрії. Але математика втратила інтерес до цього, на краще чи гірше.) Математики досі не зацікавлені в імперативному програмуванні. Стільки втрат для них. Але я розглядаю всю Інформатику як галузь математики в абстрактному розумінні. Ми її вивчаємо, розширюючи математику в процесі.

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


"Функціональне програмування блідо у порівнянні". Тепер якби я міг завести вас і Боба Гарпера на бойову арену. Ви розмахуєте великим блоком команд, і він спробує кинути вам закриття. (PS: Дуже гарна відповідь, я її підтримав.)
Андрій Бауер

Що ж, він мене якось уникає. Я не знаю, чи означає це щось :-)
Удай Редді,

11

Функціональне програмування має чітку основу в математиці, оскільки функціональні мови програмування еволюціонували паралельно відповідній математиці, і їхні дизайнери, як правило, велику увагу приділяли математиці. Міцний і прямий взаємозв'язок - це пророцтво, що самореалізується.

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

Багато людей намагаються пояснити імперативне програмування в (традиційно) функціональному плані. Це може бути найближче, що ми можемо дістатись до того, що ви шукаєте, але ці спроби незмінно незручні, нудні, криміналістичні. Я впевнений, що я скоріше відверну очі з обличчя, ніж прочитаю доказ про прогрес / збереження для CLR.

Зазвичай, якщо ви дістанете до кінця гідний підручник з pl (наприклад, типи Pierce та мови програмування), ви почнете бачити формальне моделювання імперативних мовних особливостей. Це вам може бути цікавим.


11

An Axiomatic Basis for Computer Programming Автомобілем

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

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.85.8553&rep=rep1&type=pdf


8

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


7

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

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


ти справді мав намір зробити цю вікі спільноти?
Суреш Венкат

Так, я мав на увазі зробити це вікі спільноти.
jbapple

7

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

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

Варто зазначити і те, що логіку хоара / розділення можна розглядати як монаду, і що існує ряд сучасних проектів, таких як проект «ynot at harvard», які вивчають ці теми.

дослідження логіки розділення - це постійне та активне поле.


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

дуже вдале уточнення, хоча я вважаю, що цілий ряд людей використовували монади а-ля-хаскелл для дослідження семантики за допомогою монад-трансформаторів. Зокрема, різну семантику для операцій, що виникають із різних композицій зазначених трансформаторів (наприклад, щодо стану / змінності, тривалості, недетермінізму тощо)
Carter Tazio Schonwald,

5

До цього питання я приходжу ще пізніше, але мене однаково захоплює.

Чому теорія імперативного програмування вважається менш усталеною, ніж теорія функціонального програмування, уникає мене. Це, мабуть, почало серйозно ставитися до Скотта і де Баккера в 1969 р. З їх аналізу значення рекурсії простою імперативною мовою [1]. Коли імперативна мова набуває особливостей, історія стає дещо грізнішою, але це лише ціна, яку потрібно заплатити за те, щоб бути ближче до металу. Щоб назвати одне з всеосяжніших зусиль, у 1980 році де Баккер, де Брюйн та Цукер написали монографію на цю тему [2]. Інші були згадані вище. Ці посилання, звичайно, логіки розділення перед датами, але [2] все-таки вирішує масиви та взаємно рекурсивні процедури.

[1]: не опублікований у 1969 р., Але з'явився як Джейко У. де Баккер та Дана С. Скотт. Теорія програм , сторінки 1-30. У Клоп та ін. JW de Bakker, 25 января. CWI, Амстердам, 1989. Liber Amoricum.

[2]: Jacobus W. de Bakker, Arie de Bruin, Jeffrey Zucker: Математична теорія коректності програми. Prentice Hall 1980.


1
Очевидно, що імперативне програмування надзвичайно добре зрозуміло. Я думаю, що люди мають на увазі, коли вони говорять, що це менш врегульовано, це те, що в структурі імперативне програмування багатше чистого функціонального програмування, і було виявлено набагато менше математичної структури, що виникає в тій чи іншій формі імперативного програмування. Наприклад, певні види імперативних програм можуть міркувати про непогане використання логіки розділення. Це, мабуть, стосується форм обміну. Може, такі програми мають приємну, абстрактну математичну характеристику?
Мартін Бергер

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

@Kai. Ласкаво просимо до теми! З давніх пір я дивився на роботу де Баккера, але я вважаю, що основна проблема полягає в тому, що підхід не змінює масштабність. Короткий підсумок прогресу в імперативному програмуванні з тих пір дивіться у моєму дописі "Що означає денотаційна семантика?" посилання на нитку .
Удай Редді

@NeelKrishnaswami. Я хотів би бачити ці докази. Чи є вони на вашій веб-сторінці? Здійснення псевдоніму - це як паралельність у тому, що вони обидва передбачають складний обмін та переплетення. Паралельно, ви абстрагуєтесь від переплетення і припускаєте недетермінізм (що добре). Здійснюючи згладжування, ви змушуєте себе розібратися з переплетенням. Семантика ігор - чудовий приклад цього вимушеного переплетення, тому мені це не подобається.
Удай Редді

3

Незабаром після того, як ви задали своє запитання, Марк Бендер з університету Макмастер випустив дисертацію: Присвоєння обчислення: чиста імперативна мова міркування (2010 р., 8 вересня). Ця теза описує просту, імперативну мову, відповідну обчисленню лямбда.

Обчислення призначень складається лише з чотирьох основних конструкцій, призначення X:=t, послідовності t;u, формування ¡tпроцедури та виклику процедури !t. Для змінного струму даються три інтерпретації: оперативна семантика, денотаційна семантика та система переписування термінів. Три показані рівнозначними.

Дисертація Марка Бендера продовжується для вивчення варіантів, розширених з ледачою оцінкою, зворотним відстеженням, складом процедур. Це аналогічно дослідженню лямбдального обчислення за допомогою невеликих розширень.

В цілому теза дає відносно пряму відповідь на питання ОП.


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