山本ゆうごブログ

山本ゆうごの仕事メモ

依存モジュールとの戦いと戦わないという戦略

  • 90年代後半Perl全盛時代
    • PurePerl or XS という戦いがあった
    • ライブラリをc言語で書けば速いのはわかってる
    • ただしOSごとにビルド環境が必要
    • 当時はWindows向にPerlもあったし、JperlというSJISネイティブ対応のPerlもあった
    • c言語を使ったライブラリをxsと称して別枠にしていた
    • Perl言語のみで作るライブラリをPurePerlとしてより理想的なライブラリとして扱っていた
    • PerlのWebフレームワークのCatalystはモジュールの依存関係激しすぎてインストールが面倒なので有名
  • 2000年Java時代
    • 環境依存しないということでライブラリ含めてPureJavaで作るという思想
    • MSがOS依存のJavaを作ったときに断固として拒否した。MSをJava界から追放するまでの大戦争
    • とはいえGUIに関してはPureJavaは遅くて見た目もダサいので、IBMがEclipseを通じてちょっとだけ環境依存するようにした
    • それでもデータベースの接続はJDBCでPureJavaを貫いている
    • 環境に依存しないの最高峰がJava
  • 2000年PHP時代
    • PHPも外部モジュールはCで作られてる
    • ただしPHPの特徴としてレンタルサーバーで動かすことが多かった
    • 開発者がCのモジュールを意識することはほとんどなく、Apacheのconfで.soや.dllをロードするしないで外部ライブラリのon/offを決めていた
    • 使いそうなライブラリを予め、Linux、Windows、Macで別にインストールしていればよく、XAMPPなどの便利ツールもあった
    • 利用者かれらすればPHPだけのことを考えればよいのでいいことだらけ
    • 黒い画面を触らなくても、サクラエディタとFFMPEGがあればサービス開発ができた(TortiseSVNもGUIでバージョン管理できたし)
  • 2010年Go時代
    • Javaは所詮はJVMという仮想マシンの上で動いてる
    • 仮想マシンがあれば環境依存しないなんて意味がない
    • ということでGoはOS上で直で動くのに環境依存がない。理想中の理想
    • ただし環境依存のなさを優先しすぎてGUIが作れない
  • 2010年Ruby on Rails時代
    • Ruby on Railsは「Windowsを捨てる」ことで環境依存の問題をクリア
    • Nokogiriやmysql接続ライブラリなど、cのビルドは毎度走る
    • clangとGCCがあればいいという割り切り
    • MacとLinux間で相互に動けばいいという割り切り
    • bashやzshがいる前提での環境
    • Windowsで快適に動かすにはJRubyというJVMの実装もある(結局Javaが一番環境依存が少ない)
  • そんな中でずっと環境依存に無頓着なのがPython
    • 早く動けばcのライブラリはためらわず使う
      • csvを読むみたいなライブラリでさえもcで書かれてる
      • 結果的にcsv読むのがめちゃくちゃ速い
    • 行列計算はFORTRANを使ってる
      • 行列計算はCでも遅い。そこはFORTRANを使う方がいい
      • Pythonのライブラリビルドを観ていると、「gfortran」の文字が見えるはず
    • それでも環境依存をなくしたい人たちがあれこれジタバタしている
      • pyenvのようなものがいっぱいある
      • Anagndaで一気にPythonのモジュール管理を行ってるけど別のツールと交じると地獄
      • そもそもローカルで開発するのを諦めて、GoogleClabを使うしかないでしょうという一派もいる
    • そもそも環境依存で苦労するのって一部の人じゃない?
      • Linux、Mac、Windowsの3つのOSだけの話よね
      • 世界で誰かが3回苦労するだけでいいじゃない
      • 機械学習ともなるとGPUドライバを認識させるのも大変だよね
      • だったらGoogleClabでいいじゃない