Java
JavaScript
ポエム
逆噴射

JAVA=JAVAscript問題について考える(今後必要)

この記事の目的

JAVA = JAVAscriptであることを示します。
一応、末尾にまじめな解説とかもつけました。
なお、一部誤りがあったので末尾に謝罪もつけました。

コード

同じコードを2つ貼ります。

/*
<script>
var System = {out: {println: function(e){console.log(e);document.getElementsByTagName('body')[0].innerHTML=e;}}};
window.onload = function() {
    eval(document.getElementById('code').innerHTML.replace(/[*]/g, '/').replace(/(public|static|void|String\[\] args)/g, ''));
}
</script>
<div id="code">
*/
class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
/*
new Main().main();
</div>
*/
/*
<script>
var System = {out: {println: function(e){console.log(e);document.getElementsByTagName('body')[0].innerHTML=e;}}};
window.onload = function() {
    eval(document.getElementById('code').innerHTML.replace(/[*]/g, '/').replace(/(public|static|void|String\[\] args)/g, ''));
}
</script>
<div id="code">
*/
class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
/*
new Main().main();
</div>
*/

JAVAで動かす

実行方法は正直なんでもいいのですが、paizaというサイトに貼り付けて実行します。
うごく!Hello, world!ってでる!すごい!

JAVAscriptで動かす

上記のコードをhtmlとして保存して、ダブルクリックするなどして適当なブラウザで開きます。
検証した環境はchromeでした。
Hello, world!ってでる!すごい!

ひょっとすると、一部のブラウザの画面には変な文字列が出ているかもしれませんが、真の男はそういう事は気にしません。
一部のブラウザを使っている場合も、開発者ツールを見てみましょう。Hello, world!ってたぶんでる!すごい!

ポエム

真の男にとっては、JAVA=JAVAscriptであることは自明なことだ。
JAVAとJAVAscriptは違うなどとゆうあほや腰抜けも居るが、メキシコの荒野ではそんなのは通用しない。
それがわからないやつは、最初は威勢だけはいいが、やがてコメント欄に吹き荒れるメキシコの風に倒れ、酒場で知り合ったベイブと慰め合い、刹那の快楽に酔い、子を産み育て、「何も面白いことが無い一生だった」などと酒場でぼやきながら・・・・やがて老いて死ぬ。THE END OF MEXICO....。
だが、おまえがまだ真の開拓精神を持っているならば話は別だ。今からでも遅くはない。JAVA=JAVAscriptをやれ。

うそです

JavaとJavaScriptは別物です。すみませんでした。
なぜ別物なのに同じだと主張する人が出てくるのか?という背景については、
https://qiita.com/pik/items/1c95d69debee4aedffea
が詳しいです。

ちょっとだけ解説

JavaとJavaScriptは、コメントの形式などもC由来で似ている言語なのですが、一方で予約語の振る舞いなどが色々違います。とくに、スペースだけでトークンを配置した時の扱いも貧弱です。
そこで、素朴なやり方ではどちらでも動くコードを書くのは不可能かなと思い、邪道に手を出しました。

コメント

まず、HTMLを使う事によって、JavaではコメントだがJSではコメントではない、という領域を作り出します。
Javaの世界では、これによってJavaScript用のコードを全てコメントとして扱えるようになります。Javaにはマクロもないので、コードを実行時に動的に書き換えるのは少し難しく、コメントを除けばJavaとしては普通のコードになるようにします。

コードの書き換えとeval

上述のとおり、素朴なやり方では邪魔な予約語が沢山あるので、コードを書き換えます。キモになるのは、evalとreplaceです。

eval

evalというのは、パフォーマンス的にもセキュリティ的にもやってはいけない事で、文字列をJavaScriptのコードとして評価します。

replace

予約語とコメントの片割れが邪魔なので、正規表現で置換します。予約語以外も、一部面倒なので消してしまいます。

ワンポイント

実は、このコードには、例えばphpを乗せることも不可能ではないのですが、出力をHello, world!だけにするのがちょっとめんどくさいなと思ってやめました。

お詫び

その1

コピペミスっていて、Javaのソースが古いバージョンになってました。直しました。すみません。

その2

replaceは以下の通り、一回で良かったです。すみません。

改良版
/*
<script>
var System = {out: {println: function(e){console.log(e);document.getElementsByTagName('body')[0].innerHTML=e;}}};
window.onload = function() {
    eval(document.getElementById('code').innerHTML.replace(/[*]/g, '/'));
}
</script>
<div id="code">
*/
class Main {
    /**/ public static void
    main(
        /**/ String[] args
    ) {
        System.out.println("Hello, world!");
    }
}
/*
new Main().main();
</div>
*/

おしまい!