Atualizando o livro mais influente da era BASIC
Neste post, apresento o projeto de atualização do livro BASIC Computer Games para novas linguagens de programação, falo sobre como participar, e compartilho um pouco da minha experiência portando o jogo Life para C#.

BASIC Computer Games é considerado um dos livros mais influentes da sua época. Foi o primeiro livro de programação a vender mais de 1 milhão de cópias e houve uma época em que havia mais cópias do livro distribuídos em bibliotecas do que computadores capazes de rodar BASIC.
Nas décadas de 1970 e 1980, revistas de programação traziam uma série de programas impressos, que precisavam então ser digitados num computador para rodar. Era um conceito bem interessante DIY gaming.

#O Projeto
Os jogos do livro estão agora sendo atualizados para linguagens de programação modernas, de modo a preservar uma parte da história da computação e torná-los mais acessíveis. Isso está sendo feito através de um projeto open source organizado pelo Jeff Atwood, co-fundador do StackOverflow, e apresentado em detalhes no post Updating The Single Most Influential Book of the BASIC Era.
O artigo é super interessante, e traz um contexto histórico muito rico para o projeto. Como é um projeto open source, você também pode contribuir.
#Como contribuir
Os jogos estão sendo atualizados para as linguagens no topo do índice TIOBE Fevereiro 2021 que são consideradas memory safe e de script de propósito geral:
- Java
- Python
- C#
- VB.NET
- JavaScript
- Ruby
- Delphi / Object Pascal
- Perl
Se você conhece alguma dessas linguagens, pode contribuir também. Imagino que algumas outras linguagens podem ser aceitas, mas teria que perguntar (é um projeto de código aberto, afinal).
#Escolhendo um jogo para portar
A primeira coisa que você precisa fazer (depois de ler o artigo, é claro) é acessar o repositório e identificar algum jogo que não tenha sido portado para uma linguagem que você domina.
No meu caso, escolhi portar para C# o jogo 55 da lista, Life.
Por sorte, não vai ser necessário transcrever o código em BASIC a partir da revista, pois isso já foi feito. Aliás, o conteúdo do livro pode ser encontrado no site Atari Archives, e o livro pode ser baixado na íntegra aqui.
A próxima etapa é preparar o ambiente local.
#Preparando o ambiente BASIC
Por volta de 2009, Lyle Kopnicky normalizou todo o código para o Vintage BASIC. Isso facilita nossa vida, pois a ferramenta é fácil de instalar e rodar no Windows, Linux e MacOS.
O Vintage BASIC é um interpretador de BASIC implementado em Haskell e apresenta comportamento semelhante ao BASIC do Commodore 64.
No site do projeto, há um Guia de Usuário bem completo, e que pode ser lido em cerca de uma hora.
Uma vez instalado, você pode rodar um programa em BASIC no seu terminal desta forma: vintbas myprogram.bas
.
#Fork do projeto
Para contribuir com o projeto, você terá primeiro que bifurcar (criar um fork) o repositório do projeto no GitHub.
Se você é novo no mundo dos projetos open source, a documentação do GitHub mostra em detalhes como bifurcar um repositório.
#Convertendo para outra linguagem
Essa é a parte divertida, e é com você. É importante lembrar no entanto que se trata de um porte, e não simplesmente de uma nova versão. Então é importante buscar reproduzir com grande fidelidade o comportamento do original.
Para testar o seu porte, você pode abrir dois terminais: no primeiro, você roda o jogo original usando o Vintage BASIC; no segundo o seu. Se estiver tudo certinho, o resultado deveria ser o mesmo.
#Pull Request
Quando você estiver satisfeito com o porte, basta abrir um Pull Request para o repositório original. Eu acabei abrindo dois, porque encontrei alguns bugs na primeira implementação.
#Minha contribuição: Life em C#
Escolhi o jogo 55 do livro, chamado LIFE, e decidi portá-lo para C#. Dediquei aproximadamente um dia e meio das minhas férias para o porte. Isso incluiu estudar BASIC, entender o programa original, escrever meu porte e corrigir um monte de bugs.
#Por que escolhi Life para portar
Escolhi especificamente Life pois já admirava. Conhecido como Conway's Game of Life, trata-se de uma simulação com autômatos celulares criada por John Conway em 1970. A partir de um conjunto de regras simples, comportamentos complexos emergem. Mais tarde, Stephen Wolfram estudou mais a fundo os autômatos celulares, publicando uma série de artigos que culminaram na escrita do livro A New Kind of Science, publicado em 2002.
Mais recentemente, Stephen Wolfram tem trabalhado num modelo unificado da física que tem suas raízes nesses mesmos conceitos. A teoria propõe um modelo computacional do universo, e você pode ver mais sobre ela aqui.

Caso tenha batido a curiosidade e o seu inglês estiver bom, pode conhecer mais sobre o projeto no podcast do Lex Fridman:
- #234 - Stephen Wolfram - Cellular Automata, Computation, and Physics
- #124 - Stephen Wolfram - Fundamental Theory of Physics
- #89 - Stephen Wolfram - Complexity and the Fabric of Reality
#O processo de portar o jogo para C#
Portar Life para C# foi mais divertido do que eu esperava. A maior dificuldade do projeto foi tornar a simulação do porte fiel à do original.
Como BASIC é uma linguagem cujos arrays são indexados em 1, ao invés de 0, como Java ou C#, o programa original tinha vários valores hard-coded que complicaram a conversão. Alguns erros ao ajustar os índices levaram a diferenças sutis na simulação após algumas dezenas de iterações.
Devido à alterações que tive que fazer na indexação, a primeira implementação funcionava, mas só até alguma célula atingir as bordas da simulação. A partir daí, a simulação do porte evoluía de forma complementamente diferente da original.
Depois de algumas horas de testes, consegui finalmente corrigir e chegar a um resultado satisfatório:
O código você encontra aqui.