ntaoo blog

主にDart, Flutter, AngularDartについて書いていきます。ときどき長文。日本語のみ。Twitter: @ntaoo

視聴メモ : Why JavaScript Programmers Hate You: an ode to dynamic languages, Jan Vitek 

www.youtube.com

2013年のプレゼン。ここでのYouは、このプレゼンの聴衆である言語研究コミュニティを指している。以下視聴メモ。

Why JavaScript Programmers Hate You: an ode to dynamic languages, Jan Vitek

  • 型は生産性を上げるいう伝統的な信念がある。静的型付けは、より良いものだと。目標は正しさ。
  • その伝統的信念に反して、実世界では、動的型付け言語がデザインされ続けてきた。VB, Python, R, Lua, Java (= static + dynamic), JavaScript, PHP, Ruby, Clojure
  • Adobe Lightroomは、大半のコードがLuaで書かれている。簡単に書けるし組み合わせることができるから。スウェーデンで500万人の顧客が利用するペンションの管理システムは32万行のPerlで書かれている。正しさに関しては、彼らは独自のcontract systemを発明した。
  • 実世界で使われている言語は動的型付け言語ということが、統計で示されている。

JavaScriptプログラマーがあなたを嫌うのは、だれも使わない言語を設計するからだ。

  • コンピューティングを必要とする人々の中で、あなたたちはほんの一握りのニッチな集団に過ぎない。あなたの駆使するML, Haskell, Scala, C++は、プログラミングの専門家が大規模なシステムを開発するための、ドメイン特化言語だ。大多数の人々は、それらを使っていない。
  • そのようなDSLおよびその厳格な規律を、他の人々(たとえば、生物学者統計学者など)に押しつけてはいけない。人々にとって、プログラミング言語は、計算論的思考のための導入剤であるべきだ。
  • 静的型付けのベネフィットとコスト。静的型付けは、実行前にエラーを抑止でき、効率的なコードを生成でき、機械的に検査可能なドキュメントとなる。
  • なぜ静的型付けが悪いアイデア?静的型付けは、自明なエラーを潰すことに関してだけは役立つ。しかし、実世界での、Smalltalkという反例がある。静的型付けがなくとも、デバッガーによる高速なイテレーションで自明なエラーを簡単に潰せるので、静的型付けが提供するベネフィットは不要とされる。
  • 静的型付けがより多くのエラーをキャッチできるようになるために、型システムはますます複雑になっていく。それはコンピューター科学者以外のユーザーにとって、大きな参入障壁になってしまう。
  • 静的型付けは、そもそも本質的にモジュール間にまたがったグローバルなシステム。局地的な変更の実験をしたいだけなのに、システム全体で型チェッカーを満足させなければ実行できない。それはコードを硬化させて融通をきかなくさせ、進化の邪魔をして減速させてしまう。
  • 静的型付けが動的型付けと比べて生産性を上げるというデータは乏しい。ある研究では、仮説に反して、両者の生産性に差は見られなかった。
  • 動的型付け言語は手軽に初めることができる。動的型付け言語は静的型付けを強制しないので、プログラミングを初める敷居がとても低い。未完成のコードを実行できる。それが間違ったコードであれ、プログラミングを初めることができる。ほとんどのPHPプログラマーは、言語のマニュアルを一度も読んだことがない。

JavaScriptプログラマーがあなたを嫌うのは、あなたが実世界を無視しているからだ。

  • プログラミング言語のデザインは、実世界での使われ方からの実証に基づくべきだ。
  • JavaScriptのSunspiderベンチマークが想定するコードと、実世界でのコードの傾向はかなり異なる。
  • リフレクションは静的解析を破壊するが、JavaScriptでは常用される。トップ100サイトの82%でevalが使われている。

JavaScriptプログラマーがあなたを嫌うのは、あなたが見当違いの問題を解いているからだ。

  • Java向けのエイリアス解析について言及した13000もの論文PDFがあるが、結局はどのようなJVMにも導入されていない。実世界の、リフレクションかネイティブコードという要素を無視しているからだ。Ownership Types, Information Flow......
  • プログラマーの生産性を第一に考えよう。大事な問題は、どうすればプログラマーが問題解決にかける時間を減らし、正しいコードを生み出せるかだ。
  • 動的言語に異論は多い。動的言語は、プログラムをできる限り実行し続ける。未完成のプログラムを実行し、データタイプを自動変換し、エラーを飲み込む。JavaScriptではエラーはできるだけ遅延される。JavaScriptで実行されるWebサイトは、一部のコードが壊れても、UIの一部が動かなくなるだろうが、サイト自体は動き続ける。もしこれがJava製ならば、サイトがクラッシュするだろう。
  • やりかたが分かるから定理を証明するのではなく、やる必要がある定理を証明しよう。
  • 漸進的型付け、たとえば動的型付け言語であるThron言語では、型注釈を書くことによってプログラムを遅くすることはないし、よくテストされた実行中のプログラムを破壊しない。PHPClojureでの型システムと同じ原理。
  • Rは、もっとも広く使われているlazy functionalな言語。(その事実はだれも知らないだろうが)

結論としては、実際にプログラミング言語の技術は必要とされているが、ユーザーのベネフィットに沿うように、我々の価値体系を変化させる必要がある。言語研究は、実世界での使用方法に基づき、動機づけられなければならない。ダイナミズムを受け入れなさい。そして、静的な解析技術を(JavaScriptPHPなどの)ランタイムに適用しよう。そうして彼らを手助けすれば、我々は彼らに大きな影響を与えることができる。


2013年のプレゼン。JavaScriptの人気については、参入障壁が低い動的言語であることは正解としても、単にWebでのランタイムの選択肢がそれしかないという不幸な環境要因であることが一番大きいだろう。最近はTypeScriptやDartがようやく盛り上がってきているけど。

仮に新たなWebのようなプラットフォームをデザインするとしたら、その言語のデザインについては、やはりシンプルでクリーンな動的型付け言語にして、その上であくまでオプションとしてユースケースに応じての型システム等のツールを提供できるようにして大規模開発にも適用可能なものにするのが良さそうだ。