서로 다른 두 언어로 서로 다른 두 가지 프로그래밍을하는 방법은 무엇입니까?


26

이것이 너무 넓은 지 아닌지는 모르겠지만 저는 아직 주니어 주니어 대학 인 젊은 프로그래머입니다. 나는 다른 언어에 대해 꽤 잘 이해하고 있고 꽤 좋은 기초를 가지고 있다고 생각합니다. 그러나 예를 들어, 프로그램을 만들고 노력하기 때문에 파이썬에서 한 부분을 작성했다고 말하면서 작업이 쉽지만,이 프로그램은 내가 작성한 다른 프로그램에서 출력을 얻어야한다고 생각합니다. C에서 속도 때문에 C를 사용하고 있습니다. 두 개의 다른 프로그램과 언어가 서로 상호 작용하여 전체적으로 하나의 총 프로그램을 만드는 방법을 잘 모르겠습니다. 파일에 쓸 수 있다고 확신하지만 파이썬과 C 프로그램이 파일에 액세스하면 잠금을 고려해야합니다.

대부분의 경우이 작업은 파일을 프로그램으로 가져 오는 것이었지만 가져 오기 기능을 사용하기가 쉽지만 동일한 언어이므로 두 언어 / 프로그램이 상호 작용하여 하나의 응집력있는 출력을 생성합니다. .

나는이 질문에 대해 생각하고 있었기 때문에 배우기 위해 일부 기본 웹 응용 프로그램을 만들려고 생각했지만 파이썬으로 작성하거나 그 반대로 Javascript 파일을 대화 형으로 말하는 방법을 모릅니다.

나는 여기서 정말로 쉬운 것을 놓치고 이해하지 못하는 것처럼 느낍니다. 이 질문이 너무 광범위하지만 온라인에서 명확한 답변을 찾을 수 없다면 오픈 소스 웹 응용 프로그램을 살펴 보려고했지만 실제로 답변을 파악할 수 없었습니다. 이곳은 stackexchange에서 읽는 것을 좋아합니다.

답장을 보내 주셔서 감사합니다.


Swig 가 있다는 것을 알고 있습니다. 원하는 것을하는 것처럼 보이지만 사용하지 않았습니다. 그래서 당신은 그것을 시도하고 참조하십시오 :).
user712092

1
귀하의 질문에는 완전히 관련이없는 두 가지 주제가 포함되어 있습니다. 하나는 동일한 호스트에서 두 개의 프로세스 / 응용 프로그램 사이에서 일반적으로 통신하고 다른 하나는 클라이언트에서 JS를 사용하고 서버에서 Python을 사용하여 일반적인 웹 서버 / 클라이언트 아키텍처입니다.
João Pinto

램프 개념을 검토 했습니까? 데이터베이스를 통해 많은 통신을 할 수 있습니다.
SDsolar

답변:


28

다른 언어로 작성된 코드는 여러 가지 방식으로 상호 작용할 수 있습니다.

소스 레벨에서 일부 언어 조합에 대해 한 언어에서 다른 언어로의 크로스 컴파일을 수행 할 수 있습니다 (예 : Google의 GWT에는 java-to-javascript 컴파일러, Glasgow Haskell 컴파일러는 C로 컴파일 가능, 초기 버전의 C ++ 포함) C로 컴파일 됨. 대부분의 경우 그러나 이것은 실제로 실현 가능하지 않습니다.

JVM 또는 .NET 런타임과 같은 가상 플랫폼을 공유하는 언어는 일반적으로 플랫폼에 의해 노출되는 메커니즘을 통해 상호 작용할 수 있습니다. 예를 들어 모든 JVM 언어는 Java 라이브러리에 액세스하고이를 사용하여 서로 통신하고 메소드를 호출 할 수 있습니다. 다른 JVM 언어로 작성된 클래스를 사용하십시오.

Python을 포함한 많은 프로그래밍 언어는 일반적으로 C로 작성된 기본 라이브러리와 인터페이스하는 메커니즘을 제공합니다. 이러한 메커니즘을 사용하면 더 높은 수준의 다른 언어에서 기본 함수를 호출 할 수 있습니다. 인기있는 라이브러리는 종종 바인딩을 쉽게 사용할 수 있습니다. 이 기술은 일반적으로 "외국 기능 인터페이스"라고 합니다. Python-into-C 인터페이스는 CFFI 입니다.

또 다른 옵션은 완전히 분리 된 두 개의 프로그램을 빌드하고 런타임에 상호 작용하도록하는 것입니다. 이를 달성하기위한 다양한 메커니즘이 있습니다. 가장 쉬운 방법은 파이프를 사용하는 것입니다 ( subprocess파이썬 모듈을 살펴보십시오 ). 기본적으로 한 프로그램은 다른 프로그램을 호출하여 stdin에 입력을 보내고 stdout에서 결과를 다시 읽습니다. 이것은 하나의 프로그램을 다른 프로그램의 하위 프로세스로 만듭니다. 오래 지속되고 독립적으로 시작해야하는 경우, 명명 된 파이프, (로컬) 네트워크 소켓, 공유 파일 및 (플랫폼에 따라) 다른 수단을 통해 데이터를주고받을 수 있습니다. 어느 것이 가장 좋은지에 달려 있습니다.


좋은 대답입니다. 또 다른 가능성은 인터프리터가 기본 프로그램에 임베드 될 수 있으며, 일반적으로 게임 개발을 위해 C ++과 Lua 사이에서 수행됩니다. 또는 Greenspun의 10 번째 규칙을 참조하십시오. en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew

11

두 프로그램이 서로 통신 할 수있는 여러 가지 잘 확립 된 방법이 있습니다. 당신은 이미 파일을 공유함으로써 하나의 명백한 것을 식별했으며, 그것으로 명백한 어려움이 있습니다. 그러나 다른 방법이 있습니다.

대부분의 최신 운영 체제에는 이름이 pipes라는 메커니즘이 있습니다.이 메커니즘 은 기본적으로 하나의 프로그램에서 입력 끝이 다른 프로그램에서 출력 끝이있는 데이터 스트림입니다. 하나의 프로그램에서 같은 컴퓨터에서 실행되는 다른 프로그램으로 데이터를 보내야하는 경우 사용하는 것이 좋습니다.

한 프로그램이 다른 프로그램을 호출하는 데 사용할 API를 설정해야하는 경우 일반적으로 OS 수준에서 다시 지원되는 RPC (원격 프로 시저 호출)를 살펴볼 수 있습니다.

두 대의 다른 컴퓨터에서 두 프로그램간에 통신하려면 상황이 더 복잡해집니다. 그런 다음 네트워킹 및 프로토콜로 작업해야합니다. 소켓을 열고 들어오는 메시지를 듣고, 내부 메소드 호출로 디코딩하고, 처리하고 응답을 리턴 할 수있는 프로그램 중 하나가 필요합니다. C 및 Python을 포함한 다양한 언어로이 기능을 제공하는 데 사용할 수있는 라이브러리가 많이 있습니다.

기본적으로 어떤 방법을 사용해야하는지에 따라 달라집니다. 다양한 형태의 프로세스 간 통신 및 네트워크 메시징 에 대한 조사를 수행 하면 자신의 요구에 가장 적합한 것이 무엇인지 알아낼 수 있어야합니다.


2

메시지 전달 은 서로 다른 언어가 상호 작용할 수있는 다양한 예가 있기 때문에 일반적인 개념으로 보입니다. 예를 들어 COM 구성 요소와 일부 JavaScript를 사용하여 동일한 ASP를 사용하여 동일한 응용 프로그램에서 3 가지 언어를 혼합하여 사용할 수 있습니다.

예를 들어, 잠금은 운영 체제가 파일 시스템에서 처리 할 수있는 것이 아닌가? 각 프로그램은 반드시 다른 프로그램에 대해 알지 못합니다.


0

대부분의 소프트웨어 구성 요소는 명령과 관련하여 통신하지 말고 데이터를주고받습니다 : 데이터베이스와 상호 작용, JSON / XML 요청 보내기 / 받기 등


0

문제점 유형에 따라 파이프의 표준 쉘 사용이 충분할 수 있습니다 (쉘 유형).

program1 | program2

이런 식으로 program1의 출력은 program2의 입력으로 직접 이동합니다. 물론 이것은 모든 문제에 대해 효과가있는 것은 아니지만이 방법을 사용하면 많은 (비 대화식) 문제를 해결할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.