3 pontos por GN⁺ 2024-03-04 | 1 comentários | Compartilhar no WhatsApp
  • Um currículo autoguiado que reúne vídeos de aulas, notas, leituras de artigos e tarefas de implementação para acompanhar on-line a disciplina de nível de doutorado CS 6120 da Cornell CS
  • Cobre desde temas centrais de compiladores, como representações intermediárias, fluxo de dados e otimizações “clássicas”, até paralelização, compilação JIT e coleta de lixo
  • As práticas usam LLVM e a IR educacional Bril, levando a tarefas de hacking open source em que conceitos abstratos são implementados diretamente
  • Na versão autoguiada, é possível ignorar os prazos das tarefas, mas não participar das discussões no Zulip nem do projeto de fim de semestre da turma real
  • O material está disponível como open source no GitHub, permitindo reportar problemas; após concluir, também é possível preencher um formulário de feedback

Como cursar e escopo abordado

  • CS 6120 é uma disciplina de implementação de linguagens de programação criada por Adrian Sampson, da Cornell CS
  • O escopo do curso inclui tanto fundamentos comuns da implementação de compiladores quanto temas voltados à pesquisa
    • Representações intermediárias
    • Fluxo de dados
    • Otimizações “clássicas”
    • Paralelização
    • Compilação JIT
    • Coleta de lixo
  • O aprendizado é conduzido por leitura de artigos e tarefas de hacking open source
    • As práticas usam LLVM e Bril, uma IR educacional usada na disciplina
  • O currículo autoguiado é organizado como se você estivesse cursando uma disciplina sem nota de 4 créditos em uma “universidade imaginária”
    • As aulas são organizadas em ordem linear
    • Cada lição tem vídeo e notas em texto
    • Algumas lições incluem tarefas de implementação
    • Há uma ordem recomendada que combina assistir aos vídeos e ler os artigos

Diferenças em relação à disciplina real

  • Quem cursa de forma autoguiada pode ignorar os prazos das tarefas
  • Não é possível participar das discussões no Zulip da turma real
  • A CS 6120 real tem um projeto de fim de semestre
    • A tarefa final da versão autoguiada é “mudar o mundo com a magia dos compiladores”
  • A qualidade de produção das aulas pode ser baixa, especialmente nas primeiras lições
  • O material da CS 6120 está disponível como open source no GitHub, e é possível reportar bugs ao encontrar problemas
  • Após concluir, é possível preencher o formulário de feedback

Lições e leituras

1 comentários

 
GN⁺ 2024-03-04
Comentários do Hacker News
  • Quando eu estava terminando a graduação e procurando meu primeiro emprego em tempo integral, este curso me ajudou a passar nas entrevistas das equipes de engenharia de compiladores da MANGA (Meta, Apple, NVIDIA, Google, Amazon)
    O currículo de sistemas de computação de baixo nível da University of Waterloo também era excelente, e eu também contribuía para projetos de compiladores open source, mas este curso realmente ajudou muito a responder às perguntas mais difíceis nas entrevistas

    • Não é “par excellent”, e sim par excellence, e essa construção da frase também soa estranha
      Para soar mais natural, algo como “my university has the low level computing systems curriculum par excellence” teria sido melhor
  • Antes de escrever compiladores, acho que primeiro é preciso entender arquitetura de computadores e saber o que o compilador deve gerar para produzir o código de máquina mais eficiente possível
    Mas, pela minha experiência, escolas e universidades parecem estar dando cada vez menos prioridade à arquitetura de computadores e até à programação de sistemas, provavelmente porque consideram isso técnico demais
    Ainda assim, esse conhecimento é muito importante para conseguir bons empregos na indústria

    • É verdade que as universidades estão reduzindo a prioridade de programação de sistemas, mas o motivo não é “ser técnico demais”
      O problema fundamental que percebi trabalhando com universidades é que há conteúdo demais em potencial para cobrir dentro do tempo limitado de aula
      A quantidade de informação que precisamos conhecer na nossa área cresce exponencialmente com o tempo e já passou do limite, então faz sentido que, no currículo geral, o tempo dedicado a programação de sistemas diminua porque isso se torna menos relevante para mais alunos a cada ano
    • Você pode explicar melhor o que quer dizer com bons empregos na indústria, e por que vê dessa forma?
    • Acho que um dos grandes avanços da indústria foi justamente permitir usar compiladores sem precisar desse nível de detalhe de baixo nível
      Ainda há muito trabalho a ser feito no nível de compiladores, mas uma parte considerável disso não deveria exigir atenção até o nível de microarquitetura do computador
    • Trabalho com GPU ainda exige bastante conhecimento de arquitetura de computadores e habilidades com compiladores
      Mesmo que não seja necessário estudar x86 ou MIPS, CUDA mostra uma arquitetura ainda mais estranha do que essas
    • Pela minha experiência, ninguém parece considerar detalhes de baixo nível como “técnicos demais”
      O motivo habitual para não enfatizar conteúdo de baixo nível é que ele varia conforme a implementação, envelhece rápido e é difícil de generalizar
      Além disso, eu tendo a não me dar bem com o tipo “programador de sistemas”, porque às vezes essas pessoas fazem desse conhecimento extremamente específico toda a sua identidade profissional, e aí aparecem pessoas que sabem usar assembly mas não sabem o que é um funtor
  • Parece não haver bons materiais acadêmicos que tratem otimização avançada de compiladores em profundidade
    Procurei bastante, mas a maioria dos cursos é introdutória, e fiquei bem surpreso ao perceber que, para as técnicas realmente interessantes, é preciso mergulhar fundo no código-fonte de compiladores open source populares

    • A maioria dos cursos acadêmicos parece focar demais em parsing e ensina o resto só superficialmente
  • Acho que compiladores são uma das áreas que não evoluíram muito ao longo de uns 30 anos
    Quando eu dava aulas na Perugia University entre 2004 e 2006, conseguia usar sem problemas materiais de 15 a 25 anos antes
    Ultimamente, parece que isso mudou

    • Isso não é verdade
      Só de coisas que você poderia ter ensinado como novidade em 2004–2006, mas provavelmente não ensinou, dá para citar construção de SSA, vetorização SLP e superotimização automática de peephole, e isso foi só o que me veio à cabeça na hora
      O que não mudou foram os livros didáticos de compiladores. Eles focam demais em como construir geradores de parser e quase não cobrem como projetar compiladores de verdade, sem falar em projeto de arquitetura de computadores moderna. Essa reclamação já existe há décadas
    • Não concordo
      Nos últimos 10 anos, o cenário evoluiu bastante na direção de técnicas de compilação incremental
      Os avanços teóricos podem ter ficado presos em parsers, mas as implementações reais se aplicam ao pipeline inteiro, até otimização global de programa e geração de código
    • Desde então, teste de compiladores mudou bastante, e testes aleatórios em larga escala viraram moda
    • Não sou especialista em projeto ou implementação de compiladores, mas me parece que a linguagem de máquina e o assembly que os compiladores têm como alvo mudaram bastante com o tempo
      A cada nova geração de processadores surgem mais instruções e opções, o que parece criar novas otimizações e combinações que os compiladores podem explorar
    • Provavelmente porque a maioria das linguagens de programação não mudou tanto em aspectos como modelo imperativo, laços e efeitos colaterais amplos
      Para escrever compiladores para linguagens puramente funcionais, com certeza seria preciso material mais novo
  • Fico feliz que existam cursos assim
    Agora posso acompanhar temas avançados no meu próprio ritmo
    Sempre quis uma carreira como engenheiro de compiladores, mas onde eu moro não há muitas oportunidades de formação e trabalho
    Quando olho para os Estados Unidos, a concorrência no mercado de contratação parece esmagadoramente intensa e, sinceramente, não sei como entrar nessa área
    A única experiência que tenho é uma disciplina que fiz na graduação, mas o curso todo foi excelente

    • Esta área tem uma curva de aprendizado brutal que muita gente não consegue superar
      Acho que isso acontece porque você precisa escrever código que manipula outro código, e normalmente a semântica e os objetivos de funcionamento são bem diferentes. Além disso, há muito conhecimento oral e muito ruído
      Por isso, equipes de compiladores tendem a preferir especialmente pessoas que já fazem compiladores há muito tempo. Mas, claro, existe o problema do bootstrap, então equipes grandes também contratam recém-formados que parecem ter potencial para vencer essa curva, e foi mais ou menos assim que eu entrei
      Se você tem experiência profissional geral, mas não experiência com compiladores, uma estratégia clara é entrar em alguma empresa que faça coisas com as quais você já esteja familiarizado e que também tenha uma equipe de compiladores, algo como uma “empresa de software relativamente grande”, e tentar uma mobilidade interna lateral
  • É bom ver que “A Unified Theory of Garbage Collection” também está incluído
    Pelo menos esses alunos vão entender direito a diferença entre contagem de referências e coleta de lixo por rastreamento

  • Se “CS 6120 é uma disciplina de nível de doutorado em Ciência da Computação de Cornell sobre implementação de linguagens de programação, ministrada por Adrian Sampson”, então é um curso bem avançado?
    Não acho que eu tenha nível de doutorado em ciência da computação

    • É melhor não medir o preparo por etapas tradicionais de formação acadêmica
      Basta tentar; se você conseguir, está preparado, e se não conseguir, ainda não está
    • Ser de doutorado não significa que seja mais difícil que uma disciplina de graduação
      É só tentar
  • Ainda parece, em linhas gerais, bastante parecido com o que era coberto em um curso geral de construção de compiladores dado por Gerhard Goos há 20 anos
    Como também há links para artigos mais recentes, talvez valha a pena dar uma olhada
    Eu gostava do livro Advanced Compiler Design and Implementation, de Steven Muchnick
    Faz 18 anos que não olho código-fonte de compiladores, então sinto que já não acompanho especialmente a parte de profiling e otimização baseada em caminhos, e olhando para aprendizado de máquina hoje em dia imagino que também haja muito mais conteúdo avançado relacionado a SIMD

  • Acompanhei este curso online durante um verão alguns anos atrás e aprendi muito
    EnvieI um PR para um pequeno problema no Bril IR, e o processo de corrigir isso junto com o professor foi muito envolvente

  • Fico curioso se existe alguma disciplina prévia para este curso