OSTRACISM CO.

ScalaとOCamlとF#とPythonと...

JavaScriptとNode.js

 スラドの『リクルートの「2016年おすすめプログラミング言語」、1位はJava』(http://developers.srad.jp/story/16/06/23/1931246/)を読んでて、


> > 未だにHTMLの飾り付け程度に思ってる人は別だけど

> 経験上、その手の人は他の知識も時代遅れだったりするからめんどくさい


なんて書き込みがあり、JavaScriptなんざHTMLの飾り付け程度、と思っているのでもうちょっと調べてみようかと思った次第。

 少なくともepub2to3程度のことが出来なくちゃ話にならないので、ともかくブラウザで動作させるということから離れてコマンドラインで云々を調べていたらjsc(JavaScriptコンパイラ)ってのが出てきた。君のWindowsにも初めから入ってるよ、と。確かに入ってはいるんだが、これって何が記述できるんだろう。printという関数はあるようだが、その辺のことってどこで文書化されてるんだろう。Linuxでもjscは導入できたが、いったいそれがどう使えるか不明だった。でもまぁ調べていくと、どうやらJavaScriptには標準化されたライブラリなんてのは一切無いってことらしい。これまた思い切ったことを。print関数に関する文書って、本当、どこを見ればいいんだろう。

 で、そういった状況のJavaScriptの環境を一変させたのがNode.js。Node.jsってjQueryのような何かを実現するJavaScriptかと思っていたら、JavaScript実行環境だった。.jsって付けるなよ紛らわしい。C#における.NET Framework。それなら納得。Node.jsをインストールする。

 Node.jsに標準に備わってるZLIBの説明を見て(あぁ、文書化されてるって素晴らしい)主にgzipやzlibの話なので所謂ZIPファイルは標準では扱えないということのようだ。これでモチベーションは半分以下になる。npmで各種ライブラリをインストールするそうな。調べるとなんとも乱立状態のカオス。OCamlのOPAMやHaskellのCabalやPythonのPyPIでわかるように、碌な文書化もされてない寄せ集めで何をしろと、こんなものをどうしろと。モチベーション駄々下がり。もう俺「他の知識も時代遅れだったりするからめんどくさい」でいい。そもそもNode.jsはWebサーバを構築するためのツールなんだし。いや、それでもZIPファイルは扱うだろ。仕事でメンテしてるScala + LiftのWebサーバもZIPファイルは扱ってるぞ(たまたまJavaのライブラリに標準で入ってるだけとも言えるが)。

 例えばJSZip(node-zip)の文書(まだ文書化されてるだけマシ)で「JSZip only supports UTF-8 natively. A zip file doesn't contain the name of the encoding used, you need to know it before doing anything.」なんてあるわけで、いわゆるシフトJIS(CP932)がファイル名として使われているZIPを扱うのは苦労しそうだ。


> コンピュータサイエンスやってるエンジニアは、JavaScript は良いって言ってる気がする。

> 逆に、コンピュータサイエンスはやってなくて現場叩き上げのエンジニアは、だいたい JavaScript はおもちゃ言語扱いだな。


 理由が分かった。良いってのはJavaScriptの言語仕様のことで、おもちゃ扱いはJavaScriptの開発実行環境だ。

 どんな素晴らしい言語でもへっぽこな環境やライブラリしかなかったら見向きもされん(OCamlがまさにそう)。どんなしょぼい言語でも適切な環境やライブラリが他に無いなら使われる(かつてのWindows APIとC)ってだけ。

 ようやくprintの文書を発見(https://msdn.microsoft.com/en-us/library/1yy6ka92(v=vs.90).aspx)。さすがはMicrosoft。コンソールへの出力はあっても入力はなさそうなので、これだけで意味のあるプログラムは作れない。.NETのjscは.NET Frameworkを使うのが前提っぽい。だったらC#なりF#なりを使うよなぁ普通。

 Ubuntuにてlibjavascriptcoregtkで入ったjsc(コマンドラインJavaScriptインタプリタ)はWebKitGTK+とかいうプロジェクトのもので、これもprintが通る。しかし説明文書は見つけてない。

 ElectronもNode.jsを使ってるんで、標準で用意されてない処理でカオスなのは必至。ちゃんとしたZIPライブラリを探すところからってのは泣きそう。あるかどうかも不明な状況だし。とはいえ、OCamlの状況に比べれば利用者が多いというだけでもNode.jsの方が断然有利。多分。


2016.06.27


 ともかく、JavaScriptをいわゆるLL的にサクっと書いてサクっと動かすにはNode.jsが適切なのだと判断。やっぱり名前がおかしいよなぁ。.jsは余計だろ。で、しかもWindowsとLinuxで、多分Mac OS Xでも同じJavaScriptで同じように動くプログラムを書けそうだ。ココ重要です。はっきり言ってこれ(マルチプラットフォーム)がなけりゃ手を出してない。

 Node.jsのライブラリ文書をざっと眺めると、それなりに、特にネットワーク関連が充実してるようだ。でも多分Pythonの方が充実してるんだろうけど。前述したようにZIPファイルは標準では扱えない。何故かXMLも標準では扱えない。なんだってぇええ。モチベーションが負の数になっちゃうよ。なんでこんなのが流行ってるんだろう。

 npmがカオスだと書いたが、こんなこと書いてるページを見つけた。「あとはパパッとまとめてテスト書いていつも通りnpmパッケージとして公表。似たようなのいっぱいありそうだけどとりあえず気にしない。」だそうで。そりゃカオスにもなりますわ。

 なので、目標を下げepub2to3はやめてshuffleを書いてみることにした。これならUnixシステムコール程度のライブラリ環境でも書ける程度のサンプル。

 OCamlでは色々と標準的にあってもよかろうにと思う程度に足りない部分があったが、Node.js + JavaScriptではそういう部分はなかった。ArrayとObjectとStringが機能豊富だからだろう。ScalaやPythonと同程度の記述で書ける。

 スピードは、一度ディレクトリ探索がキャッシュに入っちゃうと、この程度の処理はPythonでも速い。よってよくわからない。


ディレクトリ以下のmp3ファイルをシャッフルしてコピーするプログラム

JavaScript (Node.js) shuffle_N.js


2016.06.28


「インデックス」へ戻る


OSTRACISM CO.

OSTRA / Takeshi Yoneki