Хтось використовував поліморфну ​​дефункціоналізацію Поттіра та Готьє в модульному компіляторі?


15

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

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

Хтось робив це, і вказав мені на компілятора, який використовує цю ідею? (Компілятори іграшок добре, і насправді кращі.)

Відповіді:


6

Один із підходів описує

Георгіос Фуртоніс та Ніколаос С. Папаспіру. 2013. Підтримка роздільної компіляції у дефункціоналізованому компіляторі. СЛАЙТ 2013.

Як згадує @gasche:

Іншим підходом до проблеми було б врахувати, що кожен модуль може визначити свій тип "нефункціоналізованих функцій" та диспетчер / обробник.

Ви можете "зв’язати" ці типи та обробники зі спеціалізованим лінкером. На відміну від відкритих типів даних, ви об'єднуєте список конструкторів та функцій регістру. Але лінкер повинен додати випадки для часткового застосування: Без загальнопрограмного аналізу ви не можете передбачити, які часткові програми можна використовувати для якої функції, тому ви додаєте всі випадки. Anн-ари функції можна частково застосувати до i аргументи (с 0<i<н) і виробляють функцію ариті н-i, які можна частково застосувати знову.


4

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

Не могли б ви детальніше зупинитися на тому, що ви маєте на увазі тут? Я не розумію, як додавання базового випадку (чи буде це до типу даних, до відповідності шаблону функції диспетчеризації або обох?) Допомагає модульності в описаному вами способі; до речі, чому ви маєте на увазі саме «модуль за модулем»?

Я можу уявити, що "базовий випадок" використовується в заданому модулі / програмі для селективної дефункціоналізації: у вас був би додатковий конструктор до вашого зміненого типу функції, який не є тегом, а просто вбудовує всі 'a -> 'bфункції, щоб упакувати функцію в цьому конструкторі, замість того, щоб надати йому вдосконалений тег, перешкоджало б його дефункціоналізації.

Іншим підходом до проблеми було б врахувати, що кожен модуль може визначити свій тип "нефункціоналізованих функцій" та диспетчер / обробник. Функції модуля M1мають тип M1.arrowі застосовуватимуться за допомогою M1.applyтощо. Хоча це добре працює для використання функцій першого порядку, я не дуже добре бачу, як можна розширити його до функції вищого порядку (що не повинно бути знайте, звідки беруться їхні функціональні аргументи): якщо ви поєднаєте функцію з її диспетчером, ви знову входите в область непрямих викликів функцій.

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

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