softperson

Automating creativity

Technology

Technology

A symbolic engine underneath a code analyzer.

The revival is centered on a reusable expression system that represents values, functions, state, types, assertions, and execution traces in one mathematical IR.

Engine architecture

01

Expression IR

Atoms, operators, lambdas, conditionals, types, members, and analysis facts share one representation.

02

Functional state

Reads and writes are modeled as state-transforming expressions, not destructive updates.

03

Method summaries

Methods become state, result, and type lambdas that can be reused by callers.

04

Simplifier

Local evaluation and global fact propagation normalize expressions and path assumptions.

05

Diagnostics

Assertions and execution markers are extracted from simplified symbolic state.

Design bet

Use denotational summaries where other tools stop at flow facts.

Branches become data.

Instead of losing precision to a single "unknown" value, conditional expressions can preserve alternatives until assumptions simplify them.

Loops become functions.

Loops and recursion are represented through lambdas, fixed points, and recurrence-like forms where the engine can reason about them.

Calls become reusable meaning.

Interprocedural analysis can use method summaries rather than only local syntax, while still falling back conservatively when precision is unavailable.

NStatic loop locals screenshot
Loop-created values and object identities can be expressed symbolically instead of flattened into unknowns.

Why it matters

Semantic diagnostics require semantic state.

To explain a warning, the analyzer must remember more than a line number. It needs symbolic values, path conditions, call context, and the state transformations that led to the issue.