ID (4)

ID は 229 = 約 500M と言ったな、あれは嘘だ。というわけで、4 bit フラグで使っていたので、228 = 268,435,456 = 約 250M 個でした。 下 1 ビットは、ID_STATIC_SYM というフラグを埋め込むためのものみたいだけど、知らないなあ。今度調べます。 ID の種…

ID (3)

さて、IDの種類を見るには、symbol.h に定義してある id_type(ID) 関数を使う。 static inline int id_type(ID id) { if (is_notop_id(id)) { return (int)(id&ID_SCOPE_MASK); } else { return -1; } } is_notop_id() の詳細はおいといて、とりあえずこれが…

ID (2)

ID は 29 bit と紹介したが、では (1) 32 bit 限定なの? (2) 3 bit はどこいった? という疑問が生じる。回答を述べると、(1) は、Yesで、(2) は ID の種類に使っている。 32ビットの理由。一般的な辞書的テーブルには key と value にそれぞれ VALUE が入…

ID

ID は、インタプリタプロセス寿命の中で、文字列に一意な数値をつけるもの、と述べた。例えば "hello" に 100 という数値を付けたら、プロセスが再起動するまでずっと 100 になる。 (C) 文字列 -> ID への変換は、rb_intern(const char *) で行う。引数は St…

静的SymbolとID

静的 Symbol の話。基本的には、ID に tag bits を含ませて VALUE にする。 #define RB_STATIC_SYM_P(x) (((VALUE)(x)&~((~(VALUE)0)<

RubyKaigi 2019 を振り返る

RubyKaigi2019 が終わったので、振り返っておく。 前日に before-RubyKaigi 開発者会議を開いた https://bugs.ruby-lang.org/issues/15459 アジェンダをきちんと作って、30分のスロットにしてみた。時間足りないかな? と思ったけど、結構ぎゅっと詰まって良…

いつの間にか平成が終わる

Symbol の続き書かなきゃなあ、と思いながら、1月で止まっていた。 その間、 PPL2019 が終わった ISMM に論文をだした → 通った!(RubyKaigi 前日に通知が来た) RubyKaigi 2019 が終わった Web+DB Press の連載が始まった と、色々あって忙しかったけど、…

Symbol

Symbol というと、Ruby では :sym のように書く奴。 こいつには 静的シンボル 動的シンボル の2種類ある。STATIC_SYM_P(v) でチェックすることができる。ここでは、静的シンボルだけ説明する。 静的シンボルは、絶対に GC されないシンボル。メソッド名など…

Flonum のビットレイアウト

double から VALUE の話を考える。 Flonum は下位 2 bit を 0b0010 にする、という話だった。では、その 2 bit はどこから来るか、というと、指数部 11 bit の上位 2 bit を使う、ということだった。指数部の上位 2 bit は 61, 62 bit 目にあるので、さて VA…

Flonum

Fixnum を紹介したので、次は Flonum を紹介する。 Flonum は聞き慣れない言葉ではないかと思うのだが、Float オブジェクト(浮動小数点数オブジェクト)を Immediate として表現するためのものだ。 Fixnum は Integer の一部(63bit で表現できる整数値)だ…

風邪とか

子供が風邪をひいて移されて、それから妻にうつったりして大変だったなぁ、と思ってたらこのブログのことをすっかり忘れていて、なんと20日弱もサボっていた。 いやー、やっぱり続けるの難しいなあ。頑張ります。

Fixnum

IMMEDIATE_P(v) でもっともポピュラーなものは Fixnum だろう。下位 1 bit が 1 であれば(v&1 であれば)Fixnum だ。 さて、そもそも Fixnum ってなんだっけ。Ruby 2.4 で消滅したクラスだった。範囲つき整数であり、範囲を超えると Bignum になった。Bignu…

true

MRI

IMMEDIATE_P(v) は、いくつかの種類のオブジェクトであると紹介した。もっとも簡単なものは true であり、Qtrue というマクロで値を参照できる。実際には 0x14 == 0b0001_0100 という値になる(64bit CPU の場合)。 #define RB_IMMEDIATE_P(x) ((VALUE)(x) …

RB_TEST_P(x)

MRI

https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L478 #define RB_TEST(v) !(((VALUE)(v) & (VALUE)~RUBY_Qnil) == 0) #define RB_NIL_P(v) !((VALUE)(v) != RUBY_Qnil) #define RTEST(v) RB_TEST(v) #define NIL_P(v) RB_NIL_P(v) RB_TEST…

IMMEDIATE_P

MRI

IMMEDIATE_P の実装を確認する。 https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L400 #define RB_IMMEDIATE_P(x) ((VALUE)(x) & RUBY_IMMEDIATE_MASK) #define IMMEDIATE_P(x) RB_IMMEDIATE_P(x) RUBY_IMMEDIATE_MASK も確認する(64bit …

SPECIAL_CONST_P 実装

MRI

さて、SPECIAL_CONST_P の実装の話。 #define RB_SPECIAL_CONST_P(x) (RB_IMMEDIATE_P(x) || !RB_TEST(x)) #define SPECIAL_CONST_P(x) RB_SPECIAL_CONST_P(x) この条件で、メモリへのポインタか、そうでないかを分けることができる、といっている。どうやる…

SPECIAL_CONST_P

MRI

SPECIAL_CONST_P の実装を見てみる。 https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L1297 #define RB_SPECIAL_CONST_P(x) (RB_IMMEDIATE_P(x) || !RB_TEST(x)) #define SPECIAL_CONST_P(x) RB_SPECIAL_CONST_P(x) どうやら、x について…

VALUE: special const

MRI

Ruby から見えるすべてはオブジェクトである、という言説がある。実際、数値など 1 + 2 は 1.+(2) といったように、オブジェクトとメソッドの組み合わせで表現される。 オブジェクトをどのように表現するかは、処理系のデザインとしては難しい問題だ。一番ナ…

VALUE という型

MRI

(早速一日さぼってしまった) MRI のソースコードでは至る所に出てくる VALUE という型が、Ruby のオブジェクトを表している。 https://github.com/ruby/ruby/blob/ruby_2_6/include/ruby/ruby.h#L94 この辺で定義しているが、やりたいことは、ポインタ型の…

ar_table の話(もっと良い提案を募集します)

MRI

Hash なのに Hash 値を使わない O(n) な Hash table いきなり色々すっ飛ばして、hash.c に定義してある ar_table の話をする。 話の前提は Ruby 2.6 の改善を自慢したい - クックパッド開発者ブログ にまとめた transient heap。この話は今後、ここでもちゃ…

対象とする CPU アーキテクチャ

MRI

MRI が対象とする CPU アーキテクチャは、32bit および 64bit CPU。命令セットは、一応だいたい動くような気がするけど、レジスタウィンドウとか、IA64 のなんとか、というのが特殊な対応が入る奴がいる。今は Intel x64 が多いんじゃないかな。AWS で動かす…

データ構造が定義してあるソースコード

MRI

Ruby のデータ構造の定義は、いろいろなところに偏在している。 主には次の三カ所。 include/ruby/ruby.h (インストールされる) internal.h(インストールされない) vm_core.h(インストールされない) (なお、他にも本当はいろいろある) 歴史的には、r…

Ruby インタプリタで学ぶアルゴリズムとデータ構造

Ruby インタプリタの開発をしていても、中のデータ構造などをまったく思い出すことが出来ないので、まとめておきたいと思って始めます。 データ構造っていうと、こんなところでしょうか。 VALUE Immediate RValue RBasic (flags, klass) RXxxx の構造 RValue…