В последнее время я слышал, что приложения, написанные на разных языках, могут вызывать функции/подпрограммы друг друга. Теперь, до недавнего времени, я чувствовал, что это очень естественно - ведь все, да все - вот что я тогда подумал, глупый! - языки скомпилированы в машинный код и должны быть одинаковыми для всех языков. Только некоторое время назад я понял, что даже языки, скомпилированные в «более высоком машинный код» - IL, байтовый код и т. Д., Могут взаимодействовать друг с другом, приложения на самом деле. Я пытался найти ответ много раз, но не смог - ни один ответ не удовлетворил меня - либо они предположили, что я много знаю о компиляторах, или что-то, с чем я полностью не согласен, и другие вещи ... Пожалуйста, объясните в легко понять, как это получается. Тем более, что языки, скомпилированные в «чистый» машинный код, имеют нечто иное, называемое «вызывающими конвенциями», - это то, что заставляет меня сцеплять мои волосы.Как взаимодействуют разные приложения, написанные на разных языках?
ответ
Это на самом деле очень широкая тема. Языки, скомпилированные для машинного кода, часто могут вызывать подпрограммы друг друга, хотя обычно это не без усилий; например, 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.
- 1. Может ли общаться два приложения, написанные на разных языках?
- 2. Как программа использует файлы, написанные на разных языках?
- 3. Как интегрировать программы, написанные на разных языках программирования?
- 4. Приложения, написанные на веб-языках и приложениях, реализованные изначально
- 5. Как отображать символы на разных языках?
- 6. static на разных языках
- 7. Хранение памяти на разных языках
- 8. Структура URL-адреса веб-страницы на разных языках, разные символы
- 9. Вызовите разные подпроцессы на разных языках, идеально разделяемую память
- 10. Как сравнить эффективность двух разных алгоритмов, написанных на разных языках?
- 11. резюме на разных языках C#
- 12. Java-алфавиты на разных языках
- 13. Сохранение цен на разных языках
- 14. Новая строка на разных языках
- 15. Стандарты кодирования на разных языках?
- 16. Ruby Геокодирование на разных языках?
- 17. Сравнение строк на разных языках
- 18. Regexp Performancing на разных языках
- 19. Телефонные приложения, написанные на C++
- 20. Способ использования Openssl на разных языках/платформах
- 21. Случайные числа на разных языках программирования
- 22. Как совместить числа на разных языках?
- 23. Как консолидировать документацию на разных языках/средах?
- 24. Как разобрать дату на разных языках
- 25. Как сделать кодИнструктор сайта на разных языках
- 26. Как отформатировать дату на разных языках?
- 27. Как динамически строить графики на разных языках
- 28. Android текст в речь на разных языках
- 29. Связь между приложениями, написанными на разных языках
- 30. Typo3 Solr индексирование на разных языках/переводах
thanx много ... я думаю, что понял, но я так думаю ... может быть, у меня будут другие сомнения ... и да ... что именно мы все имеем в виду под «сбой», программы - я имею в виду в смысле низкого уровня ... я много раз видел эту фразу, не мог точно понять, что это значит ... –
еще одна вещь ... как компьютер может различать 2 объекта - как мы используем объекты в лингво более высокого уровня, но все это сводится к 0s и 1s в скомпилированных языках ... так как Comp знает, что какой-то n-й бит является концом объекта A? или взять его просто, как он может даже отделить 2 целых числа? ведь память - это поток бит, размещенный в определенном порядке, верно? –
@ParthThakkar: сбой означает, что ваша программа просто перестает функционировать. Что касается вашего второго вопроса, то это вообще невозможно объяснить в целом. Вы знакомы с C++? –