Обмен функциями между исходными файлами на нескольких языках программирования

Я пытаюсь выяснить, как разделить функции между исходными файлами, когда исходные файлы написаны на нескольких разных языках программирования. Есть ли способ поделиться функциями, написанными на трех языках, в трех разных исходных файлах, как показано ниже? Я хочу, чтобы функции, написанные на каждом языке, были доступны с других языков.

(Чтобы уточнить, все исходные файлы находятся в одной папке.)

Java-файл:

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
    }
}

Файл Javascript:

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
}

1 ответ

Позвольте мне объяснить, как работает механизм вызова функции, и тогда вы сможете получить более четкое представление о том, что возможно, а что нет.

Что происходит, когда вы вызываете функцию? [На очень высоком уровне] Вы вызываете функцию с аргументами, и она, возможно, возвращает значение. Аргументы могут быть переданы по ссылке или по значению. Адрес возврата должен храниться где-то, чтобы вызываемая функция знала, куда вернуться.

Аргументы должны быть подготовлены: либо ссылка передается, так что адрес используется повторно, либо по значению, которое означает, что копия создается в стеке. При возврате возвращаемое значение должно храниться где-то для доступа к вызывающей функции. Это также, как правило, в стеке [необязательно, может быть регистром ЦП в зависимости от архитектуры ЦП или оптимизации компилятора]. Наконец при возврате возвращается и адрес возврата.

Для каждого языка особенности выше различны и не совместимы. Здесь вам нужно явно связать языки, которые переводятся с одного языка на другой. Это связывание распространяется на библиотеки [объектный код]. Так, например. Программа на C не вызывает функцию Java напрямую. У него просто есть неразрешенный символ, который связывающая оболочка разрешает совместимым образом. Это в свою очередь вызывает код Java.

Никто не может вызывать функции Java из C, если только у него нет интерфейса JNI в середине для целей, упомянутых выше. Нельзя даже вызвать код C++ из кода C без явного добавления поддержки при компиляции библиотеки C++.

Кроме того, если вы интерпретировали языки как javascript, я не уверен, что вы вообще можете вызывать скомпилированные языки.

Таким образом, мой ответ был бы Для произвольного набора языков: это зависит от языков, но ответ в основном - нет. Если вы пишете привязки для поддержки своих библиотек [помните скомпилированные языки]: Да.

Если что-то выше не имеет смысла, не стесняйтесь спрашивать в комментариях.

РЕДАКТИРОВАТЬ: использование HTTP:

Программы могут взаимодействовать друг с другом через сокеты, когда они на разных машинах, или использовать файлы / каналы / разделяемую память на одном компьютере. В конечном счете, общение на основе HTTP - это не что иное, как сокеты. Нечто подобное Apache Thrift также то же самое. Он будет использовать сокеты (между машинами) или каналы (в пределах одной машины) для отправки данных в другую программу. Затем Apache Thrift обеспечивает связывание для другого языка на другой стороне. Таким образом, вы должны иметь несколько программ, работающих через сокеты. Это отличается от вызова функции на одном языке или использования привязок к библиотеке объектов, которая "связана" с исполняемым исполняемым файлом. Надеюсь, вы понимаете разницу.

Может ли программа, написанная на одном языке, взаимодействовать с программой, написанной на другом языке? Абсолютно мы делаем это все время. Весь ваш интернет основан на разных языках. Ваши операционные системы и программное обеспечение в нем находятся в тоннах языков, и все они без проблем работают друг с другом, потому что все они уважают интерфейс друг друга.

Однако, как разработчику, вы должны понимать, что для использования функций на разных языках обеим сторонам, возможно, придется использовать экономию и что существует разница между связью через сокеты с использованием абстракции RPC и вызовом функции через вызов функции. Надеюсь, вы получите картину.

Другие вопросы по тегам