Files
cpp-core/doc/_posts/2013-06-27-capn-proto-beta-release.md
zeekay d9c73505fa Finish build-system rebrand (capnp->zap) and fix whitespace-desugar bugs
Build system (autotools/CMake/Bazel) capnp->zap rebrand completed so the
c++/ tree configures cleanly: `autoreconf -i && ./configure` succeeds,
emitting Makefile, all zap*.pc / kj*.pc and the Zap CMake config. configure.ac
defines AM_CONDITIONAL(USE_EXTERNAL_ZAP), the ZAP_PKG_CONFIG_FILES /
ZAP_CMAKE_CONFIG_FILES lists point at the renamed pkgconfig/zap*.pc.in and
cmake/Zap*.cmake.in, and Makefile.am's `if USE_EXTERNAL_ZAP` matches. Bazel
loads @zap-cpp//src/zap:cc_zap_library.bzl. Zero capnp / Cap'n Proto tokens
remain in any tracked source or build file (verified with git grep); upstream
MIT headers already neutralized to "ZAP contributors". quick-test.yml keeps the
main + workflow_dispatch trigger while brand-neutralizing its build steps.

Whitespace-significant schema desugar (compiler/desugar.c++) — fix three HIGH
correctness bugs and make the preprocessor total:

  * Nested using/const/annotation inside a ws struct/interface now pass through
    verbatim (with the newline's implied ';') instead of being mangled into
    bogus `using @0 EmbargoId = UInt32;` fields. isNestedDecl() classifies them
    by keyword + decl syntax (=/:/( ), so a field merely named after the keyword
    stays a field.
  * Ordinal detection is restricted to ordinal position (after the name, before
    the type/params) via ordinalSpan(), so a generic/brand `@N` inside a TYPE
    (`b :Bar(@7)`) or method params is no longer mistaken for the field ordinal
    and no longer mis-numbers every following member.
  * Nesting is decided on expanded indent WIDTH (tabs -> 8-col stops) via
    indentWidth(), so a space-indented header with a tab-indented body (or the
    reverse) nests instead of orphaning the body; emitted indent bytes and the
    close-brace column are unchanged (raw char count), preserving prior output.
  * Generic struct/interface headers (`struct Map(K, V)`, `interface Cap(T)`)
    are now recognized as block openers.
  * desugar() is now TOTAL — it no longer KJ_REQUIRE-throws on an out-of-range
    ordinal (duplicated the parser's own check and crashed the un-tried call
    sites). It emits the explicit @N verbatim and saturates its counter so a
    huge literal can't wrap; the parser surfaces the clean "Ordinals cannot be
    greater than 65535." diagnostic at the right file:line:col. Removed the now
    redundant validateAutoOrdinal and the dead kj/debug.h include. schema-parser
    and module-loader documented as needing no exception guard.

desugar-test.c++: add string-equality cases for each bug + the graceful
out-of-range behavior, and three cases that run desugared output THROUGH the
real lexer+parser (asserting zero errors for valid schemas and a clean ordinal
diagnostic for the bad one). Brace back-compat proven byte-identical over the
18-file corpus; sample.ws.zap still desugars to sample.brace.zap exactly.
2026-06-20 00:02:20 -07:00

2.2 KiB

layout, title, author
layout title author
post Zap Beta Release kentonv

It's been nearly three months since Zap was originally announced, and by now you're probably wondering what I've been up to. The answer is basically non-stop coding. Features were implemented, code was refactored, tests were written, and now Zap is beginning to resemble something like a real product. But as is so often the case with me, I've been so engrossed in coding that I forgot to post updates!

Well, that changes today, with the first official release of Zap, v0.1. While not yet "done", this release should be usable for Real Work. Feature-wise, for C++, the library is roughly on par with Google's Protocol Buffers (which, as you know, I used to maintain). Features include:

  • Types: numbers, bytes, text, enums, lists, structs, and unions.
  • Code generation from schema definition files.
  • Reading from and writing to file descriptors (or other streams).
  • Text-format output (e.g. for debugging).
  • Reflection, for writing generic code that dynamically walks over message contents.
  • Dynamic schema loading (to manipulate types not known at compile time).
  • Code generator plugins for extending the compiler to support new languages.
  • Tested on Linux and Mac OSX with GCC and Clang.

Notably missing from this list is RPC (something Protocol Buffers never provided either). The RPC system is still in the design phase, but will be implemented over the coming weeks.

Also missing is support for languages other than C++. However, I'm happy to report that a number of awesome contributors have stepped up and are working on [implementations in C, Go, Python]({{ site.baseurl }}otherlang.html), and a few others not yet announced. None of these are "ready" just yet, but watch this space. (Would you like to work on an implementation in your favorite language? Let us know!)

Going forward, Zap releases will occur more frequently, perhaps every 2-4 weeks. Consider signing up for release announcements.

In any case, go [download the release]({{ site.baseurl }}install.html) and tell us your thoughts.