Сучасні інформаційні технології/2.

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

Паращенко В.Г.

Київський національний університет технологій та дизайну

Інтеграція різнорідних мовних механізмів в рамках однієї мови програмування

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

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

Розглянемо докладніше, що мається на увазі. В якості ілюстративного матеріалу оберемо Сі ++ (як основна мова) і Лісп (як альтернативна).

           Щоб представити конструкції мови Лісп засобами Сі ++, достатньо описати клас, який здатний зберігати(інкапсулювати) S-вираз будь-якого підтримуваного типу і дати набір операцій для побудови точкових пар і списків з атомарних S-виразів[2]. Використовуючи властивість поліморфності об’єктів можна побудувати ієрархію класів з загальним предком для зберігання різних типів S-виразів, що дозволить вводити нові типи S-виразів.

           В результаті ми отримаємо запис ліспових програм і даних на Сі ++. Після компіляції тексту транслятором Сі++ в сегменті даних основної програми з’являться конструкції Лісп, які вже переведені в внутрішнє представлення. Що б змусити ці конструкції «ожити», необхідно описати функцію (можливо метод того ж класу), що здійснює обчислення значень S-виразів по правилам мови Лісп. Таким чином, за допомогою бібліотеки класів, не змінюючи мову Сі++, можна дати можливість програмісту використовувати парадигматику мови Лісп в програмі на Сі++[3].

           Перерахуємо вимоги, якими повинен задовольняти конкретна мова програмування, що обирається в якості базового методу безпосередньої інтеграції. По-перше, ця мова має включати поняття класу,що підтримує основні властивості об’єктно-орієнтовного програмування – інкапсуляцію, успадкування і динамічний поліморфізм. По-друге, така мова має бути досить універсальною і відомою, щоб її використання було допустимо в більшості проектів. Нарешті, обрана мова-лідер повинна мати можливість перевизначення стандартних операцій. Це необхідно для наочності відображення коду з альтернативної мови на основну. Цим вимогам задовольняють, зокрема, такі мови, як Сі++ і Ада 95.          Мова Сі++ має серйозні недоліки, в основному успадковані від мови Сі; зокрема в Сі++ відсутні засоби модульного програмування, які програміст вимушений імітувати за допомогою файлових заголовків, препроцесора і явного управління просторами імен[1]. Мова Ада 95 таких недоробок немає.

           В той же час, мова Сі++ надає велику кількість символів операцій, що допускають перевизначення для користувальницьких класів (в тому числі операцію «кома», перекриття якої дозволяє помітно підвищити наочність засобів побудови облікових конструкцій), тоді як у мові Ада 95 безліч таких операцій обмежується символами арифметичних дій[1].

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

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

Література:

1.     Б’ярн Страуструп, Дизайн та еволюція мови Сі++, М.:ДМК, 2009.

2.     А.В. Столяров, Інтеграція зображувальних засобів альтернативних мов програмування в проекти на Сі++.М:ДМК, 2010.

3.     В.Ш. Кауфман. Мови програмування. Концепції та принципи. Радіо та зв'язок, Москва, 2011.