Chen, Xiao 陈骁

Ph.D. Student in Computer Science

I am Chen, Xiao (陈骁), a Ph.D. student in Computer Science at Indiana University Bloomington, advised by Prof. Sam Tobin-Hochstadt.

My research in programming languages asks how expressive type systems can provide reliable guarantees within gradual typing systems, i.e., when typed and untyped code interact. In particular, I study migratory typing—the interoperability of typed and untyped modules—through language design, operational semantics, and formalized proofs. I am especially interested in connecting the guarantees a type system promises with the runtime mechanisms that enforce them.

My current work approaches this question from two directions. Type as Obligations studies how values should respect their typing histories and how those histories can guide blame assignment. Effect-Typed-Racket explores effect typing and runtime enforcement for algebraic effect handlers in Typed Racket. Looking ahead, I am interested in substructural types and the challenges of enforcing resource constraints across typed–untyped boundaries.

Ph.D. Opportunities — 2027 Entry

I am currently on leave from IU due to prolonged U.S. visa processing delays. I am applying for Ph.D. opportunities outside the United States for 2027 entry, with the aim of continuing and building on my existing research.

I would welcome the opportunity to discuss research fit and potential supervision with faculty working on type systems, effect handlers, or formal verification.

I received my M.S. in Computer Science from Northwestern University in 2024, where I worked with Prof. Christos Dimoulas on gradual typing and Prof. Simone Campanoni on program analysis and parallelizing compilers.

Interests
  • Programming Languages
  • Gradual Typing
  • Effect Handlers
  • Formal Verification

Ongoing Research Projects

My research in programming languages connects formal semantics with language implementation. I study how types and effects govern interactions between typed and untyped code, using operational models, runtime contracts, and formalized proofs to understand the guarantees these interactions provide.

Type as Obligations

Migratory Typing · Interoperability · Type Obligations · Blame Theorems · Bisimulation · Vigilance · Formal Verification

Formalized Rocq proofs complete; manuscript in preparation.

When typed and untyped modules interact, runtime enforcements must determine which type requirements to preserve and which boundaries to blame when those requirements fail. Different strategies use contracts, merge casts, or insert shallow checks, making their guarantees difficult to compare. Type soundness alone does not capture whether a value respects its typing history, i.e., every type requirement it encounters during execution.

Type as Obligations (TAO) makes these requirements explicit. Given an ordinary semantics, TAO will mechanically construct a corresponding profiler semantics. In addition to ordinary computation steps, the profiler semantics records each value’s typing history as type obligations, including their boundary origins, and propagates them through function calls and pair projections. This separates the requirements imposed by types from the runtime strategies to enforce them, giving different semantics a common basis for analysis.

My contributions connect this runtime profiling to formal guarantees:

  • Mechanical profiler semantics with evaluation correspondence. For any ordinary semantics, TAO mechanically constructs the corresponding profiler semantics by intercepting reduction steps, inserting profiling commands at appropriate points, and delegating the computational reductions back to the ordinary semantics. I prove a bidirectional correspondence between the ordinary and profiler evaluations.
  • A stronger enforcement criterion. I define obligation soundness and prove that it implies type soundness, but not conversely: returning a correctly typed result does not ensure that every accumulated obligation was respected.
  • Obligation-based blame criteria. The framework defines blame soundness and completeness using violated obligations and their boundary provenance as the reference for blame assignment.

I have applied these definitions to modeled versions of Natural, Threesomes, Forgetful, and Transient, proving positive results and exhibiting counterexamples. The framework, metatheory, and counterexamples are formalized in Rocq/Coq, with an executable Racket/Redex model. This comparison makes differences in enforcement and blame explicit and their causes inspectable through execution.

Read the detailed research description

Migratory Typing for Algebraic Effects and Handlers

Migratory Typing · Interoperability · Effect Handlers · Typed Racket · Runtime Contracts

Prototype implemented; formal semantics and proofs in progress.

An effect system describes which operations may escape a computation and require handling by its surrounding context. This guarantee becomes difficult to preserve when typed and untyped modules interact. An untyped function can return a correctly typed value while performing an unexpected effect, and a request may cross several calls and module boundaries before reaching a handler.

Effect-Typed-Racket investigates this problem by extending Typed Racket with polymorphic algebraic effect handlers, effect typing, and runtime contracts. The central idea is to enforce effect specifications by monitoring the requests that escape protected computations. The implementation connects source-level effect information to runtime checks built using Racket’s delimited continuations.

My contributions connect source-level effect specifications to runtime enforcement:

  • Effect typing within Typed Racket. Function types describe the effects of calls; handler types describe handled operations, result types, and remaining effects. I integrate this information into higher-order calls, polymorphic instantiation, and module imports, allowing effectful programs to use Typed Racket’s existing language infrastructure.
  • Contracts for escaping effects. A function contracted to allow only read is rejected if a write request escapes its execution, even if an outer handler could handle it. An operation handled entirely inside the function does not violate its external effect allowance. These reusable contracts separately check effect allowances and the values exchanged through operations and handlers; Typed Racket generates them from boundary types.
  • Effect identity across modules. I associate effect declarations’ static information with their lexical bindings, so the type checker and runtime handlers recognize the same operations across renamed imports and re-exports. This allows effectful components to be organized and reused through ordinary module interfaces.
  • Effect-row polymorphism across typed–untyped boundaries. A higher-order function can accommodate callbacks with different effects, such as reading input or writing a log. The prototype supports explicit row instantiation and contracts that check the concrete effect allowance selected at each instantiation.

The prototype has been implemented. I am developing a high-level calculus for typed–untyped interaction with effect handlers and a lower-level calculus exposing the implementation’s continuation and contract mechanisms. The intended results are type-and-effect soundness and a behavioral correspondence between the two levels, connecting source-level guarantees to the executable implementation.

Read the detailed research description

Past Research Activities

Parallelizing compilersShow detailsHide details

Program analysis · NOELLE

Previously, under the supervision of Prof. Simone Campanoni, I worked on a privatizer as part of the NOELLE project. NOELLE is a parallelizing compiler that maps sequential programs to multicore platforms to achieve nontrivial speedups.

The privatizer converts dynamic memory allocations and global variables into local variables while preserving program semantics. Local variables are more predictable than dynamically allocated memory and global variables: other functions may access that memory or those global variables even after the current function returns, making their behavior difficult to analyze. The privatizer can therefore reduce false dependencies caused by global variables and help downstream analyses identify more parallelization opportunities.

The key idea is to check that each function uses a global variable independently. Only then can we privatize the variable within the functions that use it without changing program semantics. Functions can access global variables directly by name or indirectly through pointers; our implementation must handle both cases.

For direct access, the privatizer checks that functions accessing the same global variable do not depend on values written by other functions. Each function that uses the variable must initialize it before reading its value and must not invoke other functions that use it, since those calls could change its value. For indirect access, I helped design and implement a new intraprocedural points-to analysis that checks that values written by the current function do not leak to other functions.

This work helps remove overly conservative loop-carried memory dependencies from the program dependence graph, enabling further optimizations. For example, on a loop-intensive MiBench benchmark for which NOELLE previously achieved no speedup, the privatizer enabled roughly a threefold speedup on an eight-core architecture.

Academic background

Indiana University Bloomington

Ph.D. in Computer Science

Bloomington, IN, US

Sep. 2024 - Present

Northwestern University

M.S. in Computer Science

Evanston, IL, US

Sep. 2022 - Jun. 2024

Nanjing University

M.Eng. in Electronic Information

Nanjing, Jiangsu, China

Sep. 2020 - Jun. 2022

Nanjing University

B.Eng. in Software Engineering

Nanjing, Jiangsu, China

Sep. 2016 - Jun. 2020

Misc

  • I hold a 🇯🇵 JLPT N1 certificate and have recently started learning 🇫🇷 French. 🤓
  • I have started building my own functional language, Lumière, with two intermediate representations (IRs) tentatively named Fresnel and Poisson. 🤣
  • Together with my friends, I formalized System F in Agda and proved its type soundness. 😎