Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyConf BR 2017 - Explorando stacks do Ruby

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

RubyConf BR 2017 - Explorando stacks do Ruby

Quem nunca se deparou com um erro "stack level too deep"? Curiosamente isso não acontece em Elixir - a todas implementações de loop são baseadas em recursão com um pequeno detalhe a mais que não vem habilitada por padrão no Ruby. Esta talk mergulha fundo no processo de interpretação / compilação de um script em Ruby de forma didática a fim de resolver esse problema.

Esta é a mesma apresentação que fiz na TDC - SP 2017, e também na GURUSP, no mesmo ano

Avatar for Gabriel Leopoldo Ferreira

Gabriel Leopoldo Ferreira

November 16, 2017

More Decks by Gabriel Leopoldo Ferreira

Other Decks in Technology

Transcript

  1. AST (Runtime) Loop de Parsing Código Ruby Token Ruby Grammar

    Rules Lê um caractere deu match? sem match? Ruby Parser Leitura do código
  2. NODE SCOPE table and args NODE FUNCTION method id=times NODE

    LITERAL 100 NODE ITERATION NODE SCOPE table and args NODE FUNCTION method id = puts NODE LITERAL “Ruby” variáveis e argumentos Bloco DO Main Scope Abstract Syntax Tree
  3. NODE SCOPE NODE FUNCTION NODE LITERAL NODE ITERATION NODE SCOPE

    NODE FUNCTION NODE LITERAL Bytecodes Bytecodes Virtual Machine
  4. YARV Yet Another Virtual Machine CRUBY ( > 1.9.0) JVM

    Java Virtual Machine JRUBY LLVM Low Level Virtual Machine Rubinius
  5. rb_control_frame_t pc program counter sp stack pointer self objeto self

    YARV Snippet Local Table Registradores do YARV
  6. YARV Frame Stack ◆ Input das Instruções do YARV ◆

    Coordenação das chamadas de métodos ◆ Gerenciamento do uso de variáveis, retornos de funções, etc. ◆ Gerenciamento de escopo ◆ Otimizações (chamadas para funções em C, caching, etc)
  7. YARV Memory Stack ◆ Armazenamento de variáveis declaradas ◆ Armazenamento

    de parâmetros de funções, blocos, etc. ◆ Implementação de clojures Ruby (lambdas e procs) ◆ Tabelas de variáveis especiais (&:, &$, ...)
  8. Call Stack main (Object) #factorial #factorial #factorial YARV TRACE 8

    Novo escopo #factorial Current Frame Pointer
  9. Call Stack main (Object) #factorial #factorial #factorial YARV TRACE 16

    #factorial Retorno de dados Current Frame Pointer