Supported Languages
Backbuild Prove verifies pf2 annotations across 20+ programming languages. The same proof format works everywhere; only the comment syntax differs. The launch language set is grouped by category below, with specialized domains (Solidity, CUDA/OpenCL, advanced SQL) available as add-ons.
After this page you will know whether your stack is covered, which comment syntax to use, how many languages your plan includes, and what is available as an add-on.
Backbuild Prove is launching soon. The language set, tiers, and add-ons below are the launch plan. See the pricing page for current plans and any add-on pricing.
Launch Language Set
All of the following are part of the launch language set. They use the same pf2 annotation format with language-appropriate comment syntax; only the comment delimiters differ.
Systems & Native
| Language | File Extensions | Comment Syntax |
|---|---|---|
| Rust | .rs | /// ... or /* ... */ |
| C | .c, .h | /* ... */ |
| C++ | .cpp, .hpp, .cc, .cxx, .hxx, .hh | /* ... */ |
| Objective-C | .m, .mm | /* ... */ or // ... |
| Go | .go | /* ... */ |
| Swift | .swift | /* ... */ |
| Ada | .ada, .adb, .ads | -- ... (line prefix) |
Web & Application
| Language | File Extensions | Comment Syntax |
|---|---|---|
| TypeScript | .ts, .tsx, .mts, .cts | /** ... */ |
| JavaScript | .js, .jsx, .mjs, .cjs | /** ... */ |
| Python | .py, .pyi | # ... (line prefix) |
| Dart | .dart | /// ... or /* ... */ |
Enterprise & JVM
| Language | File Extensions | Comment Syntax |
|---|---|---|
| Java | .java | /** ... */ (Javadoc) |
| Kotlin | .kt, .kts | /** ... */ (KDoc) |
| C# | .cs | /* ... */ |
Functional & Data
| Language | File Extensions | Comment Syntax |
|---|---|---|
| Haskell | .hs, .lhs | {- ... -} or -- ... |
| SQL | .sql, .psql, .plsql, .tsql | -- ... (line prefix) |
| Lua | .lua | -- ... (line prefix) |
Low-Level
| Language | File Extensions | Comment Syntax |
|---|---|---|
| x86_64 Assembly (GAS / AT&T) | .s, .S | # ... (line prefix) |
| x86_64 Assembly (NASM) | .asm | ; ... (line prefix) |
| ARM64 Assembly | .s, .S | // ... or /* ... */ |
| WebAssembly | .wat, .wast | ;; ... (line prefix) |
Specialized Add-ons
Some domains are available as specialized add-ons on top of your plan’s proof languages. They use the same pf2 format and verification pipeline. See the pricing page for add-on details.
| Add-on | File Extensions | Comment Syntax |
|---|---|---|
| SQL (advanced compliance) | .sql | -- ... (line prefix) |
| Solidity | .sol | /** ... */ or // ... |
| CUDA | .cu, .cuh | /* ... */ |
| OpenCL | .cl | /* ... */ |
Tier Limits
The number of proof languages included in your subscription depends on your plan tier. See the pricing page for current plans and any add-on details.
| Plan | Included Languages |
|---|---|
| Pro | 2 languages |
| Team | 4 languages |
| Business | 10 languages |
| Enterprise | All languages included |
Add-on: SQL Verification
SQL verification is available as a separate add-on with tier-specific pricing. SQL annotations verify stored procedures, queries, and schema constraints using the same pf2 format. See the pricing page for current add-on details.
Enterprise SQL includes formal proof printouts suitable for compliance audits. These machine-verified documents provide evidence for:
- PCI DSS: data access control and query integrity
- SOC 2: logical access controls over data
- ISO 27001: information access restriction
- HIPAA: access control and audit controls
Language-Specific Examples
Rust
Rust uses doc comments (///) or block comments
(/* ... */). Place the annotation directly above the
function:
/// prove:pf2("max_returns_larger")
/// \[
/// \begin{pre}
/// a : \mathbb{N} \land b : \mathbb{N}
/// \end{pre}
/// \begin{proof}
/// \step{1}{ a \geq b \Rightarrow \text{result} = a }
/// \pf\ By first branch.
/// \step{2}{ a < b \Rightarrow \text{result} = b }
/// \pf\ By second branch.
/// \step{3}{ \text{result} \geq a
/// \land \text{result} \geq b }
/// \pf\ By \stepref{1} and \stepref{2}.
/// \qedstep
/// \pf\ By \stepref{3}.
/// \end{proof}
/// \]
fn max_of(a: u64, b: u64) -> u64 {
if a >= b { a } else { b }
} TypeScript
TypeScript uses JSDoc-style block comments. The annotation works in
both .ts and .tsx files:
/** prove:pf2("clamp_bounded")
\[
\begin{pre}
\text{min} \leq \text{max}
\end{pre}
\begin{proof}
\step{1}{ v < \text{min}
\Rightarrow \text{result} = \text{min} }
\pf\ By Math.max branch.
\step{2}{ v > \text{max}
\Rightarrow \text{result} = \text{max} }
\pf\ By Math.min branch.
\step{3}{ \text{min} \leq \text{result}
\leq \text{max} }
\pf\ By \stepref{1} and \stepref{2}.
\qedstep
\pf\ By \stepref{3}.
\end{proof}
\]
*/
function clamp(v: number, min: number, max: number): number {
return Math.min(Math.max(v, min), max);
} Python
Python uses # line comments. Place the annotation on
consecutive comment lines directly above the function:
# prove:pf2("factorial_positive")
# \[
# \begin{pre}
# n : \mathbb{N}
# \end{pre}
# \begin{proof}
# \step{1}{ \text{factorial}(0) = 1 > 0 }
# \pf\ By base case.
# \step{2}{ \text{factorial}(n) > 0
# \Rightarrow \text{factorial}(n+1)
# = (n+1) \cdot \text{factorial}(n) > 0 }
# \pf\ By inductive step: product of positives is positive.
# \qedstep
# \pf\ By induction, \stepref{1} and \stepref{2}.
# \end{proof}
# \]
def factorial(n: int) -> int:
if n == 0:
return 1
return n * factorial(n - 1) Is my stack covered?
The launch set above spans systems and native, web and application,
enterprise and JVM, functional and data, and low-level languages, all
using the same pf2 format. Every listed language shares one proof format and one kernel;
only the comment syntax changes. Specialized domains (Solidity,
CUDA/OpenCL, advanced SQL) are add-ons.
How many languages do I get, and can I change them?
Pro includes 2 proof languages, Team 4, Business 10, and Enterprise all
of them. On Pro and Team, swapping an included language slot is subject to
a 30-day cooldown; adding a language as a paid add-on has no cooldown. See
the pricing page.
What if a specific construct in my language cannot be translated?
You cite that boundary as an explicit assumption in the annotation and
prove everything built on it; the kernel still checks those steps. This is
the same escape hatch described under Documenting External
Dependencies.
Next Steps
- Writing pf2 Annotations: full syntax reference and the LaTeX sections
- Pre/Post Contracts: precondition and postcondition details
- Governance Proofs: project-wide verification across every call site
- Editor Extensions: editor integration for all supported languages