Jak współdziałać dwa różne programy z dwoma różnymi językami?


26

Nie wiem, czy to jest zbyt szerokie, czy nie, ale jestem młodym programistą, który wciąż studiuje, to mój rok młodszy. Czuję, że mam całkiem niezłą znajomość różnych języków i całkiem dobrą bazę. Ale zastanawiam się, jak na przykład próbuję utworzyć program i powiedzieć, że napisałem jedną część w pythonie tylko dlatego, że jest to łatwe i spełnia swoje zadanie, ale ten program musiałby uzyskać dane wyjściowe z innego programu, który napisałem w C i używam C ze względu na jego szybkość. Nie jestem pewien, jak te dwa różne programy i języki współdziałają ze sobą, tworząc ogólny jeden program. Zastanawiam się, czy na pewno możesz napisać do pliku, ale co z tego, że programy Python i C uzyskujące dostęp do pliku będą musiały pomyśleć o blokadach.

Najczęściej robiłem to podczas importowania plików do programu, ale w tym przypadku są one w tym samym języku, więc łatwo jest po prostu użyć funkcji importowania, ale z dwoma językami / programami współdziałającymi w celu utworzenia jednego spójnego wyjścia mam problem .

Zastanawiałem się nad tym pytaniem, ponieważ zastanawiałem się nad stworzeniem podstawowych aplikacji internetowych, żeby się uczyć, ale nie mam pojęcia, jak powiedzieć interaktywny plik javascript z czymś, co napisałem w Pythonie lub odwrotnie.

Mam wrażenie, że brakuje mi tutaj czegoś naprawdę łatwego i po prostu nie rozumiem. Przepraszam, jeśli to pytanie jest zbyt ogólne, ale tak naprawdę nie mogłem znaleźć jasnej odpowiedzi w Internecie, próbowałem przejrzeć aplikację internetową typu open source, ale tak naprawdę nie mogłem pojąć odpowiedzi, ponownie wybacz mi, jeśli pytanie wydaje się głupie, myślałem to dobre miejsce, by zapytać Uwielbiam czytać na stackexchange.

Dziękuję za każdą odpowiedź.


Wiem, że jest Swig , wydaje się, że robi to, co chcesz, ale go nie użyłem. Więc spróbuj i zobacz :).
user712092,

1
Pamiętaj, że twoje pytanie zawiera dwa całkowicie niezwiązane ze sobą tematy, jeden ogólnie komunikuje się między 2 procesami / aplikacjami na tym samym hoście, drugi to zwykła architektura serwer / klient, używając JS na kliencie i python na serwerze.
João Pinto,

Czy zapoznałeś się z koncepcją LAMP? Możesz dużo komunikować się za pośrednictwem baz danych.
SDsolar

Odpowiedzi:


28

Kod napisany w różnych językach może wchodzić w interakcje na wiele sposobów.

Na poziomie źródłowym można przeprowadzić kompilację krzyżową z jednego języka na inny dla niektórych kombinacji języków (na przykład GWT Google zawiera kompilator Java-to-javascript; kompilator Glasgow Haskell może kompilować do C; wczesne wersje C ++ skompilowany do C). Przez większość czasu jest to jednak niewykonalne.

Języki współdzielące platformę wirtualną, takie jak JVM lub środowisko uruchomieniowe .NET, zwykle mogą wchodzić w interakcje za pośrednictwem mechanizmów udostępnianych przez platformę - na przykład wszystkie języki JVM mogą uzyskiwać dostęp do bibliotek Java i używać ich do komunikowania się między sobą oraz mogą wywoływać metody i używaj klas utworzonych w dowolnym innym języku JVM.

Wiele języków programowania, w tym Python, oferuje mechanizm interfejsu z bibliotekami natywnymi, zwykle napisanymi w C. Korzystając z takiego mechanizmu, można wywoływać funkcje rodzime z innego języka wyższego poziomu. Popularne biblioteki często mają łatwo dostępne powiązania. Technikę tę zwykle określa się jako „interfejs funkcji zagranicznej” . Interfejs Python-do-C to CFFI .

Inną opcją jest zbudowanie dwóch całkowicie oddzielnych programów i umożliwienie im interakcji w czasie wykonywania. Istnieją różne mechanizmy, aby to osiągnąć; najłatwiej jest przejść przez potok (zajrzyj do subprocessmodułu w poszukiwaniu Pythona): w zasadzie jeden program wywołuje drugi, wysyłając dane wejściowe do swojego wejścia standardowego i odczytując wynik z wyjścia standardowego. To sprawia, że ​​jeden program jest podprocesem drugiego; jeśli potrzebujesz zarówno długowieczności, jak i niezależnego uruchamiania, dane mogą być przesyłane tam iz powrotem przez nazwane potoki, (lokalne) gniazda sieciowe, udostępnione pliki i (w zależności od platformy) innymi środkami. Który z nich jest najlepszy, zależy.


Świetna odpowiedź. Inną możliwością jest wbudowanie interpretera w główny program, zwykle wykonywanego między powiedzmy C ++ i Lua do tworzenia gier. Lub zobacz dziesiątą zasadę Greenspun: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew

11

Istnieje kilka różnych dobrze znanych sposobów komunikacji między dwoma programami. Zidentyfikowałeś już jeden oczywisty, udostępniając pliki i jedną oczywistą trudność. Ale są też inne sposoby.

Większość współczesnych systemów operacyjnych zawiera mechanizm zwany potokami , który jest w zasadzie strumieniem danych z końcem wejściowym w jednym programie, a końcem wyjściowym w innym programie. Jeśli potrzebujesz wysłać dane z jednego programu do innego programu działającego na tym samym komputerze, może to być dobry sposób na użycie.

Jeśli musisz skonfigurować interfejs API dla jednego programu, który będzie używał do wywołania drugiego programu, możesz zajrzeć do RPC (zdalnego wywoływania procedur), które ponownie jest zwykle obsługiwane na poziomie systemu operacyjnego.

Jeśli chcesz komunikować się między dwoma programami na dwóch różnych komputerach, sprawy stają się bardziej skomplikowane. Następnie musisz pracować z siecią i protokołami. Potrzebujesz jednego z programów, aby móc otworzyć gniazdo i nasłuchiwać przychodzących wiadomości, dekodować je do wewnętrznego wywołania metody, przetwarzać je i zwracać odpowiedź. Dostępnych jest wiele bibliotek zapewniających tę funkcjonalność w różnych językach, w tym C i Python.

Zasadniczo, którą metodę powinieneś zastosować, zależy od specyfiki tego, co próbujesz zrobić. Przeprowadź badania dotyczące różnych form komunikacji międzyprocesowej i przesyłania komunikatów sieciowych, a powinieneś być w stanie dowiedzieć się, co najlepiej odpowiada Twoim potrzebom.


2

Wydaje się, że przekazywanie wiadomości jest tutaj ogólną koncepcją, ponieważ istnieją różne przykłady interakcji różnych języków, np. Można użyć klasycznej ASP z komponentami COM i JavaScript, aby uzyskać połączenie 3 różnych języków używanych w tej samej aplikacji.

W podanym przykładzie, czy blokady nie byłyby czymś, co system operacyjny mógłby obsłużyć w systemie plików? Każdy program nie wie o drugim koniecznie pamiętaj.


0

Większość komponentów oprogramowania nie powinna komunikować się zgodnie z instrukcjami, ale wysyłać i odbierać dane: wchodzić w interakcje z bazą danych, wysyłać / odbierać żądania JSON / XML itp.


0

W zależności od rodzaju problemu standardowe użycie rur w powłoce może być wystarczające (wpisz w powłoce):

program1 | program2

W ten sposób wyjście programu1 przechodzi bezpośrednio na wejście programu2. Oczywiście nie działa to dla każdego problemu, ale wiele (nieinteraktywnych) problemów można rozwiązać dobrze za pomocą tego podejścia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.