Research
I am currently a first-year PhD student in the Computer Science program, advised by Prof. Sarah E. Chasins↗ as a part of PLAIT Lab↗.
My research seeks to offer concrete interventions at the intersection of computing and social justice. How can we build computing and programming tools that support marginalized communities' visions of resistance, self-determination, thriving, and joy?
Recent news
-
I became a fellow of the Computational Research for Equity in the Legal System (CRELS) ↗ training program.
-
I began as a Computer Science PhD student at UC Berkeley, supported under the Chancellor's Fellowship.
-
I received the Outstanding Undergraduate Researcher Finalist ↗ award from the Computing Research Association.
-
I presented my work on babble at POPL 2023.
Past projects
babble: Learning Better Abstractions with E-Graphs and Anti-Unification
David Cao*, Rose Kunkel*, Chandrakana Nandi, Max Willsey, Zachary Tatlock, Nadia Polikarpova
Published at POPL 2023
Humans are really good at library learning: finding common patterns in code and extracting them into a library of common abstractions. This problem has a bunch of use cases across FPGA design, program synthesis, and modeling human perception. So how can we get a computer to do this?
Building off of prior work in library learning and e-graphs, we contribute new algorithms for proposing candidate abstractions and choosing the best set. We improve on the prior state-of-the-art in compression and speed by several orders of magnitude!
Type-Directed Program Synthesis for RESTful APIs
Zheng Guo, David Cao, Davin Tjong, Jean Yang, Cole Schlesinger, Nadia Polikarpova
Published at PLDI 2022
Interacting with REST APIs can often be extremely unwieldy; APIs can have hundreds of methods, and may or may not be documented. We propose a system that can synthesize programs that call into REST APIs.
Automated Dependent Resource Analysis
David Cao, advised by Tristan Knoth and Nadia Polikarpova
Submitted to POPL 2021 SRC (2nd Prize)
When programming, it's useful to know the resource use of a program (in undergrad we take whole courses on this!). We contribute a system that can automatically infer resource bounds that can depend on the inputs of a program.