Làm cách nào để chạy mã C ++ trong trình duyệt bằng asm.js?


21

Một ứng dụng asm.js rất nhanh (gần tốc độ C ++ bản địa):

nhập mô tả hình ảnh ở đây

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

Nhưng làm thế nào có thể viết một cái trong C ++, chuyển đổi nó thành mã LLVM, sau đó thực hiện một số mẹo với emscripten / asm.js? Tôi không tìm thấy bất kỳ hướng dẫn về nó.

Và nếu tôi viết mã bằng C ++, thì làm thế nào để sử dụng API js, ví dụ XMLHttpRequest, WebSockets, Canvas hoặc WebGL?


3
Chia sẻ nghiên cứu của bạn giúp mọi người. Hãy cho chúng tôi những gì bạn đã cố gắng và tại sao nó không đáp ứng nhu cầu của bạn. Điều này chứng tỏ rằng bạn đã dành thời gian để cố gắng tự giúp mình, nó giúp chúng tôi tránh nhắc lại các câu trả lời rõ ràng và hầu hết nó giúp bạn có được câu trả lời cụ thể và phù hợp hơn. Xem thêm Cách hỏi
gnat

Hướng dẫn của bên thứ ba này dường như giải quyết một số câu hỏi sau: devosoft.org/an-int sinhtion
to

Câu trả lời:


36

Tôi tin rằng bạn đang nhầm lẫn trong sự hiểu biết của bạn về asm.js .

Trước hết, từ Câu hỏi thường gặp của họ

Q. Asm.js có phải là ngôn ngữ mới không?
A. Không, đó chỉ là (một tập hợp con) của JavaScript.

Và bạn đã yêu cầu làm rõ thêm :

Nhưng làm thế nào có thể viết một [ứng dụng asm.js] trong C ++

Bạn không viết "ứng dụng asm.js", thay vào đó asm.js là mục tiêu 1 để biên dịch mã C ++ của bạn.

Điều này viết này của John Resig cung cấp một số chi tiết có thể giải thích rõ hơn về cách sử dụng asm.js.

Bắt đầu với hình ảnh này:
C ++ => clang / LLVM => emscripten => công cụ JS

bạn có thể thấy asm.js là mục tiêu dịch thuật của emscripten . Emscripten xử lý dịch mã byte LLVM sang JavaScript và asm.js là một tập hợp con của JavaScript. Ở trong tập hợp con bị hạn chế của asm.js cho phép mã được tối ưu hóa và chạy nhanh hơn.

Bạn cũng đã hỏi:

Và nếu tôi viết mã bằng C ++, thì làm thế nào để sử dụng API js

Một lần nữa, bạn là loại thiếu điểm. Asm.js cho phép chuyển các ứng dụng C / C ++ hiện có sang JavaScript để chúng có thể chạy trong trình duyệt. Thông thường bạn sẽ không thể sử dụng API JS trong mã C / C ++ của mình và không có gì kỳ diệu về asm.js để cho phép điều đó.

Nếu bạn có một ứng dụng mới để viết cần API API thì bạn nên viết ứng dụng đó bằng JS và không viết bằng cách cố gắng viết bằng C ++ và sau đó chuyển sang JavaScript.

Và quay trở lại bài viết của Resig, có hai trích dẫn chính cho câu hỏi của bạn:

loại ứng dụng sẽ nhắm mục tiêu Asm.js, trong tương lai gần, là những ứng dụng sẽ được hưởng lợi từ tính di động của trình duyệt nhưng có mức độ phức tạp trong đó một cổng trực tiếp tới JavaScript sẽ không thể thực hiện được

Như bạn có thể thấy từ đoạn mã trên Asm.js không được thiết kế để viết bằng tay. ... Trường hợp sử dụng phổ biến nhất cho Asm.js ngay bây giờ là trong các ứng dụng tuân thủ từ C / C ++ đến JavaScript. Hầu như không có ứng dụng nào trong số này tương tác với DOM theo cách có ý nghĩa, ngoài việc sử dụng WebGL và những thứ tương tự.

Thay vào đó, những gì bạn có thể muốn xem xét thực hiện là có một chương trình JavaScript gọi API API mà bạn cần cùng với thực hiện các cuộc gọi đến C ++ mà bạn đã biên dịch thành JavaScript. Có một cái nhìn về hướng dẫn này. để xem cách gọi mã C ++ từ JavaScript.


Đối với một số nghiên cứu bổ sung, emscripten có một hướng dẫn có thể giúp bạn bắt đầu với việc hiểu cách lấy mã C ++, chạy nó thông qua LLVM và sau đó nhắm mục tiêu asm.js.

1 Nói đúng ra, điều đó không đúng. Mã C / C ++ không biết nó sẽ được biên dịch thành gì, vì vậy tôi thực sự không thể gọi asm.js là mục tiêu. Một công cụ khác (emscripten) lấy đầu ra LLVM và sau đó dịch sang JavaScript tuân thủ asm.js. Nhưng tôi sẽ gọi nó là mục tiêu vì nó dễ hiểu hơn.


ASM.js là mục tiêu biên dịch cho C / C ++. Vì vậy, không có bạn không viết C ++ bằng asm.js, biên dịch C ++ của bạn thành asm.js
Calvin

Chỉ có một đề cập đến tâm trí cho các ứng dụng bắt đầu từ đầu. Trong trường hợp trò chơi, việc có mã trong C ++ có thể hữu ích cho việc triển khai trên nhiều nền tảng.
Vlad Nicula

6

Có, bạn có thể viết mã C ++ và biên dịch mã thành asm.js, bằng cách sử dụng emscripten. Tôi đã không thử bản thân mình và tôi không chắc điều này đã sẵn sàng cho thời gian chính. Nó dường như là đủ tốt để chạy một loạt các trò chơi mặc dù.

Đây là một hướng dẫn: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Nhìn vào hướng dẫn, có vẻ khá dễ dàng để biên dịch mã C ++:

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

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html

4
Đó thực sự là mã C. Một trình biên dịch C ++ phức tạp hơn khoảng hai hoặc ba bậc. May mắn thay, emscripten tránh được vấn đề khó khăn đó bằng cách biên dịch LLVM và đã có trình biên dịch C ++ - to-LLVM hiện có.
MSalters

3
@MSalters: Đó cũng là mã C ++ hợp lệ. Tưởng tượng rằng! Ồ
Thomas Eding

@ThomasEding: Bạn đã bỏ lỡ điểm. Ngôn ngữ bạn phải hỗ trợ càng nhỏ thì càng dễ biên dịch ngôn ngữ đó. Giao điểm của C và C ++ không nhất thiết phải lớn hơn một trong hai.
MSalters

Giả sử mã này là C ++ thuần túy, trình biên dịch C sẽ không xử lý, việc sử dụng emcccó hợp lệ không?
Hamza Ouaghad

@ HamzaOuaghad - vâng. một thế giới xin chào đơn giản với các lớp cout & chuỗi của c ++ hoạt động tốt với dòng lệnh emcc này. sử dụng phiên bản 1.35.0.
orion elenzil

0

Cách dễ nhất là sử dụng WCPP , gói cho phép bạn nhập C ++ gần như trực tiếp vào dự án Node của bạn.

C ++ của chúng tôi

// addTwo.cpp 

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

Trong terminal (để biên dịch C ++ của chúng tôi)

$ wcpp

JavaScript của chúng tôi

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

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

Để biết thêm thông tin, hãy xem Gói NPM hoặc Git Repo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.