Code Monkey home page Code Monkey logo

rinha-de-compiler-csharp's Introduction

Apresentação

Olá! Segue a minha implementação em C# (.NET 7) de um interpretador da Árvore Sintática Abstrata (AST) da linguagem Rinha.

Busquei implementar da forma mais simples e direta sem explorar maiores recursos disponíveis da linguagem C# (como classes) por uma questão puramente de performance.

O container da aplicação foi montado utilizando a versão do Runtime 7.0, com o Alpine Linux, o que resultou em uma imagem com apenas 85MB.

A stack padrão do runtime 7.0 do .NET além de ocupar mais espaço em disco (190MB) utiliza uma versão do Debian que, no momento em que fiz o test, informava no Docker existem 27 vulnerabilidades em pacotes presentes nesta distro.

Como testar

Utilize o comando abaixo para gerar a imagem Docker:

docker build -t rinha-compiladores-csharp -f Dockerfile .

Utilize o comando docker run como mostrado a seguir para criar e rodar o container. O parâmetro --rm exclui o container ao final da execução. As quatro AST disponibilizadas de exemplo foram incluídas por padrão dentro do Container de modo a facilitar os testes. Basta informar o nome do arquivo json durante a chamada.

docker run -it --rm rinha-compiladores-csharp files/fib.json

Uma mensagem no Console indicará o output do programa e o tempo de execução. Abaixo o output de execução do algoritmo que calcula a sequencia de Fibonacci para N=50 usando uma técnica de programação dinâmica para otimização do tempo de execução. Com a técnica o tempo de execução permaneceu linear no hardware de teste para N=10 e N=50.

12586269025
Tempo de Execução: 00:00:00.1370608

vvvv post original abaixo: vvvv

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.

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-csharp's People

Contributors

the-sofi-uwu avatar gldmelo avatar aripiprazole avatar rwillians avatar brunokim avatar iaze avatar lucasnlm avatar dhrleandro avatar jeffque avatar edusporto avatar olordecoelho avatar cleissonbarbosa avatar antoniogomes94 avatar adilsxn avatar mateuxlucax avatar ry-diffusion avatar paulo-paes avatar paulllo-victor avatar pedrofnseca avatar ricardopieper avatar reu avatar rodrigocam avatar rcovery avatar samueldurantes avatar samuelhaidu avatar sbalmt avatar rosaulisses avatar yagocrispim avatar yazaldefilimone avatar yuriwithowsky avatar

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.