C ++ kodu asm.js kullanarak tarayıcıda nasıl çalıştırılır?


21

Bir asm.js uygulaması çok hızlı (yerel C ++ hızına yakın):

görüntü tanımını buraya girin

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

Fakat bir tane C ++ 'da yazmak, LLVM koduna dönüştürmek, sonra da emscripten / asm.js ile bazı hileler yapmak nasıl mümkün olabilir? Bununla ilgili bir eğitim bulamadım.

Ve kodu C ++ 'da yazarsam, js API-s, örneğin XMLHttpRequest, WebSockets, Canvas veya WebGL nasıl kullanılır?


3
Araştırmanızı paylaşmak herkese yardımcı olur. Bize ne denediğinizi ve neden ihtiyaçlarınızı karşılamadığını söyleyin. Bu, kendinize yardım etmek için zaman harcadığınızı, bariz cevapları tekrar etmemizi önlediğini ve hepsinden daha belirgin ve alakalı bir cevap almanıza yardımcı olduğunu gösteriyor. Ayrıca Nasıl
Sorulur

Bu üçüncü taraf öğretici, bu soruların bazılarını ele alıyor gibi görünmektedir: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Yanıtlar:


36

Asm.js'yi anlamada yanılmış olduğuna inanıyorum .

Öncelikle, Sıkça Sorulan Sorular bölümünden

S. asm.js yeni bir dil midir?
A. Hayır, sadece JavaScript'in bir alt kümesidir.

Ve sordu açıklama eklendi :

Ancak bir [asm.js uygulaması] C ++ dilinde nasıl yazılabilir?

Bir "asm.js uygulaması" yazmazsınız, asm.js C ++ kodunuzu derlemek için bir hedef 1'dir .

Bu John Resig tarafından makale daha iyi asm.js cihazların nasıl kullanılacağı konusunda açıklayabilir detaylar bir dizi sağlar.

Bu resimle başlayarak:
C ++ => clang / LLVM => emscripten => JS motoru

asm.js'nin emscripten'in çeviri hedefi olduğunu görebilirsiniz . Emscripten, LLVM bayt kodunu JavaScript'e dönüştürür ve asm.js bir JavaScript alt kümesidir. Asm.js 'nin sınırlı JavaScript alt kümesinde kalmak, kodun optimize edilmesini ve daha hızlı çalışmasını sağlar.

Siz de istediniz:

Ve eğer kodu C ++ 'da yazarsam, js API-s nasıl kullanılır?

Yine, noktayı kaçırıyorsun. Asm.js, mevcut C / C ++ uygulamalarının JavaScript'e taşınmasını sağlar, böylece bir tarayıcıda çalıştırılabilirler. Normalde JS API'lerini C / C ++ kodunuzda kullanamazsınız ve asm.js ile ilgili sihirli bir şey yoktur.

JS API'leri gerektiren bir yeni uygulamanız varsa, o zaman uygulamayı JS'ye yazmalı ve C ++ ile yazmayı denemeye çalışarak futz yapmamalı ve ardından JavaScript'i kullanmalısınız.

Ve Resig'in makalesine geri dönersek, sorunuz için iki önemli teklif var:

yakın gelecekte Asm.js'yi hedef alacak uygulamaların türü, tarayıcıda çalışmanın taşınabilirliğinden faydalanacak ancak JavaScript’e doğrudan bağlantı noktasının olanaksız olacağı karmaşıklık düzeyine sahip olan uygulamalardır.

ve

Muhtemelen yukarıdaki koddan görebileceğiniz gibi Asm.js elle yazılmış şekilde tasarlanmamıştır. ... Şu anda Asm.js için en yaygın kullanım durumu, C / C ++ ile JavaScript arasındaki uygulamalardadır. Bu uygulamaların neredeyse hiç biri DOM ile etkileşimli bir şekilde WebGL ve benzerlerini kullanmanın ötesinde etkileşime girmez.

Bunun yerine yapmayı düşünmek isteyebileceğiniz şey, JavaScript'i derlemiş olduğunuz C ++ 'a yapılan çağrılarla birlikte ihtiyacınız olan JS API'lerini çağıran bir JavaScript programına sahip olmak. JavaScript'den C ++ kodunu nasıl arayacağınızı görmek için bu emscripten eğitimine bakın.


Bazı ek araştırmalar için, emscripten, C ++ kodunu nasıl alacağınızı , LLVM'de nasıl çalıştıracağınızı ve asm.js.'yi nasıl hedefleyeceğinizi anlamanıza başlamanıza yardımcı olabilecek bir öğreticiye sahiptir.

1 Kesinlikle konuşma, bu doğru değil. C / C ++ kodu ne derleyeceğinin farkında değil, bu yüzden asm.js'yi gerçekten hedef olarak adlandıramam. Başka bir araç (emscripten) LLVM çıktısını alır ve ardından asm.js uyumlu JavaScript'e çevrilir. Ama ben buna hedef diyeceğim çünkü anlaşılması daha kolay.


ASM.js, C / C ++ için bir derleme hedefidir. Öyleyse hayır, C ++ 'ı asm.js' de derlemeyin, C ++ 'ı asm.js' ye derler
Calvin

Sıfırdan başlayan uygulamalar için sadece bir söz akla geliyor. Oyunlarda, kodun C ++ 'da olması birden fazla platformda dağıtmak için yardımcı olabilir.
Vlad Nicula,

6

Evet, emscripten kullanarak C ++ kodunu yazabilir ve asm.js dosyasına derleyebilirsiniz. Kendim denemedim ve bu asal süre için ne kadar hazır olduğundan emin değilim. Yine de bir sürü oyunu çalıştırmak için yeterince iyi görünüyor.

İşte bir öğretici: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Öğreticiye bakıldığında, C ++ kodunu derlemek oldukça kolay görünüyor:

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

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

4
Bu aslında C kodu. Bir C ++ derleyicisi, iki ya da üç büyüklükteki emirlerden daha karmaşıktır. Neyse ki, emscripten LLVM'yi derleyerek bu zor problemi ortadan kaldırıyor ve mevcut bir C ++ - to LLVM derleyicisi var.
MSalters

3
@ MSalters: Ayrıca geçerli bir C ++ kodu. Hayal et! Vaov!
Thomas Eding,

@ThomasEding: Noktayı kaçırdınız. Desteklemeniz gereken dil ne kadar küçükse, o dili o kadar kolay derlemelisiniz. C ve C ++ ile kesişme, mutlaka ikisinden de büyük değildir.
MSalters,

Diyelim ki bu kod saf C ++ idi, bir C derleyicisinin kullanmayacağı, emcckullanımının geçerli olacağını ?
Hamza Ouaghad

@HamzaOuaghad - evet. c ++ 'nın cout & string sınıflarına sahip basit bir merhaba dünyası, bu emcc komut satırında gayet iyi çalışıyor. 1.35.0 sürümünü kullanarak.
orion elenzil

0

En kolay yol , C ++ ' doğrudan Node projenize almanızı sağlayan bir paket olan WCPP'yi kullanmak olacaktır .

Bizim C + +

// addTwo.cpp 

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

Terminalde (C ++ 'ımızı derlemek için)

$ wcpp

JavaScript'imiz

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

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

Daha fazla bilgi için NPM Paketine veya Git Repo'ya bakınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.