Як обробляються побічні ефекти в семантиці?


19

У розділі "Вступ до мов програмування" Ентоні Ебі про семантику він робить таке зауваження:

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

Це вражає мене як чудове визнання, що дозволити побічні ефекти мотивуватимуть основну частину роботи в семантиці.

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


Чи слід це позначати як запитання? Оскільки "значна частина роботи з семантики [...] мотивована [побічними ефектами]", то, звичайно, не можна очікувати короткої та суворої відповіді.
Раду ГРИГо

1
@Radu: Що стосується MO, це, ймовірно, буде позначено [великою картиною], яка здебільшого не є [soft-question] або CW там.
Чарльз Стюарт

Тег big-picture ще краще. Я забув про це.
Раду ГРИГо

Гарна пропозиція; Я додав тег.
Шейн

Відповіді:


18

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

Object x = new Object();
Object y = new Object();
... some more code ...

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

Object y = new Object();
Object x = new Object();
... some more code ...

Тепер поставте питання: чи змінює цей рефакторинг поведінку програми? З одного боку, на базовій машині x і y будуть розподілені в різних місцях у двох запусках програми. Тож у цьому сенсі програма поводиться інакше.

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

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

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

Але означає, що вам потрібно переконатися, що денотаційна семантика підтверджує ці еквівалентності. Отже, для цього прикладу, якщо ви хотіли дати денотаційну семантику для цієї мови, схожої на Java, вам потрібно переконатися не лише в тому, що виклик new займає купу і повертає вам нову купу з новоствореним об'єктом, але і те, що означає програми є інваріантним однаковим при всіх перестановках вхідної купи. Це може включати досить складні математичні структури (наприклад, у цьому випадку робота в категорії, яка забезпечує все, що працює за модулем, у відповідній групі перестановки).


"дві програми еквівалентні, коли жодна клієнтська програма не може обчислити різні відповіді на основі отримання цих програм як вхідних даних." Мене це бентежить. Якщо у вас є програма X і клієнтська програма Y, я вважаю, що Y означає "X", але тоді ви, здається, говорите, що Y читає текст X як вхідний , і в такому випадку я навряд чи зателефонував би Y "клієнт" X. Чи можете ви уточнити, будь ласка?
Раду ГРИГо

1
Під "клієнтом X" я маю на увазі те саме, що і "контекст програми", що є лише "більшою програмою, яка містить X як підтерміну".
Ніл Крішнасвамі

Отже, ви використовуєте "X є клієнтом Y" взаємозамінно з "X читає Y як вхід", тому що ви думаєте про X як лямбда, застосовану до Y? Це має сенс, але це трохи закручено, коли ви говорите про Java. :)
Раду ГРИГо

1
@RaduGRIGДо: контекст програми означає щось інше. Ви правильно читаєте публікацію, але якщо X читає вихідний код Y як вхідний (саме так я інтерпретую публікацію), ви можете розрізнити кожні дві синтаксично різні програми; натомість, якщо Y - лямбда-функція на X, можна виділити занадто мало програм. Коментар Ніла щодо "контексту програми" - це правильне визначення: контекст програми Y - це програма з отвором у її AST, де ви можете розмістити (значущо) два різних фрагменти програми X1 та X2.
Blaisorblade

@NeelKrishnaswami: ви могли б пояснити, що ви маєте на увазі у публікації? Ви можете просто продовжити використовувати свій приклад і поговорити про програму, куди ви можете вставити той чи інший фрагмент.
Blaisorblade

12

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

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


1
Так, семантика категорії функторів не підтвердила всіх відповідностей Мейєра-Зібера. Пітер О'Герн та Роберт Теннант розробили параметричну версію семантики категорії функторів у середині 90-х, яка (IIRC) отримала всі приклади Мейєра-Зібера, але я не знаю, була це повністю абстрактна чи ні.
Ніл Крішнасвамі

Модель О'Герна та Теннента не є абсолютно абстрактною. Про це йдеться в самому документі. Але уточнення О'Гарна та Рейнольдса з використанням лінійного обчислення лямбда є абсолютно абстрактним аж до другого порядку. Він порушує третій порядок, приклади - еквівалентності, вивчені Ахмедом, Дрейєром, Біркедалом та ін.
Удай Редді,

12

Маттіас Феллейзен представив переконливе рішення проблеми побічних ефектів у семантиці у своїй серії "Синтаксичні теорії управління і держави".

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

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

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

Середовище відображає змінні адреси; магазин відображає адреси до значень.

Це спрощує моделювання змінних змінних: просто змініть значення за його адресою.

Це також спрощує моделювання покажчиків та динамічного розподілу: просто робіть адреси магазину першокласними значеннями.

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


6

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

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

Не просто побічні ефекти, такі як стан, викликають проблеми. Прості імперативні мови, такі як захищена командна мова Dijkstra, мають такі види побічних ефектів і мають гарну семантику. Проблема виникає при розширенні лямбда-числення з типом оперативної семантики, що очікується від мов програмування навіть за відсутності побічних ефектів: найпершій, PCF Плоткіна, давали денотаційні моделі відносно рано, але семантика не була повністю абстрактною, тобто денотаційна семантика була надмірно загальною, не точно відповідала їх оперативній семантиці. Нарешті, PCF отримав цілком абстрактну денотаційну семантику наприкінці 1980-х з ігровою семантикою, що зовсім не схожа на теоретико-теоретичну семантику Скотта. Конкурс досі не отримав повністю адекватного денотаційного лікування.

Багато хто сумнівається у важливості такого роду семантики. Ми завжди можемо надати якусь оперативну семантику, навіть якщо ця "семантика" - це лише джерело програми та назви деяких машин, які склали та запускають програму: з цієї причини Страчі засудив оперативну семантику. Але структурна семантика операції Плоткіна показала, як операційну семантику можна відокремити від машинних моделей, а робота Пітта показала, як така семантика може підтримувати подібні міркування щодо програм та мов програмування для денотаційної семантики. Таким чином, оперативна семантика є життєздатною альтернативою денотаційній семантиці і успішно застосовується для значної кількості мов програмування, таких як Standard ML.

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

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


PCF Скотта не держава і ні це Скотт, є його бачить? En.wikipedia.org/wiki / ...
Андрій Bauer

@Andrej: Помилково, враховуючи, що Люк Онг керував моїм D.Phil, я не повинен робити цієї помилки. Я опублікував тизерний підсумок PCF Мілнера та LCF Скотта, який є більш ... кращим, ніж WP, як історія LtU : lambda-the-ultimate.org/node/2196 Мені здається, що ви можете мати доступ до зниклого Скотта (1969) рукопис ...
Чарльз Стюарт

Це був би PCF Плоткіна, я думаю :-) Я можу спробувати дістати рукопис, але насправді цього немає.
Андрій Бауер

Але справа в тому, що PCF не має стану. Яку "причину" ви говорите, що Страчі засуджує оперативну семантику? Мені це було не видно. Останній абзац суперечить тому, що ви говорили раніше, а саме, що охороняються команди мають гарну семантику, але PCF ні!
Удай Редді,

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