Skip to content

Instantly share code, notes, and snippets.

@wanabe
wanabe / how-falcon-work.md
Last active April 28, 2024 08:24
Falcon ってどういう仕組みなのか読んでみたけれどよくわからない(未完)

免責

てきとうに読み始めててきとうに書き始めていてまだ終わっていません。 何か変なことを書いていたらすみません。

序文

https://github.com/socketry/falcon がどう動いているのか気になったので見てみます。

初手

@wanabe
wanabe / parser.peg
Last active February 12, 2023 22:12
# original file: https://git.ruby-lang.org/ruby.git/tree/parse.y
%prefix "tiny_ruby_parser"
%capture on
%value c -> "tiny_ruby_value" rb -> "TinyRubyValue"
%auxil c -> "tiny_ruby_context_ext *"
dump <- program:program
c -> {
# This code is hereby placed in the public domain.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
@wanabe
wanabe / class.md
Last active January 30, 2023 10:12
classDiagram

Parser --> LrMemoTable: memos
Parser --> Thunk: thunks[]
LrMemoTable --> LrMemo: memos[pos][rule_name]
LrMemo --> ThunkChunk: answer

Thunk <|-- ThunkNode
Thunk &lt;|-- ThunkLeaf
@wanabe
wanabe / gist:bc6c4091d9e70164baa2b8d6162e5807
Created November 27, 2022 08:20
ruby sample/exyacc.rb parse.y at d055c44b0cfeeed2d02f8899200863d69758abc1
program : top_compstmt
;
top_compstmt : top_stmts opt_terms
;
top_stmts : none
| top_stmt
| top_stmts terms top_stmt
;
@wanabe
wanabe / gist:d1d6c0711b3ac7df4a94021477713b9a
Last active July 9, 2022 09:53
Feature #18875 がどういうことなのか読み解く

Feature #18875 https://bugs.ruby-lang.org/issues/18875 で、Ruby になにやら大きな変更が入ったようです。 チケットを読んでもどういうものなのかまだあまりわからず、気になったので調べつつメモします。

もっとも特徴的なのはこの部分です。

@@ -456,9 +460,12 @@ struct rb_iseq_constant_body {
     } variable;
 
 unsigned int local_table_size;

yjit についてメモ書き

めちゃ速い

$ for opt in '' '--jit' '--yjit'; do echo "opt": $opt; time ./miniruby $opt -e 'def fib(n); return n if n < 2; fib(n - 1) + fib(n-2); end; fib(35)'; done
opt:
diff --git a/compile.c b/compile.c
index 1cabb8cccd..9e3a1111dc 100644
--- a/compile.c
+++ b/compile.c
@@ -6562,7 +6562,7 @@ iseq_compile_array_deconstruct(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NO
ADD_INSNL(ret, line, branchunless, match_failed);
- ADD_SEND(ret, line, rb_intern("deconstruct"), INT2FIX(0));
+ ADD_INSN(ret, line, deconstruct);
@wanabe
wanabe / gist:5ba643a3b0e40c05f8de255081e829f0
Last active October 13, 2020 03:16
ruby が 0 という一文字を解釈する流れをわかりたい

この文章は

CRuby がプログラムをどう実行しているのかを自分がいまいち理解していないので、その理解のために書いていくものです。 実験的に、あっちこっちリンクで飛ぶように書きたいと思います。

はじまり

CRuby の実行ファイルである ruby(Windows であれば ruby.exe)は、Ruby スクリプトを解釈して実行します。 たとえば ruby -e 0 などとすると、0 という一文字の Ruby スクリプトだと解釈され、実行されます。画面に何も表示しないので本当かどうかよくわかりませんが、そうらしいです。

@wanabe
wanabe / gist:b4baf0d4459b60a0c31d794cd9801f27
Last active August 10, 2020 02:02
パターンマッチをわかりたい

この文書は

Ruby のパターンマッチングがどうやって実装されているのかわからないので実装を読んでわかったことを書いていく覚え書きです。

もともとは、パターンマッチング文法のコンパイル結果の命令列を見ていて、なんだかおかしいような気がしたけれども自信がないので、もうちょっと読んでおかしいかおかしくないか判断しよう、というのが動機です。

結論として「動きはするし顕在化とは思うが、微妙にまずそう」というところを見つけたのでそこまでの道筋を書きます。

パターンマッチングの書式