Jardinagem de Árvores Abstratas

Link da palestra

qr-code.png

Um pouco sobre o jardineiro

Bairro Felicidade, Belo Horizonte

0001-felicidade.jpg

PSL-MG, Minas Livre, Encontro Mineiro de Software Livre

minaslivre.png

emsl.png

Ministério da Cultura, Cultura Digital

cultura-digital.jpg

Governo do Rio Grande do Sul, Gabinete Digital

gabinetedigital.png

rgds.png

Uma meia dúzia de startups, Burnout

Recurse Center, reaprendendo a programar

https://recurse.com

recurse.svg

DataDog, atual

Façamos uma pequena linguagem de programação

Por que? Pra que? Pra quem?

Este é um papo informal

Expressões Aritméticas

1 + 2 * 3 = 7
(1 + 2) * 3 = 9

Primeiros Arbustos

1 + 2 * 3 = 7 (1 + 2) * 3 = 9

arbusto1.png

arbusto2.png

Propriedades de Operadores

  • Aridade
  • Precedência
  • Associatividade

Notações de Expressões

  • infix
  • prefix
  • postfix

Prefix

+ 1 * 2 3 = 7
* + 1 2 3 = 9

Quem usa notação prefix?

lisp é um exemplo

(+ 1 (* 2 3))
(* 3 (+ 1 2))

Postfix

3 2 * 1 + = 7
1 2 + 3 * = 9

Quem usa notação postfix?

Máquina de Pilha

3 2 * 1 + = 7 2 1 + 3 * = 9

push 3
push 2
mul
push 1
add

push 2
push 1
add
push 3
mul

Pilhas

pilha.jpg

Array.push() e Array.pop()

Uma pausa pra falar de arquitetura

Compilação

compilador.png

A linguagem alvo pode ser ou uma linguagem textual, ou código de máquina (Bytecode, Assembly).

Execução

  • Interpretador de Árvores: Exemplo
  • Interpretador de Bytecode: Exemplo
  • Código de Máquina (Assembly): Intel x86, ARM, RISC-V, etc

Exemplos

texto pra texto

babel.svg

texto pra bytecode

python.svg

texto pra bytecode

A JVM é alvo de vários compiladores: Java, Clojure, Kotlin, Scala, Groovy, Jython, etc…

java.svg

Chrome's v8: everything all at once

v8-architecture.png

fonte da imagem

Funções Primitivas

Textual Máquina de Pilha

print("a")
print(25)

push "a"        ; copia a constante "a" pro topo do stack
prim "print" 1  ; chama a função primitiva "print"
                ; que tem 1 parâmetro

push 25         ; copia a constante 25 pro topo do stack
prim "print" 1

Variáveis

Textual Máquina de Pilha

a = 1
print(a)

push 1     ; coloca o valor 1 no topo da pilha
store 0    ; remove o valor no topo da pilha
           ; e salva na variavel 0

load 0     ; copia a variável 0 pro topo da pilha
prim "print" 1

Condicionais: Galhos (Branches)

Textual Máquina de Pilha

if (a == b) {
  print("oi!")
}

      push b
      push a
      ; compara os dois valores no topo da pilha
      cmp
      ; Jump If Not Equal: Pula pro rótulo "exit"
      ; se a comparação não for igual
      jne exit
      push "oi!"
      prim "print" 1
exit: halt

Repetições

Textual Máquina de Pilha

a = 0
while (a < 10) {
  print(a)
  a++
}

      push 0
      store 0
loop: load 0
      push 10
      cmp
      jnb exit      ; Jump if not below
      load 0
      prim "print" 1
      load 0
      incr
      store 0
      jmp loop      ; Unconditional Jump
exit: halt

Funções

Textual Máquina de Pilha

function sum() {
  a = 2
  return 40 + a
}

print(sum())

     call sum 0
     prim "print" 1
     halt

sum: push 2
     store 0
     push 40
     load 0
     sum
     ret

Extra: Parsing

Top Down Recursive Parsing

Parsing Expression Grammars

Gramáticas

e.g.: parser de CSV

File <- Line*
Line <- Val (',' Val)* '\n'
Val  <- (![,\n] .)*

Expressões

sequence e1 e2  
ordered choice e1 / e2  
not predicate !e  
and predicate &e (sugar for !!e)
zero or more e*  
one or more e+ (sugar for ee*)
optional e? (sugar for &ee / !e)

Recursos aleatórios

O que não falamos sobre

Tipos

Biblioteca Padrão (stdlib)

Muuuita coisa 😅

Gradicido!