2019-01-01から1ヶ月間の記事一覧

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…