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

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

У меня возникла пара вопросов, не смог найти ответы в сети. Можно ли с помощью LLVM соединять коды разных программ? т.е. есть js код и есть какая-то C++ библиотека. Можно ли теперь сделать возможным с помощью Js кода использовать C++?
То же самое с Ruby, Python?
Можно ли это дело потом вообще скомпилировать до машинного кода?
И где можно подробно почитать?
  • Вопрос задан
  • 1637 просмотров
Решения вопроса 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
Похожие вопросы
BostonGene Москва
от 100 000 до 200 000 руб.
Payneteasy Москва
от 120 000 руб.
МойСклад Москва
от 120 000 до 160 000 руб.