2007-09-12

そりゃLL使いでも低レベルを知っているに越したことはないに決まっている

えーと、最近の一連の話はほとんど読んでませんが、C もアセンブラもかじった程度にだけ経験はあるけど BINARY HACKS はほとんど分からなかった1 LL な人間として思うことは

絶対に知っとけとは言わないけど、知ってると勘は働くよ

ってことかなぁ。勘て書くと誤解を生みそうだけど。

C やマシン語をきちんとやらなきゃいけないって意味じゃーないんだけど、低レベルの動作がある程度想像できるようになっていると、例えばあまりに非効率な方法は実際に書いて動かしてみる前におかしいと気づきます。(なんつーか、これを詳細設計と呼ぶのかもしれない。知らんけど。)

例えば DB からデータを取得するときに、まるでテキストファイルを相手にするかのごとくシーケンシャルに一つずつ取ってくる2とか、テキストファイルからデータを取得する際に OS のバッファリングなどに丸投げせずに自分で妙な技を開発しちゃうとか、そういうのはフツーあり得ないわけですけど、何がどうあり得ないのかきちんとマシン語レベルで説明できなくても、そりゃ効率悪いに決まってるやんとかは気づくわけです。なんとなくですけど。3

同じように、アルゴリズムとデータ構造といった、いわゆるコンピュータサイエンスの基礎中の基礎に当たる部分もやっておくと、この場合にこんなデータ構造にするわけないじゃんとか、これは有名な○○のアルゴリズムをそのまま当てはめればいいし、それは標準関数のこれこれとかライブラリのどれそれですぐに実現できちゃうのに、なんでそんな力技を編み出そうとするの?とかいうのも、実際に書いて動かす前に気づけるわけです。4

そういう意味での基礎体力というか、そんな感じで役に立ちます。もちろんそういう効率の悪いコードを書いてしまっても、それをきちんと計測して遅いから別な方法を採用した方がいいなと判断できる力があるならそれでも構わないとは思うんですが、残念ながらそんな、いい意味でアンバランスな人5にはお目にかかったことがありませんし、書く前に気づけるならそれに越したことはないわけです。なまじっか動くものができちゃうとそれを壊したり直したりするのに抵抗が生まれたり6するでしょ? 動くものができる前なら遠慮なく破棄できますから。

LL や Java など VM 上で動く言語を使う人間としてはそんなの知ったことかと思いたいわけですよ。そんなのお前らがいい具合に勝手に解釈しろと。まぁそこまで乱暴なことは言わないまでも、「コンピュータなんだからそれくらい良きに計らってよ」に近いことをぼんやりとですが、考えていたりするわけです。よく考えると「開発者」とか「技術者」を名乗るにはあり得ない発想だったりしますけど7、まぁやっぱ基本的にプログラマは楽をしたいから苦労する人間なわけで、楽をしたいと思うこと自体は否定しちゃダメなのかなとも思います。

話がそれた。

とにかく、あんまりこと細かに具体的な話をするのは難しいんですが、知ってるに越したことはないよというのは間違いないです。そしてこれは特定の言語のクセとして慣れるのとは違うレベルでの力なので、言語を乗り換えても活きます。例えば「PHP のプログラムを高速化するための 10 の Tips」みたいなのってものすごく人気あるわけですけど、そういう知識は PHP を使わなくなったら役に立たなくなります。でも低レベルの知識は PHP だろうが Ruby だろうが役に立ちます。低レベルがガラッと変わっちゃうことはそうそうないですから。

ただまぁ、くり返しになりますが、優先順位はそんなに高くないと思います。

  • プロファイラがちゃんと使える
  • 論理演算というか集合がちゃんと分かる
  • テストをちゃんと書く
  • 黙ったまま作業しないでちゃんと commit する
  • 構成管理のツール(Trac とか)が入ってるならちゃんとそれを使う

とか、「上のレベル」で身につけなきゃいけないことが多いですし、少なくともここに挙げたものを満たさずにマシン語レベルの話が分かったからと言って大きな顔をするようなやつは廊下に立ってろですよ。8

最後にこれものすごく疑問なのですが、例えば Perl のリファレンスとか Lisp の car, cdr なんかを、メモリアドレスとか C のポインタとかを知らずにどうやって理解するんでしょうか? そこら辺がどーも私にはピンときません。Perl ハッカーで C もアセンブラもさっぱりですという方がいたらご一報ください。お友達になりましょう。

cf.

  1. というかネタとして買った 

  2. 単にロックの仕方をちゃんと知らなくても安心して使えるストレージに成り下がっちゃってる 

  3. 例えば一回 C でファイルの読み書きを全部書いてみりゃどれだけコストがでかいかは実感できます。少なくともまともに動く C のソースを書き上げるだけで面倒です。Ruby なら File.open( moge ) { |f| } で一発なのに、とか思いながら書くのでますますうっとぉしいです。 

  4. と、言いつつ自分はあんまりそういうのが役に立つようなことはしてないですし、どれだけの精度で自分に当てはまっているかについては自信はありません。ありませんけど、世の中にはそういうの全然分かってないのに自信満々な自称プロの方もいたりして、不思議だなーと思うことはあります。 

  5. 低レベルの知識ゼロなのにプロファイラ使いこなしてる人 

  6. 自分の心の抵抗じゃなくて外圧の場合もある 

  7. それを実現するのが己らの仕事じゃねーのかよ 

  8. くどいようだけど、これは低レベルの知識がなくても書ける LL を前提にした話ね。 

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm