SlideShare a Scribd company logo
1 of 27
Download to read offline
UNIX V6 インタプリタ



     七誌
自己紹介
• 典型的な社内ニート(たまにVBA程度)
• プログラミングはほとんど趣味
 – 良いネタができたら独立・・・と考えて早10年
 – 自然言語処理がやりたかったけど、さっぱり
• みんなで自作のおもちゃコンパイラを作って、
  自作のおもちゃOSを作って遊びたい!
• コンパイラを作るにはバイナリの知識が必要
• そのため準備としてPE勉強会を主催
自作コンパイラ
• 4年くらい掛けて独自言語コンパイラのセルフ
  ホスティングに到達
 – セルフホスティングする前はC#で書いた
• ある程度できてから、独自言語でコンパイラ
  を書き直そうとして挫折
• 2年くらい放置した後、C#から独自言語にトラ
  ンスレートすれば良いと気付いた
• こういう遊びを広めたい!
最初の失敗
独自言語
              C#
コンパイラ
のソース        コンパイラ
 (C#)

            独自言語
 サンプル
            コンパイラ   EXE
(独自言語)
             のEXE


コンパイラ書き直し   • あれもこれも!
  (独自言語)
            • セカンドシステム症候群
トランスレート
                         タイムスタンプ以外
独自言語コンパイラ        C#        完全一致!
 のソース(C#)      コンパイラ
                          独自言語
                          コンパイラ
                           のEXE
C#から独自言語への
  トランスレータ

               独自言語       独自言語
独自言語コンパイラ      コンパイラ      コンパイラ
のソース(独自言語)      のEXE       のEXE

             セルフホスティング
OS遊び
• 2年ほどFreeBSDをメインにしていたけど、巨
  大過ぎて内部には手が付けられなかった
• MINIXがシンプルで良いと思ったので、PEか
  らa.outに変換するツールを作って、VC++で
  吐いたEXEを変換して動かしてみた
 – カーネルもVC++でビルドできるようにはなったけ
   ど、アセンブリをACKからMASMに書き換える際
   に間違えたらしく、うまく動かなかった
 – カーネルハックには到達できず挫折
UNIX V6
• 1975年頃の古いUNIX
 – コンパイラ+カーネルのセットとしてはMINIXより
   も遥かにコンパクトで手頃だと思った
• 解説書のLions本は持っていたけど、どこから
  読めば良いのかよく分からず放置
• そんなとき読書会が始まった!
 – PDP-11のアセンブリが読めなくて脱落寸前
• 慣れるため、simh(エミュレータ)でV6を動か
  して、ハローワールドを書いて遊んだりした
V6のファイルシステム
• ハローワールドをディスクイメージから取り出
  して、バイナリを分析したい
• TCP/IP実装前でネットワークはない
• 仕方ないのでカーネルのソースを見ながら
  ディスクイメージを分析して、ファイルを取り出
  すツールを作った
• VFS以前の時代で、lsがディレクトリエントリを
  ユーザー側で読んでいるのが衝撃的
V6FS
• F#で作った自作のファイル抜き出しツール
• 最初はWindows FormsのGUIアプリ
• GUIアプリって気軽に試しにくいよね
 – ダウンロード→展開→実行
 – ClickOnceではインストールされてしまう
 – Windows以外ではmonoで動くけど、monoはな
   かなか普及しない
• とりあえずブラウザで動かすためSilverlight
F#
• とにかく構文が簡潔
 – セミコロンやブロックのブレースが不要
• REPL標準装備
• クラスを作らずにコードをベタ書きできる
 – C#だと必ずクラスで囲まなければいけない
   class Test { static void Main() { … } }
• モジュールをopenすれば接頭辞が不要
 – C#だとstaticメソッド呼び出しにクラス名が必要
 – VB.NETでもできるけど
Silverlight
• Webページに貼り付けるプラグイン
• MS版Flashというかアプレットみたいなもの
 – 実は.NET 1.0の頃からアプレットは作れた
 – 誰も使わない、MSも推奨しない
• GUI以外のコードが流用できるので、.NETア
  プリをWebに貼り付けるのが手軽
• サーバー側に処理を組み込まなくても、ロー
  カルに閉じた擬似ファイル送受信が可能
 – ディスクイメージ→ファイル抜き出しに使用
ツールを作ったけど
• いちいちファイルを取り出すのが面倒
• V6の外でコンパイラが動けば済むのでは?
 – バイナリ分析が目的なので、必ずしも実行できな
   くても構わない
• gccはpdp11-aoutターゲットをサポート
 – V6のコードはK&R以前の古いC言語でgcc非互
   換、アセンブラもgasとは非互換
• V6のcc/asがどうしても必要!
移植戦略
•   ccを今のC言語で書き直すのは、頑張れば
    できると思った
•   しかしasはフルアセンブラ
•   さてどうしよう・・・?

1. アセンブリを解読しながら高級言語に翻訳
2. 文法を真似て互換アセンブラを開発
3. インタプリタを作って動かす ← 採用
PDP-11インタプリタ
• 初めに逆アセンブラを作成
• 当初はGUIアプリとSilverlightを並行開発
 – すぐに面倒になりSilverlightに一本化
• 逆汗の分岐をコピペして実行に書き換え
 – PDP-11はアドレッシングモードが豊富で、初めは
   理解が曖昧だったので苦労した
 – 動いた解釈が正しいというのが判断基準
 – ひたすらログを目視でトレース
• 開発言語はVB.NET(ぇ
VB.NET
• ごめんなさい、ぬるい人間にF#はきつい!
• 言語ではなくIDEのサポート不足が問題
 – 補完が微妙とかは許容範囲内
 – 「すべての参照の検索」 ができないのは致命的
• C#の好きじゃない点もVB.NETならクリア
 – セミコロンを打たなくて良い
 – モジュールの接頭辞を省略できる
 – VB10なら次の行への継続も自動判断
   • VB9までこれができないのでC#を使っていた
コマンドライン版
• Silverlight版インタプリタでcc/asが動いた
• カーネルをビルドしていじるには、結局ローカ
  ルのコマンドラインじゃないと不自由
• 当初はVB.NETのコードでコマンドライン版を
  作ろうと思っていたけど、Lions本読書会の参
  加者に.NET愛好者はいない!
• 仕方ないので読書会前日にC++で作り直し
• V6カーネルのビルドができるのを確認
C++
• POSIX前提にInterix上で開発
 – NetBSD, FreeBSD, Mac OS Xで動作確認
• C++0xとかboostはなし
 – 依存ライブラリなしに、OSデフォルトのコンパイラ
   でサクっとビルドできるようにしたい
 – FreeBSDはGPL3避けのためgcc-4.2系で更新
   を停止している(clang待ち)
• STLを使った10年くらい前のスタイルで開発
 – STLすら使えない環境は・・・ごめんなさい
Interix
• MSが買収して公式になったPOSIXサブシステム
• Interix上のV6インタプリタでカーネルをビルドすると
  simhの5倍くらい遅い
• VMware上のNetBSDではsimhとほぼ同じ速度
• InterixのオーバーヘッドはCygwinほどではないと
  思っていたけど、これは酷い
 – Vista以降はUltimate/Enterprise縛りがあって人に薦めら
   れないので、個人的にはMSYSに移行する予定
• 仕方ないのでWin32ネイティブに移植すると、simh
  とほぼ同じスピードが出た
システムコール
• cc/asを動かすのに必要なものだけ実装
 – 標準出力/ファイル入出力/fork/exec
• 標準出力のシステムコールで出力した文字を
  テキストボックスに表示するだけ
 – トレースでV6のprintf()がデフォルトでバッファリン
   グせずに一文字ずつ出力しているのがわかる
• Silverlight上でのファイルはRAMディスク
 – 実態は単なるフルパスのハッシュテーブル
fork/exec (1)
• これが一番厄介だった
• Silverlight、POSIX、Win32それぞれ別実装
• POSIXではforkは実際にフォーク(プロセス
  のコピー)、execはVM内でのシミュレート
• SilverlightとWin32はネイティブプロセスには
  触れずに完全にVM内でのシミュレート
 – 原理的には実装を同じにできる
 – そうなっていないのは、Silverlightでの実装が稚
   拙で、Win32を実装したとき改良したため
fork/exec (2)
• V6のforkは子プロセスは   _fork:
                       mov    r5,-
                              r5,-(sp)
  コピー後そのまま実行し、         mov    sp,r5
  親プロセスは命令を1つ          sys    fork
                                    子
                    親         br 1f
  飛ばして続行                bec   2f
• Lions本読書会で教えて    1:
                        jmp   cerror

  もらった                  mov   r0,_par_uid
                        clr   r0
 – 教えてくれた方は、この仕    2:
   組みを解読するのにとて          mov   (sp)+,r5
                        rts   pc
   も苦労したとのこと
fork/exec (3)
• POSIXではホストのネイティブのforkを使って
  インタプリタのプロセスを実際にfork後、親プ
  ロセス側のVMのPCをいじって対応
     プロセス(親)
        VM
                  本物のfork
       sys fork             プロセス(子)
                              VM
       PC += 2
fork/exec (4)
                                プロセス
• Silverlightではcc/asに特          VM(親)
  化した小細工で実装
• 子はすぐexecして親はそ
                         sys fork   sys exec
  れをwaitするパターン
• execでVMのインスタンス                    VM(子)

  を作り、exit後にfork時点       PC += 2    sys exit

  にロールバックして続行            sys wait
• シングルスレッド実行のた
  めwaitは素通り
fork/exec (5)
                              プロセス
• Win32にはネイティブの        VM(親)
  forkはないため、VMのイ
  ンスタンスをコピーして擬
  似的にforkを再現           sys fork   VM(子)

• execはVMのメモリイメー                  sys exec
  ジを書き換えて再現
                       PC += 2    sys exit
• シングルスレッド実行の
  ため、Silverlightと同じよ   sys wait
  うにwaitは素通り
• Silverlightの改良モデル
オチ
• 読書会の参加者から既存のユーザーモード
  シミュレータが存在すると教えてもらった
 – apout
   http://puszcza.gnu.org.ua/software/apout/
• 存在を知っていたら、作らなかったと思う
• せっかく作ったので、ユーザーモードとカーネ
  ルモードの特定の遷移をモデル化して抽出す
  るなど、学習に特化した方向で発展させたい
最後に
• V6関係は手探りだったけど、状況がわかって
  かなり開けてきた感じ
• まごろくさんのV7の説明を聞いて、基本的な
  部分はほとんど同じだと感じた
 – 読書会でV6のバグじゃないかと指摘された部分
   がV7で直されていたりして面白い
 – BSD派なのでV6からBSDを追いたいかも
• コンパイラ・OS自作にフィードバックしたい
 – あれ、自然言語処理はいつになったら・・・
ご清聴ありがとうございました

More Related Content

What's hot

Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)
Kazuhide Maruyama
 
俺のZabbixがこんなに可愛いわけがない
俺のZabbixがこんなに可愛いわけがない俺のZabbixがこんなに可愛いわけがない
俺のZabbixがこんなに可愛いわけがない
Seiichiro Ishida
 
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
mametter
 

What's hot (20)

最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm
 
VimM#3
VimM#3VimM#3
VimM#3
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
Ansibleハンズオン勉強会
Ansibleハンズオン勉強会Ansibleハンズオン勉強会
Ansibleハンズオン勉強会
 
WordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSWordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPS
 
Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)
 
俺のZabbixがこんなに可愛いわけがない
俺のZabbixがこんなに可愛いわけがない俺のZabbixがこんなに可愛いわけがない
俺のZabbixがこんなに可愛いわけがない
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
 
Infrastructure as codeのススメ
Infrastructure as codeのススメInfrastructure as codeのススメ
Infrastructure as codeのススメ
 
webアプリケーションフレームワークの話
webアプリケーションフレームワークの話webアプリケーションフレームワークの話
webアプリケーションフレームワークの話
 
Real World PHP in pixiv
Real World PHP in pixivReal World PHP in pixiv
Real World PHP in pixiv
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話
 
Flowtype Introduction
Flowtype IntroductionFlowtype Introduction
Flowtype Introduction
 
Osoljp201204
Osoljp201204Osoljp201204
Osoljp201204
 
PhpStormで始める快適なWebアプリケーション開発 #phpcon2013
PhpStormで始める快適なWebアプリケーション開発 #phpcon2013PhpStormで始める快適なWebアプリケーション開発 #phpcon2013
PhpStormで始める快適なWebアプリケーション開発 #phpcon2013
 
OSC 2011 KeySnail
OSC 2011 KeySnailOSC 2011 KeySnail
OSC 2011 KeySnail
 
運用に効く!JVMオプション三選
運用に効く!JVMオプション三選運用に効く!JVMオプション三選
運用に効く!JVMオプション三選
 
エディタ戦争
エディタ戦争エディタ戦争
エディタ戦争
 
Closure Compiler Updates for ES6
Closure Compiler Updates for ES6Closure Compiler Updates for ES6
Closure Compiler Updates for ES6
 
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
 

Viewers also liked

Unixファイルシステムの歴史
Unixファイルシステムの歴史Unixファイルシステムの歴史
Unixファイルシステムの歴史
magoroku Yamamoto
 
PDP-11のインタプリタを作った話
PDP-11のインタプリタを作った話PDP-11のインタプリタを作った話
PDP-11のインタプリタを作った話
kanorimon
 
ファイルシステム
ファイルシステムファイルシステム
ファイルシステム
Yohei Tanaka
 
家計簿習慣化支援サービス ~エロい家計簿~
家計簿習慣化支援サービス ~エロい家計簿~家計簿習慣化支援サービス ~エロい家計簿~
家計簿習慣化支援サービス ~エロい家計簿~
Takuya Komatsu
 
仕様記述言語の中の関数
仕様記述言語の中の関数仕様記述言語の中の関数
仕様記述言語の中の関数
ardbeg1958
 
0423mitsubishi
0423mitsubishi0423mitsubishi
0423mitsubishi
loftwork
 

Viewers also liked (20)

Unixファイルシステムの歴史
Unixファイルシステムの歴史Unixファイルシステムの歴史
Unixファイルシステムの歴史
 
PDP-11のインタプリタを作った話
PDP-11のインタプリタを作った話PDP-11のインタプリタを作った話
PDP-11のインタプリタを作った話
 
V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
シンプル資産運用法
シンプル資産運用法シンプル資産運用法
シンプル資産運用法
 
貯金エクササイズ
貯金エクササイズ貯金エクササイズ
貯金エクササイズ
 
ファイルシステム
ファイルシステムファイルシステム
ファイルシステム
 
Deb2009
Deb2009Deb2009
Deb2009
 
20140607 限界はどこにある?
20140607 限界はどこにある?20140607 限界はどこにある?
20140607 限界はどこにある?
 
2015年10月度スパイス・パークのアップデート計画
2015年10月度スパイス・パークのアップデート計画2015年10月度スパイス・パークのアップデート計画
2015年10月度スパイス・パークのアップデート計画
 
家計簿習慣化支援サービス ~エロい家計簿~
家計簿習慣化支援サービス ~エロい家計簿~家計簿習慣化支援サービス ~エロい家計簿~
家計簿習慣化支援サービス ~エロい家計簿~
 
物欲家計簿プレゼン
物欲家計簿プレゼン物欲家計簿プレゼン
物欲家計簿プレゼン
 
仕様記述言語の中の関数
仕様記述言語の中の関数仕様記述言語の中の関数
仕様記述言語の中の関数
 
Hiib
HiibHiib
Hiib
 
お金持ちはなぜタワーマンションに住むの?そのリスクは?
お金持ちはなぜタワーマンションに住むの?そのリスクは?お金持ちはなぜタワーマンションに住むの?そのリスクは?
お金持ちはなぜタワーマンションに住むの?そのリスクは?
 
だいたいデジタルのライフログ
だいたいデジタルのライフログだいたいデジタルのライフログ
だいたいデジタルのライフログ
 
[20120410] @marqsの転職を祝うLT
[20120410] @marqsの転職を祝うLT[20120410] @marqsの転職を祝うLT
[20120410] @marqsの転職を祝うLT
 
0423mitsubishi
0423mitsubishi0423mitsubishi
0423mitsubishi
 
日本を捨てた富裕層たち
日本を捨てた富裕層たち日本を捨てた富裕層たち
日本を捨てた富裕層たち
 
婚活メソッド
婚活メソッド婚活メソッド
婚活メソッド
 
Language presentations at WOCS and after.
Language presentations at WOCS and after.Language presentations at WOCS and after.
Language presentations at WOCS and after.
 

Similar to V6 Interpreter (Nagoya Geek Bar 2011-05-02)

動画共有ツール
動画共有ツール動画共有ツール
動画共有ツール
tamtam180
 
うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?
Masahiro Sano
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
ishiki-takai
 
メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012
cfm_art
 

Similar to V6 Interpreter (Nagoya Geek Bar 2011-05-02) (20)

密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
動画共有ツール
動画共有ツール動画共有ツール
動画共有ツール
 
Emscriptenと不思議のダンジョン
Emscriptenと不思議のダンジョンEmscriptenと不思議のダンジョン
Emscriptenと不思議のダンジョン
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
 
初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
 
CLR/H第54回勉強会 ライトニングトーク
CLR/H第54回勉強会 ライトニングトークCLR/H第54回勉強会 ライトニングトーク
CLR/H第54回勉強会 ライトニングトーク
 
FOLIOのコードを動かしてみた
FOLIOのコードを動かしてみたFOLIOのコードを動かしてみた
FOLIOのコードを動かしてみた
 
Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介Aspnet mvc 6の今を紹介
Aspnet mvc 6の今を紹介
 
邪道Jenkins
邪道Jenkins邪道Jenkins
邪道Jenkins
 
うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?うわ…私のEmacs力、低すぎ...?
うわ…私のEmacs力、低すぎ...?
 
scheme処理系の実装
scheme処理系の実装scheme処理系の実装
scheme処理系の実装
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
 
WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3
 
composer-scriptsについて
composer-scriptsについてcomposer-scriptsについて
composer-scriptsについて
 
Unix architecture
Unix architectureUnix architecture
Unix architecture
 
メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012メガ Unity ユーザーミートアップ 2012
メガ Unity ユーザーミートアップ 2012
 

More from 7shi (11)

ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
F#とトランスレータ
F#とトランスレータF#とトランスレータ
F#とトランスレータ
 
F#談話室(3) LT
F#談話室(3) LTF#談話室(3) LT
F#談話室(3) LT
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
 
Cコンパイラの改造(未)
Cコンパイラの改造(未)Cコンパイラの改造(未)
Cコンパイラの改造(未)
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続
 
ZIP勉強会
ZIP勉強会ZIP勉強会
ZIP勉強会
 
Deflate
DeflateDeflate
Deflate
 
CRC-32
CRC-32CRC-32
CRC-32
 
無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発
 
LLPML
LLPMLLLPML
LLPML
 

Recently uploaded

Recently uploaded (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

V6 Interpreter (Nagoya Geek Bar 2011-05-02)

  • 2. 自己紹介 • 典型的な社内ニート(たまにVBA程度) • プログラミングはほとんど趣味 – 良いネタができたら独立・・・と考えて早10年 – 自然言語処理がやりたかったけど、さっぱり • みんなで自作のおもちゃコンパイラを作って、 自作のおもちゃOSを作って遊びたい! • コンパイラを作るにはバイナリの知識が必要 • そのため準備としてPE勉強会を主催
  • 3. 自作コンパイラ • 4年くらい掛けて独自言語コンパイラのセルフ ホスティングに到達 – セルフホスティングする前はC#で書いた • ある程度できてから、独自言語でコンパイラ を書き直そうとして挫折 • 2年くらい放置した後、C#から独自言語にトラ ンスレートすれば良いと気付いた • こういう遊びを広めたい!
  • 4. 最初の失敗 独自言語 C# コンパイラ のソース コンパイラ (C#) 独自言語 サンプル コンパイラ EXE (独自言語) のEXE コンパイラ書き直し • あれもこれも! (独自言語) • セカンドシステム症候群
  • 5. トランスレート タイムスタンプ以外 独自言語コンパイラ C# 完全一致! のソース(C#) コンパイラ 独自言語 コンパイラ のEXE C#から独自言語への トランスレータ 独自言語 独自言語 独自言語コンパイラ コンパイラ コンパイラ のソース(独自言語) のEXE のEXE セルフホスティング
  • 6. OS遊び • 2年ほどFreeBSDをメインにしていたけど、巨 大過ぎて内部には手が付けられなかった • MINIXがシンプルで良いと思ったので、PEか らa.outに変換するツールを作って、VC++で 吐いたEXEを変換して動かしてみた – カーネルもVC++でビルドできるようにはなったけ ど、アセンブリをACKからMASMに書き換える際 に間違えたらしく、うまく動かなかった – カーネルハックには到達できず挫折
  • 7. UNIX V6 • 1975年頃の古いUNIX – コンパイラ+カーネルのセットとしてはMINIXより も遥かにコンパクトで手頃だと思った • 解説書のLions本は持っていたけど、どこから 読めば良いのかよく分からず放置 • そんなとき読書会が始まった! – PDP-11のアセンブリが読めなくて脱落寸前 • 慣れるため、simh(エミュレータ)でV6を動か して、ハローワールドを書いて遊んだりした
  • 8. V6のファイルシステム • ハローワールドをディスクイメージから取り出 して、バイナリを分析したい • TCP/IP実装前でネットワークはない • 仕方ないのでカーネルのソースを見ながら ディスクイメージを分析して、ファイルを取り出 すツールを作った • VFS以前の時代で、lsがディレクトリエントリを ユーザー側で読んでいるのが衝撃的
  • 9. V6FS • F#で作った自作のファイル抜き出しツール • 最初はWindows FormsのGUIアプリ • GUIアプリって気軽に試しにくいよね – ダウンロード→展開→実行 – ClickOnceではインストールされてしまう – Windows以外ではmonoで動くけど、monoはな かなか普及しない • とりあえずブラウザで動かすためSilverlight
  • 10. F# • とにかく構文が簡潔 – セミコロンやブロックのブレースが不要 • REPL標準装備 • クラスを作らずにコードをベタ書きできる – C#だと必ずクラスで囲まなければいけない class Test { static void Main() { … } } • モジュールをopenすれば接頭辞が不要 – C#だとstaticメソッド呼び出しにクラス名が必要 – VB.NETでもできるけど
  • 11. Silverlight • Webページに貼り付けるプラグイン • MS版Flashというかアプレットみたいなもの – 実は.NET 1.0の頃からアプレットは作れた – 誰も使わない、MSも推奨しない • GUI以外のコードが流用できるので、.NETア プリをWebに貼り付けるのが手軽 • サーバー側に処理を組み込まなくても、ロー カルに閉じた擬似ファイル送受信が可能 – ディスクイメージ→ファイル抜き出しに使用
  • 12. ツールを作ったけど • いちいちファイルを取り出すのが面倒 • V6の外でコンパイラが動けば済むのでは? – バイナリ分析が目的なので、必ずしも実行できな くても構わない • gccはpdp11-aoutターゲットをサポート – V6のコードはK&R以前の古いC言語でgcc非互 換、アセンブラもgasとは非互換 • V6のcc/asがどうしても必要!
  • 13. 移植戦略 • ccを今のC言語で書き直すのは、頑張れば できると思った • しかしasはフルアセンブラ • さてどうしよう・・・? 1. アセンブリを解読しながら高級言語に翻訳 2. 文法を真似て互換アセンブラを開発 3. インタプリタを作って動かす ← 採用
  • 14. PDP-11インタプリタ • 初めに逆アセンブラを作成 • 当初はGUIアプリとSilverlightを並行開発 – すぐに面倒になりSilverlightに一本化 • 逆汗の分岐をコピペして実行に書き換え – PDP-11はアドレッシングモードが豊富で、初めは 理解が曖昧だったので苦労した – 動いた解釈が正しいというのが判断基準 – ひたすらログを目視でトレース • 開発言語はVB.NET(ぇ
  • 15. VB.NET • ごめんなさい、ぬるい人間にF#はきつい! • 言語ではなくIDEのサポート不足が問題 – 補完が微妙とかは許容範囲内 – 「すべての参照の検索」 ができないのは致命的 • C#の好きじゃない点もVB.NETならクリア – セミコロンを打たなくて良い – モジュールの接頭辞を省略できる – VB10なら次の行への継続も自動判断 • VB9までこれができないのでC#を使っていた
  • 16. コマンドライン版 • Silverlight版インタプリタでcc/asが動いた • カーネルをビルドしていじるには、結局ローカ ルのコマンドラインじゃないと不自由 • 当初はVB.NETのコードでコマンドライン版を 作ろうと思っていたけど、Lions本読書会の参 加者に.NET愛好者はいない! • 仕方ないので読書会前日にC++で作り直し • V6カーネルのビルドができるのを確認
  • 17. C++ • POSIX前提にInterix上で開発 – NetBSD, FreeBSD, Mac OS Xで動作確認 • C++0xとかboostはなし – 依存ライブラリなしに、OSデフォルトのコンパイラ でサクっとビルドできるようにしたい – FreeBSDはGPL3避けのためgcc-4.2系で更新 を停止している(clang待ち) • STLを使った10年くらい前のスタイルで開発 – STLすら使えない環境は・・・ごめんなさい
  • 18. Interix • MSが買収して公式になったPOSIXサブシステム • Interix上のV6インタプリタでカーネルをビルドすると simhの5倍くらい遅い • VMware上のNetBSDではsimhとほぼ同じ速度 • InterixのオーバーヘッドはCygwinほどではないと 思っていたけど、これは酷い – Vista以降はUltimate/Enterprise縛りがあって人に薦めら れないので、個人的にはMSYSに移行する予定 • 仕方ないのでWin32ネイティブに移植すると、simh とほぼ同じスピードが出た
  • 19. システムコール • cc/asを動かすのに必要なものだけ実装 – 標準出力/ファイル入出力/fork/exec • 標準出力のシステムコールで出力した文字を テキストボックスに表示するだけ – トレースでV6のprintf()がデフォルトでバッファリン グせずに一文字ずつ出力しているのがわかる • Silverlight上でのファイルはRAMディスク – 実態は単なるフルパスのハッシュテーブル
  • 20. fork/exec (1) • これが一番厄介だった • Silverlight、POSIX、Win32それぞれ別実装 • POSIXではforkは実際にフォーク(プロセス のコピー)、execはVM内でのシミュレート • SilverlightとWin32はネイティブプロセスには 触れずに完全にVM内でのシミュレート – 原理的には実装を同じにできる – そうなっていないのは、Silverlightでの実装が稚 拙で、Win32を実装したとき改良したため
  • 21. fork/exec (2) • V6のforkは子プロセスは _fork: mov r5,- r5,-(sp) コピー後そのまま実行し、 mov sp,r5 親プロセスは命令を1つ sys fork 子 親 br 1f 飛ばして続行 bec 2f • Lions本読書会で教えて 1: jmp cerror もらった mov r0,_par_uid clr r0 – 教えてくれた方は、この仕 2: 組みを解読するのにとて mov (sp)+,r5 rts pc も苦労したとのこと
  • 22. fork/exec (3) • POSIXではホストのネイティブのforkを使って インタプリタのプロセスを実際にfork後、親プ ロセス側のVMのPCをいじって対応 プロセス(親) VM 本物のfork sys fork プロセス(子) VM PC += 2
  • 23. fork/exec (4) プロセス • Silverlightではcc/asに特 VM(親) 化した小細工で実装 • 子はすぐexecして親はそ sys fork sys exec れをwaitするパターン • execでVMのインスタンス VM(子) を作り、exit後にfork時点 PC += 2 sys exit にロールバックして続行 sys wait • シングルスレッド実行のた めwaitは素通り
  • 24. fork/exec (5) プロセス • Win32にはネイティブの VM(親) forkはないため、VMのイ ンスタンスをコピーして擬 似的にforkを再現 sys fork VM(子) • execはVMのメモリイメー sys exec ジを書き換えて再現 PC += 2 sys exit • シングルスレッド実行の ため、Silverlightと同じよ sys wait うにwaitは素通り • Silverlightの改良モデル
  • 25. オチ • 読書会の参加者から既存のユーザーモード シミュレータが存在すると教えてもらった – apout http://puszcza.gnu.org.ua/software/apout/ • 存在を知っていたら、作らなかったと思う • せっかく作ったので、ユーザーモードとカーネ ルモードの特定の遷移をモデル化して抽出す るなど、学習に特化した方向で発展させたい
  • 26. 最後に • V6関係は手探りだったけど、状況がわかって かなり開けてきた感じ • まごろくさんのV7の説明を聞いて、基本的な 部分はほとんど同じだと感じた – 読書会でV6のバグじゃないかと指摘された部分 がV7で直されていたりして面白い – BSD派なのでV6からBSDを追いたいかも • コンパイラ・OS自作にフィードバックしたい – あれ、自然言語処理はいつになったら・・・