2012-04-21 1 views
0

В последнее время я слышал, что приложения, написанные на разных языках, могут вызывать функции/подпрограммы друг друга. Теперь, до недавнего времени, я чувствовал, что это очень естественно - ведь все, да все - вот что я тогда подумал, глупый! - языки скомпилированы в машинный код и должны быть одинаковыми для всех языков. Только некоторое время назад я понял, что даже языки, скомпилированные в «более высоком машинный код» - IL, байтовый код и т. Д., Могут взаимодействовать друг с другом, приложения на самом деле. Я пытался найти ответ много раз, но не смог - ни один ответ не удовлетворил меня - либо они предположили, что я много знаю о компиляторах, или что-то, с чем я полностью не согласен, и другие вещи ... Пожалуйста, объясните в легко понять, как это получается. Тем более, что языки, скомпилированные в «чистый» машинный код, имеют нечто иное, называемое «вызывающими конвенциями», - это то, что заставляет меня сцеплять мои волосы.Как взаимодействуют разные приложения, написанные на разных языках?

ответ

0

Это на самом деле очень широкая тема. Языки, скомпилированные для машинного кода, часто могут вызывать подпрограммы друг друга, хотя обычно это не без усилий; например, 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, а) ,

Вызывающие условные обозначения действительно усложняют изображение в том, что подпрограммы, скомпилированные одним компилятором, могут не вызываться из C, скомпилированные другим компилятором, если только они не разделяют общее соглашение о вызовах. Например, один компилятор может составить

foo(i, j); 

к (псевдо-сборке)

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

в то время как другие могут толкать значения i и j в обратном порядке, или поместить их в регистрах. Если foo был скомпилирован компилятором, следуя другому соглашению, он может попытаться извлечь его аргументы из стека в неправильном порядке, что приведет к непредсказуемому поведению (подумайте, что вам повезло, если он немедленно сбой).

Некоторые компиляторы поддерживают различные соглашения о вызовах для этой цели. Wikipedia article представляет соглашения о вызовах; для получения дополнительной информации обратитесь к документации вашего компилятора.

Наконец, смешивание байт-кода, скомпилированных или интерпретируемых языков и низкоуровневых в одном и том же адресном пространстве, еще сложнее. В языковых реализациях высокого уровня обычно используется собственный набор условных обозначений, чтобы расширить их с помощью кода нижнего уровня (C или C++). Например, Java имеет JNI и JNA.

+0

thanx много ... я думаю, что понял, но я так думаю ... может быть, у меня будут другие сомнения ... и да ... что именно мы все имеем в виду под «сбой», программы - я имею в виду в смысле низкого уровня ... я много раз видел эту фразу, не мог точно понять, что это значит ... –

+0

еще одна вещь ... как компьютер может различать 2 объекта - как мы используем объекты в лингво более высокого уровня, но все это сводится к 0s и 1s в скомпилированных языках ... так как Comp знает, что какой-то n-й бит является концом объекта A? или взять его просто, как он может даже отделить 2 целых числа? ведь память - это поток бит, размещенный в определенном порядке, верно? –

+0

@ParthThakkar: сбой означает, что ваша программа просто перестает функционировать. Что касается вашего второго вопроса, то это вообще невозможно объяснить в целом. Вы знакомы с C++? –

Смежные вопросы