Programming camp code reading

Hiro Yoshioka
Hiro YoshiokaVisiting Professor at Advanced Institute of Industrial Technology em Advanced Institute of Industrial Technology
セキュリティ&プログラミング
    キャンプ2010

  ソースコードの読み方

   よしおかひろたか
     2010年8月13日
講師紹介
●   よしおかひろたか、Debug Hacks著者、カーネ
    ル読書会主宰、YLUG(横浜Linux Users
    Group)、勉強会勉強会
●   未来のいつか/hyoshioの日記
    http://d.hatena.ne.jp/hyoshiok
●   ユメのチカラ
    http://blog.miraclelinux.com/yume/
●   hyoshiok@gmail.com
●   http://twitter.com/hyoshiok
                                         2
お題
●   ソースコードの読み方




                 3
プログラマに必要な3つの
    スキル
●   ソースコードを読むチカラ
●   デバッグするチカラ
●   テストをするチカラ




                   4
3つのスキルをどう身につ
    けるか
●   学校では教えてくれない
●   教科書を読む?
●   実際のプロジェクトで経験する?
    ●   オープンソースのプロジェクトに参加?
●   師匠に弟子入り?
    ●   そこでプログラミングキャンプだ


                             5
ソースコードの読み方
●   ソースコードって何?
●   人間がプログラミング言語などを用い
    て記述したもの。
    ●   そのままではコンピュータは実行できないので
        、通常、コンパイラと呼ばれるソフトウェアで
        直接実行できる形式に変換して実行されるか、
        インタプリタと呼ばれるソフトウェアで字面を
        解釈し実行される。

                            6
トラブルシューティングと
    ソースコードの読み方
●   トラブルシューティングと問題の理解
●   実践的なコードの理解




                        7
ソースコードを読むチカラ
●   プログラマの基礎体力
    ●   ソフトウェア開発コストの大部分は保守
    ●   不具合修正、改良、機能追加にはコードの理解
        が必須
●   技術者の付加価値
    ●   OSSは深追いできる
    ●   陳腐化しにくい
●   プロフェッショナルとしての研鑚
    ●   すぐれた技術者はソースコードを上手に読む
                               8
コードの読み方
●   なぜ、コードを読むのか
●   どのように、読むのか




                  9
なぜコードを読むのか?
●   仕事だから(目的中心)
    ●   トラブルシューティング(不具合修正)
    ●   機能修正、機能開発
    ●   自己研鑚、勉強
●   趣味だから(興味中心)
    ●   楽しいから
    ●   自己啓発(知的好奇心)
●   不純な動機
                             10
    ●   形から入る
なぜコードを読むのか
●   目的中心の場合
    ●   対象に対する基礎知識は必要
    ●   アーキテクチャ
        OS、プログラミング言語、RDBMS、…
    ●   定番の教科書で知識を得る




                               11
なぜコードを読むのか
●   興味中心の場合
    ●   人それぞれ、人生いろいろ
    ●   無目的でもいいじゃないか
    ●   熟読、濫読、積読、黙読、音読、再読、誤読、
        精読、速読、耽読、通読、復読、輪読、朗読、
        輪読、…




                            12
コードの理解について
●   モットー:
    コードは読むな、
    理解しろ〜


               13
どのようにコードを理解す
    るのか
●   個人的な方法を紹介する
    ●   唯一あるいはベストな方法というわけでもない
    ●   適材適所、もっと良い方法があると思う
    ●   公開することによって進化したい(もっと良い
        方法への模索)




                             14
ソースコードを読む視点


       微視的理解 巨視的理解

静的理解

動的理解

                     15
理解の仕方、読み方
●   静的、動的理解
●   微視的、巨視的
●   規模の把握
●   ツールの利用
●   事例


                16
静的理解、動的理解
●   静的理解
    ●   字面での理解
●   動的理解
    ●   動作による理解




                  17
静的、動的構造
●   静的構造(デモ)
    ●   規模
    ●   ディレクトリ構造
    ●   名前つけ規約
●   動的構造
    ●   呼び出し経路
    ●   プロファイリング
    ●   実行結果
                   18
微視的、巨視的
●   微視的:細部からの理解
    ●   最終的にはコードの一行
●   巨視的:全体からの理解
    ●   規模、構造、機能など。実行結果(性能?)
    ●   俯瞰図、鳥瞰図。




                               19
規模の把握(巨視的理解)
●   規模重要
    ●   規模(相手)を知らずして作戦を立てられない
    ●   大局的な地図、俯瞰図、鳥瞰図
    ●   大規模になればなるほど、システマティックな
        方法論が必要になってくる
    ●   巨視的な理解




                            20
規模の把握
●   小規模:100K行未満程度、
    ファイル数100未満
    10人未満
●   中規模:100K行〜1M行程度
    ファイル数100〜1000未満
    100人未満
●   大規模:1M行以上
    ファイル数1000以上
    100人以上
    ざっくりの規模感
                      21
規模の把握(例)
●   find -type f -name "*.[ch]"|wc
●   find -type f -name "*.[ch]"|xargs wc|grep total




      Ruby 1.8.5                  257 197767
      Linux 2.6.18              16522  680万
      MySQL 5.0.24a              1795 988463

                                                      22
ディレクトリ構造
●   トップディレクトリは、ソフトウェア
    の論理的構造を表している
    ●   doc ドキュメント
    ●   lib ライブラリ関係
    ●   test テスト
●   ソースツリーの把握


                      23
ドキュメント
●   README, INSTALL, COPYING, …
●   内部ドキュメント(Docs)
●   リリースノート
●   ChangeLog




                                  24
変更の履歴
●   ChangeLog/Release Notes
●   コード管理システム
    ●   例:Linux git/Subversion/CVS
●   Mailing List
●   Wiki
●   blog
●   変更(時間軸)の微視的理解
                                     25
ドキュメント、情報収集
●   マニュアルを読む
●   サーチエンジン(Google)に聞く
●   Mailing List
●   Bug database
●   開発者との会話(シンポジウムなど)
●   勉強会

                     26
ソースコードを読む視点


       微視的理解 巨視的理解
                             ディ ト 構造、
                               レク リ  名前付け規約
静的理解   ソ
       ノ
        ースコ 、
        ート
           ード ChangeLog、 リ
                        リ ース 、規模の把握(
                             など)
                                    行数、 ァ ル数
                                       フ イ




動的理解   デバッガによる実行         実行性能、 グレッ ンテスト
                              リ   ショ




                                               27
いよいよコードを読む?
●   ツール
    ●   エディタ:emacs
    ●   デバッガ:gdb
    ●   クロスレファレンス:cscope
    ●   カーネルの場合、クラッシュダンプ(crash)




                                  28
デモ、実習
●   例題としてrubyを読むことにする。
    ●


●   GNU Hello
    ●   http://savannah.gnu.org/projects/hello




                                                 29
実習
●   ソースコードの規模を理解する
●   ディレクトリ構造を理解する
●   ビルドする
●   ソースコードのナビゲート
●   機能変更をする


                     30
実習
●   ディレクトリ構造を理解する
●   ファイル名を眺める
●   ファイル数を調べる
●   プログラムの行数を調べる




                    31
実習
●ソースコードの入手
    $ git-clone git:// (講師に聞いてください)
●   ビルドの準備
    READMEをよく読む
●   必要なツールを揃える
    -   automake <http://www.gnu.org/software/automake/>
    -   autoconf <http://www.gnu.org/software/autoconf/>
    -   bison <http://www.gnu.org/software/bison/>
    -   gettext <http://www.gnu.org/software/gettext/>
    -   git <http://git.or.cz/>
    -   gperf <http://www.gnu.org/software/gperf/>
    -   gzip <http://www.gnu.org/software/gzip/>
    -   perl <http://www.cpan.org/>
    -   rsync <http://samba.anu.edu.au/rsync/>
    -   tar <http://www.gnu.org/software/tar/>
                                                           32
実習
●   ビルド
    $   time git clone ssh:// (講師から情報を得る)
    $   cd ruby
    $   time autoconf
    $   time ./configure
    $   time make
    $   time make test




                                            33
●   $ git checkout -b trunk
    origin/trunk
●   $ autoconf
●   ./configure
●   make -j4 miniruby


                              34
動的理解
●   ビルド




           35
動的理解
●   ともかく動かす
    ●   make
    ●   strace
    ●   ltrace
    ●   gdb
    ●   oprofile
    ●   リグレッションテスト
    ●   ベンチマークテスト
                     36
make
●   とりあえず、make
●   実行環境の構築
    ●   gcc -g (デバッグシンボルを付加する)
        通常はMakefileのCFLAGSなどに設定
    ●   cscopeのインデックスを作成
    ●   ビルドはemacsのshellなどから行い、ビルド
        のログを取得しておくと便利


                                  37
strace
 ●   システムコールのトレース
$ strace ruby -v
execve("/usr/local/bin/ruby", ["ruby", "-v"], [/* 39 vars */]) = 0
uname({sys="Linux", node="asianux2.miraclelinux.com", ...}) = 0
brk(0)                       = 0x976a000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or dir
open("/etc/ld.so.cache", O_RDONLY)          =3
fstat64(3, {st_mode=S_IFREG|0644, st_size=89946, ...}) = 0
old_mmap(NULL, 89946, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7
close(3)                     =0
open("/lib/libdl.so.2", O_RDONLY)         =3

                                                                 38
gdb
●   デバッガはコードを理解するためにあ
    る
    ∴コードを読むために使う
●   http://savannah.gnu.org/projects/gdb




                                    39
gdbで読むための準備
●   gcc -g でコンパイル
●   コンパイルしたコードサイズが大きく
    なる以外、特に副作用はない
●   printfデバッグは有害無益




                    40
gdb
●   ブレークポイントを設定
●   ウオッチポイント(変数の変更)
●   run
●   止まった時点で
    ●   bt スタックフレームの表示
    ●   p 変数の表示
    ●   c 実行再開、s ステップ実行(関数に潜る)、
        n ステップ実行(関数に潜らない)
                              41
●   繰り返す
oprofile
●   プロファイラー
    ●   実行時のボトルネックを発見
    ●   # opcontrol --start
    ●   テストの実行
    ●   # opcontrol --stop
    ●   # opreport -l
●   http://oprofile.sourceforge.net/news/

                                     42
oprofile
CPU: Core Solo / Duo, speed 2666.77 MHz (estimated)
Counted DCACHE_PEND_MISS events (Weighted cycles of L1 miss outstanding)
   with
a unit mask of 0x00 (Weighted cycles) count 100000
    vma     samples %      linenr info          app name symbol name
000000000042be50 244787 33.2383 gc.c:1661                ruby
   os_each_obj
 000000000042bfac 1       4.1e-04 gc.c:1599
 000000000042bfb9 5        0.0020 gc.c:1599
 000000000042bfbe 6       0.0025 gc.c:1599
 000000000042bfd0 4862      1.9862 gc.c:1601
 000000000042bfd3 228573 93.3763 gc.c:1601
 000000000042bfd6 2698      1.1022 gc.c:1601
                                                                       43
 000000000042bfd8 250       0.1021 ruby.h:672
oprofile
●   高速道路で、ズバリ最もコストのか
    かっているところに連れて行ってくれ
    る
●   コードを読まないで、理解する極意




                    44
微視的理解
●   ひたすらコードを読む
●   王道はない
●   ↑身もふたもない
●   データ構造、変数などに注目し、どこ
    で定義され、参照され、代入(変更)
    されているかという観点でみる
●   デバッガとエディタ、クロスリファレ
    ンスツールを駆使        45
微視的理解
●   $ time find -type f -name  '*.
    [ch]' -or -name '*.cpp'  -or
    -name '*.cxx' | xargs  egrep -l
    hogehoge
●   $ time grep -r 
    –include='*.[ch]' hogehoge .
●   hogehogeを含むファイルを検索
                                   46
微視的理解
●   クロスリファレンスツール
    ●   変数の定義(型情報)、変更(代入)、参照
●   変数(関数)が、どのように定義されていて、ど
    のように参照、変更されているかを追う
●   cscope
    http://cscope.sourceforge.net/
●   lxr
    http://lxr.linux.no/
●   GNU GLOBAL
    http://www.gnu.org/software/global/
●   ack-grep                              47
実習
●   cscopeを利用する
    $ time cscope-indexer -r
●   emacsを利用する
●   gdbを利用する
●   oprofileを利用する



                               48
ソースコードを読む視点


       微視的理解 巨視的理解
                              ディ ト 構造、
                                レク リ  名前付け規約
静的理解   ソースコ 、
       ノ 、
            ード ChangeLog、 リ
        ート cscope
                         リ ース 、規模の把握(
                              など)
                                     行数、 ァ ル数
                                        フ イ




動的理解   デバッ (gdb)による実行、
          ガ
                           oprofile、
                      strace ッションテスト
                                    strace、実行性能、 グレ
                                                リ




                                                      49
参考書
●   Linux
    ●   詳解LINUXカーネル第三版
        ISBN:487311313X
    ●   Linuxカーネル2.6解読室
        ISBN:4797338261
●   コードリーディング
    ●   ISBN:4839912653
●   Rubyソースコード完全解説
    ●   ISBN:4844317210(品切れ中)
        http://i.loveruby.net/ja/rhg/   50
ユメのチカラ(ブログ)
●   http://blog.miraclelinux.com/yume/
●   ブックマークで見た人気エントリー
●   ソースコードの読み方(524個)
    ●   http://blog.miraclelinux.com/yume/2007/08/post_d6bd.ht
        ml

●   デバッグ方法論(99個)
    ●   http://blog.miraclelinux.com/yume/2007/08/post_d3eb.ht
        ml

●   多くの人に興味がある話題                                             51
●   ブログ:ユメのチカラ
●   http://blog.miraclelinux.com/yume/
●   未来のいつか/hyoshiokの日記
●   http://d.hatena.ne.jp/hyoshiok/




                                         52
1 de 52

Recomendados

How to read linux kernel por
How to read linux kernelHow to read linux kernel
How to read linux kernelNaoya Ito
7.4K visualizações45 slides
Programming camp 2008, Codereading por
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
303 visualizações46 slides
20131128 perl beginners_11_profiler por
20131128 perl beginners_11_profiler20131128 perl beginners_11_profiler
20131128 perl beginners_11_profilerSyun Fuji
1.1K visualizações13 slides
ハッキングチャレンジ!8946攻略!第0回 por
ハッキングチャレンジ!8946攻略!第0回ハッキングチャレンジ!8946攻略!第0回
ハッキングチャレンジ!8946攻略!第0回ゆがぽ
603 visualizações6 slides
Rustを勉強してみた! por
Rustを勉強してみた!Rustを勉強してみた!
Rustを勉強してみた!ssmylh
635 visualizações24 slides
Pythonで書くじゃんね! por
Pythonで書くじゃんね!Pythonで書くじゃんね!
Pythonで書くじゃんね!Kiminori Kato
194 visualizações17 slides

Mais conteúdo relacionado

Mais procurados

ret2libcとpopretで初等的BOF攻撃 por
ret2libcとpopretで初等的BOF攻撃ret2libcとpopretで初等的BOF攻撃
ret2libcとpopretで初等的BOF攻撃monochrojazz
3.6K visualizações14 slides
Our docsys-pyfes-2012-11 por
Our docsys-pyfes-2012-11Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11Keiichiro Shikano
9.4K visualizações32 slides
リーダブルコード por
リーダブルコードリーダブルコード
リーダブルコードKeita Otsuka
9.3K visualizações65 slides
Javakuche yono por
Javakuche yonoJavakuche yono
Javakuche yonoyono05
458 visualizações17 slides
ほんとはこわくない Gentoo Linux por
ほんとはこわくない Gentoo Linuxほんとはこわくない Gentoo Linux
ほんとはこわくない Gentoo Linuxgion_XY
6.9K visualizações19 slides
俺のGentooがこんなに可愛いわけがない por
俺のGentooがこんなに可愛いわけがない俺のGentooがこんなに可愛いわけがない
俺のGentooがこんなに可愛いわけがないTakuto Matsuu
4.9K visualizações21 slides

Mais procurados(19)

ret2libcとpopretで初等的BOF攻撃 por monochrojazz
ret2libcとpopretで初等的BOF攻撃ret2libcとpopretで初等的BOF攻撃
ret2libcとpopretで初等的BOF攻撃
monochrojazz3.6K visualizações
Our docsys-pyfes-2012-11 por Keiichiro Shikano
Our docsys-pyfes-2012-11Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11
Keiichiro Shikano9.4K visualizações
リーダブルコード por Keita Otsuka
リーダブルコードリーダブルコード
リーダブルコード
Keita Otsuka9.3K visualizações
Javakuche yono por yono05
Javakuche yonoJavakuche yono
Javakuche yono
yono05458 visualizações
ほんとはこわくない Gentoo Linux por gion_XY
ほんとはこわくない Gentoo Linuxほんとはこわくない Gentoo Linux
ほんとはこわくない Gentoo Linux
gion_XY6.9K visualizações
俺のGentooがこんなに可愛いわけがない por Takuto Matsuu
俺のGentooがこんなに可愛いわけがない俺のGentooがこんなに可愛いわけがない
俺のGentooがこんなに可愛いわけがない
Takuto Matsuu4.9K visualizações
シェルスクリプトを極める por bsdhack
シェルスクリプトを極めるシェルスクリプトを極める
シェルスクリプトを極める
bsdhack8.1K visualizações
Oscの沼にはまった por mattenn
Oscの沼にはまったOscの沼にはまった
Oscの沼にはまった
mattenn513 visualizações
Psql起動画面(修正版) por Toshi Harada
Psql起動画面(修正版)Psql起動画面(修正版)
Psql起動画面(修正版)
Toshi Harada1.2K visualizações
Mishimasyk6 iwatobipen por Takayuki Serizawa
Mishimasyk6 iwatobipenMishimasyk6 iwatobipen
Mishimasyk6 iwatobipen
Takayuki Serizawa942 visualizações
Mishimasyk 3 20140705 por Takayuki Serizawa
Mishimasyk 3 20140705Mishimasyk 3 20140705
Mishimasyk 3 20140705
Takayuki Serizawa920 visualizações
Casual Compression on MongoDB por moai kids
Casual Compression on MongoDBCasual Compression on MongoDB
Casual Compression on MongoDB
moai kids11K visualizações
Rdkitの紹介 por Takayuki Serizawa
Rdkitの紹介Rdkitの紹介
Rdkitの紹介
Takayuki Serizawa4.3K visualizações
Cpu idle expedition por cota2n
Cpu idle expeditionCpu idle expedition
Cpu idle expedition
cota2n767 visualizações
Javaメモリ勉強会 por Tetsuya Yoshida
Javaメモリ勉強会Javaメモリ勉強会
Javaメモリ勉強会
Tetsuya Yoshida4.3K visualizações
勉強会 - 2 por KenjiYamasaki5
勉強会 - 2勉強会 - 2
勉強会 - 2
KenjiYamasaki513 visualizações
エンジニアのための痔の話 por Kouhei Maeda
エンジニアのための痔の話エンジニアのための痔の話
エンジニアのための痔の話
Kouhei Maeda1.4K visualizações
今最もアツイdistribution Gentoo Linuxについて por Takuto Matsuu
今最もアツイdistribution Gentoo Linuxについて今最もアツイdistribution Gentoo Linuxについて
今最もアツイdistribution Gentoo Linuxについて
Takuto Matsuu11K visualizações

Destaque

Xp祭り2013 por
Xp祭り2013Xp祭り2013
Xp祭り2013Yoshihiro Furukawa
1.4K visualizações61 slides
Linux syllabus por
Linux syllabusLinux syllabus
Linux syllabusLinux Training Chennai
463 visualizações1 slide
自宅サーバーを立てる話 por
自宅サーバーを立てる話自宅サーバーを立てる話
自宅サーバーを立てる話naba0123
1.6K visualizações17 slides
JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~ por
JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~
JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~Neppo Telewisteria
921 visualizações22 slides
Vi(m)を教えた話 por
Vi(m)を教えた話Vi(m)を教えた話
Vi(m)を教えた話gu4
1.7K visualizações36 slides
実践リーダブルコードの概要 por
実践リーダブルコードの概要実践リーダブルコードの概要
実践リーダブルコードの概要Kouhei Sutou
1.1K visualizações41 slides

Destaque(20)

自宅サーバーを立てる話 por naba0123
自宅サーバーを立てる話自宅サーバーを立てる話
自宅サーバーを立てる話
naba01231.6K visualizações
JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~ por Neppo Telewisteria
JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~
JA7YCQプログラミング勉強会 第1回 ~プログラミングやってみようか~
Neppo Telewisteria921 visualizações
Vi(m)を教えた話 por gu4
Vi(m)を教えた話Vi(m)を教えた話
Vi(m)を教えた話
gu41.7K visualizações
実践リーダブルコードの概要 por Kouhei Sutou
実践リーダブルコードの概要実践リーダブルコードの概要
実践リーダブルコードの概要
Kouhei Sutou1.1K visualizações
Writing Readable Code por eddiehaber
Writing Readable CodeWriting Readable Code
Writing Readable Code
eddiehaber1.7K visualizações
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう por Kouhei Sutou
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
Kouhei Sutou1.6K visualizações
The art of readable code (ch1~ch4) por Ki Sung Bae
The art of readable code (ch1~ch4)The art of readable code (ch1~ch4)
The art of readable code (ch1~ch4)
Ki Sung Bae17.3K visualizações
リーダブルコード勉強会 in 筑波大のまとめ por Kouhei Sutou
リーダブルコード勉強会 in 筑波大のまとめリーダブルコード勉強会 in 筑波大のまとめ
リーダブルコード勉強会 in 筑波大のまとめ
Kouhei Sutou1.1K visualizações
実践リーダブルコードのコードチェンジ por Kouhei Sutou
実践リーダブルコードのコードチェンジ実践リーダブルコードのコードチェンジ
実践リーダブルコードのコードチェンジ
Kouhei Sutou508 visualizações
リーダブルコードが良書だったのでまとめました por Takumi Sato
リーダブルコードが良書だったのでまとめましたリーダブルコードが良書だったのでまとめました
リーダブルコードが良書だったのでまとめました
Takumi Sato1.9K visualizações
コーディングがラクになる!? “自分仕様”のさくさくコーディング法 por Rico Sengan
コーディングがラクになる!? “自分仕様”のさくさくコーディング法コーディングがラクになる!? “自分仕様”のさくさくコーディング法
コーディングがラクになる!? “自分仕様”のさくさくコーディング法
Rico Sengan15.4K visualizações
The Art Of Readable Code por Baidu, Inc.
The Art Of Readable CodeThe Art Of Readable Code
The Art Of Readable Code
Baidu, Inc.22K visualizações
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale por Jérôme Petazzoni
Introduction to Docker (and a bit more) at LSPE meetup SunnyvaleIntroduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Jérôme Petazzoni4.4K visualizações
Apache ArrowのRubyバインディングをGObject Introspectionで por Kouhei Sutou
Apache ArrowのRubyバインディングをGObject IntrospectionでApache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject Introspectionで
Kouhei Sutou1.7K visualizações
イマドキC++erのモテカワリソース管理術 por Kohsuke Yuasa
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
Kohsuke Yuasa10.6K visualizações
コーディング入門以前 por Yutaka Kinjyo
コーディング入門以前コーディング入門以前
コーディング入門以前
Yutaka Kinjyo13.6K visualizações
Javaコーディング勉強会 por inatus
Javaコーディング勉強会Javaコーディング勉強会
Javaコーディング勉強会
inatus6.6K visualizações

Similar a Programming camp code reading

Code Reading at Security and Programming camp 2011 por
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Hiro Yoshioka
1.1K visualizações52 slides
Sourcecode Reading Workshop2010 por
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Hiro Yoshioka
1.1K visualizações52 slides
第2回勉強会スライド por
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
4K visualizações80 slides
Node.jsでブラウザメッセンジャー por
Node.jsでブラウザメッセンジャーNode.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャーYahoo!デベロッパーネットワーク
4.2K visualizações63 slides
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば por
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
4.3K visualizações47 slides
20130228 Goノススメ(BPStudy #66) por
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)Yoshifumi Yamaguchi
11.6K visualizações58 slides

Similar a Programming camp code reading(20)

Code Reading at Security and Programming camp 2011 por Hiro Yoshioka
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
Hiro Yoshioka1.1K visualizações
Sourcecode Reading Workshop2010 por Hiro Yoshioka
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
Hiro Yoshioka1.1K visualizações
第2回勉強会スライド por koturn 0;
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
koturn 0;4K visualizações
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば por Hirotaka Kawata
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata4.3K visualizações
20130228 Goノススメ(BPStudy #66) por Yoshifumi Yamaguchi
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
Yoshifumi Yamaguchi11.6K visualizações
20130316 プログラミング言語Go por Yoshifumi Yamaguchi
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語Go
Yoshifumi Yamaguchi7.5K visualizações
Terraformで始めるInfrastructure as Code por Takahisa Iwamoto
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
Takahisa Iwamoto4.8K visualizações
DTraceによるMySQL解析ことはじめ por Mikiya Okuno
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Mikiya Okuno3.9K visualizações
2011.09.18 v7から始めるunix まとめ por Makiko Konoshima
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima1.1K visualizações
Lisp Tutorial for Pythonista Day 6 por Ransui Iso
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso1.7K visualizações
C・C++用のコードカバレッジツールを自作してみた話 por simotin13 Miyazaki
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki507 visualizações
Programming camp Codereading por Hiro Yoshioka
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
Hiro Yoshioka461 visualizações
Dalvikバイトコードリファレンスの読み方 改訂版 por Takuya Matsunaga
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga3.7K visualizações
プログラマ人生論 por ymmt
プログラマ人生論プログラマ人生論
プログラマ人生論
ymmt 3K visualizações
Debug Hacks at Security and Programming camp 2011 por Hiro Yoshioka
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
Hiro Yoshioka1K visualizações
Goでかんたんソースコードの静的解析 por Takuya Ueda
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
Takuya Ueda6.7K visualizações
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版 por Katsuhiro Morishita
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita6.4K visualizações
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~ por Akira Inoue
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue2K visualizações

Mais de Hiro Yoshioka

Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活 por
Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活
Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活Hiro Yoshioka
2.3K visualizações51 slides
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」 por
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」Hiro Yoshioka
1K visualizações50 slides
不揮発性メモリ(NVM)とはなにか por
不揮発性メモリ(NVM)とはなにか不揮発性メモリ(NVM)とはなにか
不揮発性メモリ(NVM)とはなにかHiro Yoshioka
1K visualizações22 slides
続・人生100年時代の学び方 por
続・人生100年時代の学び方続・人生100年時代の学び方
続・人生100年時代の学び方Hiro Yoshioka
1.6K visualizações53 slides
人生100年時代における学び方 定年後の学生生活 por
人生100年時代における学び方 定年後の学生生活人生100年時代における学び方 定年後の学生生活
人生100年時代における学び方 定年後の学生生活Hiro Yoshioka
425 visualizações47 slides
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten... por
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...Hiro Yoshioka
194 visualizações24 slides

Mais de Hiro Yoshioka(20)

Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活 por Hiro Yoshioka
Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活
Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活
Hiro Yoshioka2.3K visualizações
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」 por Hiro Yoshioka
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」
Hiro Yoshioka1K visualizações
不揮発性メモリ(NVM)とはなにか por Hiro Yoshioka
不揮発性メモリ(NVM)とはなにか不揮発性メモリ(NVM)とはなにか
不揮発性メモリ(NVM)とはなにか
Hiro Yoshioka1K visualizações
続・人生100年時代の学び方 por Hiro Yoshioka
続・人生100年時代の学び方続・人生100年時代の学び方
続・人生100年時代の学び方
Hiro Yoshioka1.6K visualizações
人生100年時代における学び方 定年後の学生生活 por Hiro Yoshioka
人生100年時代における学び方 定年後の学生生活人生100年時代における学び方 定年後の学生生活
人生100年時代における学び方 定年後の学生生活
Hiro Yoshioka425 visualizações
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten... por Hiro Yoshioka
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...
Hiro Yoshioka194 visualizações
人生100年時代の学び方、脳には可塑性がある por Hiro Yoshioka
人生100年時代の学び方、脳には可塑性がある人生100年時代の学び方、脳には可塑性がある
人生100年時代の学び方、脳には可塑性がある
Hiro Yoshioka535 visualizações
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、「私のような仕事につく方法」、2019/06/23 DevLOVE X Day 1 D-7 por Hiro Yoshioka
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、「私のような仕事につく方法」、2019/06/23 DevLOVE X Day 1 D-7エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、「私のような仕事につく方法」、2019/06/23 DevLOVE X Day 1 D-7
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、「私のような仕事につく方法」、2019/06/23 DevLOVE X Day 1 D-7
Hiro Yoshioka10K visualizações
OSSとの付き合い方。OSSから学んだこと。OSS貢献者賞受賞講演 por Hiro Yoshioka
OSSとの付き合い方。OSSから学んだこと。OSS貢献者賞受賞講演OSSとの付き合い方。OSSから学んだこと。OSS貢献者賞受賞講演
OSSとの付き合い方。OSSから学んだこと。OSS貢献者賞受賞講演
Hiro Yoshioka967 visualizações
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、デブサミ 2019 【15-A-8】 por Hiro Yoshioka
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、デブサミ 2019 【15-A-8】エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、デブサミ 2019 【15-A-8】
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、デブサミ 2019 【15-A-8】
Hiro Yoshioka2.7K visualizações
未経験プログラマがコボルコンパイラを作った話 #compiler_study por Hiro Yoshioka
未経験プログラマがコボルコンパイラを作った話 #compiler_study未経験プログラマがコボルコンパイラを作った話 #compiler_study
未経験プログラマがコボルコンパイラを作った話 #compiler_study
Hiro Yoshioka7K visualizações
Godel, Escher, Bach: an Eternal Golden Braid, reading club, Chapter 12 por Hiro Yoshioka
Godel, Escher, Bach: an Eternal Golden Braid, reading club, Chapter 12Godel, Escher, Bach: an Eternal Golden Braid, reading club, Chapter 12
Godel, Escher, Bach: an Eternal Golden Braid, reading club, Chapter 12
Hiro Yoshioka5K visualizações
海外から見た東京 〜人生100年時代の働き方〜 #efsta56 por Hiro Yoshioka
海外から見た東京 〜人生100年時代の働き方〜 #efsta56海外から見た東京 〜人生100年時代の働き方〜 #efsta56
海外から見た東京 〜人生100年時代の働き方〜 #efsta56
Hiro Yoshioka4.7K visualizações
理科系の作文技術 por Hiro Yoshioka
理科系の作文技術理科系の作文技術
理科系の作文技術
Hiro Yoshioka2K visualizações
Agile Software Development advanced course (PBL) at AIIT, 2015 por Hiro Yoshioka
Agile Software Development advanced course (PBL) at AIIT, 2015Agile Software Development advanced course (PBL) at AIIT, 2015
Agile Software Development advanced course (PBL) at AIIT, 2015
Hiro Yoshioka7.6K visualizações
質問される力 #TechGirls por Hiro Yoshioka
質問される力 #TechGirls質問される力 #TechGirls
質問される力 #TechGirls
Hiro Yoshioka1.7K visualizações
Oracle vs Google API 著作権裁判を考える por Hiro Yoshioka
Oracle vs Google API 著作権裁判を考えるOracle vs Google API 著作権裁判を考える
Oracle vs Google API 著作権裁判を考える
Hiro Yoshioka1.4K visualizações
Using oss at an internet company and hacker culture por Hiro Yoshioka
Using oss at an internet company and hacker cultureUsing oss at an internet company and hacker culture
Using oss at an internet company and hacker culture
Hiro Yoshioka1.4K visualizações
Be Hacker por Hiro Yoshioka
Be HackerBe Hacker
Be Hacker
Hiro Yoshioka1.4K visualizações
Project Based Learning using by PaaS por Hiro Yoshioka
Project Based Learning using by PaaSProject Based Learning using by PaaS
Project Based Learning using by PaaS
Hiro Yoshioka2K visualizações

Último

さくらのひやおろし2023 por
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023法林浩之
96 visualizações58 slides
定例会スライド_キャチs 公開用.pdf por
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
111 visualizações64 slides
Windows 11 information that can be used at the development site por
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
88 visualizações41 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 por
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
60 visualizações26 slides
JJUG CCC.pptx por
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 visualizações14 slides
SSH応用編_20231129.pdf por
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdficebreaker4
335 visualizações13 slides

Último(11)

さくらのひやおろし2023 por 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之96 visualizações
定例会スライド_キャチs 公開用.pdf por Keio Robotics Association
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdf
Keio Robotics Association111 visualizações
Windows 11 information that can be used at the development site por Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka88 visualizações
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 por Hitachi, Ltd. OSS Solution Center.
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
JJUG CCC.pptx por Kanta Sasaki
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptx
Kanta Sasaki6 visualizações
SSH応用編_20231129.pdf por icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4335 visualizações
SNMPセキュリティ超入門 por mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda355 visualizações
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) por NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... por NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
NTT DATA Technology & Innovation120 visualizações
The Things Stack説明資料 by The Things Industries por CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.58 visualizações

Programming camp code reading

  • 1. セキュリティ&プログラミング キャンプ2010 ソースコードの読み方 よしおかひろたか 2010年8月13日
  • 2. 講師紹介 ● よしおかひろたか、Debug Hacks著者、カーネ ル読書会主宰、YLUG(横浜Linux Users Group)、勉強会勉強会 ● 未来のいつか/hyoshioの日記 http://d.hatena.ne.jp/hyoshiok ● ユメのチカラ http://blog.miraclelinux.com/yume/ ● hyoshiok@gmail.com ● http://twitter.com/hyoshiok 2
  • 3. お題 ● ソースコードの読み方 3
  • 4. プログラマに必要な3つの スキル ● ソースコードを読むチカラ ● デバッグするチカラ ● テストをするチカラ 4
  • 5. 3つのスキルをどう身につ けるか ● 学校では教えてくれない ● 教科書を読む? ● 実際のプロジェクトで経験する? ● オープンソースのプロジェクトに参加? ● 師匠に弟子入り? ● そこでプログラミングキャンプだ 5
  • 6. ソースコードの読み方 ● ソースコードって何? ● 人間がプログラミング言語などを用い て記述したもの。 ● そのままではコンピュータは実行できないので 、通常、コンパイラと呼ばれるソフトウェアで 直接実行できる形式に変換して実行されるか、 インタプリタと呼ばれるソフトウェアで字面を 解釈し実行される。 6
  • 7. トラブルシューティングと ソースコードの読み方 ● トラブルシューティングと問題の理解 ● 実践的なコードの理解 7
  • 8. ソースコードを読むチカラ ● プログラマの基礎体力 ● ソフトウェア開発コストの大部分は保守 ● 不具合修正、改良、機能追加にはコードの理解 が必須 ● 技術者の付加価値 ● OSSは深追いできる ● 陳腐化しにくい ● プロフェッショナルとしての研鑚 ● すぐれた技術者はソースコードを上手に読む 8
  • 9. コードの読み方 ● なぜ、コードを読むのか ● どのように、読むのか 9
  • 10. なぜコードを読むのか? ● 仕事だから(目的中心) ● トラブルシューティング(不具合修正) ● 機能修正、機能開発 ● 自己研鑚、勉強 ● 趣味だから(興味中心) ● 楽しいから ● 自己啓発(知的好奇心) ● 不純な動機 10 ● 形から入る
  • 11. なぜコードを読むのか ● 目的中心の場合 ● 対象に対する基礎知識は必要 ● アーキテクチャ OS、プログラミング言語、RDBMS、… ● 定番の教科書で知識を得る 11
  • 12. なぜコードを読むのか ● 興味中心の場合 ● 人それぞれ、人生いろいろ ● 無目的でもいいじゃないか ● 熟読、濫読、積読、黙読、音読、再読、誤読、 精読、速読、耽読、通読、復読、輪読、朗読、 輪読、… 12
  • 13. コードの理解について ● モットー: コードは読むな、 理解しろ〜 13
  • 14. どのようにコードを理解す るのか ● 個人的な方法を紹介する ● 唯一あるいはベストな方法というわけでもない ● 適材適所、もっと良い方法があると思う ● 公開することによって進化したい(もっと良い 方法への模索) 14
  • 15. ソースコードを読む視点 微視的理解 巨視的理解 静的理解 動的理解 15
  • 16. 理解の仕方、読み方 ● 静的、動的理解 ● 微視的、巨視的 ● 規模の把握 ● ツールの利用 ● 事例 16
  • 17. 静的理解、動的理解 ● 静的理解 ● 字面での理解 ● 動的理解 ● 動作による理解 17
  • 18. 静的、動的構造 ● 静的構造(デモ) ● 規模 ● ディレクトリ構造 ● 名前つけ規約 ● 動的構造 ● 呼び出し経路 ● プロファイリング ● 実行結果 18
  • 19. 微視的、巨視的 ● 微視的:細部からの理解 ● 最終的にはコードの一行 ● 巨視的:全体からの理解 ● 規模、構造、機能など。実行結果(性能?) ● 俯瞰図、鳥瞰図。 19
  • 20. 規模の把握(巨視的理解) ● 規模重要 ● 規模(相手)を知らずして作戦を立てられない ● 大局的な地図、俯瞰図、鳥瞰図 ● 大規模になればなるほど、システマティックな 方法論が必要になってくる ● 巨視的な理解 20
  • 21. 規模の把握 ● 小規模:100K行未満程度、 ファイル数100未満 10人未満 ● 中規模:100K行〜1M行程度 ファイル数100〜1000未満 100人未満 ● 大規模:1M行以上 ファイル数1000以上 100人以上 ざっくりの規模感 21
  • 22. 規模の把握(例) ● find -type f -name "*.[ch]"|wc ● find -type f -name "*.[ch]"|xargs wc|grep total Ruby 1.8.5 257 197767 Linux 2.6.18 16522 680万 MySQL 5.0.24a 1795 988463 22
  • 23. ディレクトリ構造 ● トップディレクトリは、ソフトウェア の論理的構造を表している ● doc ドキュメント ● lib ライブラリ関係 ● test テスト ● ソースツリーの把握 23
  • 24. ドキュメント ● README, INSTALL, COPYING, … ● 内部ドキュメント(Docs) ● リリースノート ● ChangeLog 24
  • 25. 変更の履歴 ● ChangeLog/Release Notes ● コード管理システム ● 例:Linux git/Subversion/CVS ● Mailing List ● Wiki ● blog ● 変更(時間軸)の微視的理解 25
  • 26. ドキュメント、情報収集 ● マニュアルを読む ● サーチエンジン(Google)に聞く ● Mailing List ● Bug database ● 開発者との会話(シンポジウムなど) ● 勉強会 26
  • 27. ソースコードを読む視点 微視的理解 巨視的理解 ディ ト 構造、 レク リ 名前付け規約 静的理解 ソ ノ ースコ 、 ート ード ChangeLog、 リ リ ース 、規模の把握( など) 行数、 ァ ル数 フ イ 動的理解 デバッガによる実行 実行性能、 グレッ ンテスト リ ショ 27
  • 28. いよいよコードを読む? ● ツール ● エディタ:emacs ● デバッガ:gdb ● クロスレファレンス:cscope ● カーネルの場合、クラッシュダンプ(crash) 28
  • 29. デモ、実習 ● 例題としてrubyを読むことにする。 ● ● GNU Hello ● http://savannah.gnu.org/projects/hello 29
  • 30. 実習 ● ソースコードの規模を理解する ● ディレクトリ構造を理解する ● ビルドする ● ソースコードのナビゲート ● 機能変更をする 30
  • 31. 実習 ● ディレクトリ構造を理解する ● ファイル名を眺める ● ファイル数を調べる ● プログラムの行数を調べる 31
  • 32. 実習 ●ソースコードの入手 $ git-clone git:// (講師に聞いてください) ● ビルドの準備 READMEをよく読む ● 必要なツールを揃える - automake <http://www.gnu.org/software/automake/> - autoconf <http://www.gnu.org/software/autoconf/> - bison <http://www.gnu.org/software/bison/> - gettext <http://www.gnu.org/software/gettext/> - git <http://git.or.cz/> - gperf <http://www.gnu.org/software/gperf/> - gzip <http://www.gnu.org/software/gzip/> - perl <http://www.cpan.org/> - rsync <http://samba.anu.edu.au/rsync/> - tar <http://www.gnu.org/software/tar/> 32
  • 33. 実習 ● ビルド $ time git clone ssh:// (講師から情報を得る) $ cd ruby $ time autoconf $ time ./configure $ time make $ time make test 33
  • 34. $ git checkout -b trunk origin/trunk ● $ autoconf ● ./configure ● make -j4 miniruby 34
  • 35. 動的理解 ● ビルド 35
  • 36. 動的理解 ● ともかく動かす ● make ● strace ● ltrace ● gdb ● oprofile ● リグレッションテスト ● ベンチマークテスト 36
  • 37. make ● とりあえず、make ● 実行環境の構築 ● gcc -g (デバッグシンボルを付加する) 通常はMakefileのCFLAGSなどに設定 ● cscopeのインデックスを作成 ● ビルドはemacsのshellなどから行い、ビルド のログを取得しておくと便利 37
  • 38. strace ● システムコールのトレース $ strace ruby -v execve("/usr/local/bin/ruby", ["ruby", "-v"], [/* 39 vars */]) = 0 uname({sys="Linux", node="asianux2.miraclelinux.com", ...}) = 0 brk(0) = 0x976a000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or dir open("/etc/ld.so.cache", O_RDONLY) =3 fstat64(3, {st_mode=S_IFREG|0644, st_size=89946, ...}) = 0 old_mmap(NULL, 89946, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7 close(3) =0 open("/lib/libdl.so.2", O_RDONLY) =3 38
  • 39. gdb ● デバッガはコードを理解するためにあ る ∴コードを読むために使う ● http://savannah.gnu.org/projects/gdb 39
  • 40. gdbで読むための準備 ● gcc -g でコンパイル ● コンパイルしたコードサイズが大きく なる以外、特に副作用はない ● printfデバッグは有害無益 40
  • 41. gdb ● ブレークポイントを設定 ● ウオッチポイント(変数の変更) ● run ● 止まった時点で ● bt スタックフレームの表示 ● p 変数の表示 ● c 実行再開、s ステップ実行(関数に潜る)、 n ステップ実行(関数に潜らない) 41 ● 繰り返す
  • 42. oprofile ● プロファイラー ● 実行時のボトルネックを発見 ● # opcontrol --start ● テストの実行 ● # opcontrol --stop ● # opreport -l ● http://oprofile.sourceforge.net/news/ 42
  • 43. oprofile CPU: Core Solo / Duo, speed 2666.77 MHz (estimated) Counted DCACHE_PEND_MISS events (Weighted cycles of L1 miss outstanding) with a unit mask of 0x00 (Weighted cycles) count 100000 vma samples % linenr info app name symbol name 000000000042be50 244787 33.2383 gc.c:1661 ruby os_each_obj 000000000042bfac 1 4.1e-04 gc.c:1599 000000000042bfb9 5 0.0020 gc.c:1599 000000000042bfbe 6 0.0025 gc.c:1599 000000000042bfd0 4862 1.9862 gc.c:1601 000000000042bfd3 228573 93.3763 gc.c:1601 000000000042bfd6 2698 1.1022 gc.c:1601 43 000000000042bfd8 250 0.1021 ruby.h:672
  • 44. oprofile ● 高速道路で、ズバリ最もコストのか かっているところに連れて行ってくれ る ● コードを読まないで、理解する極意 44
  • 45. 微視的理解 ● ひたすらコードを読む ● 王道はない ● ↑身もふたもない ● データ構造、変数などに注目し、どこ で定義され、参照され、代入(変更) されているかという観点でみる ● デバッガとエディタ、クロスリファレ ンスツールを駆使 45
  • 46. 微視的理解 ● $ time find -type f -name '*. [ch]' -or -name '*.cpp' -or -name '*.cxx' | xargs egrep -l hogehoge ● $ time grep -r –include='*.[ch]' hogehoge . ● hogehogeを含むファイルを検索 46
  • 47. 微視的理解 ● クロスリファレンスツール ● 変数の定義(型情報)、変更(代入)、参照 ● 変数(関数)が、どのように定義されていて、ど のように参照、変更されているかを追う ● cscope http://cscope.sourceforge.net/ ● lxr http://lxr.linux.no/ ● GNU GLOBAL http://www.gnu.org/software/global/ ● ack-grep 47
  • 48. 実習 ● cscopeを利用する $ time cscope-indexer -r ● emacsを利用する ● gdbを利用する ● oprofileを利用する 48
  • 49. ソースコードを読む視点 微視的理解 巨視的理解 ディ ト 構造、 レク リ 名前付け規約 静的理解 ソースコ 、 ノ 、 ード ChangeLog、 リ ート cscope リ ース 、規模の把握( など) 行数、 ァ ル数 フ イ 動的理解 デバッ (gdb)による実行、 ガ oprofile、 strace ッションテスト strace、実行性能、 グレ リ 49
  • 50. 参考書 ● Linux ● 詳解LINUXカーネル第三版 ISBN:487311313X ● Linuxカーネル2.6解読室 ISBN:4797338261 ● コードリーディング ● ISBN:4839912653 ● Rubyソースコード完全解説 ● ISBN:4844317210(品切れ中) http://i.loveruby.net/ja/rhg/ 50
  • 51. ユメのチカラ(ブログ) ● http://blog.miraclelinux.com/yume/ ● ブックマークで見た人気エントリー ● ソースコードの読み方(524個) ● http://blog.miraclelinux.com/yume/2007/08/post_d6bd.ht ml ● デバッグ方法論(99個) ● http://blog.miraclelinux.com/yume/2007/08/post_d3eb.ht ml ● 多くの人に興味がある話題 51
  • 52. ブログ:ユメのチカラ ● http://blog.miraclelinux.com/yume/ ● 未来のいつか/hyoshiokの日記 ● http://d.hatena.ne.jp/hyoshiok/ 52