「kernelvmの発表者に、プログラミングを学んでわずか半年にして、PDP-11エミュレーターを実装した強者がいる」
kernelvmに参加した南山まさかず君は筆者に言った。なんと、プログラミング初心者が半年でPDP-11エミュレーターを実装し得ただと? いったい我々は何をやっていたのだ。その強者と話がしてみたい。きっとまだプログラミングの基礎を覚える過程を記憶していて、プログラミングを学ぶ方法がわからない筆者として、興味深い話が聞けることであろうし、半年でPDP-11エミュレーターを実装できたのであれば、本物のプログラマーの素質を持っているであろうから。
聞けば、その強者は、七誌氏の主催する、池袋バイナリ勉強会なる勉強会で学んだという。一体どのような勉強会なのだろうか。ひとまず、その勉強会に参加してみよう。幸い、今週の土日に、初心者向けの講座が開かれる。
池袋バイナリ勉強会の会場は、東京都豊島区池袋 2-12-11 三共池袋ビルであった。Google Mapsで確認したところ、池袋駅からそれほど迷わずに行けるように思われた。当日、筆者は悠々と洗濯をし、弁当を作り、会場に向かった。
ところが、現地は思いの外に入り組んでおり、30分以上迷った末に、ようやく、数時間単位で部屋を貸す変わったホテルに囲まれた会場を発見した。
中に入ると、ちょうど、勉強のための環境を構築中であった。
なんと、七誌氏はこの勉強会のために、8086向けのUNIX v6とそのコンパイラー、インタプリターを用意したのだという。しかも、導入は以下のように、とても簡単だ。
$ hg clone https://bitbucket.org/7shi/i8086tools
$ cd i8086tools
$ make
$ sudo make install
筆者は事前に何も準備をしてこなかったので、まずMercurialをインストールした。
sudo apt-get install mercurial
そして、インストールしたものをパッケージ管理したかったので、checkinstallを使おうとしたが、なんと、今使っているラップトップには、checkinstallが入っていなかったので、それもいれた。そういえば、最近Ubuntuでパッケージ化されているClangも、なかなか使えるようになってきたので、もう独自ビルドしていないのであった。
実に、GNU/Linuxの有名なディストロは、筆者のような情弱にも優しいOSであると言える。筆者は遅刻をしたものの、即座に環境を構築することが出来た。
勉強会の参加者の多くは、不自由なWindowsや不自由なMacを使っていたが、極めて苦労していた。午前中は環境構築だけで潰れたようだ。
しかし、不自由なWindows上でこの環境構築をするというのは、極めて不思議な状況だ。まず、不自由なWindowsで、UNIXの極めて薄いレイヤーである自由なMinGWを動かし、その上に8086インタプリターやUNIX v6を動かすのであるから、レイヤーにレイヤーを重ねた環境である。なぜGNU/Linuxを使わないのか理解に苦しむ。
そして、この環境は、なかなか素晴らしい。思えば、今の環境は、バイナリの入門用には、複雑になりすぎた。PEフォーマットやELFフォーマットをパースするのは一苦労だし、x64は相当に複雑になった。この環境は、a.outフォーマットなので、16バイトのヘッダーとtextセクションとdataセクションだけという、実に単純な構成だ。
さて、ひと通り環境を理解した筆者は、8086の逆アセンブラを実装しようとした。それには、まずIntelの資料を理解しなければならない。さっそく資料の読解にとりかかった筆者であったが、8086のバイナリは、想像を絶するほどに汚かった。
筆者は、x86アセンブリはある程度経験している。そのため、8086のバイナリの理解は、それほど苦労しないであろうとたかをくくっていた。ところが、である。8086のバイナリは、想像をはるかに上回る汚さであった。
これまで、筆者は、x86は、アセンブラー、逆アセンブラーが提供する、親切なニーモニック経由でしか触れていなかった。MOVはMOVであって、それより先を考える必要はなかった。
ところが、である。Intelの資料による8086のビット列を参照すると、MOVはてんでばらばらな複数のビット列から成り立っていることがわかった。しかも、オペランドの組み合わせにより、ビット列は、お互いに何の規則性もないビット列にエンコードされるではないか。何と言うことだ。
しかも、そのビット列の構造たるや、極めて汚らしく、綺麗なコードで逆アセンブラを書くことが出来ない。そもそも、コードがなかなか書けない。
筆者はここ何年も、規格の文面の解釈に力を入れてきた。その間に書いたコードといえば、言語の文法を説明するための数行のコードぐらいなもので、なにか本格的な動くコードは、しばらく書いていなかった。これは極めてまずいことである。筆者の役割には、C++の教育も入っているはずであるのだが、肝心の教育者が、まともなコードを書けないのでは問題だ。コードを書かないCSの教授は間違っているとBjarne Stroustrupは言った。筆者もその考えには同意しながらも、規格ばかりにかまけていて、動くコードを書かずにいた。
ただ、8086の逆アセンブラを実装するのは、動くコードを書くいい機会であるように思う。
それにしても興味深いのは、七誌氏だ。彼はOSやコンパイラーに興味があり、教育のためのこのような環境を用意するだけのちからがありながら、バイナリエディターとはなんであるかとか、エンディアンとはなんであるかと言った、基礎的な知識の教育を行うのにも躊躇しない。基礎的な知識を教えるのに躊躇している筆者と比べて、なんと意欲的なことか。
そういえば、この勉強会には、女も来ていたという点でも、興味深かった。一体、プログラマーの不自然な男女比は、どうして生じるのであろうか。肉体的な違いのためであろうか。社会的な要因のためであろうか。筆者がこの話題を持ちかけると、相手は男女とも、社会的な要因であろうと断言する。果たしてそうであろうか。
例えば、生物の科学者には女が多いと聞く。生物と言っても広いが、中には研究のほとんどが、プログラミングであるという生物学者もいる。いまや、あらゆる分野で、プログラミングは必要である。何故、不自然な男女比が存在するのであろうか。
この勉強会には、ちょまど氏が来ていた。筆者は、てっきり氏はネカマであろうと勝手な推測をしていたが、実は女であったため、驚きのあまり、第一声が極めて失礼な物言いになってしまった。聞けば、SEをしているという。その仕事は・・・いや、何も言うまい。いまさら始まった話ではないのだ。
さて、二日間かけて、8086の複雑怪奇なMOV命令のバイナリを、ある程度理解した筆者は、さっそく逆アセンブラを書き始めたいのだが、あいにくと、2014-05-pre-Rapperswil mailingが出ている。明日からは、また論文読解とレビューの忙しい日々が待っている。
池袋バイナリ勉強会には、ちょくちょく顔を出そうと思う。
そういえば、この勉強会で、C++を深く学ぶ道を進もうか、統計解析の道に進もうかと迷っている学生に出会った。筆者は統計解析の事情はよくわからないのだが、統計解析でC++を使うことはあまり一般的ではないようなので、おそらくC++が使われにくい事情があるのであろう。そもそも、規模があまりにも大きいので、単一のプログラムをカリカリに最適化して数倍の性能を出すよりも、何百台、何千台もの大規模な分散型の実行環境で力任せにぶん回すほうが効率的な分野ではないのかとも思う。筆者は、所謂フルスタック(笑)は幻想であり、そろそろ、なにか一つのものに注力したほうがいいであろうと言っておいた。それがC++であれ、統計解析であれ。
ドワンゴ広告
この記事はドワンゴの勤務外に書かれた。
この前に書いた、ドワンゴはデータマイニングエンジニアの中途採用募集をしていないというのは誤りで、実は積極的に募集しているし、採用情報にも常に記載があるそうだ。
【ドワンゴ】データマイニングエンジニア/リーダー・メンバー(正社員) | 株式会社ドワンゴ
ドワンゴはその他の分野でも本物のエンジニアを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0
checkinstallもいいですが、完全にユーザー権限だけで管理可能なxstowもいいですよ。
ReplyDeleteその昔、プログラミングは女性の仕事でした。
ReplyDelete今は男性の多くが自由なコンピュータを触るので男性比が多いかと思います。
しかし、ツワモノもいたものですね。
一目その動いている姿を拝見したいが、地方民にはつらい話です。
肉体的(器質的;遺伝的)要因が大きいと私は思っていますけれどね。
ReplyDeleteある程度の解離的思考(俗に論理的思考と言われている)ができないと、プログラミングは難しいでしょう。
無論、職場の苛酷さは、現代日本で男のプログラマが多い要因でしょうが。
それは本質的には社会的要因であるが、
過剰労働が困難なのは肉体的要因と、また社会的要因である儒教による(女に無理をさせない)ものでしょう。
生物学者に女が少なくないのは、「男社会」から疎外されるという社会的要因もあれば、
統合的な思考と感覚が高いという器質的要因、
男は男性ホルモンの影響で他の動物に恐怖を与える臭いや声等を発しているという器質的要因もあるでしょう。
偶然の偏りにそれらしい理由を付けることは簡単だ
ReplyDelete統計解析ソフトの開発に携わったことがありますが、既存のC/C++にしろJavaにしろ、ランタイムライブラリだけでは浮動小数点計算が弱すぎるのですよ。
ReplyDeleteついでに、MS VC++に限った話だと、.NET Framework登場以降はCランタイムが.NET Frameworkのライブラリの流用?だったので、VC++6とVC++ 2005でコンパイルしたアプリの動作が違うとか結構あって苦労した記憶が。。。
nice blog.
ReplyDelete