Alvin Zhang
Email: a224zhan@uwaterloo.ca
LinkedIn: Alvin Zhang
Personal github: SaltOverflow
Personal blog (check here for updates on my research): SaltOverflow.github.io
Currently studying a Master's in Computer Science at the University of Waterloo. Studying programming languages under the supervision of Prof. Peter Buhr. Current research involves researching and building a module system for the Cforall compiler.
Programming languages are interesting to me because they are "tools for tools" - how they are designed and the tools/libraries available to them have large implications on their performance, flexibility and maintainability, including in ways that may not seem obvious at first glance. A couple of mantras I follow when designing these systems:
- Don't Fight The Syntax: If I know the semantics of the program I want to write, I shouldn't be struggling to figure out how to express it in a given programming language. The way code executes on a computer is fairly simple, so I argue that programming constructs should also be simple to understand.
- State What You Want: Writing excessive boilerplate for a program is annoying. Ideally, we should be able to specify only the core details of a program, then build on top of that.
- See What Is Running: A large part of programming is maintainance and debugging. As such, it is important to consider the usability of debuggers, tracers, testers, REPLs, etc. as being core parts of a programming language.
- It's about the journey: Programming languages support development. As such, they shouldn't be overly structured to the point of stifling development. It's all a careful balance between managing chaos and promoting creativity.
A couple of research directions I'm working on:
- Interoperation between programming languages: For example, pybind allows us to call C++11 code from Python. However, how would an interface between, say, Java and Python work? Would changes to the programming languages themselves have to be made?
- Transpilers: How difficult is it to translate a program written in one programming lanuage into an equivalent program in another? (spoiler: really hard) However, if we consider smaller code blocks of a program which don't use complex programming language constructs, this could be feasible. This has close ties to JIT compiler research.
- "Better" syntax structures for languages: "Better" is oftentimes subjective, but I'd like to experiment with trying out different syntax structures for languages, such as removing semicolons and {}. Perhaps I can come up with a format that makes it easier to reason about C++ templates.
- More autocomplete capabilities: Autocomplete promises to completely change the way we can code. Not only can we autocomplete variable names and types, but we can also set up macro templates and other language-aware transformations. GenAI tools like Copilot are also interesting tools to research.
- Tooling and other accessory programs: As stated in my mantra "See What Is Running," programming languages are so much more than just the compiler nowadays. It's the entire ecosystem of tools that a developer uses that makes up a successful programming language nowadays.
Some of my current work:
- Unordered SQL: SQL, but let programmers write their SELECT, FROM and WHERE clauses in any order, even allowing multiple of them in the same statement. I wrote an initial blog post, then later gave a presentation at ONPLS 2025 (slides).
- Cforall modules: Like C++, Cforall extends the C programming language. We try to keep the language similar to the C style of doing things, instead of imposing an Object-Oriented paradigm. With our modules, we show that it is indeed possible to treat .c/.h files as modules, offering C programmers a way to incrementally upgrade their codebases to a more modern, modular system. Development is currently at the proposal stage (link to proposal).