In the winter term 2024/25, we launched the first edition of Build Your Own Programming Language (BYOPL), a university course in which 20 students implemented a full dynamic language on top of the Truffle/GraalVM platform. Using a provided Lox-based baseline and working with the recently introduced Truffle Bytecode DSL, students developed bytecode-interpreted runtimes supporting expressions, control flow, functions, closures, objects, inheritance, and tooling support.

The course was structured around weekly lectures and development milestones, with all source code published and extended incrementally. This structure made it easy for students to follow along, yet integrating all components into a coherent and performant runtime proved challenging. Despite this, engagement remained high throughout the course. Students tackled optional weekly bonus challenges—often involving complex language or runtime features—and all participants completed the final project.

To evaluate implementations, we adapted a subset of the Are We Fast Yet? benchmarks, requiring some practical extensions to the Lox language. The course concluded with a benchmark-based shootout and individual oral exams, where students were interviewed about their own codebases to assess their understanding beyond copy-paste development. One of the key takeaways was that, although all students had access to the same reference implementations and were introduced to debugging and visualization tools, the final performance of their interpreters varied significantly. This variance revealed much about how subtle design and implementation choices affect runtime behavior—even within a shared framework like Truffle. In this talk, we’ll present the technical structure of the course, the architectural decisions behind the runtime, and what we learned about dynamic language implementation through observing a dozen independent Truffle-based interpreters evolve in parallel.