Skip to content

Comparing ARO to Other Languages

Kris Simon edited this page Mar 22, 2026 · 1 revision

Comparing ARO to Other Languages

ARO is a DSL for expressing business features as Action-Result-Object statements. Its syntax reads like a business requirement; its runtime handles routing, errors, and concurrency. This page situates ARO relative to languages you may already know.


General-Purpose Languages

Python

Python reads like pseudocode; ARO reads like a business requirement. Both prioritize expressiveness over ceremony, but where Python uses functions and classes, ARO uses business activities and feature sets. Python's error handling is explicit (try/except); ARO's runtime handles errors and produces human-readable messages automatically. Python is a general-purpose tool — ARO is purpose-built for business logic.

Ruby

Ruby shares ARO's philosophy that code should feel natural to read. Rails pioneered "convention over configuration" for web apps; ARO applies the same idea to business logic with contract-first HTTP and auto-discovered .aro files. Both favor expressiveness, but Ruby metaprogramming can produce cryptic DSLs, while ARO's natural-language syntax stays legible to non-programmers.

JavaScript / Node.js

Node.js is callback/promise-driven and event-based — so is ARO. But JavaScript carries decades of quirks (coercion, this, async complexity), while ARO's event model is declarative: you name a feature set after an event, and the runtime wires it. JavaScript requires explicit error propagation; ARO's runtime auto-generates error messages from the failed statement itself.

TypeScript

TypeScript adds a type system on top of JavaScript's chaos. ARO's type discipline comes from OpenAPI contracts rather than inline annotations — the schema is defined externally and the runtime enforces it. TypeScript is a general-purpose language with types; ARO is a business DSL where the "type system" is the API contract.

Java

Java made enterprise software verbose and boilerplate-heavy. ARO targets the same enterprise domain with the opposite philosophy — no interfaces, no dependency injection frameworks, no XML config. A Java UserController with annotations, a service layer, and repository interfaces does what a 10-line ARO feature set does. Trade-off: Java has decades of ecosystem; ARO is narrowly focused.

C#

C# with ASP.NET is the closest mainstream equivalent: HTTP APIs, event-driven patterns, contract-first generation via tooling. ARO differs by making the contract (OpenAPI) the source of truth rather than code-gen output. C# is expressive and powerful; ARO trades that power for radical simplicity in the business logic layer.

Go

Go's explicit error handling (if err != nil) is idiomatic but repetitive. ARO takes the opposite stance — the runtime handles errors, and the error message is the failed statement. Go compiles to fast single binaries; ARO does too via aro build. Both value simplicity, but Go's simplicity is at the language level, ARO's is at the business-domain level.

Rust

Rust enforces correctness at compile time via ownership and the borrow checker. ARO enforces correctness at the domain level via immutable bindings and the OpenAPI contract. Rust is systems-level with zero-cost abstractions; ARO is business-logic level with zero-boilerplate abstractions. ARO even uses Rust as a plugin language, so they're complementary.

Swift

ARO's runtime is written in Swift 6.2 and shares its Sendable/structured concurrency model. Swift enforces safety via the type system and optionals; ARO enforces it via immutable bindings and the event model. Swift is a general-purpose language for Apple platforms and servers; ARO is its domain-specific layer for business rules.


Functional Languages

Haskell

Haskell pursues purity — no side effects except through monads. ARO's action roles (REQUEST, OWN, RESPONSE, EXPORT) encode data-flow direction similarly to how Haskell's type system tracks effects. Both avoid mutable state by default. Haskell requires mastering a steep type-theory learning curve; ARO requires understanding business activities.

Elixir / Erlang

Elixir's actor model and the BEAM's fault tolerance are legendary. ARO's EventBus is a simpler message-routing layer — no isolated process per actor, no supervisor trees. Elixir excels at high-concurrency, fault-tolerant distributed systems; ARO targets the business logic layer of smaller, domain-focused services. Elixir's Phoenix is to ARO what a cathedral is to a bungalow.

F# / OCaml

F# brings functional programming to the .NET ecosystem with discriminated unions and pipelines. ARO's feature-set pipeline (Extract → Compute → Transform → Return) echoes F#'s |> operator. F# is typed and compiled; ARO's types come from OpenAPI schemas at the boundary. Both favor immutability and data transformation over mutation.

Clojure

Clojure puts data first — maps and sequences over objects. ARO shares this: results are dictionaries, repositories store records, events carry payloads. Clojure's REPL-driven development and Lisp macros enable extreme expressiveness; ARO trades that for readability by non-Lisp speakers. Both treat the happy path as primary.


Domain-Specific and Declarative

SQL

SQL is the most successful business-domain language ever created. Like ARO, it reads like English: SELECT users FROM orders WHERE status = 'active'. ARO's Retrieve the <users> from the <user-repository> where status = "active" is the application-layer equivalent. SQL operates on relational data; ARO orchestrates business processes. They're natural complements.

COBOL

COBOL was designed to be readable by business managers. ARO has the same ambition — Extract the <amount> from the <transaction: amount> is closer to COBOL's verbose English than to modern code. COBOL runs payroll systems for half the world's banks; ARO is a modern rethinking of that idea without the 60-year baggage and fixed-width columns.

Gherkin (Cucumber / BDD)

Gherkin writes business requirements as Given / When / Then scenarios. ARO writes them as executable feature sets. The gap between Gherkin specs and the actual code implementing them is ARO's design target — ARO is the spec and the implementation at once. Gherkin is read by humans but executed via glue code; ARO eliminates the glue.

YAML / Kubernetes Manifests

Kubernetes YAML declares desired state declaratively. ARO is also declarative at the business level — you declare what should happen when an event occurs, not how the runtime should schedule it. Both are human-readable and avoid imperative control flow. YAML configs describe infrastructure; ARO describes business behavior.

AppleScript

AppleScript is the most literal natural-language programming attempt on macOS: tell application "Mail" to send message. ARO applies the same idea to business services: Send the <welcome-email> to the <user: email>. Both prioritize English readability. AppleScript is brittle and narrow; ARO is designed for production business logic.


Object-Oriented

Smalltalk

Smalltalk invented the message-passing model: objects send messages to each other. ARO's event bus is a modern take on this — feature sets respond to events (messages). Smalltalk's image-based environment made everything live and inspectable; ARO's aro run interpreter and aro check linter aim for similar fast feedback. Smalltalk influenced everything; ARO is influenced by that influence.

Kotlin

Kotlin cleaned up Java for Android and server development. Both Kotlin and ARO care about conciseness and correctness. Kotlin's sealed classes and when expressions model business states explicitly; ARO's match and state machine patterns do the same at the language level. Kotlin requires a JVM; ARO compiles to native.


Logic and Constraint

Prolog

Prolog programs are facts and rules — the engine finds solutions. ARO feature sets are rules triggered by events — the runtime routes execution. Both are declarative and avoid telling the machine how to do things in favor of what should happen. Prolog is for search and constraint satisfaction; ARO is for business process orchestration. Neither has much explicit control flow.


Infrastructure and Config

Terraform / HCL

Terraform declares infrastructure as code — what resources should exist, not how to create them. ARO declares business behavior as code — what should happen when events occur, not how the runtime orchestrates it. Both are declarative, both are domain-specific, and both separate the what from the how. Terraform owns infrastructure state; ARO owns business logic state.


Summary

Language Paradigm ARO Similarity Key Difference
Python Multi-paradigm Readable, business-friendly General-purpose; explicit errors
Ruby OOP / DSL Convention over config Metaprogramming vs. natural language
JavaScript Event-driven Event-based runtime Async complexity; decades of quirks
TypeScript Typed JS Contract-driven types Types in code vs. types in OpenAPI
Java OOP Enterprise domain Boilerplate-heavy; explicit wiring
C# OOP ASP.NET HTTP model Code-gen vs. contract-first
Go Systems Single-binary compilation Explicit errors vs. runtime-generated
Rust Systems Immutability, correctness Memory safety vs. domain safety
Swift Multi-paradigm Runtime host language General-purpose vs. business DSL
Haskell Functional Immutability, data flow Type theory vs. business activities
Elixir Actor model Event-driven concurrency Fault tolerance vs. simplicity
F# Functional Pipeline data flow Typed vs. contract-typed
Clojure Functional Data-first records Lisp expressiveness vs. readability
SQL Declarative English-like business queries Data layer vs. process layer
COBOL Procedural Business-readable English Legacy baggage vs. modern design
Gherkin BDD spec Business language as code Spec only vs. spec + implementation
YAML / K8s Declarative Desired state declaration Infrastructure vs. business logic
AppleScript Natural language English-like actions Brittle automation vs. business APIs
Smalltalk OOP / messaging Message passing Image-based vs. file-based
Kotlin OOP Conciseness, correctness JVM vs. native; general vs. domain
Prolog Logic Declarative rules Constraint solving vs. event routing
Terraform Declarative What not how Infrastructure state vs. business state

Clone this wiki locally