Всегда было интересно как игровые движки понимают инородные языки. Например много движков написано на языке C++ и во многих из них есть поддержка языков на которых сам движок не написан.
Например:
Unity написан на C++, но игры пишутся на C#
Love2D написан на C++, но игры пишутся на Lua
Cocos2D написан на Python/C++, но игры пишутся на Lua
Каким образом движок написанный на C++ понимает другие языки? Движки которые не используют инородные языки работают быстрее? Можно совместить любые языки?
Дядя Богдан, результатом работы классического компилятора является код для текущей аппаратной платформы, оформленный в виде объектного файла определённой структуры с именованными ссылками на функции и другие символы. Соответственно, если знать имя функции и её аргументы, то её можно вызвать из любого языка.
Конечно, и тут есть много нюансов. Например, С и C++ по-разному формируют имена символов (из-за того, что в C++ одна функция за счёт перегрузки может иметь много вариантов). Поэтому если нужно линковать код C и C++, то приходится использовать extern "C", в этом случае C++ правильно понимает, как ссылаться на функцию из C-кода или как экспортировать у себя функцию, которую будут использовать другие языки (необязательно C).
После компиляции идёт линковка - все файлы собираются в один программный код. Линковка бывает статической - когда объектный файл включается в программу (в UNIX-системах это .o-файлы или архив .o-файлов с расширением .a, в DOS/Windows - .obj) - и динамическая - когда файл включается в программу в процессе запуска или уже после запуска из программного кода с помощью специальных методов (.so-файлы, dll-файлы).
Теперь перейдём к интерпретируемым языкам и языкам с байткодом. В них есть два направления использования: из скрипта вызвать низкоуровневый код и наоборот. Для первой задачи в этих языках есть методы, которые позволяют вызывать функции, но к этим функциям могут предъявляться требования по именованию, типам аргументов итд итп. Если очень надо вызвать что-то более сложное, то можно написать функцию-обёртку. Для второй задачи обычно есть библиотека lib[название_языка], которая позволяет выполнять кусок кода, переданный строкой либо загружаемый из файла. Тут для передачи параметров их тоже надо правильно оформлять. Всё потому, что на низком уровне функция - это просто адрес вызова и определённый блок данных в стеке процессора с аргументами функции, вызывающий код должен правильно угадать, что именно положить в стек, чтобы программа повела себя адекватно, ведь в объектном файле этой информации нет.
Есть такие штуки - трансляторы, интерпретаторы и компиляторы, которые можно писать на любом языке - хоть на C++, хоть на C# или Python.
Вот этим они и занимаются - понимают любые языки вплоть до самописных.