Bagaimana menjalankan kode C ++ di browser menggunakan asm.js?

21

Aplikasi asm.js sangat cepat (mendekati kecepatan asli C ++):

masukkan deskripsi gambar di sini

http://kripken.github.io/mloc_emscripten_talk/micro4b.png

Tetapi bagaimana mungkin untuk menulis satu di C ++, mengonversinya menjadi kode LLVM, kemudian melakukan beberapa trik dengan emscripten / asm.js? Saya belum menemukan tutorial tentang itu.

Dan jika saya menulis kode dalam C ++, lalu bagaimana menggunakan js API-s, misalnya XMLHttpRequest, WebSockets, Canvas atau WebGL?

LO kaka
sumber
3
Berbagi penelitian Anda membantu semua orang. Beri tahu kami apa yang telah Anda coba dan mengapa itu tidak memenuhi kebutuhan Anda. Ini menunjukkan bahwa Anda telah meluangkan waktu untuk mencoba membantu diri sendiri, itu menyelamatkan kami dari mengulangi jawaban yang jelas, dan yang paling utama itu membantu Anda mendapatkan jawaban yang lebih spesifik dan relevan. Lihat juga Cara Meminta
nyamuk
Tutorial pihak ketiga ini tampaknya menjawab beberapa pertanyaan berikut: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Jawaban:

36

Saya percaya Anda salah dalam memahami asm.js Anda .

Pertama, dari FAQ mereka

Q. Apakah asm.js adalah bahasa baru?
A. Tidak, itu hanya (sebagian dari) JavaScript.

Dan Anda meminta klarifikasi menambahkan :

Tetapi bagaimana mungkin untuk menulis satu [aplikasi asm.js] di C ++

Anda tidak menulis "asm.js aplikasi", bukan asm.js adalah target 1 untuk mengkompilasi C ++ kode untuk.

Ini artikel oleh John Resig menyediakan sejumlah detail yang mungkin lebih menjelaskan bagaimana asm.js akan digunakan.

Dimulai dengan gambar ini:
C ++ => dentang / LLVM => emscripten => mesin JS

Anda dapat melihat bahwa asm.js adalah target terjemahan emscripten . Emscripten menangani menerjemahkan bytecode LLVM ke dalam JavaScript, dan asm.js adalah bagian dari JavaScript. Tetap berada dalam subset terbatas JavaScript asm.js memungkinkan kode dioptimalkan dan berjalan lebih cepat.

Anda juga bertanya:

Dan jika saya menulis kode dalam C ++, maka bagaimana cara menggunakan js API-s

Sekali lagi, Anda agak kehilangan intinya. Asm.js memungkinkan porting aplikasi C / C ++ yang sudah ada ke dalam JavaScript sehingga dapat dijalankan di dalam browser. Anda biasanya tidak dapat menggunakan API JS dalam kode C / C ++ Anda, dan tidak ada yang ajaib tentang asm.js untuk mengizinkannya.

Jika Anda memiliki aplikasi baru untuk menulis yang membutuhkan JS API maka Anda harus menulis aplikasi dalam JS dan tidak lanjut dengan mencoba menulis dalam C ++ dan kemudian port ke JavaScript.

Dan kembali ke artikel Resig, ada dua kutipan kunci untuk pertanyaan Anda:

jenis aplikasi yang akan menargetkan Asm.js, dalam waktu dekat, adalah mereka yang akan mendapat manfaat dari portabilitas berjalan di browser tetapi yang memiliki tingkat kerumitan di mana port langsung ke JavaScript tidak akan mungkin

dan

Seperti yang mungkin Anda lihat dari kode di atas, Asm.js tidak dirancang untuk ditulis dengan tangan. ... Kasus penggunaan paling umum untuk Asm.js saat ini adalah dalam aplikasi yang dipenuhi dari C / C ++ ke JavaScript. Hampir tidak ada aplikasi ini berinteraksi dengan DOM dengan cara yang bermakna, selain menggunakan WebGL dan sejenisnya.

Apa yang Anda mungkin ingin lakukan adalah memiliki program JavaScript yang memanggil JS API yang Anda perlukan bersamaan dengan membuat panggilan ke C ++ yang Anda kompilasi ke JavaScript. Silahkan lihat pada ini emscripten tutorial untuk melihat bagaimana memanggil C ++ kode dari JavaScript.


Untuk beberapa penelitian tambahan, emscripten memiliki tutorial yang dapat membantu Anda memulai dengan memahami cara mengambil kode C ++, menjalankannya melalui LLVM, dan kemudian menargetkan asm.js.

1 Sebenarnya, itu tidak benar. Kode C / C ++ tidak mengetahui apa yang akan dikompilasi, jadi saya tidak bisa benar-benar memanggil asm.js target. Alat lain (emscripten) mengambil output LLVM dan kemudian diterjemahkan ke JavaScript yang sesuai dengan asm.js. Tapi saya akan menyebutnya target karena lebih mudah dimengerti.

TehShrike
sumber
ASM.js adalah target kompilasi untuk C / C ++. Jadi tidak, Anda tidak menulis C ++ di asm.js mengkompilasi C ++ Anda ke asm.js
Calvin
Hanya satu yang terlintas dalam pikiran untuk aplikasi mulai dari awal. Dalam hal gim, memiliki kode dalam C ++ dapat membantu untuk digunakan pada berbagai platform.
Vlad Nicula
6

Ya, Anda dapat menulis kode C ++ dan mengompilasinya ke asm.js, menggunakan emscripten. Saya belum mencobanya sendiri, dan saya tidak yakin seberapa siap ini untuk prime time. Tampaknya cukup baik untuk menjalankan banyak game.

Berikut ini adalah tutorialnya: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Melihat tutorialnya, sepertinya cukup mudah untuk mengkompilasi kode C ++:

// hello.cpp
#include<stdio.h>

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html
jdm
sumber
4
Itu sebenarnya kode C. Kompiler C ++ sekitar dua atau tiga kali lipat lebih kompleks. Untungnya, emscripten menghindari masalah sulit dengan mengkompilasi LLVM, dan ada kompiler C ++ - to-LLVM yang ada.
MSalters
3
@ MSalters: Ini juga kode C ++ yang valid. Bayangkan itu! Wow!
Thomas Eding
@ Thomas: Anda tidak mengerti intinya. Semakin kecil bahasa yang Anda harus mendukung, semakin mudah untuk mengkompilasi bahasa itu. Perpotongan C dan C ++ tidak harus lebih besar dari keduanya.
MSalters
Misalkan kode ini murni C ++, yang tidak akan ditangani oleh kompiler C, apakah penggunaan emccvalid?
Hamza Ouaghad
@ HamzaOuaghad - ya. dunia hello sederhana dengan cout & string kelas c ++ berfungsi dengan baik dengan baris perintah emcc ini. menggunakan versi 1.35.0.
orion elenzil
0

Cara termudah adalah dengan menggunakan WCPP , paket yang memungkinkan Anda mengimpor C ++ hampir secara langsung ke proyek Node Anda.

C ++ kami

// addTwo.cpp 

export int addTwo(int a, int b) {
  return a + b;
}

Di terminal (untuk mengkompilasi C ++ kami)

$ wcpp

JavaScript kami

const ourModule = await require('wcpp')('./addTwo.cpp')

console.log(ourModule.addTwo(2, 3))

Untuk informasi lebih lanjut, lihat Paket NPM atau Git Repo

Brandon Dyer
sumber