Създаване на интерфейс между C програми

Днес скриптовите езици са много популярни. Тук няма да обсъждаме причините за това явление, тъй като предимствата на интерпретираните езици са съвсем очевидни. Вместо това, нека да поговорим за техните недостатъци или по-скоро за отстраняване на тези недостатъци. Както знаете, скриптовете се изпълняват много по-бавно от компилираните програми, което е съвсем естествено. Можете да опитате да пишете бързи устни преводачи, но едва ли някога ще постигнете сравнима скорост. Освен това хардуерът е трудно достъпен от скриптови езици и изисква специални разширения (драйвери). Писането на такива разширения ще бъде обсъдено в нашата статия. Ще ги напишем на C; ние също се нуждаем от SWIG. И така, SWIG (English Simplified Wrapper and Interface Generator) е инструмент за свързване на програми и библиотеки, написани на C/C ++, със скриптови езици. В момента той се поддържа от повечето от най-популярните езици като PHP, Perl, Tcl, Ruby, Python и др. Проектът се развива интензивно, така че постоянно се появяват нови езици. Можете също така да участвате в разработването и да добавите поддръжка за всеки език. За щастие лицензът позволява, той е безплатен и близък до стила на BSD. С други думи, можете да използвате изходния код по свое усмотрение, да го модифицирате и разпространявате практически без ограничения, за търговски и нетърговски цели.
Този инструмент се използва главно за достъп до библиотеки, написани на C/C ++, от скриптови езици. Тази нужда може да възникне доста често. Например имате набор от някои функции в C/C ++ и няма абсолютно никакво желание да ги пренапишете, да речем, в Python. Или вашето приложение има критични раздели по време на изпълнение. Можете да ги напишете на C, а самото приложение в същия Python. Друг вариант е, че сте създали библиотека за работа с pdf файлове и искате програмистите на различни езици да могат да използват вашето творение. След това трябва да вземете SWIG, да бъдете търпеливи и да получите добавки за няколко дузини скриптови езици. SWIG се използва и за тестване на програми. Можете да напишете скриптове, които да следят правилното поведение на функциите. В някои езици това е по-лесно, отколкото в C/C ++. SWIG дори ви позволява да вградите поддръжка на скриптове в самата програма! Много приложения имат такива възможности, помнете поне макроси в офис програми или персонализирани карти и нива в игрите.
Сайтът има списък с проекти, които използват SWIG. Това са главно пренесени библиотеки за 3D графика. Лично аз открих няколко познати разработки там.
В процеса SWIG няма да създаде малко проблеми на програмиста. Поддържат се почти всички конструкции на езиците C и C ++. Рядко трябва да модифицирате изходния код, за да работи. Все още има някои нюанси, те се отнасят главно до C (ще говорим за това по-късно). Междувременно нека разгледаме опцията за работа с SWIG, като използваме Perl като пример, обсъдим някои програмни функции и, разбира се, покажем пример за писане на модул за този език.
SWIG и Perl
Какво е SWIG? Това е един вид компилатор, който създава "обвивки" на C/C ++ инструкции за скриптови езици. Тези "обвивки" ще се съдържат в модул за определен език, с помощта на който можете да извиквате функции, да имате достъп до променливи и класове на езика C/C ++. Идеята не е нова, такива инструменти, разбира се, съществуват. По-специално за Perl можете да използвате h2xs, който генерира perl модули от заглавни файлове. SWIG се отличава с подкрепата си за голям брой езици и следователно с единния принцип на работа.
Входът към SWIG е интерфейсен файл, който съдържа инструкции за генериране на модул или заглавен файл. Общият синтаксис на командите е както следва:
където file_name е името на този файл. В нашия случай трябва да посочите опцията -perl5. Това е за езика Perl, можете да видите пълния списък на поддържаните езици и опции в документацията или като изпълните командата swig -help. Обмисляме Perl, но принципите на работа за други езици са практически същите. Възможно е да има някои нюанси по отношение на изпълнението на целевия език или опциите на компилатора при създаване на обектни файлове. Можете да разберете кои опции за SWIG са налични за определен език, като изпълните командата swig - -help .
Резултатът ще бъде два файла: _wrap.c и .pm. Първият файл съдържа C код, който по същество е интерфейсът между C модула и Perl модула. Вторият файл е модул perl, който съдържа "обвивки" за кода C. За програмист той не се различава от другите модули, от него могат да се извикват функции, могат да се използват обекти и променливи, независимо от езика, на който са били първоначално написано. Отново, всичко това е вярно за C и Perl. Ако предположим, че имате C ++ код и искате да получите модул за Java, тогава издавате следната команда: