view user/pine/note/2021/10/05.md @ 94:d55c9448d3a8

backup 2021-10-06
author autobackup
date Wed, 06 Oct 2021 00:10:04 +0900
parents
children
line wrap: on
line source

# 研究目的
- アプリケーションの信頼性を保証するために、アプリケーションが動作するOSの信頼性を高める必要がある。

- 本研究室では、Continuation Based C(CbC)を用いて、信頼性と拡張性を両立するOSであるGearsOSを開発している。

- ソフトウェア開発においてエラー・バグは付き物であり、その発見が重要である。現在GearsOSにはデバッガーが未実装であるため、円滑なOS開発を行うために、GearsOSのデバッガーを作成する。

## やったこと
- generate_stub.plのコードリーディング

## 作業ログ
デバッガをstubCodeGearに組み込むということになったが、組み込むためにはgenerate_stub.plを読まないといけなさそうだったので、読み始めた。


## mainルーチン
@ARGVをforeachで回してファイルを取得している。

@ARGVはコマンドライン引数が入った配列で、通常の愛列を同じように利用できる。

[コマンドライン引数の扱い @ARGV - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説](https://perlzemi.com/blog/20080108132865.html)

なので、コマンドライン引数の値それぞれをforeachで回してる。

for内では、正規表現でパターンマッチを行っている。行っているパターンマッチは接尾字が`.cbc`かどうかで行っている。

`!~`で.`.cbc`じゃなければ、nextで次のループに行ってる。

[「=~」 - パターンマッチ演算子 - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説](https://perlzemi.com/blog/20080331120697.html)

.cbcだった場合、
`my $cbc_content = slurpCbCFiles($fn);`の実行。

$cbc_contentは読み込んだcbcファイルの各行を配列化したものが入ってる。

## slrupCbCFiles
cbcファイルのファイル読み込みをしてるっぽい。

`open my $fh, ‘<‘, $cbcFile or die “failed open $cbcFile”;`

open関数を使ってcbcファイルを読み込み専用で開いている。

[open関数 - ファイルをオープンする - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説](https://perlzemi.com/blog/20080718121643.html)

ファイルが存在しない場合はdieでプログラムの終了と、エラーメッセージの出力をしている。

読み込んだcbcファイルを一行ずつwhileで回して、push関数使って配列に入れていってる。

```
  while (<$fh>) {
    push(@emitCbCFileArray, $_);
  }
  close $fh;
```

ダイアモンド演算子(行入力演算子)を単独で使ってるので、whileで回してるcbcの各行がデフォルト演算子$_に入るっぽい。

[行入力演算子「<>」 - ファイルから一行読み込む - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説](https://perlzemi.com/blog/20080722121673.html)

## getDataGear
`my ($filename, @content) = @_;`
一行目でサブルーチンの引数を受け取っている。

ちなみにmainルーチンでのサブルーチンの呼び出しは、`getDataGear($fn, $cbc_content);`なので、

$filename = $fn, @content = $cbc_contentとなる。

$は変数、@は配列を表す。

[サブルーチンの引数 @_ - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説](https://perlzemi.com/blog/20180523152759.html)

```
my ($lineNumber, $codeGearName, $name, $inTypedef,$described_data_gear, $currentCodeGear, $codeGearInfo);
```

my()で複数の変数を同時に局所化できる。

↓局所化とは?
[my と local どう違う? - futomi’s CGI Cafe](https://www.futomi.com/lecture/local/index.html)

perlでは特に変数宣言しなくても変数として使えてしまう。なので局所化によって{}で囲まれた部分のみで使える変数にする。つまりローカル変数にすることができる。

for文でcbcの各行が入った配列を回して、パターンマッチをして処理をしている。

### 正規表現について
[Perlの正規表現をマスターしよう - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説](https://perlzemi.com/blog/20100827127859.html)
[基本的な正規表現一覧 | murashun.jp](https://murashun.jp/article/programming/regular-expression.html)

`AtomicT<T> *createAtomicTImpl(struct Context* context, T init){`
に対する正規表現が↓
`/^(\w+)(?:<(\w+)>)?\s*(\*)\s*create(\w+)\(/`

/は最初と最後を表す

()でパターンマッチした文字列から特定の部分をキャプチャすることができる。キャプチャした文字列は、特殊変数である$1や$2に格納される。

\wはアルファベット、アンダーバー、数字

+は直前の文字が1文字以上

なので、\w+はアルファベット、アンダーバー、数字が一文字以上という意味

例でいうとAtomicTの部分のキャプチャをしている。

`?:`を使うとキャプチャしない括弧、つまりグループ化するだけの括弧を定義できる。

なので、(?:<(\w+)>)でいうと、`?:`を使っているので、<や>を合わせた部分でキャプチャはされない。しかし中で(\w+)は書かれているので、その部分はキャプチャされる。

この正規表現は、例でいうと、<>内の文字列のキャプチャ。すなわち<T>のTをキャプチャしている。

?は直前の文字が0個か1個を表す。つまり直前の文字があっても無くてもいいってこと?
    
例でいうと`(?:<(\w+)>)?`となっているので、<T>の部分があっても無くてもいいってこと?

## searchCbCFromCodeGearNameWCurrentFrileName
```
my $searchCbCFromCodeGearNameWCurrentFrileName  = createSearchCbCFromCodeGearNameWCurrentFrileName($FindBin::Bin);
```
となっているので、実際にはcreateSearchCbCFromCodeGearNameWCurrentFrileName関数のこと。
    
ちなみに$FindBin::Binはスクリプトが存在するディレクトリのパスが入ってる。
    
[FindBin - スクリプトが存在するディレクトリのパスを取得 - Perlゼミ|Perlの基礎をインストールからサンプルで丁寧に解説](https://perlzemi.com/blog/20100524127696.html)

```
  #Find the cbc file that contains CodeGear.
  #If there are more than one cbc file, the one whose namespace is the same as the filename has priority.
```
とのことなので、CodeGearが含まれたcbcファイルを探す関数。
    
また、複数のcbcファイルがあった場合は、ファイル名と同じ名前空間を持つcbcファイルが優先されるらしい。

`my $search_root = shift;`
のshiftは配列の先頭を取得する。今回は単独shiftなので、mainルーチンであればARGV、サブルーチンであれば@_の先頭を取得する。

## やること
- generate_stub.plのコードリーディングの続き
- generate_stub.plを読んで、stubにどんな感じでdataGearの表示を組み込むか考える