「実践 Rails――強力なWebアプリケーションをすばやく構築するテクニック」の第1章2節の途中までを読んでの学びと感想
知り合いのエンジニアの方から「Rubyをするならこの本を読むといいよ」とお薦めを受けたので下記の本を購入。
多分現時点での自分にとっては相当むずかしく、途中で放り出す可能性は大だが、とりあえずほんの少しずつ読み進めていきたい。気が向いたらこうして何か学んだことや感じたことを書きたい。
とりあえず本記事では「1章 基本的な手法」の「1.1 メタプログラミングとは何か」と「1.2 Rubyの基礎」の途中までを読んだ学びと感想を書いていく(どういうことか気になったがよく分からないところはそのまま「よく分からない」と記載している)。
学び
メタプログラミングについて
メタプログラミング
- メタプログラミングとはあるプログラムを実行すると別のプログラムが生成されるというプログラミング手法のこと
- つまり「→」がプログラムだとして、入力と出力の関係が以下のようになるプログラムをメタプロと呼ぶっぽい
- プログラム → プログラム
- データ → プログラム
- メタプログラミングは多くのプログラミング言語で使用されているが、最もよく使用されるのは、一般にプログラムをデータとして操作する機能が強化されているRubyやPythonなどの動的プログラミング言語
- プログラムをデータとして操作するとはどういうことか?逆にプログラムをデータとしては操作しない言語があるということか?
- よく分からない・・・
- プログラムをデータとして操作するとはどういうことか?逆にプログラムをデータとしては操作しない言語があるということか?
- RubyやRailsにおけるメタプログラミングの実例は以下
- 例えばRailsのアプリでメタプログラミングのファイルを作った場合、それはどのフォルダに置くものなのか?
- よく分からない・・・
- つまり「→」がプログラムだとして、入力と出力の関係が以下のようになるプログラムをメタプロと呼ぶっぽい
イントロスペクション
- イントロスペクションとはざっくり、対象のプログラムの役割を調べる機能のこと。一般的に構文的イントロスペクションと意味的イントロスペクションの2つがある
- このイントロスペクションはメタプロにおいてどのような用途?
- よく分からない・・・。これはこの節以降で説明されるものかも
- 構文的イントロスペクションとは何か?
- プログラムの文字列などを直接調べること
- 意味的イントロスペクションとは何か?
- このイントロスペクションはメタプロにおいてどのような用途?
DRY
- DRYとは「Don't Repeat Yourself」の略であり、システムにおいて特定の情報を表現する必要があるのは一度だけでよいという意味のプログラミングの原理
Rubyの基礎の仕組みについて
全てのRubyオブジェクトに含まれるフィールド
- 全てのRubyオブジェクトはメモリの中に以下のフィールドを持っている。
- klass
- iv_tbl
- このオブジェクトに属するインスタンス変数のデータが入っているフィールド
- flags
- オブジェクトの汚染状態、ガベージコレクションマークビット、オブジェクトがフリーズされているかどうかといった、何らかのステータス情報が含まれたBooleanフラグのビットフィールド
- ステータス情報の具体例を示した用語がよく分からない・・・
- オブジェクトの汚染状態、ガベージコレクションマークビット、オブジェクトがフリーズされているかどうかといった、何らかのステータス情報が含まれたBooleanフラグのビットフィールド
- m_tbl(オブジェクトがクラスまたはモジュールだった場合のみ)
- インスタンスメソッドのデータが入っているフィールド
- super(オブジェクトがクラスまたはモジュールだった場合のみ)
- スーパークラスへのポインタ
クラスの継承について
- クラスの継承についての図は以下。これはこの「実践 Rails」の本に書いてある図を少し修正した図
- klassポインタの矢印が、全てのクラスはclassクラスのオブジェクトであるという関係を示している
- superポインタの矢印が、自作したクラスがObjectクラスを継承しているという関係を示している
メソッドとメッセージとレシーバ
Rubyではメソッドが呼び出されるときのことを「メッセージを送信している」と言い、メッセージの送信先となるオブジェクトを「レシーバ」と言う。
- メソッド=メッセージではなく、メソッドというものが呼び出されることをメッセージを送信すると呼称するよう。
以下伊藤淳一さん著のプロを目指す人のためのRuby入門のP211を丸々参考にさせていただいた図だが・・・レシーバとメッセージの関係性はこんな感じだと思う
感想
- メタプロは重複してる複数のプログラムを抽象化するのにも使われるんだ。というかそれが主な用途なんかな・・・?分からん。
- データの入力を受け取るとデータの出力を吐き出すプログラムが普通のプログラムで、それ以外のパターンのプログラムがメタプロになるんかな(プログラムを受け取ってプログラムを吐き出すとか)。
- コードとプログラムという用語を今日まで使い分けせずにきたけど、調べると意味の差は一応あるらしい。プログラムがコンピュータ側が理解できるもの、コードが人間側でRubyとかを用いて書いたもの・・・。とはいえそんなに意識されてなさそうなとこな感じはしたので、この記事では一旦「プログラム」で統一しようと思う。
- 翻訳系の本はそうなんかもしれんけど、とりあえず自分にとってこの本の文章は分かりづらい・・・
- 1.1節からいきなりかなりむずいので、一旦は今持ってる上述したRuby入門書とネットの記事を都度頼りながら読んでく他なさそう。