コンパイラ、インタプリタなどの処理系に関係する本を購入
気になった本を3冊購入しました。全部処理系に関連した有名な洋書です。読み終わったら書評でも書いていきたいと思います。
Optimizing Compilers for Modern Architectures: A Dependence-based Approach
- 作者: Randy Allen,Ken Kennedy
- 出版社/メーカー: Morgan Kaufmann
- 発売日: 2001/10/22
- メディア: ハードカバー
- クリック: 2回
- この商品を含むブログ (2件) を見る
Advanced Compiler Design and Implementation
- 作者: Steven Muchnick
- 出版社/メーカー: Morgan Kaufmann
- 発売日: 1997/08/15
- メディア: ハードカバー
- クリック: 3回
- この商品を含むブログ (7件) を見る
Modern Compiler Implementation in C
- 作者: Andrew W. Appel,Maia Ginsburg
- 出版社/メーカー: Cambridge University Press
- 発売日: 2004/07/08
- メディア: ペーパーバック
- 購入: 2人 クリック: 10回
- この商品を含むブログ (5件) を見る
コンピュータ・ハードウェアの演算に関するCPUとレジスタ周りについて
コンピュータサイエンスの基礎となるCPUとレジスタ周りについて調べました。結構忘れやすいので備忘録がわりに残しておくことにしました。ほとんど本を読んでまとめただけな個人的なメモです。
CPUとレジスタ
汎用レジスタ(general-purpose)
条件フラグ(condition flag)
- 比較命令の結果を確認する1ビット長のレジスタで、ゼロフラグ、zf,sfなどがある。
命令ポインタ(instruction pointer)
- CPUが次に実行すべき命令の格納場所を指す32ビット長のレジスタeipで、プログラムカウンタ(program counter)とも呼ばれる。CPUは、eipの指す位置から命令を一つ取り出すと同時に、その直後の命令の位置を指すようにeipを更新しておく。その後取り出した命令を実行する。
コード生成関連
コード生成にあたって基本となる事項ををまとめる。処理系について勉強したい人は理解していたほうがいいです。
メモリについて
メモリはメモリ領域(memory area)という連続した領域に分けて利用される。以下の図のように、OS領域、コード領域、大域領域、ヒープ、スタックに分類される。
OS領域 | コード領域 | 大域領域 | ヒープ | スタック |
OS領域:
OS専用の領域。ここのコンピュータごとにその大きさが一定。
コード領域:
プログラムのコードを格納するための領域。プログラムごとにきまっており、プログラム実行中は変化しない。
レジスタ
呼び出した関数がどのレジスタを使用中であるかは、呼び出された関数にはわからない。そのためコンパイラ設計時には、汎用レジスタを2種類に分けておく方法がとられる。
呼び出し後保存レジスタ(callee-saved register)
呼び出す側が使用中かもしれないレジスタ。呼び出される関数がこれらのレジスタを使用したい場合は、本体の実行前に値を保存しておき、実行後にもとに戻さなければならない
呼び出し前保存レジスタ(caller-saved register)
呼び出される関数は、これらのレジスタの値を保存することなく、自由に使用して良い。ただし、呼び出された関数がこれらのレジスタを使用中にさらに別の関数を呼び出すときは、あらかじめ値を保存しておかなければならない。
関数本体の実行時に、どの呼び出し後保存レジスタを使用するかは、本体のコードを生成してみないとわからない。そこで本体のコード生成時には呼び出し後保存レジスタの値を退避するための場所を、割り当てると良い。汎用レジスタの個数は限られているし、使用できる数も数個から数十個ときわめて少ない。pentiumプロセッサの場合は、esp,ebpを除くと6個しかない。そのため、汎用レジスタすべてについて「使用中」、「空き」を記憶するテーブルを用意し、レジスタを割り当てるときに、そのテーブルを検索して空きレジスタをさがすの方法が単純で効果的となる。汎用レジスタの個数はきわめて少ないので、これらを有効的に利用することはコード生成の基本となる。レジスタを有効に利用して、できるだけ一時変数への退避をさけるようなコードを生成することが、算術式のコード生成で最も重要な課題である。
sphinxでドキュメントを管理する
日本だけの風習かもしれませんが、開発の現場では仕様書をエクセルで作るのが慣わしのようになっています。セルをグリッドのように器用に使って作成している現場がおおいです。ただ、文書を書くということについてですと、非常に書くにくく、印刷したら端っこが切れて読めないとか、画面に見えているレイアウトと印刷したレイアウトがずれることは日常茶飯事です。私は基本的にmacな環境で仕事をしているので、このエクセルのドキュメントを見るのが苦痛にです。また開発中にわざわざエクセルを開いて無駄にメモリと時間を消費するのが馬鹿らしくなります。エクセルを立ち上げるのも面倒ですが、複数のファイルに分かれて書かれたものなんて中身の検索もままならず、どこに記述してあるのかすらわからない状態です。検索できないドキュメントほど使いにくいものはありません。また、納品のドキュメントもPDFで納品するとなると、わざわざ使いにくいエクセルでドキュメントを作成する必要もないと思います。開発の現場ではwikiのようなHTMLで確認でき、さらに好きなときに追記ができる、そして最後にはPDFで出力できるものが一番使いやすく有効なドキュメントです。
設計書のドキュメントについて
「社内監査」がなどドキュメントの体裁をうるさく言うところもあるようですが、本当に開発で必要なドキュメントはその時現場でできたドキュメントです。それはメモであったり、ホワイトボードに書いた内容であったり。この活きた情報をそのまま残すことが大切に感じています。設計書に書き直すと結論だけが簡潔に書かれるため、メモがきみたいな落書きが消されてしまいます。なにかあったときは、その結論いたるまでの課程が重要なので、あとで読み返すとなぜこの処理をしているのか理解出来ないことが多いです。
日本では内部監査がどうとか、ISOがどうのとよく耳にする話ですが、これらを取得したからしっかりした体制が出来ていると勘違いしている会社が多い。まわりからみているとこれらの認証を取得した結果、逆に今まで以上に無駄が増え、さらに品質まで落ちている会社が多いように思います。もう一度見直すべきでは??日本を代表するトヨタ自動車がISOを取得していません。
話は変わりますが、microsoftが昔ほど元気がありません。windows中心で今までやってきた企業は、万が一、windowsがこの世から消えてしまうと大変な事になってしまいますよ。今の状況からすると可能性がないとも言い切れないと思います。
そのようなきっかけから、sphinxというドキュメント作成ツールを使ってみたいと思うようになりました。見た目も綺麗だし、機能もさり気無く豊富なので、このツールを使ってドキュメント作成を進めていきたいと思います。
プロジェクトの作成
sphinx-quickstart
必要なのはプロジェクト名、バージョン番号、著者の名前
mongoDBのインストール
ファイルを取ってきて解凍したらすぐ使えるのでインストールは楽勝です。
新しくmongoDBのフォルダを作って作業しました。
ソースファイルの取得
mkdir mongoDB macbook% cd mongoDB macbook% curl -O http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-1.6.5.tgz tar -zxvf mongodb-osx-x86_64-1.6.5.tgz
データフォルダの設定
mv mongodb-osx-x86_64-1.6.5 ~/Library/mongodb mkdir ~/Library/mongodb/data
これでインストール作業は終わりです。
実際に動いているか以下のコマンドで確認できます。
cd ~/Library/mongodb/bin ./mongod --dbpath=/Users/XXXXXX/Library/mongodb/data &
node.jsのインストール
今回はnode.js、ライブラリパッケージ管理のnpm、データベースとしてmongoDBを試しにインストールしてみたいと思います。mongoDBについてはまだ使ったことはないのですが、これを機に時間をみつけて触っていきたいと思います。
node.jsのインストール
Mac OS X 環境でのインストールです。
PATHの設定
sudo を使わなくてすむようにインストール先を ~/local にしました。
~/local/binへパスを通すために設定ファイルへの追記が必要です。
私はzshを使用しているので、.zshenvに以下の設定を追加します。
export PATH=$PATH:~/local/bin
以下のコマンドでパスが通っているか確認します。
echo $PATH
ソースからコンパイルしてインストール
git clone https://github.com/ry/node.gitcd node ./configure --prefix=~/local make make install
npmのインストール
$HOME/.npmrcを設定して一般ユーザーの権限で入れるのがベストらしい
npmをインストールする
wget https://download.github.com/isaacs-npm-v0.2.14-6-14-g0cec5bf.tar.gz cat >>~/.npmrc <<NPMRC root = $HOME/.node_libraries binroot = $HOME/bin manroot = $HOME/share/man NPMRC tar -zxvf isaacs-npm-v0.2.14-6-14-g0cec5bf.tar.gz cd isaacs-npm-v0.2.14-6-14-g0cec5bf make install
mongooseとexpressをインストール
expressと今回はmongoDBを使ってみたかったので、
npmを利用してmongooseとexpressをインストールします。
mongooseはnode.js用ORM/ODMでexpressはnode.js用のフレームワークです。
npm install mongoose npm install express
node.jsの環境構築まとめ
javascriptでサーバーサイドプログラムができる話題のnode.jsがどんなものなのか調べてみました。
- node.js
- node.js本体です。
- npm
- ライブラリのパッケージ管理に使用します。
- nvm
- node.jsの複数のバージョンを切り替えて使う際に必要
テンプレートエンジン
node.jsで使えるデータベース
- MYSQL(RDB)
- MongoDB(NOSQL) http://www.mongodb.org/
- couchd(NOSQL) https://github.com/felixge/node-couchdb
- bdirty(ネイティブ型)