Можно ли с помощью LLVM соединять куски кода с разных языков?

Здравствуй, Тостер!
Как я понял LLVM это такой универсальный компилятор, который компилирует универсальный язык, в который, в свою очередь, переводится код программы на обычных языках.

У меня возникла пара вопросов, не смог найти ответы в сети. Можно ли с помощью LLVM соединять коды разных программ? т.е. есть js код и есть какая-то C++ библиотека. Можно ли теперь сделать возможным с помощью Js кода использовать C++?
То же самое с Ruby, Python?
Можно ли это дело потом вообще скомпилировать до машинного кода?
И где можно подробно почитать?
  • Вопрос задан
  • 1654 просмотра
Решения вопроса 2
32bit_me
@32bit_me
Программист, встраиваемые системы
Да, можно. Вы можете, например, скомпилировать несколько файлов в LLVM IR, затем их слинковать, прогнать через оптимайзер и скомпилировать исполняемый файл.
Ответ написан
@Skapix
jew on 1/8
При использовании LLVM, как и при использовании других компиляторов, при связывании различных языков определённые проблемы. Первое о чём нужно помнить, каждый ЯП имеет свои типы данных и хранит их по-своему. Например в Python, String - это немного более сложная структура, чем указатель на строку. Другие языки ничего не знают об этой структуре и поэтому приходится писать связки языков. Также нужно соблюдать ABI вызовов. Думаю, вам следует смотреть в сторону Swig и Boost python. Связав оба языка программирования вы легко можете создать 1 исполняемый файл при помощи любого компилятора.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@SOKR
Можно
function counter()// модуль asm.js может принимать три аргумента stdlib, foreign, heap
{
// директива инициирующая синтаксис asm
"use asm";

function wass()
{
var wasmCode = new Uint8Array([0,97,115,109,1,0,0,0,1,133,128,128,128,0,1,96,0,1,127,3,131,128,128,128,0,2,0,0,4,132,128,128,128,
0,1,112,0,0,5,131,128,128,128,0,1,0,1,6,129,128,128,128,0,0,7,153,128,128,128,0,3,6,109,101,109,111,114,121,2,0,5,99,111,117,110,
116,0,0,4,109,97,105,110,0,1,10,163,128,128,128,0,2,135,128,128,128,0,0,65,0,40,2,12,11,145,128,128,128,0,0,65,0,65,0,40,2,12,65,
1,106,54,2,12,65,0,11,11,138,128,128,128,0,1,0,65,12,11,4,0,0,0,0]);
//instance - это функция, предоставляющая экземпляр модуля, а метод WebAssembly.Instantiate()
//компилирует и инсталлирует Wasm-code в один шаг
WebAssembly.instantiate(wasmCode).then(({instance}) => {
while(instance.exports.count()<42){
instance.exports.main();console.log(instance.exports.count())
}
});
}
return {wass:wass};//этот синтаксис организует обращение к функциям из глобальной области наподобие классов c++
}
var fast = counter(this);
fast.wass();
Вся эта штука работает в последнем Chrom

Код на си, который был использован для примера
int counter = 0;
int count()
{
return counter;
}
int main()
{
counter = counter+1;
}
читайте тут
developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы