Guide

Choosing a Systems Language

A practical guide for evaluating systems languages by runtime constraints, memory model, concurrency needs, team skill, ecosystem, and deployment target.

Start With Runtime Constraints

The first question is not which language is more admired. It is what the program is allowed to depend on at runtime.

If the project cannot tolerate a garbage collector, Go is probably the wrong default, and D's ordinary GC-backed runtime also needs careful proof before it belongs. That does not make either language slow or unsuitable for services; it means the runtime model has to match the deployment constraint. Kernels, embedded firmware, hard real-time components, game-engine internals, high-integrity control software, and allocator-sensitive libraries often need a no-GC language such as Ada, Rust, C, C++, or Zig. Assembly belongs even lower: use it for exact target instructions, startup code, ABI shims, and hardware entry points, not as the default owner for ordinary systems logic.

If a managed runtime is acceptable and the target is a network service, command-line tool, control plane, or deployment helper, Go becomes much more attractive. It gives native binaries, a standard formatter, a standard test workflow, and built-in concurrency without requiring the team to model ownership and lifetimes in every module.

Evaluate The Memory Model

Memory behavior is a product requirement, not just a language detail.

Choose a no-GC language when:

  • Latency spikes from garbage collection are unacceptable.
  • Memory layout and allocation strategy are part of the interface or performance model.
  • The code must run in an environment with severe memory or runtime restrictions.
  • Compile-time ownership or manual memory control is worth the added complexity.

Choose Rust when the project needs no required garbage collector and the team wants the compiler to enforce ownership, borrowing, and many thread-sharing rules. This is a strong fit for new systems components, parsers, libraries, agents, embedded modules, WebAssembly, and code where lifetime errors would be expensive.

Choose Ada when the project needs native execution, strong nominal typing, explicit package interfaces, real-time tasking, restricted runtime profiles, or high-integrity review and certification evidence. Ada is strongest when the system benefits from ranges, contracts, analyzable concurrency, and SPARK adjacency more than from a broad general package ecosystem.

Choose C when existing code, ABI requirements, vendor SDKs, platform conventions, freestanding targets, or broad compiler reach dominate the decision. C is often the integration language for operating-system interfaces, embedded SDKs, language runtimes, and plugin surfaces. Ownership can be disciplined in C, but the discipline usually lives in API contracts, documentation, coding standards, sanitizers, static analysis, fuzzing, and review rather than in the type system.

Choose C++ when the project needs native control plus richer abstraction tools such as RAII, templates, constructors/destructors, standard containers, and stronger library modeling. C++ is often a better fit than C for large native applications and performance-sensitive frameworks when the organization has mature C++ practices.

Choose D when C/C++ adjacency, native compilation, DUB, Phobos, templates, CTFE, ranges, and @safe boundaries are attractive, and the project can accept a garbage-collected default runtime plus a smaller ecosystem. Treat @nogc, manual allocation, reduced-runtime styles, and C/C++ interop as constraints to prove on the exact target.

Choose Zig when explicit allocation, simple language mechanics, C-oriented control, and integrated cross-compilation are attractive, and the team accepts a younger ecosystem, pre-1.0 release churn, and more manual responsibility.

Choose Odin when procedural, data-oriented native code is the draw: explicit allocation, distinct types, array programming, structure-of-arrays layouts, graphics-friendly vendor packages, and C interop. Treat it as a young compiler and ecosystem, and plan to vendor dependencies manually because Odin deliberately does not provide an official package manager.

Choose Nim when native compilation, Python-like readability, macros, C-family backends, and configurable memory management are attractive, and the project is closer to native tooling, systems scripting, wrappers, or application-level C interop than to allocator-centered core systems work.

Choose Crystal when native compilation, Ruby-like readability, static type inference, fibers, Shards, and C bindings are attractive, and the project is closer to backend tools, workers, CLIs, wrappers, or application-level C interop than to allocator-centered core systems work.

Choose a garbage-collected systems-adjacent language such as Go when:

  • Service delivery, operational simplicity, and team readability matter more than maximum control.
  • The workload is mostly I/O-bound.
  • The team can measure allocation behavior and tune hot paths when needed.
  • The deployment target accepts a runtime inside the binary.

Related memory concepts: Ownership, Garbage Collection, Manual Memory Management, RAII And Deterministic Cleanup, Stack Vs Heap Allocation, and Memory Safety.

Related runtime concepts: Compilation Targets, Foreign Function Interface, ABI Stability, and Build Systems.

Assembly Adoption Constraints

Assembly is the systems choice only when the unit of work is truly instruction-level or ABI-level. It fits boot code, reset handlers, interrupt and exception entry, context switches, syscall stubs, JIT trampolines, CPU feature probes, and measured kernels where source-level code or intrinsics cannot express the requirement.

Before starting new assembly work, answer these questions:

  • Which ISA, assembler, syntax dialect, object format, ABI, operating system, privilege level, and CPU feature set are targeted?
  • Which calling convention, callee-saved registers, stack alignment, red-zone or shadow-space rules, and unwind metadata are required?
  • Can a compiler intrinsic, builtin, target attribute, or small C/Rust/Zig/C++ function express the same behavior more safely?
  • How will the assembly be tested from the real caller language and linked artifact?
  • Is there a higher-level reference implementation for correctness tests?
  • How will target-specific variants be maintained for x86-64, AArch64, RISC-V, embedded cores, or vendor ABIs?

If these answers are vague, assembly's closeness to hardware becomes a liability. Keep it narrow and let a systems language own the surrounding logic.

Ada Adoption Constraints

Ada is the systems choice to evaluate when explicitness, high-integrity engineering, real-time behavior, and long-lived maintenance are central. It is especially relevant for embedded control, aerospace, rail, defense, medical, industrial systems, and codebases where certification evidence or SPARK proof can matter.

Before starting new Ada work, answer these questions:

  • Which Ada standard, compiler, runtime profile, and target platforms are required?
  • Will the project use full Ada tasking, Ravenscar, Jorvik, another restricted profile, or no tasking?
  • Which restrictions, coding standards, run-time checks, contracts, and static analysis tools gate releases?
  • Is SPARK part of the plan, and if so, which modules need proof instead of only tests and review?
  • How will GPRbuild, Alire, GNAT tools, cross-compilation, debugger support, and CI be pinned?
  • Does the team have enough Ada expertise, or a training and review plan, to make the language's explicitness an asset?

If these answers are vague, Ada's high-integrity strengths can turn into toolchain and staffing risk. Prototype the target runtime, tasking model, proof path, and build before committing broadly.

Rust Adoption Constraints

Rust is most valuable when its constraints line up with the problem. Before choosing it, answer these questions directly:

  • Does the team have time to learn ownership, borrowing, lifetimes, traits, and Cargo workflows?
  • Will compile times and generic-heavy dependencies be acceptable for the feedback loop?
  • Is async needed, and if so, which runtime will the project standardize on?
  • Does the target platform have the right rustc support tier, standard-library support, and CI coverage?
  • Will FFI boundaries document ownership, allocation, panic, threading, and layout rules?
  • Can unsafe code be kept small, reviewed, and fuzzed or tested at the boundary?
  • Does the crate ecosystem cover the domain well enough, or will the team build foundational libraries first?

If the answer to several of these is unclear, Rust may still be viable, but the first milestone should be a prototype that tests the hard target, dependency, and ownership questions rather than a broad rewrite.

C Adoption Constraints

C is still one of the most portable answers for native boundaries, but it should not be treated as low-risk just because it is familiar. Before starting new C work, answer these questions:

  • Which C standard or dialect is required: C17, C23, GNU C, MSVC C, or a vendor embedded dialect?
  • Which compilers, C libraries, architectures, operating systems, and ABIs are supported?
  • Is the target hosted, freestanding, or embedded with vendor startup and linker scripts?
  • How will ownership rules be documented for every pointer, buffer, handle, and callback?
  • Which warnings, sanitizers, static analyzers, fuzzers, and test suites are mandatory?
  • How will dependencies be obtained: system packages, vendored source, SDKs, Conan, vcpkg, pkg-config, or manual build wiring?
  • Which APIs must remain stable at the source or binary level?

If these answers are vague, C's small syntax will not save the project. The language gives control, but the engineering system around it has to supply many of the guardrails.

C++ Adoption Constraints

C++ is the native-systems choice when a project needs C-like control plus stronger abstraction tools: RAII, constructors and destructors, value types, templates, standard containers, smart pointers, namespaces, overloads, and large existing native ecosystems. It is often the practical center for game engines, browser engines, databases, compilers, desktop applications, graphics stacks, trading systems, robotics, simulation, and large native codebases.

Before starting new C++ work, answer these questions:

  • Which C++ standard or dialect is required: C++17, C++20, C++23, vendor preview modes, or a restricted embedded subset?
  • Which compilers, standard libraries, operating systems, ABIs, and architectures are supported?
  • Are exceptions, RTTI, dynamic allocation, static initialization, and modules allowed on the target?
  • What is the ownership policy for raw pointers, references, std::unique_ptr, std::shared_ptr, views, spans, and custom allocators?
  • Which warnings, sanitizers, static analyzers, fuzzers, and coding guidelines are mandatory?
  • How will dependencies be obtained: Conan, vcpkg, system packages, vendored source, SDKs, or hand-written build rules?
  • What binary interfaces must remain stable, and should they be C ABI boundaries instead of C++ ABI boundaries?

If these answers are not explicit, "modern C++" can mean too many incompatible things. Define the subset and toolchain before the codebase grows around accidental defaults.

D Adoption Constraints

D is the systems-adjacent choice to evaluate when a project wants native compilation and C/C++ adjacency with a broader integrated language surface: garbage collection by default, Phobos, DUB, templates, CTFE, ranges, mixins, contracts, built-in unit tests, and @safe/@trusted/@system safety boundaries. It is especially relevant for native tools, services, libraries, parsers, generators, and C/C++ adjacent applications where full Rust-style ownership checking is not the main requirement.

Before starting new D work, answer these questions:

  • Which compiler family will be pinned: DMD, LDC, or GDC?
  • Is the ordinary D runtime and garbage collector acceptable on the target?
  • Which modules must be @safe, which wrappers may be @trusted, and where is @system allowed?
  • Which code must be @nogc, manually allocated, or isolated from GC pauses?
  • Does DUB and the DUB registry cover the dependency set, or will packages be vendored or written locally?
  • Which C or C++ boundaries are required, and who owns allocation, callbacks, exceptions, strings, and threading?
  • Does the team value D's CTFE, ranges, Phobos, and C++ adjacency enough to accept a smaller ecosystem and hiring pool?

If these answers are vague, D's productive surface can hide runtime and ecosystem risk. Keep the first milestone narrow and prove compiler choice, runtime behavior, package health, FFI, profiling, and deployment before using it broadly.

Zig Adoption Constraints

Zig is the systems choice to evaluate when a project wants C-like control with a clearer allocation story, stronger language constructs than C, and a toolchain that treats cross-compilation and C interop as central features. It is especially relevant for C replacement modules, native tools, allocators, parsers, embedded-adjacent experiments, freestanding targets, and projects where zig cc or zig build can simplify a messy C/C++ build.

Before starting new Zig work, answer these questions:

  • Which Zig version will be pinned, and how will upgrades be tested while the language is still pre-1.0?
  • Does the target platform have the required support tier, linker behavior, libc story, debugger workflow, and CI coverage?
  • Which allocator policy will APIs follow: caller-provided allocator, arena, fixed buffer, page allocator, C allocator, or no dynamic allocation?
  • How will ownership, lifetime, and cleanup rules be documented at every boundary?
  • Will C interop use direct imports, translated C, object-file mixing, a C ABI export, or zig cc as a build tool?
  • Are required third-party Zig packages maintained for the chosen release, or will dependencies be vendored or written locally?
  • Which build modes, safety checks, fuzzing, tests, and cross-target builds are required before release?

If these answers are vague, Zig's simpler syntax will not be enough. The language makes allocation and control flow explicit, but it does not enforce Rust-style ownership and it does not yet have C's institutional stability.

Odin Adoption Constraints

Odin is the systems choice to evaluate when a project wants C-like native control with stronger data-oriented language support: distinct types, explicit conversions, allocator-aware built-ins, defer, procedure groups, using, array programming, SIMD/vector types, and structure-of-arrays layouts. It is especially relevant for game engines, graphics tools, simulations, native tools, C ABI libraries, and codebases where data layout and allocation policy are part of the design.

Before starting new Odin work, answer these questions:

  • Which Odin release will be pinned, and how will compiler and library upgrades be tested?
  • Which targets, linkers, debuggers, calling conventions, and foreign libraries must work?
  • Which allocator policy will the codebase use: context allocator, temporary allocator, arenas, fixed buffers, subsystem allocators, or no dynamic allocation?
  • How will ownership, cleanup, and lifetime rules be documented when the compiler does not enforce Rust-style borrowing?
  • Which dependencies will be copied, vendored, submoduled, or otherwise pinned without an official package manager?
  • Are the required core, vendor, and third-party packages mature enough for the selected release?
  • Does the team value Odin's data-oriented ergonomics enough to accept a smaller ecosystem and hiring pool?

If these answers are vague, Odin's pleasant syntax can hide production risk. Keep the first milestone narrow and prove the compiler, target, allocator model, dependency policy, and debugging workflow before using it as a broad systems default.

Nim Adoption Constraints

Nim is the systems-adjacent choice to evaluate when a project wants native binaries and C interop but also wants compact, Python-like source code, macros, templates, and selectable memory-management modes. It is especially relevant for command-line tools, generators, wrappers around C libraries, native application code, embedded-adjacent experiments, and scripts that have become important enough to deserve static compilation.

Before starting new Nim work, answer these questions:

  • Which Nim version will be pinned, and are you relying only on stable language features?
  • Which backend is production: C, C++, Objective-C, or JavaScript?
  • Which memory-management mode will be used: ORC, ARC, refc, Boehm, Go GC, or a specialized embedded configuration?
  • Which C compiler, C library, linker flags, and target platforms are part of the support matrix?
  • How will C/C++ ownership, allocation, cleanup, callbacks, and exceptions be represented at the boundary?
  • Are required Nimble or Atlas packages maintained for the selected Nim release?
  • Will macros and generated bindings remain reviewable by developers who are not Nim experts?

If these answers are vague, Nim's concise syntax can hide native-build complexity. Treat backend, memory mode, FFI, generated code, and package policy as first-class production decisions.

Crystal Adoption Constraints

Crystal is the systems-adjacent choice to evaluate when a project wants native binaries, Ruby-like source code, static checking, fibers, and direct C bindings without adopting Ruby's runtime model. It is especially relevant for command-line tools, workers, HTTP services, C-library wrappers, crawlers, internal tools, and scripts that have outgrown Ruby or shell but still benefit from a Ruby-shaped language.

Before starting new Crystal work, answer these questions:

  • Which Crystal version will be pinned, and are the needed features stable on the 1.x release line?
  • Which target platforms are in scope, and do they fall into Crystal's stronger support tiers?
  • Which shards are required, and are they maintained for the selected compiler release?
  • Does the application depend on fibers and channels, and has the team tested blocking calls, backpressure, and CPU-bound work?
  • Which C bindings, foreign resources, callbacks, and cleanup rules need explicit ownership documentation?
  • Is Ruby-like syntax a material advantage, or would Go's larger ecosystem and standard toolchain be cheaper to operate?

If these answers are vague, Crystal's readable syntax can hide platform and ecosystem risk. Treat target support, Shards, C bindings, runtime behavior, and deployment shape as production decisions.

Concurrency And Services

For services, the concurrency model often matters more than benchmark-oriented language comparisons. Go's goroutines and channels make it straightforward to structure concurrent I/O, background work, cancellation, and request fan-out. The standard library also includes practical building blocks for HTTP, TLS, contexts, synchronization, profiling, and testing.

Those tools do not remove design responsibility. A Go service still needs bounded goroutine creation, cancellation paths, timeouts, backpressure, error handling, and data-race avoidance. If a design needs compile-time guarantees around ownership and sharing, Rust may be a better fit. If it needs simple concurrent service code that most backend engineers can read quickly, Go is often easier to sustain.

Rust services can be excellent when resource use, protocol correctness, or native dependencies are central. They also require choices around async runtime, dependency surface, build times, and trait-heavy abstractions. For ordinary request/response services, treat Rust as a deliberate choice, not a default upgrade from Go.

Tooling And Deployment

Strong default tooling reduces project entropy. Go's go command covers modules, builds, tests, formatting, documentation, and installation. Rust's Cargo covers the same broad shape for Rust projects and is one of Rust's major strengths. In both cases, prefer the language's native workflow before adding custom build layers.

Deployment shape should be decided early:

  • Can the project ship a single native executable?
  • Does it need static or mostly static linking?
  • Does it need cross-compilation?
  • Does it need no_std, freestanding, or embedded target support?
  • Are container images the production artifact?
  • Does the operations team already have mature runtime support for another ecosystem?
  • How will toolchain versions and minimum supported versions be pinned?

For Go, the single-binary path is often a practical advantage for internal tools and services. For Rust, the lack of a required garbage collector and the control over dependencies can be decisive for lower-level components.

C++ can ship native binaries and libraries, but the deployment shape is usually more platform-specific. Linkage, runtime libraries, C++ standard-library versions, compiler flags, symbol visibility, exception boundaries, and ABI policy should be part of the release plan. A C++ build that only works on one developer machine is not a systems-language advantage.

Zig can be unusually practical when cross-compilation is a first-order requirement. It can build Zig code for many targets, act as a C or C++ compiler, and bundle target/libc knowledge that ordinary C projects often have to assemble by hand. Still test the exact target, libc, linker, debugger, and package set instead of treating the target list as a guarantee.

D can be practical when C/C++ adjacency and native productivity matter more than a no-GC default. DUB, Phobos, DMD, LDC, and GDC give a real workflow, while CTFE and ranges can reduce boilerplate. Still test GC behavior, @nogc boundaries, DUB package health, compiler selection, and C/C++ interop before treating D as an ordinary drop-in for C++ or Rust.

Odin can be practical when data-oriented native code and graphics-friendly libraries matter more than automated dependency resolution. Its core and vendor collections are useful starting points, but the repository should own vendoring, compiler pins, and dependency review explicitly because there is no official package manager.

Nim can be practical when the team wants a native executable from code that reads closer to a scripting language. Its generated C-family backends make C interop and platform compilers part of the deployment story. Test the selected backend, memory-management mode, C compiler, Nimble packages, and target operating systems together.

Team Skill And Maintenance

The best technical fit can still fail if the team cannot maintain the code. Rust asks more from developers up front, especially around ownership, borrowing, lifetimes, trait design, async runtime choices, compile-time errors, and dependency review. That cost can pay for itself in libraries and systems where correctness and memory behavior are central.

Go usually asks less from the reader. The language is smaller, formatting is uniform, package structure is conventional, and many service patterns are easy to recognize. The tradeoff is that some invariants remain social, test-driven, or operational rather than statically enforced.

C and C++ depend heavily on local standards. A mature C++ organization with RAII, sanitizers, static analysis, fuzzing, and disciplined review may have a safer path modernizing existing code than introducing Rust or Ada immediately. A C codebase with weak ownership documentation may benefit from Rust at new memory-sensitive boundaries or Ada/SPARK at high-integrity control boundaries, but the migration plan must be narrow enough to verify.

Ada fits teams that value explicit domain modeling, real-time profiles, packages, contracts, and assurance evidence. It is less attractive when the team needs the largest mainstream package ecosystem, fast onboarding from common web/backend backgrounds, or terse exploratory code.

Zig fits teams that already think comfortably about allocation and native boundaries but want a cleaner language and toolchain than C. It is less attractive when the team needs a mature hiring pool, a stable package ecosystem, or compiler-enforced ownership.

D fits teams that want native compilation, C/C++ adjacency, and a more integrated language than C++ for some application and tooling work. It is less attractive when the target rejects GC/runtime assumptions, when Rust-style safety is required, or when package and staffing depth matter more than CTFE, ranges, and Phobos.

Odin fits teams that think in data layout, explicit allocation, and C interop, especially for game, graphics, tooling, and simulation work. It is less attractive when package automation, long-term compatibility, broad hiring, or compiler-enforced memory safety matter more than data-oriented ergonomics.

Nim fits teams that want to move faster than C in native tools or systems-adjacent application code, especially when macros and C wrappers reduce boilerplate. Crystal fits a related but more Ruby-shaped lane: native tools, workers, web backends, and C-bound wrappers where static typing and readable application code matter more than allocator-level control. Both are less attractive when the team needs Rust's safety guarantees, Go's ecosystem and operations depth, or a platform where another language owns the standard deployment story. A new C project should be chosen for concrete platform, ABI, freestanding, or ecosystem reasons, not because it feels simple on paper.

Questions To Ask

  • Does the project need predictable memory behavior without a garbage collector?
  • Is the target a service, CLI, agent, library, embedded component, WebAssembly module, or runtime?
  • Are latency, memory layout, binary size, or allocation patterns hard requirements?
  • Is the team ready to pay a learning curve for stronger compile-time guarantees?
  • Would a smaller language and standard toolchain make reviews and onboarding faster?
  • Does the ecosystem already have the libraries, platform support, and deployment examples the project needs?
  • How will the team test, profile, observe, and update the chosen language in production?
  • What are the ownership rules at every API and FFI boundary?

Practical Starting Points

Start with Go when the project is a network service, HTTP API, control plane, internal platform tool, command-line utility, or infrastructure daemon where garbage collection is acceptable and operational clarity is the priority.

Start with Rust when the project is a low-level component, performance-sensitive library, embedded target, WebAssembly module, parser, security-sensitive component, or service part where memory control and stronger compile-time guarantees justify a steeper learning curve.

Start with Ada when the project is high-integrity native software, embedded control, hard real-time work, or a safety-critical component where packages, contracts, restricted profiles, and SPARK adjacency are valuable.

Start with C when the work is a narrow ABI layer, platform interface, firmware target, or existing C estate where toolchain reach and integration outweigh stronger language checks.

Start with C++ when the domain already depends on C++ engines, frameworks, libraries, or performance tooling, and the organization has a real plan for modern C++ safety practices, ABI boundaries, and build reproducibility.

Start with D when native C/C++ adjacent productivity, DUB, Phobos, CTFE, ranges, and attribute-based safety are the draw, and a GC-backed default runtime plus a smaller ecosystem are acceptable.

Start with Zig when explicit control, cross-compilation, and C replacement work are the draw, and the project can absorb a younger language and ecosystem.

Start with Odin when data-oriented native code, graphics-friendly libraries, explicit allocation, and manual vendoring are acceptable tradeoffs for a cleaner C-adjacent workflow.

Start with Nim when native compilation, C-family interop, macros, and Python-like readability are the draw, and the project can absorb a smaller ecosystem plus backend and memory-mode decisions.

Start with Crystal when native compilation, Ruby-like readability, fibers, Shards, and C bindings are the draw, and the project can absorb a smaller ecosystem plus platform-support checks.

Revisit the decision when a project crosses boundaries. It is common for a platform to use Go for service orchestration, Rust for narrow memory-sensitive components, Ada or SPARK for high-integrity control modules, D or Nim for native tools or wrapper layers, and C or C++ at legacy or ABI edges.

Sources

Last verified:

  1. GNU assembler manual GNU Binutils
  2. Intel 64 and IA-32 Architectures Software Developer Manuals Intel
  3. x86-64 psABI x86 psABI maintainers
  4. ISO/IEC 8652:2023 - Programming languages - Ada International Organization for Standardization
  5. Ada Overview Ada Resource Association
  6. GNAT Pro for Ada AdaCore
  7. SPARK AdaCore
  8. Concurrency and Ravenscar Profile AdaCore
  9. Rust Programming Language Rust Foundation
  10. The Rust Programming Language - Ownership Rust Project
  11. The Cargo Book Rust Project
  12. The rustup book Rust Project
  13. rustc book - Platform Support Rust Project
  14. The Embedded Rust Book - no_std Rust Project
  15. The Go Programming Language Go Project
  16. The Go Programming Language Specification Go Project
  17. Effective Go Go Project
  18. Go 1 and the Future of Go Programs Go Project
  19. C language homepage C language project
  20. ISO/IEC JTC1/SC22/WG14 - C ISO/IEC JTC1/SC22/WG14
  21. C - Project status and milestones ISO/IEC JTC1/SC22/WG14
  22. Language Standards Supported by GCC GNU Compiler Collection
  23. C Support in Clang LLVM Project
  24. The Standard Standard C++ Foundation
  25. The Committee - Standard C++ Standard C++ Foundation
  26. C++ Core Guidelines Standard C++ Foundation
  27. C++ Standards Support in GCC GNU Compiler Collection
  28. C++ Support in Clang LLVM Project
  29. D Programming Language D Language Foundation
  30. Overview D Language Foundation
  31. Memory-Safe-D-Spec D Language Foundation
  32. Intro to DUB D Language Foundation
  33. Downloads D Language Foundation
  34. Zig Programming Language Zig Software Foundation
  35. Zig Language Reference 0.16.0 Zig Software Foundation
  36. Overview - Zig Programming Language Zig Software Foundation
  37. 0.16.0 Release Notes Zig Software Foundation
  38. Odin Programming Language Odin
  39. Overview Odin
  40. Frequently Asked Questions Odin
  41. Odin source repository Odin
  42. Nim Programming Language Nim
  43. Nim Backend Integration Nim
  44. Nim's Memory Management Nim
  45. Nimble User Guide Nimble
  46. The Crystal Programming Language Crystal
  47. Crystal Platform Support Crystal
  48. Crystal C bindings Crystal
  49. The Shards command Crystal