Moduł Inline
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
Co to jest?
Moduł Inline służy do robienia wstawek w innych językach. Można w łatwy sposób (w porównaniu z XS) wzbogacić program perlowy o kod z innych języków.
Jak użyć?
Na przykład tak:use Inline C=>'void abc() {printf("abc");}'; #definujemy funkcję w C
abc(); #a tu ją uruchamiamy w Perlu
lub
use Inline C;
print "9 + 16 = ", add(9, 16), "\n";
print "9 - 16 = ", subtract(9, 16), "\n";
__DATA__
__C__
//blok kodu w C
int add(int x, int y) {
return x + y;
}
int subtract(int x, int y) {
return x - y;
}
Funkcje są zdefiniowane w C, a wykonywane w Perlu.
Gdy użyjemy modułu Inline::Files, wtedy wstawki mogą wyglądać tak:
use Inline Java => <<'END';
/* Kod Javy ... */
END
# A tu Perl ...
lub
use Inline::Files;
use Inline 'Java';
# Perl ...
__JAVA__
/* Java ... */
Konfiguracja
W większości przypadków Inline będzie działać poprawnie. Jednakże czasami trzeba zrobić coś inaczej.
use Inline (
C => 'DATA',
DIRECTORY => './inline_dir',
LIBS => '-lfoo',
INC => '-I/foo/include',
PREFIX => 'XXX_',
WARNINGS => 0,
);
Taki kod będzie ustawiał opcje dla języka C w sekcji DATA.
use Inline (
C => Config =>
DIRECTORY => './inline_dir',
LIBS => '-lfoo',
INC => '-I/foo/include',
PREFIX => 'XXX_',
WARNINGS => 0,
);
use Inline C => <<'END_OF_C_CODE';
Config wskazuje, że jest to tylko sekcja ustawień i nie będzie kodu do analizowania.
use Inline (
Config => DIRECTORY => './inline_dir',
);
use Inline (
C => Config => #opcje dla C
LIBS => '-lglobal',
);
use Inline (
C => 'DATA', # Dla pierwszej sekcji C
LIBS => ['-llocal1', '-llocal2'],
);
use Inline (
Config => #Ustawienia ogólne, odnoszą się do tego co poniżej
WARNINGS => 0,
);
use Inline (
Python => 'DATA', # Dla pierwszej sekcji Python'a
LIBS => '-lmypython1',
);
use Inline (
C => 'DATA', # Dla drugiej sekcji C
LIBS => [undef, '-llocal3'],
);
Ustawienia są dziedziczone i sumowane. Dla pierwszej sekcji C, są używane biblioteki global1, local1 oraz local2. Dla drugiej sekcji undef resetuje ustawienia bibliotek i będzie użyta tylko local3.
Dla opcji, których wartości są 0 lub 1 można użyć ENABLE/DISABLE:
use Inline (
Config =>
ENABLE => FORCE_BUILD,
DISABLE => CLEAN_AFTER_BUILD
);
Opcje
Wybrane opcje:
- DIRECTORY
- Ustawia katalog, w którym będą przechowywane skompilowane rozszerzenia. Jeżeli definiujemy go, to musi już istnieć, Inline sam go nie stworzy. Gdy ten parametr nie zostanie zdefiniowany, to Inline szuka katalogu o nazwie '.Inline/'. Jak nie znajdzie to jest tworzony './_Inline'
- NAME
- Ustawia nazwę naszego rozszerzenia. Np. dla NAME => 'Foo::Bar' zostanie stworzony katalog 'lib/auto/Foo/Bar'.
- AUTONAME
- Można włączyć (domyślnie jeżeli niezdefiniowane NAME) lub wyłączyć. Tworzy zawsze unikalną nazwę dla kompilowanego rozszerzenia. Nie są one automatycznie sprzątane!
- VERSION
- Określa wersję. Używa się tylko przy tworzeniu modułów! Musi się zgadzać ze zmienną $VERSON! Inline nie skompiluje kodu do katalogu tymczasowego (_Inline/) jeżeli wersja została ustawiona. Jest to sposób na powiadomienie Inline'a, że moduł jest gotowy do instalacji.
- FORCE_BUILD
- Wymusza kompilację przy każdym uruchomieniu. Domyślnie jest wyłączona.
- BUILD_NOISY
- Włącza wypisywanie komunikatów kompilacji na ekran.
- BUILD_TIMERS
- Wyświetla czasy kompilacji poszczególnych faz. Przeważnie potrzebuje Time::HiRes.
Dodatkowe informacje
Uwagi końcowe
Ten opis wystarczy żeby napisać proste programy perlowe z wstawkami z innych języków (głównie C). Trzeba jednak pamiętać, że ten moduł udostępnia także obsługę innych języków: Java, Python, Ruby, AWK, assembler, PERL i wiele innych.
W tej chwili na Mancie są zainstalowane Inline oraz Inline::C. Brakuje Inline::Files oraz Inline::Java, o które prosiłem. Może za jakiś czas się doczekamy lub ktoś przy okazji zajdzie do adminowa i ponowi prośbę.
Dokumentacja
Oyrginalna dokumentacja Inline na CPANie.
Inne moduły związane z Inline.
Inline::C cookbook - przykłady wykorzystania (warto przeczytać).
Kontakt i informacje o autorze opracowania
Autor: Marek Kwiatkowski
Email: songo@(bez_tego)manta.univ.gda.pl