2014-04-09 17 views
12

Pracuję nad systemem wysokiej wydajności napisanym w C++. Proces ten musi być w stanie zrozumieć złożoną logikę (reguły) w czasie wykonywania napisaną w prostym języku opracowanym dla tej aplikacji. Mamy dwie opcje:Generowanie kodu binarnego (biblioteki współdzielonej) z osadzonego LLVM w C++

  1. interpretować logikę - uruchomić wbudowany interpreter i generują dynamiczny wywołanie funkcji, która gdy odbiera dane, w oparciu o interpretowane logiki działa na danych

  2. Kompilacja logikę do plugin.so dynamiczny wspólny plik, użyj dlopen, dlsym załadować wtyczki i wywołanie funkcji logicznych przy starcie

Wariant 2 wydaje się być bardzo atrakcyjna, gdyż będzie zoptymalizowany kod maszynowy, byłoby o wiele szybciej niż wbudowany tłumacz w t on przetwarza.

Opcje Jestem badające są:

    • napisać ciąg metoda kompilacji kompilacji (logiczny ciąg, lista & błędy, lista & Ostrzeżenia)
    • tu logika wejściowy jest logiczny łańcuch zawierający kodowane w naszym języku niestandardowym
    • generuje llvm ir, zwracana wartość metody kompilacji zwraca łańcuch ir
    • write link method bool link (string ir, nazwa pliku napisu, lista & błędów, lista & ostrzeżenia)
    • dla metody łącza i szukałem dokumentacji llvm, ale nie byłem w stanie dowiedzieć się, czy istnieje możliwość napisania takiego metoda

    Jeśli mam rację, LLVM IR jest konwertowany na kod bajtu LLVM lub kod zespołu. Następnie albo LLVM JIT służy do uruchamiania w trybie JIT, albo używa GNU Assembler do generowania natywnego kodu.

    Czy można znaleźć funkcję w LLVM, która to robi? Byłoby o wiele ładniej, gdyby wszystko odbywało się z poziomu kodu, niż przy użyciu polecenia systemowego z C++, aby wywołać "as", aby wygenerować plik plugin.so dla mojego wymagania.

    Proszę dać mi znać, jeśli wiesz o sposobach generowania wspólnego kodu binarnego z biblioteki współdzielonej z mojego procesu w środowisku wykonawczym.

    +0

    Nie jestem ekspertem w tej sprawie, ale może http://llvm.org/docs/tutorial/LangImpl4.pomoc dla html # adding-a-jit-compiler. – godfatherofpolka

    +0

    dzięki za link. Tak, myślę, że osadzony jit to kolejna opcja. Zastanawiam się, czy możemy zaimplementować interfejs C++ w kodzie JIT i zwrócić wskaźnik do implementacji klasy pochodnej od JIT do wywołującej aplikacji C++? – Sanjit

    +0

    Jeśli języki skryptowe, takie jak AngelScript lub Lua (a dokładniej LuaJit), nie są wystarczająco szybkie do twoich celów, sugeruję przejrzenie OpenCL. Pozwala na kompilację kodu obliczeniowego napisanego w języku C/C++ w środowisku wykonawczym. Możesz łatwo skonfigurować jądra obliczeniowe za pomocą procesora C. Większość kompilatorów OpenCL używa wewnętrznie LLVM, więc otrzymasz pełną moc bez konieczności bałaganowania mnóstwem szczegółów technicznych. Jako ostatnia premia, możesz łatwo spróbować uruchomić swój kod na GPU, ale możesz ograniczyć się do CPU, jeśli chcesz. – stgatilov

    Odpowiedz

    3

    llc, który jest narzędziem llvm, które wykonuje LLVM-IR na translację kodu binarnego. Myślę, że to wszystko, czego potrzebujesz.

    Zasadniczo możesz produkować LLVM IR tak, jak chcesz, a następnie dzwonić do Llc przez IR.

    Możesz zadzwonić z niego z wiersza poleceń lub przejść do implementacji llc i dowiedzieć się, jak to działa w twoich własnych programach.

    Oto link przydatne:

    http://llvm.org/docs/CommandGuide/llc.html

    Mam nadzieję, że to pomaga.

    +2

    llc jest asemblerem/kompilatorem, a nie łącznikiem. Wytwarza wyjście .asm lub .obj. Nie tworzy załadowanych bibliotek (.dll lub .so). – Sean

    +1

    Dziękuję Seanowi za komentarz, oczyszcza moje pytanie. Osadzony JIT to najlepsza opcja, którą do tej pory znalazłem. – Sanjit

    Powiązane problemy