Сучасні
інформаційні технології/2.
Обчислювальна
техніка та програмування
Паращенко В.Г.
Київський національний
університет технологій та дизайну
Інтеграція різнорідних мовних механізмів в рамках однієї
мови програмування
В
даній роботі запропоновано вирішення задачі представлення програмістам, які
володіють альтернативними мовами програмування (такими, як Лісп, Пролог, Рефал
та ін.) зручних можливостей застосування своїх навиків в рамках проектів,
реалізованих на індустріальних мовах програмування (зокрема на мові С++). Якщо бути більш точним, проблема полягає в тому,
щоб надати програмісту, який володіє, поряд з базовою мовою проекту, ще й
яким-небудь альтернативним стилем програмування, можливість застосування своїх
знань і навичок у проекті, базова мова якого розглянутий стиль не підтримує. Ця тема (проблема мультипарадигмальності
програмування) вивчається досить давно, і на цей момент відомо досить велика
кількість підходів до її вирішення. Ми
розглянемо у цій статті найкращий метод вирішення проблеми.
Пропонований
підхід до вирішення проблеми мультипарадигмального програмування ґрунтується на
виборі мови-лідера як основної мови проекту. В якості мови-лідера пропонується
використовувати об'єктно-орієнтовану мову програмування, що надає можливість
перевизначення символів стандартних операцій для користувацьких типів даних. Замість
синтаксичного розширення мови засобами препроцесора і подібних інструментів, ми
розглядаємо семантику альтернативної мови програмування як специфічну предметну
область, що підлягає моделюванню об'єктно-орієнтованими образотворчими засобами
мови-лідера (у вигляді відповідної бібліотеки класів).
Розглянемо
докладніше, що мається на увазі. В якості ілюстративного матеріалу оберемо Сі
++ (як основна мова) і Лісп (як альтернативна).
Щоб представити конструкції мови Лісп
засобами Сі ++, достатньо описати клас, який здатний зберігати(інкапсулювати)
S-вираз будь-якого підтримуваного типу і дати набір операцій для побудови
точкових пар і списків з атомарних S-виразів[2]. Використовуючи властивість
поліморфності об’єктів можна побудувати ієрархію класів з загальним предком для
зберігання різних типів S-виразів, що дозволить вводити нові типи S-виразів.
В результаті ми отримаємо запис
ліспових програм і даних на Сі ++. Після компіляції тексту транслятором
Сі++ в сегменті даних основної програми з’являться конструкції Лісп, які вже
переведені в внутрішнє представлення. Що б змусити ці конструкції «ожити»,
необхідно описати функцію (можливо метод того ж класу), що здійснює обчислення
значень S-виразів по правилам мови Лісп. Таким чином, за допомогою бібліотеки
класів, не змінюючи мову Сі++, можна дати можливість програмісту
використовувати парадигматику мови Лісп в програмі на Сі++[3].
Перерахуємо
вимоги, якими повинен задовольняти конкретна мова програмування, що обирається
в якості базового методу безпосередньої інтеграції. По-перше, ця
мова має включати поняття класу,що підтримує основні властивості
об’єктно-орієнтовного програмування – інкапсуляцію, успадкування і динамічний
поліморфізм. По-друге, така мова має бути досить універсальною і відомою,
щоб її використання було допустимо в більшості проектів. Нарешті, обрана
мова-лідер повинна мати можливість перевизначення стандартних операцій. Це
необхідно для наочності відображення коду з альтернативної мови на основну. Цим
вимогам задовольняють, зокрема, такі мови, як Сі++ і Ада 95. Мова Сі++ має серйозні недоліки, в
основному успадковані від мови Сі; зокрема в Сі++ відсутні засоби модульного
програмування, які програміст вимушений імітувати за допомогою файлових
заголовків, препроцесора і явного управління просторами імен[1]. Мова Ада 95
таких недоробок немає.
В той же час, мова Сі++ надає велику
кількість символів операцій, що допускають перевизначення для
користувальницьких класів (в тому числі операцію «кома», перекриття якої
дозволяє помітно підвищити наочність засобів побудови облікових конструкцій),
тоді як у мові Ада 95 безліч таких операцій обмежується символами арифметичних дій[1].
Отже,
запропонований метод, що дозволяє, не виходячи за рамки базової мови (наприклад
Сі++), програмувати в стилі, характерному для альтернативної мови (наприклад
Лісп, Рефл, Пролог і т.д.). Метод полягає в тому, щоб штатними засобами базової
мови задавати вирази, які семантично еквівалентні і синтаксично близькі
конструкціям відповідних альтернативних мов. Основна відмінність методу від
раніше існуючих полягає в тому, що при розробці програми використовується лише
одна мова (базова) без будь яких змін, при цьому програмісту надається
можливість мислити в термінах альтернативної мови Лісп, що підтримує
запропонований підхід.
Описаний в цій роботі метод
безпосередньої інтеграції вирішує проблему мульти-парадигмального
програмування, надаючи інструментарій, що дозволяє в рамках одного проекту
поряд з традиційними концепціями базової мови застосовувати концепції
альтернативних мов. При цьому запропоноване рішення не має деяких недоліків,
які властиві іншим способам вирішення проблеми.
Література:
1. Б’ярн Страуструп,
Дизайн та еволюція мови Сі++, М.:ДМК, 2009.
2. А.В. Столяров,
Інтеграція зображувальних засобів альтернативних мов програмування в проекти на
Сі++.М:ДМК, 2010.
3. В.Ш. Кауфман.
Мови програмування. Концепції та принципи. Радіо та зв'язок, Москва, 2011.