A week in the compiled-mode trenches (plus cloud/Linux build fixes)

This was one of those weeks where the changelog looks chaotic but the story underneath is simple: I went hard at making compiled NLP++ analyzers and knowledge bases actually run correctly, and I fixed the cloud/Linux/macOS build so it stops silently rotting. Fourteen engine releases in six days (v3.1.30 → v3.1.43) — that’s not scope creep, that’s a release train of one-bug-at-a-time fixes, each one verified against the cloud build before moving to the next.

Compiled mode: closing the gap with interpreted mode

If you’ve been compiling your analyzers to native code for speed, this week mattered a lot. I found and fixed a string of bugs that only show up once you’re running compiled KBs and passes instead of interpreting them live:

  • Pass 16/17 crashespnvartype and Arun::attrtype were misbehaving in compiled mode (attrtype was always returning 0), which was silently blocking later passes from ever running correctly.
  • Comparison ops — added Arun::vargt/varlt for compiled mode and resynced the function tables so var comparisons actually work.
  • sem_to_str crash on non-zero RSLONG/RSFLOAT values — fixed.
  • Null cgerr SEGV in CG::popVal warnings — guarded.
  • KB loading — compiled KBs were getting double-loaded, and there was a linkage mismatch in the generated kb_setup.h/cpp wrapper that broke v3.1.24. Both fixed, plus a real wrapper generator so compiled-KB load is consistent.
  • File outputSaveKB-produced files were coming out empty in compiled mode because writes to var-LHS << weren’t being flushed; Arun::out writes now flush immediately too, so you can actually watch diagnostic output as it happens instead of after the process exits.
  • A sneaky unspecified-evaluation-order bug in generated function-call args — hoisted args into temps so behavior doesn’t depend on compiler whim.
  • compile-analyzer.ps1 now also builds rund.dll from run/, and run_analyzer is properly exported from the compiled run.dll on Windows.

Net effect: compiled analyzers and KBs are noticeably more trustworthy this week than last week. If you hit a compiled-mode issue before, it’s worth re-testing against v3.1.43.

Cloud/Linux and macOS build fixes

Separately, I tracked down why the cloud Linux build kept breaking:

  • Generated St*.cpp files weren’t including prim/libprim.h, which triggered _TCHAR errors on Linux.
  • Generated headers (ehead.h, rhead.h, per-pass headers) now emit forward-slash include paths instead of Windows-style ones.
  • <tchar.h> and <streamClasses.h> are now gated behind #ifndef LINUX in the generated analyzer.h.
  • StdAfx.h is now emitted on Linux too, at all the emission sites (there were more than one — round 2 caught the rest).

On macOS, I dropped the -std=c++11 override in build-macos.yml so std::filesystem actually works instead of silently falling back.

VS Code extension

  • Fixed the run-mode toggle getting stuck when compiled modes weren’t available — it now cycles freely instead of trying to be clever about gating.
  • Fixed a colorizer bug where the “Update Colorizer” command wasn’t reading the template from the running extension.
  • Cleaned up packaging so .vscode/, .claude/, and log files don’t end up in the shipped .vsix.
  • Released v3.1.16 → v3.1.19 as these landed.

Next

With compiled mode in noticeably better shape, next up is stress-testing longer NLP++ pipelines end-to-end in compiled form and making sure the cloud build stays green as I keep pushing on this. If you’re compiling analyzers, give the latest release a spin and let me know what breaks.