2012-04-21 3 views
0

늦게 나는 다른 언어로 작성된 응용 프로그램이 서로의 함수/서브 루틴을 호출 할 수 있다고 들었습니다. 자, 최근까지 저는 그것이 매우 자연 스럽다고 느꼈습니다. 모두 그렇습니다. 그게 바로 내가 생각한 바보 같았습니다! - 언어는 기계어 코드로 컴파일되며 모든 언어에서 동일해야합니다. 오직 시간이 흐른 뒤에는 "상위 기계 코드"(IL, 바이트 코드 등)로 컴파일 된 언어조차도 서로 실제로 상호 작용할 수 있다는 것을 깨달았습니다. 나는 대답을 많이 찾으려고 노력했으나 실패했다. 대답이 만족스럽지 않았다. 그들은 컴파일러에 대해 많이 알고 있다고 생각했거나 완전히 동의하지 않은 것, 그리고 다른 것들을 생각했다. 이것이 어떻게 작동하는지 이해하기 쉽습니다. 특히 '순수한'기계 코드로 컴파일 된 언어가 '호출 규칙'이라고하는 다른 방식을 사용하면 내 머리카락에 감동을 줄 수 있습니다.다른 언어로 작성된 다양한 앱이 어떻게 상호 작용합니까?

답변

0

이것은 실제로 매우 광범위한 주제입니다. 기계어 코드로 컴파일 된 언어는 대개 서로의 루틴을 호출 할 수 있습니다. 예를 들어, C++ 제대로 선언 한 C 루틴을 호출 할 수있는 코드 : C++가 명시 적으로 C와의 호환성을 위해 설계 되었기 때문에

// declare the C function foo so it can be called by C++ code 
extern "C" { 
    void foo(int, char *); 
} 

이, 그것은수록에 대한 간단는 (그것뿐만 아니라 C에서 C++ 루틴을 호출하기위한 지원을 포함) .

하나의 컴파일러에 의해 컴파일 된 C 루틴이 공통 호출 규칙을 공유하지 않는 한, 다른 컴파일러에 의해 컴파일 된 C에서 호출 가능하지 않을 수 있다는 점에서 호출 규칙은 실제로 복잡합니다. 다른 역순 ij의 값을 푸시하는 반면 예를 들어, 컴파일러 (의사 조립체)

PUSH the value of i on the stack 
PUSH the value of j on the stack 
JUMP into foo 

foo(i, j); 

컴파일 수도 있고, 레지스터에 배치. foo이 다른 규칙에 따라 컴파일러에 의해 컴파일 된 경우 잘못된 순서로 스택에서 인수를 가져 오려고 시도하여 예기치 않은 동작을 일으킬 수 있습니다 (즉시 충돌하는 경우 행운이라고 생각할 수 있음).

일부 컴파일러는 이러한 목적으로 다양한 호출 규칙을 지원합니다. Wikipedia article은 호출 규칙을 도입합니다. 자세한 내용은 컴파일러의 설명서를 참조하십시오.

마지막으로 동일한 주소 공간에서 바이트 코드로 컴파일되거나 해석 된 언어와 하위 수준의 언어를 혼합하는 것은 여전히 ​​더 복잡합니다. 고급 언어 구현은 일반적으로 저수준 (C 또는 C++) 코드로 확장하기 위해 자체적 인 규칙 집합과 함께 제공됩니다. 예 : 자바는 JNIJNA입니다.

+0

많이 고맙다 ... 나는 그것을 이해했다고 생각하지만, 나는 그렇게 생각한다. 아마도 나는 다른 의심을 가질 것이다. ... 그리고 예 ... 정확하게 우리 모두는 ' 프로그램의 - 나는 낮은 수준의 의미에서 의미 ... 나는이 구를 여러 번 본적이 정확히 무슨 뜻인지 밖으로 만들 수 없었다 ... –

+0

한 가지 더 ... 어떻게 컴퓨터가 두 개체 - 우리는 더 높은 레벨의 객체에서 객체를 사용하지만, 컴파일 된 언어에서는 0과 1로 끝나야합니다 ... 그래서 n 번째 비트가 객체 A의 끝임을 어떻게 알 수 있습니까? 또는 간단히 취하면 어떻게 2 개의 정수를 분리 할 수 ​​있습니까? 모든 메모리가 특정 순서로 배치 된 비트 스트림입니다. 그렇습니까? –

+0

@ParthThakkar : 충돌은 프로그램이 갑자기 작동하지 않는다는 것을 의미합니다. 두 번째 질문에 대해서는 일반적으로 설명하기가 거의 불가능합니다. C++에 익숙합니까? –