スクリプト言語を舐めてはいけない

おれはハッカーだ。
なので、ハッカーではない人種と呑むのが苦手である。
たとえば「ITエンジニア」と自称するような人たちだ。

当然だが、ITエンジニアと自称する人はハッカーではない。
ITエンジニアと言う言葉はスコープが広すぎていちいち細かい説明を聞かなければならない。

これが厄介なところである。

あるとき、友達の家で飲み会をすると言われ、誰が来るの?と聞いたら知らないIT関連会社のエンジニアたちだという。

エンジニアと呑むと喧嘩しちゃうので断ったのだが、いろいろあっていくことになってしまった。

するとやっぱりこんなはなしをしていた。

「やっぱ私もRubyみたいなスクリプト言語なんか卒業してコンパイル言語やんなきゃ。処理速度がね…」
「コンパイル言語って?」
「TypeScriptとかJavaとかC#とか」
「それ、中間コード言語じゃねえか。なんの意味があるんだ。YARV知らないのか」

またやっちまった

だからね、無用の煽りとかしたくないのよ。
Rubyは古い、とか目の前で言われちゃうとおじさん悲しい。

僕は普段からRubyを使ってるわけじゃないけど、新しい言語というのは新しい目的やより洗練されたコーディングのために文字通り命を削って作られているのである。

JavaがいいとかRubyがいいとかの話じゃなく、速度を求めるならコンパイル、というあたりがすでにおかしいのだ。

自慢じゃないがおれはもう、今の世代のCPUで速く動くコードを書く自信はない。
アセンブリだろうがCだろうが、そもそも386以降のプロテクトモードで動いてるCPUはいつタスクスイッチが走るか予測できないので厳密にこの書き方が速い、とは常に断言できない。

ましてやガベコレのある言語など、本当に速度を求めるなら論外なのである。

ただ悲しいかな。この辺の話を別に理解しなくていい。
どうせどんなアルゴリズムもニューラルネットのほうが速くなるし最適化もニューラルネットの方が強くなるに決まってるんだから

LLVMがニューラルネットで最適化するようになれば、それが最大公約数的な最速になることは疑うべくもない。
もう俺が若かった頃のテクニックも、今の若者が勘違いしながら勉強する事も、意味がなくなることは明らかなのだ。

ゴールデン街で飲んでたら、「我が輩はITエンジニアなり」と言う人に立て続けに会った。
ある人は銀行系のベンダーで10年そこそこ勤めたあと、ベンチャーに転職したら給料が半分になったと嘆いていた。年は僕とそう変わらない。いいとしこいたおじさんである。

「ITって、何系ですか?」

と聞いたら

「ゼッパチなんて言ってもあんたにゃわからんだろ」

と言われ、少し喋りすぎた。

「まあ確かに知りませんね。島正利がフェデリコ・ファジンとインテルをスピンアウトして作った8080互換の傑作CPUで、ゲーム機から戦闘機まで世界中に普及したチップということくらいしか知りません。僕は最初から8086から入ったんで。まだZ80を仕事でお使いなんですか?それは確かに、仕事としてやっていくのは大変そうですね」

またやってしまった。

今の銀行ではまだZ80を使ってるんだろうか。そんなわけはあるまい。組み込み系でも新規の商品にそんな古いものは使わないだろう。だとすると稼動中のシステムのメンテナンスだろうか。

いずれにせよ、みんなスクリプト言語をなめすぎ、アセンブリに期待しすぎなのである。
それはもう昔話だ。

マシン語を操ることが至高で、高級言語が素人の手慰みだった時代は25年も前に終わってる。
10代の頃働いてたバイト先の先輩が、libgsを逆アセンブルしてもう一度アセンブルしたら速度がでないと当たり前のことに首を傾げていた時代から、全く会話が変わらない

かといって、コンパイラの最適化だけに頼りきる二流の姿勢も許せない。
これが老人か

遅延分岐スロットがあるMIPS系の逆アセンブルでは遅延分岐スロットにNOPが入るのは常識で、それじゃあパイプラインがNOPだらけになるから遅くなるのは当たり前だ。当たり前ですよ、と突っ込んだら毛嫌いされてすぐバイトをやめた。

アルゴリズムがバブルソートなのにコンパイラがクイックソートにしてくれるわけがない。計算量の絶対値が違うものをコンパイラは省いてくれない。もし省くならコンパイラのバグである。

まあでもきっと、どうせ全てはニューラルネットになるだろう。

と、悪口しか書かないと意地が悪すぎるのでなぜスクリプト言語を舐めるべきでないか補足しておこう。

さっきも言ったように、スクリプト言語を含むプログラミング言語の進化は、常に新しい哲学とメソドロジーの積み重ねの上にある。

誤解を恐れず言えば、新しく普及した言語は、常に旧世代の言語の欠陥を改善してる。
そしてスクリプト言語を高速に動かすために、CPUそのもののバージョンアップも行われる。RISCの時代から、人間が知恵を絞ってマシン語を整頓するのではなく、高級言語で書かれたものをコンパイラが自動的に最適化するような思想に移行した。

しかしコンパイラの最適化は極めて限定的であり、実際にはCPUフレンドリーであってプログラマーフレンドリーではない。だからコンパイラによる最適化を効果的に行うには、逆説的だがプログラマーはより厳密にCPUの処理過程を意識する必要がある。

ところが21世紀に入るとインテル系アーキテクチャはマイクロコードというRISCベースの内部言語に,8086というCISCベースのマシン語から動的にコンパイルするようになった。このとき必要になったのが分岐予測や投機的実行などのアイデアで、すでに我々プログラマーはCPUの内部構造を知ることそのものが困難になっている。
  
プログラム実行の最後の最後でコンパイルが入るのだから、だとすると中間コード言語もスクリプト言語も本質的には何ら代わりがないことになる。

それどころか、VM上で動くプログラムは、CPUキャッシュの消費を抑制しネイティブコードよりも高速に実行できる可能性がある。

なぜ可能性と書いたのかというと、実際にそうなるかどうかはプログラマーがVMの内部構造を熟知し、中間コードとアセンブリがどのように実行されるのかを具体的にイメージできなければそのようなプログラムを書くことが不可能だからだ。

どちらにせよ、動的スケジューリングの性能に期待するしかないのである。

ではなぜスクリプト言語は重要なのか。

増井俊之が提唱した、富豪的プログラミングにその答えはある。

富豪的プログラミングとは、簡単に言えばメモリとCPUの処理速度は無限と仮定して最もプログラマーにとって自然で明快なプログラミングをするのが最も効率的な方法である。という思想だ。

これが提唱されたのは90年代で、当時の増井俊之が所属していたソニーCSLは次々と富豪的なアーキテクチャを生み出した。VR空間の記述言語であるVRMLなどである。この当時、増井俊之が最も推していた言語がECMAscriptであり、この当時は誰もそこまで深刻にこれを捉えていなかった。

現在、ECMAscriptはあらゆるコンピューターで動くほとんど唯一の共通言語になった。
今この瞬間も、あなたの目の前で動いてるはずである。

あらゆるWebサービスはECMAscriptで動いているからだ。日本ではJavaScriptと呼ばれている。
もともと、JavaScriptはLISPベースの言語で、LISPがそもそもマシン語とは対極の概念から作られた。

Fortran系の言語、すなわちCやJavaは、主にCPUの都合を人間に優しくするべく作られた。どこまで行ってもマシン語の匂いがするのはそのためだ。

LISPはそれとは全く逆に、人間の理性が計算をどのように捉えるか、捉えたいか、を前提として作られたM式からうまれ、もともとはプログラミング言語でさえなかった。

LISPは数学的定義から生まれているため直感的理解が難しく、使う人を選んだ。一方、計算順序通りにプログラミングできるFortranとその派生系は直感的理解が容易で普及した。

ところがLISPには様々な優れた特徴があり、LISPの長所をFortran系言語にも取り入れようとした様々な試みがRubyやJavaScriptというかたちになった。

極めて興味深いのは、WebAssemblyは中身が単なるLISPと同じS式を使うところだ。
 
マシン語使いにとってはガベージコレクションのあるVM言語はオムツを履いて歩き回る赤ん坊のようなものだ。
でも、人類社会がオムツをした状態に最適化されるのであれば、それがオムツでもパンツでも変わらない。

そうかんがえると、ガベージコレクションなんていうものは、プログラマーの頭の弱さをカバーするABSのようなものだ。でもそもそもプログラミング言語やソフトウェア工学は、頭が悪い人でもきちんとプログラミングできるように進化してきた。だからそうした技術はフールプルーフ(バカ保護)と呼ばれる。そして頭がいい人は、メモリ管理などのつまらない悩みから解放されてさらに高みをめざせるように進化してきたのだ。だとしたら、高級言語を使うことの何がいけないのだろう。

それは遥かに書きやすく、齟齬が少なく、なにより手っ取り早く記述できるよう工夫されているのだ。

そして実際、世界全体は高級言語に最適化されるように動いているのだ。

ニューラルネットによって人間はおそらく考えるという行為や、頭がいいとか悪いとかの差別から解放される。自動車が足が速いとか遅いとかの差別をなくしたように、頭の善し悪しにさほどの意味はなくなるだろう。

したがって、コンパイル言語に傾倒することも、ゼッパチのマシン語が書けることを自慢することも、全く意味をなさない世界に既に突入してることをまず知るべきである。

そのうえで、想像力の翼を広げ、どうすればより人類が面白おかしく生きられるのか、その世界の実現に向けて自分は何に時間を使うべきかを考えるべきだ。

スクリプト言語を舐めてはいけない。むしろそれは人類の持つ、一番大きな翼なのだ。

常在戦場
274
ハッカー / サークル「shi3zのメディアラボ」→ https://note.com/sh3syuran/circle

こちらでもピックアップされています

#エンジニア 系記事まとめ
#エンジニア 系記事まとめ
  • 789本

noteに投稿されたエンジニア系の記事のまとめ。コーディングTIPSよりは、考察や意見などを中心に。