Giter VIP home page Giter VIP logo

rinha-de-compiler's Introduction

banner

Introdução

O ideal da rinha é fazer um interpretador ou compilador que rode em uma maquina com 2 núcleos e 2G de RAM.

O seu interpretador ou compilador deve trabalhar com algo chamado "árvore sintática abstrata" que está armazenada no formato JSON. Essa árvore sintática abstrata será gerada por nós usando uma ferramenta específica disponível neste repositório.

Sua responsabilidade na tarefa é receber esse JSON que contém a árvore abstrata e, em seguida, interpretar ou compilar o programa de acordo com as informações fornecidas na árvore abstrata.

Simplificando:

  1. Nós te damos um JSON com uma árvore dentro
  2. Voce roda o JSON
  3. Voce fica feliz que apareceu o resultado.

Para executar

Cada projeto deve ter seu próprio Dockerfile para que consigamos rodar

Como testar

Para testar você pode usar o arquivo files/fib.rinha e gerar com o programa que disponibilizamos aqui para um JSON ou você pode usar diretamente o JSON que está em files/fib.json.

Durante a rinha nós iremos adicionar outros testes :)

Requisitos

Você tem que fazer um PR, alterando o arquivo PARTICIPANTS.md, com uma nova linha e seu repositório. Talvez isso seja mudado depois (fique atento).

Seu repositório terá que ter uma imagem no root do repositório, e buildaremos a imagem no rankeamento.

Especificação

A linguagem terá que rodar com base em algum arquivo, que é o JSON da AST da rinha especificado aqui.

  1. O arquivo terá que ser lido de /var/rinha/source.rinha.json
  2. Poderá também ser lido de /var/rinha/source.rinha, se você quiser ler a AST na mão.

A linguagem é uma linguagem de programação dinâmica, como JavaScript, Ruby, etc.

O projeto da rinha de compilador, tem um "interpretador" do json, que retorna um AST, e o código terá que ser testado de diferentes formas, como outros algorítimos além de Fibonacci.

Exemplo

Exemplo com fibonacci

let fib = fn (n) => {
  if (n < 2) {
    n
  } else {
    fib(n - 1) + fib(n - 2)
  }
};

print("fib: " + fib(10))

Competição

O prazo para mandar os PRs, é até o dia 23/09, depois disso serão negados o projeto.

Será liberado para ajustes até o dia 27/09, você poderá arrumar sua implementação, depois da publicação dos testes.

Resultados

Rank Name Language TYpe Points
1 Raphael M. R. Victal Golang Tree-Walker 72786
2 Tacio Golang Tree-Walker 72582
3 cleissonbarbosa Haskell Tree-Walker 72458
4 Danfs TypeScript Tree-Walker 70096
5 Valmor Flores Flutter 69584
6 Victor Augusto TypeScript Tree-Walker 69273
7 fabiosvm C Bytecode Interpreter 68737
8 coproduto ⚡Zig Tree-Walker 68647
9 Adriano dos Santos Fernandes C++ Tree-Walker 68309
10 Ítalo Paulino (irbp) Dart 🎯 Tree-Walker 67919

Recursos

Alguns recursos úteis para aprender como fazer seu próprio interpretador ou compilador são:

Fique ligado que alguns vídeos e posts úteis chegarão em breve.

rinha-de-compiler's People

Contributors

aleffmoura avatar algebraic-sofia avatar antoniogomes94 avatar aripiprazole avatar brunokim avatar cleissonbarbosa avatar dhrleandro avatar edusporto avatar iaze avatar jeffque avatar lucasnlm avatar mateuxlucax avatar olordecoelho avatar paulllo-victor avatar paulo-paes avatar pedrofnseca avatar rcovery avatar reu avatar ricardopieper avatar rodrigocam avatar rosaulisses avatar rwillians avatar ry-diffusion avatar samueldurantes avatar samuelhaidu avatar sbalmt avatar takusuman avatar yagocrispim avatar yazaldefilimone avatar yuriwithowsky avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rinha-de-compiler's Issues

[Sugestão] Discord Server

Se a rinha, além do intuito competitivo claro, tiver a intenção de ajudar novas pessoas a entenderem esse mundo (educativo),
eu sugeriria a criação de um servidor no discord pra facilitar a interação. Mas fica a critério de vocês

Estado dos projetos

Seria bom ter algum indicativo de qual o estado de desenvolvimento de cada projeto na lista de participantes, não acham?

AST foi gerada corretamente?

A título de informação eu fiz meu parser & lexer e tentei gerar a AST para esse exemplo e na hora de interpretar acabei pegando o erro, então resolvi gerar a AST com a ferramenta rinha e tentar interpretar.

Usando o seguinte código

// symbols.rinha
if (1 + 2 == 3 && 3 <= 2 || 2 == 1) {
   print("hello")
} else {
   print("wellcome to hell")
}

Temos a seguinte AST gerada pela rinha:

{"name":"symbols.rinha","expression":{"kind":"If","condition":{"kind":"Binary","lhs":{"kind":"Binary","lhs":{"kind":"Int","value":1,"location":{"start":4,"end":5,"filename":"symbols.rinha"}},"op":"Add","rhs":{"kind":"Int","value":2,"location":{"start":8,"end":9,"filename":"symbols.rinha"}},"location":{"start":4,"end":9,"filename":"symbols.rinha"}},"op":"Eq","rhs":{"kind":"Binary","lhs":{"kind":"Int","value":3,"location":{"start":13,"end":14,"filename":"symbols.rinha"}},"op":"And","rhs":{"kind":"Binary","lhs":{"kind":"Int","value":3,"location":{"start":18,"end":19,"filename":"symbols.rinha"}},"op":"Lte","rhs":{"kind":"Binary","lhs":{"kind":"Int","value":2,"location":{"start":23,"end":24,"filename":"symbols.rinha"}},"op":"Or","rhs":{"kind":"Binary","lhs":{"kind":"Int","value":2,"location":{"start":28,"end":29,"filename":"symbols.rinha"}},"op":"Eq","rhs":{"kind":"Int","value":1,"location":{"start":33,"end":34,"filename":"symbols.rinha"}},"location":{"start":28,"end":34,"filename":"symbols.rinha"}},"location":{"start":23,"end":34,"filename":"symbols.rinha"}},"location":{"start":18,"end":34,"filename":"symbols.rinha"}},"location":{"start":13,"end":34,"filename":"symbols.rinha"}},"location":{"start":4,"end":34,"filename":"symbols.rinha"}},"then":{"kind":"Print","value":{"kind":"Str","value":"hello","location":{"start":47,"end":54,"filename":"symbols.rinha"}},"location":{"start":41,"end":55,"filename":"symbols.rinha"}},"otherwise":{"kind":"Print","value":{"kind":"Str","value":"wellcome to hell","location":{"start":74,"end":92,"filename":"symbols.rinha"}},"location":{"start":68,"end":93,"filename":"symbols.rinha"}},"location":{"start":0,"end":95,"filename":"symbols.rinha"}},"location":{"start":0,"end":95,"filename":"symbols.rinha"}}

Temos também a AST gerada pelo meu parser:

{"expression":{"condition":{"kind":"Binary","lhs":{"kind":"Int","location":{"start":1,"end":6,"filename":"symbols.rinha"},"value":1},"location":{"start":1,"end":8,"filename":"symbols.rinha"},"op":"Add","rhs":{"kind":"Binary","lhs":{"kind":"Int","location":{"start":1,"end":10,"filename":"symbols.rinha"},"value":2},"location":{"start":1,"end":13,"filename":"symbols.rinha"},"op":"Eq","rhs":{"kind":"Binary","lhs":{"kind":"Int","location":{"start":1,"end":15,"filename":"symbols.rinha"},"value":3},"location":{"start":1,"end":18,"filename":"symbols.rinha"},"op":"And","rhs":{"kind":"Binary","lhs":{"kind":"Int","location":{"start":1,"end":20,"filename":"symbols.rinha"},"value":3},"location":{"start":1,"end":23,"filename":"symbols.rinha"},"op":"Lte","rhs":{"kind":"Binary","lhs":{"kind":"Int","location":{"start":1,"end":25,"filename":"symbols.rinha"},"value":2},"location":{"start":1,"end":28,"filename":"symbols.rinha"},"op":"Or","rhs":{"kind":"Binary","lhs":{"kind":"Int","location":{"start":1,"end":30,"filename":"symbols.rinha"},"value":2},"location":{"start":1,"end":33,"filename":"symbols.rinha"},"op":"Eq","rhs":{"kind":"Int","location":{"start":1,"end":35,"filename":"symbols.rinha"},"value":1}}}}}}},"kind":"If","location":{"start":1,"end":3,"filename":"symbols.rinha"},"otherwise":{"kind":"Print","value":{"kind":"Str","location":{"start":4,"end":29,"filename":"symbols.rinha"},"value":"wellcome to hell"}},"then":{"kind":"Print","value":{"kind":"Str","location":{"start":2,"end":18,"filename":"symbols.rinha"},"value":"hello"}}},"name":"symbols.rinha"}

Desconsiderando os meus erros ao gerar a AST, gostaria de saber se a árvore gerada pela rinha estaá correta e o problema em vez da arvore seria o interpretador, já que o mesmo código em js é válido, ou se a árvore gerada não está correta.

`Var` inconsistente no exemplo `fib.json`

Boa noite! Queria começar essa issue parabenizando o esforço de vocês na preparação desta rinha, dá pra ver que deu bastante trabalho :)

Sobre o problema, nesta linha há um termo da variante Var que não possui o atributo kind, enquanto nesta linha possui. Acho que o esperado seria que todas as instâncias de Var tivessem um kind.

Erro em TESTS.md

Meu dockerfile builda corretamente com docker build -t rinha-de-compiler . mas está listado como problemático.

Acredito que o repositório foi clonado sem --recurse-submodules.

Foi falado que seria usado essa opção.

Eu não sei qual link eu devo colocar para o repositório ser clonado

Inicialmente eu coloquei mandei esse link

https://github.com/SamuelHaidu/RinhaToPythonVM/tree/main

Deu o erro "cannot clone repository"

De fato rodando git clone com esse link da isso aqui:

PS D:\Projects> git clone https://github.com/SamuelHaidu/RinhaToPythonVM/tree/main
Cloning into 'main'...
fatal: repository 'https://github.com/SamuelHaidu/RinhaToPythonVM/tree/main/' not found

Mas ai fiz um pull request #287 para trocar para o https://github.com/SamuelHaidu/RinhaToPythonVM.git

Ai rodando aqui deu:

PS D:\Projects> git clone https://github.com/SamuelHaidu/RinhaToPythonVM.git
Cloning into 'RinhaToPythonVM'...
remote: Enumerating objects: 234, done.
remote: Counting objects: 100% (234/234), done.
remote: Compressing objects: 100% (140/140), done.
remote: Total 234 (delta 116), reused 199 (delta 82), pack-reused 0
Receiving objects: 100% (234/234), 42.73 KiB | 2.51 MiB/s, done.
Resolving deltas: 100% (116/116), done.
PS D:\Projects>

Porém ontem subiram no TESTS.md que o repositório não foi encontrado:
cannot clone repository 'unexpected http status code: 404'

Ai já não sei mais o que é, pois parece que agora nem encontrou nada no endereço http :(

Dúvida sobre Print(Print(x))

No Discord, eu levantei a dúvida de "O que acontece na chamada Print(Print(x))".

A resposta para esse pergunta é:
Uma chamada de print, além de printar o valor, retorna esse valor. Logo, um print(print(x)) deveria printar x duas vezes

O print não deveria ter um "next"?

Acredito que o print, assim como o let, deveria haver um "next" para o próximo comando. Se não, não poderíamos colocar mais de um print no código.

As funções anônimas podem criar closures que capturam referências?

Existe o termo closure no arquivo SPECS.md, então parece que as funções anônimas podem capturar variáveis ou seus valores.

Pergunta: as funções anônimas podem criar closures que capturam variáveis por referência? Ou só por valor definido por let?

Tomara que só por valor. ;)

Algumas dúvidas

Olá, pessoal, parabéns pela iniciativa! Aqui vão algumas notas do q tive dúvidas até o momento, q poderiam ser destacadas no spec:

  • closures sintáticas?
  • escopo sintático ou de função (a la Python)?
  • let de fn é sempre recursivo?
  • erros: let de variável existente, operação com tipos inválidos, etc.
  • shadowing de variáveis
  • exemplo de uso de cons no fib.json
  • Not não é Binary, qual o valor de lhs?

Aí sobre a linguagem Rinha:

  • sintaxe de escape em strings?
  • símbolos válidos?
  • sintaxe de lista?
  • precedência de operadores

Eu sei q só joguei tópicos, se algo n estiver claro eu escrevo melhor depois. Obrigado pela paciência

Ajuda para gerar novas AST

Pessoal, sou um pouco leigo com Rust (na verdade não sei absolutamente nada). Como faço pra gerar uma nova AST para um script teste meu?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.