fc2ブログ

Mosh学習日記5

 今日は久しぶりに朝Moshをしてみました。余りにも久しぶりだったので、次にどこを読もうか迷ってしまいました。本日は、眠気眼をこすりながら迷っている間に、数十分が経って殆ど収穫がありませんでした。
 それでも楽しく読みました。前にも読んだところですが、Moshはポートを重要視していて、テキストポートの初期化時にスキャナを初期化しています。そして、MoshはBisonで構文解析を行っています。やはり本格的なコンパイラを作ろうと思ったら、Bisonが要るようですね。そういえば、昔yacc/lexを触った事があるけど、随分長い間パーサジェネレーターを触っていないな・・・
 おっと、いかんいかん。睡魔に襲われてしまった。他は今まで読んだところの再確認になってしまいました。う~ん、頭が働かない。朝Moshをする日は、もっと早く起きて目を覚ましてからしなくてはならないですね・・・
 
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

Mosh学習日記4

 今日は久しぶりに朝Moshをしたので、その感想を書きます。
 今回気になったのはテストのやり方です。ソフトウェアはテストが大事です。積極的にリファクタリングが行われているプロジェクトでは、なくてはならない存在です。テストの構成を調べてみると、仮想マシンは単体テストに相当するもの。仮想マシン上で実現されている機能については、結合テストに相当するものでした。
 仮想マシンはC++でプログラミングされているので、当然テストコードはC++です。一方、ソケットなどの仮想マシン上で実現する機能については、Schemeでプログラミングされていました。その事から私は、単体テストと結合テストが上手く実施されていると感じました。テストの量は、チーム開発としては少ないものの、ハッカーの個人的プロジェクトではありです。どれだけの精度でテストを行うのかは、プロジェクトの性質と開発人数により異なります。
 次に私が興味を持ったのはポートです。Moshにおいて、ポートはかなり重要なオブジェクトです。ポートは複数の階層になっており、最終的にはヒープから取り出されています。ポートオブジェクトのインスタンスの生成方法に特徴があります。ポートのインスタンスは、Unicodeに対応する為に、直接オブジェクトを生成するのではなく、Objectのメソッドにより間接的に生成されています。Moshはデータと文字コードを分離しています。
 ヒープから取り出されるのは、ポートだけではないと思われます。ポートの他に、シンボル・各種データ・クロージャ・Callable(恐らく関数呼び出しに関する情報)のタイプが定義されています。ヒープの使い方が非常に興味深いので今後調べます。
 

テーマ : プログラミング
ジャンル : コンピュータ

Mosh学習日記3

 今日も2・3時間、夕Moshしました♪私が昨日気になったのは、match_imageです。matchというぐらいだから、関数型言語が得意とするマッチング処理で、FaslReaderが読みとっている事からSRFI が関係していると推測していました。しかし、match_imageがUTF-8のバイナリだったので、確証が持てませんでした。
 そこで、過去のMoshのソースコードを探って、match_imageについて調べてみました。その結果、やはりマッチ処理に関する事だという確証を得ました。どうやら、match_imageはマッチマクロの様です。これが正解か分かりませんが、大きくは外れていないでしょう。
 ついでに、Moshの過去のヴァージョンのソースコードをちょっと覗いてみました。すると、リファクタリングされている様子が伺えました。例えば、ヴァーチャルマシンに関する事は、当初VMだけでした。ヴァージョンが上がるごとに、ヘッダーファイルとソースコードが増えています。その分け方が綺麗で、リファクタリングをしっかりしている事が感じ取れます。
 ソースコードを読み始めて、改めて感じたのですが、ひげぽんさんは凄いです。R6RS準拠だし、SRFIにも対応しているご様子です。恥ずかしい事に、私なんかR5RSしか知りませんでした。ひげぽんさんは常に最先端を行っています。
 それからもうひとつ、関心した事があります。それは、親クラスでマクロを使って、Boehm GCの使用有無を抽象化している部分です。これは実にいいアイデアだと思います。マクロを使ったメタプログラミングは奥が深いです。
 これは、ソースコードとは違う話題ですが、SRFIから言語設計について考えさせられました。Schemeはコンパクトな言語設計を目指しています。それは、正しい事だと思います。しかしそれが原因で、SRFIが生まれてしまうとは皮肉です。とはいえ、C++もBoostがあるし、技術者の創造力はとどまる事を知らないという事かな?
 話しは飛びますが、MoshのVMがポートでやり取りをしているのを見て、Erlangを連想しました。ポートとストリームを使ったやり方は宣言的並列性の手法であり、分散処理と並列処理に向いています。もしかすると、MoshはErlangの要素を取り入れて、分散処理と並列処理に強くなるのかもしれない。ひげぽんさんは、こうした方面にも強いからその可能性は十分にあると思います。
 それにしても、Moshのソースコードは面白いです。また明日も朝Moshします。

テーマ : プログラミング
ジャンル : コンピュータ

Mosh学習日記2

 午前中で疲れた体を休め、今日は午後からMoshのソースコードを読んでいます。その過程で色々面白い事が分かりました。先ず、Moshの仮想マシンについてですが、レジスタ付きのスタックベース仮想マシンでした。備えているレジスタは、計算・ディスプレイクロージャ・カレントクロージャ・フレームポインタ・スタックポインタ・プログラムカウンタです。
 初期化時は、スタックサイズおよび、3個のポートを指定しています。仮想マシンを初期化した後は、コンパイラをロードしており拡張性を感じます。現在はSchemeコンパイラをロードしていますが、他の言語をロードする事が可能になるかもしれない。
 コンパイラロード時には、標準ライブラリと拡張仕様SRFIに準拠したバイナリストリームを、評価器内で使用するためにレジスタにセットしているようです。この部分で興味を引いたのがgetDirectThreadedCodeメソッド。
 getDirectThreadedCodeメソッドをざっくり読んだところ、どうやらコンパイル済みコードもしくは、コンパイル前のコードを一気に読みこんでいるようです。名前からして、他のスレッドから読んでいるのかもしれませんが、今のところはそこはまだ調べていません。このメソッドの重要な処理はrunLoopメソッドが行っています。ダイレクトスレッドが定義されていない場合も、指定されたオブジェクトをそのまま返して、runLoopメソッドが実行されています。
 runLoopメソッドは見所です。Schemeの中心部と言えるかもしれません。皆が大好きな?carが実行されていたりします。エラーが出た時は、callAssertionViolationAfterメソッドが処理をしています。この部分から分かったのですが、内部処理は○○Proceduresで定義されているようです。分かりやすくていい。こういう細かい部分で、ひげぽんさんが丁寧にプログラミングをしている事が分かります。
 ただ、一つ気になった事があります。それは、コメントアウトされたコードがある事です。Moshのソースコードは、確かGITで管理している筈です。ですから、コメントアウトして置いておく必要はないと思います。でも、ひげぽんさんがしているのだから、何か深い事情があるのかもしれない。もしかしたら、ソースコードをコミットしてた後要らないコードを削除するとか?いや、もしかしたらデバッグ中のコードかもしれない・・・色々想像してしまいます。今度聞いてみよう。
 では、またソースコードの海へ帰ります♪

テーマ : プログラミング
ジャンル : コンピュータ

Mosh学習日記1

 今日は残念ながら、仕事が忙しくて殆どMoshに触れませんでした。CMakeが難しい・・・何故か上手くいかない。仕方がないので、Windows上のビルドをひとまず置いといて、Moshのソースコードを読みました。いざとなったらDebianでビルドすればいいや。それに、ソースコードが読めれば、問題ナッシング。
 Moshコンパイラ(正確に言うとインタプリタ)なので字句解析をする為に、どこでスキャナが動作している筈。そこで、本日はスキャナを探す事にしました。スキャナと言えばTextであり、Moshはポートでやり取りをしているので、スキャナが使われている場所が直ぐに検討が付きました。調べてみると、やはりTextualInputPortクラスのコンストラクタで初期化されていました。
 スキャナは、ストリームとして設計されており、fill・emptyBuffer・scan・currentTokenの計4つのメソッドが定義されていました。なるほど、ポートでやり取りをするのであれば、ストリームで扱うのが王道。美しい連携プレイです。
 ここで、時間切れになりました。朝Moshは時間が短い。かといって、最近仕事が忙しくて、夜はもうくたくたです。う~ん、悩ましい。もっとMoshをハックしたいな。

テーマ : プログラミング
ジャンル : コンピュータ

Mosh学習日記

 以前から興味があったので、今日からMoshのソースコードを読みます。コンパイラに興味がある人や、Moshに興味がある人の参考になれば幸いです。誤解がないように、初めに断っておきますが、この日記はあくまでも私の感想を書いたものなので、正確なものではありません。
 MoshとはScheme言語の処理系の一つで、作者はひげぽんさんです。R6RS準拠で、FFIやソケットなどを拡張しているのが特徴です。公式ホームページはhttp://code.google.com/p/mosh-scheme/です。興味がある人はチェックして下さい。前置きはこれぐらいにして、日記を始めます。
 本日は、朝マックならぬ朝Moshをしました。ダウンロードして直ぐに展開し、迷わずソースコードをチェックしました。普通はドキュメントを読むべきなのでしょうが、ときめきを抑えきれずソースへ直行です!
 色々読みたいところがあるのですが、初めてなのでヘッダファイルとmainを眺める事にしました。ヘッダファイルは、綺麗に整理されており、中々読みやすそうです。Arithmetic.hとArithmeticProcedures.hのように綺麗に分割されており、後で調べたい時に便利だと感じました。他にも、Unicodeのサポートの充実ぶりや、InputとOutput関係のヘッダが多い事などが目を引きました。後でじっくり調べよう。
 ヘッダファイルをざっと読んだ後は、お決まりコースのmainメソッドを読んでみました。コンパイラは複雑なので、正直言って「いきなり読んで大丈夫か?」と不安だったのですが、Moshは綺麗に整頓されていました。色々せずに、指定されたコンパイラオプションのチェックおよび、仮想マシンのセットアップ処理をしていました。
 main.cppをざっくり見て分かったのですが、どうやらMoshの仮想マシンはポートでやり取りをする様です。UNIX思想を感じます。この考えは、Moshを強力な梃子にするでしょう。ただし、標準ポートを共有するとバッファの問題が起きるので、標準ポートは共有していないそうです。
 mainメソッドをざっくりと読んだ後は、なんとなくWindows上でビルドをしてみる事にしました。MoshはCMakeでビルドをします。マルチプラットフォームは大変ですね。リリースマネージメントをしておられるmjtさんの大変さが伺えます。CMakeはまだ使った事がないので、色々なホームページを見ながらやってみました。えいや!うごけー!うぉぉ~・・・!?・・・おや?失敗したぞ。
 エラーメッセージを読んで分かったのですが、Moshは鬼車とGMPを使用しているようです。おお!想像通りMoshは本格的だ。やはり、初めからドキュメント読むべきでした。鬼車をコンパイルして、GMPを・・・う~ん、難しい。GMPをソースからコンパイルするのが難しいです。仕方がないので色々調べたところ、WindowsではMPIRがよいそうです。。。。あれ?MPIRもビルドするのが難しいぞ。どうなっているんだ?
 ここで、9時前になったので朝Mosh終了しました。MPIRをWindowsへインストールするいい方法はないものか。今夜調べよう。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター