2012-10-12 1 views
1

소스 파일이 여러 가지 프로그래밍 언어로 작성된 경우 소스 파일간에 기능을 공유하는 방법을 알아 내려고합니다. 아래에 표시된 것처럼 세 가지 다른 소스 파일에서 세 가지 언어로 작성된 함수를 공유 할 수있는 방법이 있습니까? 각 언어로 작성된 함수를 다른 언어에서 액세스 할 수 있기를 바랍니다.여러 프로그래밍 언어로 소스 파일 간의 기능 공유

(모든 소스 파일이 같은 폴더에, 명확합니다.)

자바 파일 :

public class JavaFile{ 
    public static String generateStringFromRegex(String theRegex){ 
     //native Java function, implement this using xeger 
    } 
    public static String generateRandomString(String theString){ 
     //return the result from the corresponding Javascript function 
    } 
    public static int getFileText(String filename){ 
     //return the result from the corresponding C++ function 
    } 
} 

자바 스크립트 파일 :

function getFileText(fileName){ 
    //call the corresponding C++ function and return the value 
} 

function generateRandomString(theString){ 
    //native Javascript function 
} 
function generateStringFromRegex(int1, int2){ 
    //call the corresponding Java function and return the value 
} 

C++ 파일 :

#include<string> 

int main(){ 

} 

string generateRandomString(string theString){ 
    //call the corresponding Javascript function and return the value 
} 
string generateStringFromRegex(string theRegex){ 
    //call the corresponding Java function and return its value 
} 

string getFileText(string fileName){ 
    //native C++ function: get the text of a text file 
} 
+0

아파치 희생? Protobuf? 웹 서비스? –

+0

@AbhinavSarkar 나는이 중 어떤 것이이 목적에 가장 적합한 지 모릅니다 : 그래서 나는이 질문을했습니다. –

+0

필요에 따라 평가하고 가장 적합한 것을 선택하십시오. –

답변

1

어떻게 설명할까요? 함수 호출 메커니즘이 작동하면 가능 한 것과 그렇지 않은 것을 명확하게 파악할 수 있습니다.

함수를 호출하면 어떻게됩니까? [맨 위 레벨에서] 인수를 사용하여 함수를 호출하면 값을 반환 할 수 있습니다. 인수는 참조 또는 값에 의해 전달 될 수 있습니다. 반환 된 주소는 호출 된 함수가 어디로 돌아갈지를 알 수 있도록 어딘가에 저장되어야합니다.

인수를 준비해야합니다. 참조가 전달되어 주소가 다시 사용되거나 값에 의해 스택에 사본이 생성됩니다. 반환 값을 반환하는 것은 호출하는 함수가 액세스 할 수있는 어딘가에 저장되어야합니다. 이것은 또한 일반적으로 스택에 있습니다 [CPU 아키텍처 나 컴파일러 최적화에 따라 CPU에 레지스터가 될 필요는 없습니다]. 마지막으로 반환 주소를 반환하는 동안 반환됩니다.

각 언어에 대해 위의 내용은 서로 다르며 호환되지 않습니다. 여기에서 하나의 언어에서 다른 언어로 변환하는 명시 적으로 언어 간 바인딩이 필요합니다. 이 바인딩은 [객체 코드] 라이브러리에 걸쳐 래핑됩니다. 그래서 예. C 프로그램은 Java 함수를 직접 호출하지 않습니다. 바인딩 래퍼가 호환되는 방식으로 해결하는 해결되지 않은 기호가 있습니다. 이것에 의해, Java 코드가 불려갑니다.

위에서 언급 한 목적을 위해 중간에 JNI 인터페이스가 없으면 C에서 Java 기능을 호출 할 수 없습니다. C++ 라이브러리를 컴파일하는 동안 명시 적으로 지원을 추가하지 않고도 C 코드에서 C++ 코드를 호출 할 수 없습니다.

또한 자바 스크립트와 같은 langauges를 해석 한 경우 컴파일 된 언어를 전혀 호출 할 수 있는지 확신하지 못합니다.

내 대답은 입니다. 임의의 언어 집합 : 언어에 따라 다르지만 그 대답은 거의 없습니다. 라이브러리를 지원하기 위해 바인딩을 작성하는 경우 [컴파일 된 언어 기억하기] : 예.

위의 내용이 이해가되지 않는 경우 의견에 자유롭게 질문하십시오.

편집 : HTTP 사용 :

프로그램이 소켓을 통해 서로 통신 할 때 기계 또는 동일한 시스템에있는 파일/파이프/공유 메모리를 사용하여 가로 질러. 궁극적으로 HTTP 기반 통신은 소켓 일뿐입니다. 아파치 절약 같은 것도 똑같습니다.그것은 소켓을 통해 (기계를 통해) 또는 파이프 (동일한 기계 안에) 다른 프로그램으로 데이터를 보낼 것입니다. Apache thrift는 다른 측면에서 다른 언어에 대한 바인딩을 제공합니다. 따라서 소켓을 통해 통신하는 여러 프로그램을 실행해야합니다. 이는 실행중인 실행 파일에 "링크"되어있는 동일한 언어의 함수 호출 또는 객체 라이브러리에 대한 바인딩을 사용하는 것과는 다릅니다. 희망을 당신이 그 차이를 이해합니다.

한 언어로 작성된 프로그램을 다른 언어로 작성된 프로그램과 통신 할 수 있습니까? 절대적으로 우리는 항상 그렇게합니다. 귀하의 전체 인터넷은 다른 언어에 기초합니다. 당신의 운영 체제와 소프트웨어는 수많은 언어로되어 있으며 모두가 서로를 존중하기 때문에 서로 원활하게 작동합니다.

개발자는 다양한 언어에서 기능을 사용하려면 양측이 절약을 사용해야 할 수도 있고 RPC 추상화를 사용하여 소켓을 통해 통신하고 함수 호출을 통해 함수를 호출하는 것과 차이가 있음을 이해해야합니다. 당신이 그림을 얻기를 바랍니다.

+0

언어 바인딩을 사용하는 대신 Apache Thrift와 같은 RPC 프레임 워크를 사용할 수 있습니까? 나는 언어 바인딩을 사용하는 것이 내 목적에 비해 너무 융통성이 없을 것이라고 생각한다. 나는 한 언어로 작성된 함수를 다른 언어가 아닌 다른 여러 언어로 사용 가능하게 만들고 싶다. –

+0

각 프로그래밍 언어가 HTTP를 사용하여 다른 프로그래밍 언어와 통신 할 수 있도록 REST (Representational State Transfer)를 사용하여이 작업을 수행 할 수도 있다고 가정합니다. –

+0

@AndersonGreen, 예, thrift (당신을위한 언어 바인딩을하고 있습니다 .. 그래서 바인딩을 이스케이프 처리하지 않습니다)를 사용하면 다른 언어에서 다른 모듈을 호출 할 수 있습니다. Thrift는 내부적으로 소켓을 사용합니다. REST는 HTTP 인터페이스의 아키텍처입니다. HTTP를 사용하여 프로그램간에 통신 할 수 있습니다. 위의 편집에서 설명했다. 이 모든 것은 인터넷을 통해 매일 수행됩니다 (브라우저와 스택 오버 플로우 서버는 서로 다른 언어입니다). 함수 호출과 동일하지 않습니다. – av501