JavaScriptについてのたわごと

2017/3/29作成

最近、仕事でJavaScriptを書くことが増えました。以前からも、フロントエンドでjQuery使って簡単なボタンアクション程度ならやってましたが、最近はNode.jsでわりとがっつりと書いてます。ですが、まだまだJavaScript初心者で慣れない点も多いことから、なんか違和感あるなぁと思うことも多いのでちょっと吐き出し。

JavaScriptといえば非同期実行が特徴の一つです。コールバック関数を登録して、処理が終わったらそちらが呼ばれるまでは次の処理が次々と投入されていきます。基本的に書かれた通りの順番で実行される言語に比べると、処理の順番があちこちに飛んでいきますので、処理を追っかけるのがちょっと大変ではあります。

そんな非同期処理が特徴とはいえ、順番に処理しないといけないこともありますので、そういう場合はコールバックで続きの処理を書きます。これを繰り返しているとコールバックの中でコールバックを書いてってのを積み重ねてしまって、ソースコードが非常に見にくくなってしまいます。いわゆるコールバックヘルというやつですね。これを解決するためにPromiseというものが用意されています。って、Promiseは別にコールバックヘル対策だけでもないのですが、JavaScript初心者にとってはこれが目玉みたいなもんなんですよ。

で、Promiseでコールバックの代わりに.then()で繋いでいくのですが、順序保証をしないといけない処理が多くて、結局ソースコードは.then()で埋め尽くされるってことになってしまいがちです。これだったら、最初から同期処理で記述できるようになっていたほうがソースコードがすっきりするんじゃないかなぁという気がしてしまいます。まあ、私の頭がまだ非同期処理に切り替わってないだけなのかもしれませんが。

また、非同期処理で実行されるわけですがマルチスレッドで処理されるわけではありません。JavaScriptの処理系は基本的にはシングルスレッドです。なので、一つの処理で長時間かかる処理をしていると他の処理は止まってしまいます。フロントエンドの場合は、ブラウザが固まってしまいますね。これを避けるために、長時間かかる処理を行い際は、途中で時々setTimeout(0)を呼んでやって、他の処理にもタスクが割り当てられるようにしてやる必要があります。これを知ったとき、Windows 3.1のノンプリエンプティブマルチタスクを思い出したのは私だけですかね。プリエンプティブマルチタスクを売りにしたWindows 95がリリースされたのが20年以上前ですから、思い出すとしても年寄だけだとは思いますけれども。

この辺を考えてると、つまりはJavaScriptの処理系はその中にOSのタスク処理を再実装しつつあるのかなぁという気がします。かつて、OSが通ってきた道を今JavaScriptがまた通ろうとしている。ノンプリエンプティブマルチタスクよりもプリエンプティブマルチタスクの方が開発者は楽になれます。コンピュータの能力は日進月歩で発達していますが、人間の能力は基本的にずっと変わりません。なので、コンピュータの歴史とはすなわちいかに仕事をコンピュータに押し付けて人間が楽をするかの歴史でもあるわけですね。Windowsは20年前にプリエンプティブマルチタスクでかなり人間に楽をさせるようになりましたが、JavaScriptは今は20年前のWindows 3.1と同等の負担を人間に押し付けてる、というような気がしています。JavaScriptを理解してない初心者の言いがかりだろうとは思いますが。

あと気になるのは、JavaScriptがOSから独立してOSと同じようなものを作り出そうとしているような気がして、それって技術的に正しいのかなぁという疑問がないでもない。OSのタスクスケジューラはプリエンプティブマルチタスク以外にも多数の機能を搭載して熟成していますが、JavaScript処理系のタスクスケジューラはそこまでの高性能ではないと思います。セキュリティ面でも心配ではありますよね。OS上でダイレクトに動くプロセスならば様々な防御機構が働きますが、JavaScriptが独自に作り上げる環境の中で動くプロセスに対しては防御もどうしたって手薄になります。ある種の仮想環境ですから、最新のOS上でゲストOSとしてWindows XPを動作させてるようなものと言えばどうでしょう。ホストOSはしっかり防御されても、ゲストOSであるWindows XP環境の中はボロボロになりそうですよね。それと似たようなことがJavaScript処理系でも起こるんじゃないかなぁという気がしないでもない。だからって、ブラウザ上で動作するプログラムがOS上でネイティブに動作したら、それはそれで怖いんですけどね。

とかまあ、いろいろ気になりつつもJavaScriptで開発している今日この頃です。