読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

C++をJavaScriptに變換するあれ

今日はBoost勉強會に行つて來た訣ですが、その中でC++Hello World!をJavaScriptにすると12萬行になると云ふ話があつたので自分でも試してみました。
まづ普通にC++です。

// hoge.cc
#include <iostream>

int main() {
  std::cout << "Hello World!" << std::endl;
}

これをem++ -o hoge.js hoge.ccした後のwcコマンドの結果です。em++すると"clang: warning: argument unused during compilation: '-nostdinc++'"とか出るのですが、手を拔いてUbuntu12.04用のバイナリを使つたからだつたりするんですかね。

125034  357293 3470474

見ると確かに12萬行あります。
で、iostreamがでかいのではと云ふ説に對してCライブラリ使つても變はらなかつたと云ふ情報があつたのですが、

#include <stdio.h>

int main() {
  puts("Hello World!");
}

これのwc結果は、

2048  9064 82829

2000行程度で濟んでました。唯、このhoge.jsを實行すると

using stub malloc (reference it from C to have the real one included)
Hello World!

とか出てきます。最初のiostream使ふやつだと最初のusingなんたらの行は出ませんでした。
最後にやりたかつただけのシステムコール呼ぶ版です。

int main() {
  __asm__ volatile ("leaq 0(%0), %%rsi;"
                    "movq $0x1, %%rax;"
                    "movq %%rax, %%rdx;"
                    "movq $0xd, %%rdx;"
                    "syscall" : : "r"("Hello World!\n"));
}

wc結果は、

1482  6639 57274

流石の小ささです。しかしこれを實行すると殘念乍ら

hoge.js:1377
  leaq 0($0), %rsi;movq $$0x1, %rax;movq %rax, %rdx;movq $$0xd, %rdx;syscall
       ^

module.js:434
  var compiledWrapper = runInThisContext(wrapper, filename, true);
                        ^
SyntaxError: Unexpected number
    at Module._compile (module.js:434:25)
    at Object..js (module.js:464:10)
    at Module.load (module.js:353:32)
    at Function._load (module.js:311:12)
    at Array.0 (module.js:484:10)
    at EventEmitter._tickCallback (node.js:190:39)

と出てきて實行出來ませんでした。ちよつとアセンブリの書き方が惡いのですかね。