How I Made Ruby Faster Than Ruby
Как я ускорил Ruby до скорости Ruby
P2 — новая библиотека шаблонов, где HTML описывается чистым Ruby. В отличие от ERB, исходный код шаблона не исполняется: он компилируется в эффективный Ruby-код, который генерирует HTML. Это делает P2 первой библиотекой, использующей компиляцию исключительно.
Как работает компиляция
Шаблон — это Proc:
->(title:) {
html { body { h1 title } }
}.render(title: 'Hi')
При вызове #render код превращается в:
->(buf, title) {
buf << "<html><body><h1>"
buf << ERB::Escape.html_escape(title.to_s)
buf << "</h1></body></html>"
buf
}
- Парсинг: Sirop читает файл и строит AST через Prism.
- Трансформация:
TagTranslatorзаменяетCallNodeнаTagNode, если вызов соответствует HTML-тегу без получателя. - Обратный код: подкласс
Sourcifierпреобразует AST обратно в Ruby, подставляя строки буфера и экранирование.
Оптимизация
Jean Boussier указал узкие места и направления. В результате генерация стала заметно быстрее «чистого» Ruby.