2013-07-06 9 views
6

Wiem, że wiele aplikacji na dużą skalę, takich jak gry wideo, jest tworzonych przy użyciu wielu języków. Na przykład prawdopodobne jest, że silniki gry/fizyki są napisane w języku C++, podczas gdy zadania związane z grą, GUI są napisane w języku Python lub Lua.Jak działa interoperacyjność?

Rozumiem, dlaczego ten podział ról jest wykonywany; Używaj języków niższego poziomu do zadań, które wymagają ekstremalnej optymalizacji, podkręcania, wydajności i szybkości, przy użyciu języków wyższego poziomu, aby przyspieszyć czas produkcji, zmniejszyć nieprzyjemne błędy ect.

Niedawno zdecydowałem się podjąć większy osobisty projekt i chciałbym podzielić części projektu podobne do powyższych. W tej chwili jestem naprawdę zdezorientowany tym, jak działa ta interoperacyjność między językami (zwłaszcza kompilacja a interpretacja).

Jestem dość obeznany ze szczegółami przechodzenia od testu kodu ANSCII do ładowania pliku wykonywalnego, gdy napisano coś takiego jak C/C++. Jestem bardzo ciekawy, jak działa gra komputerowa zbudowana z wielu różnych języków. Jest to duże/szerokie pytanie, ale jestem zainteresowany:

  • Jak działa logika kodu? To znaczy. jak mogę wywołać kod Pythona z programu C++? Zwłaszcza, że ​​nie obsługują tych samych wbudowanych typów?
  • Jak wygląda obraz programu? Z tego co wiem, gra wideo działa w jednym procesie, więc jak wygląda obraz środowiska wykonawczego podczas uruchamiania programu C/C++, który wywołuje funkcję Python?
  • W przypadku wywoływania kodu z języka interpretowanego ze skompilowanego programu, jaka jest sekwencja zdarzeń, które mają miejsce? Jeśli jestem w swoim skompilowanym pliku wykonywalnym i z jakiegoś powodu mam połączenie z interpretowanym językiem w pętli, czy muszę czekać na tłumacza w każdej iteracji?

Trudno jest znaleźć informacje na temat tego, co dzieje się na poziomie maszyny, więc każda pomoc będzie doceniana. Chociaż jestem ciekawy co do ogólnej współpracy oprogramowania, szczególnie interesuje mnie interakcja w C++ i Pythonie.

Bardzo dziękuję za wszelkie uwagi, nawet jeśli jest to tylko wskazówka, gdzie mogę znaleźć więcej informacji.

+2

http://en.wikipedia.org/wiki/Foreign_function_interface prawdopodobnie nie wiedział, prawy termin, aby szukać – aryjczyk

+0

@aryjczyk Dziękuję za link. Tak, nie wiedziałem o tym terminie. To świetnie pomaga zrozumieć, jak to się robi. Wciąż jestem zdezorientowany, jak coś takiego fizycznie działa, szczególnie w środowiskach GC i innych niż GC. Nie mam pojęcia, jak mógłby wyglądać obraz procesu. W każdym razie, dziękuję, i będę wyglądać! – gone

Odpowiedz

2

W konkretnym przypadku Pythona, masz w zasadzie trzy opcje (i to na ogół stosuje się w całej rozciągłości):

  1. Host Pythona w C++: Z z perspektywy programu C++, interpreter python jest biblioteką C. Po stronie Pythona możesz potrzebować czegoś takiego jak ctypes, aby odsłonić api C (++).

  2. Python używa kodu C++ jako bibliotek DLL/SO - kod C++ prawdopodobnie nie zna się na pythonie, pyton zdecydowanie musi korzystać z obcego interfejsu funkcji.

  3. Komunikacja międzyprocesowa - zasadniczo działają dwa oddzielne procesy i rozmawiają przez gniazdo. W dzisiejszych czasach prawdopodobnie wykorzystasz jakąś architekturę usług internetowych, aby to osiągnąć.

+0

Ah tak, wiedziałem o (3). Odnośnie (1), trochę rozumiem, jak to byłby naturalny pomysł; chociaż nie bardzo rozumiem, w jaki sposób zostałby zaimplementowany, ponieważ interpreter Py jest wyraźnie ** nie ** biblioteką współdzieloną/dynamiczną C. Dodatkowo, w jaki sposób środowisko GC funkcjonuje bez środowiska innego niż GC? Ponadto, na przykład, jeśli zrobiłem jakąś aplikację w C/C++, która używała wbudowanego Pythona, czy wszyscy użytkownicy musieliby koniecznie interpretera Py zainstalowane na ich dyskach? – gone

+0

@Zak Myślę, że wystarczy zapoznać się z podstawami działania procesów i budowania programów binarnych pod maską. Python po prostu zarządzałby przydzielonymi obiektami. Python można zbudować do osadzania. Zastanów się, co oznacza osadzanie, aby odpowiedzieć na twoje ostatnie pytanie. – Marcin

+0

Ok, dzięki Marcin. Doceniam odpowiedź - zajrzę do tego! – gone

0

W zależności od tego, co chcesz zrobić:

  • spojrzeć SWIG: http://www.swig.org/ Jest to narzędzie, które ma na celu połączyć kodu C/C++ z Python, Tcl, Perl, Ruby, itp Wspólna przypadek użycia to interfejs Pythona (graficzny lub nie), który wywoła kod C/C++. SWIG przeanalizuje kod C/C++ w celu wygenerowania interfejsów.

  • Libpython: to lib, który pozwala na osadzenie kodu Pythona. Masz kilka przykładów tutaj: http://docs.python.org/3.0/extending/embedding.html

+0

Moje pytanie dotyczy raczej ** jak działa coś takiego jak SWIG. Ale dziękuję za twój repson – gone

+0

@Zak Rzeczywiście, po prostu możesz znaleźć na ich stronie więcej informacji o tym, jak działa SWIG. W każdym razie, zredagowałem swoją odpowiedź, aby dodać więcej informacji. –