2026-04-02ยท10 min readยทsota.io team

Deploy Modula-3 to Europe โ€” Luca Cardelli ๐Ÿ‡ฎ๐Ÿ‡น (Olivetti Research Cambridge 1988), the Type-Safe Language That Invented Garbage Collection and Taught Java Everything, on EU Infrastructure in 2026

In 1988, a small team of computer scientists at two research laboratories โ€” one in Palo Alto, one in Cambridge, England โ€” published a language specification that would quietly reshape the programming world. The language was Modula-3. Within a decade, its three most radical ideas โ€” automatic garbage collection in a statically typed language, interfaces as a first-class abstraction, and threads with mutexes built into the standard library โ€” would appear in the most widely used programming language ever created: Java.

James Gosling, Java's creator, named Modula-3 explicitly when describing Java's intellectual debts. "From Modula-3," he noted in the Java Language Specification, came the thread model, the exception structure, and โ€” most fundamentally โ€” the proof that a systems language could be both statically typed and garbage-collected without becoming impractically slow.

The European half of Modula-3's design came from Olivetti Research Centre in Cambridge, England, where Luca Cardelli ๐Ÿ‡ฎ๐Ÿ‡น โ€” born in Montecatini Terme, Tuscany, Italy โ€” was the principal type theorist. Cardelli had previously earned his MSc and PhD at the University of Edinburgh ๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ท, one of Europe's leading computer science departments, before moving to the Cambridge research lab of Italy's most famous technology company: Olivetti.

Luca Cardelli and Olivetti Research Cambridge

Luca Cardelli ๐Ÿ‡ฎ๐Ÿ‡น is one of the most cited and consequential programming language researchers in European computing history. Born in Italy, educated in Edinburgh, he spent his career on the EU side of the Atlantic โ€” first at Olivetti Research Centre in Cambridge ๐Ÿ‡ฌ๐Ÿ‡ง, then at Digital Equipment Corporation's Systems Research Center, then at Microsoft Research Cambridge ๐Ÿ‡ฌ๐Ÿ‡ง, where he remained for over two decades.

His intellectual contributions span three decades:

Olivetti (Ivrea, Turin ๐Ÿ‡ฎ๐Ÿ‡น) โ€” the company behind Olivetti Research Cambridge โ€” is one of Italy's most storied technology companies. Founded in 1908 by Camillo Olivetti, it pioneered programmable calculators (Programma 101, 1965, the world's first personal computer), mainframes, and personal computers before IBM. The Cambridge research arm, operating in the 1980s and 1990s, represented a direct pipeline between Italian industry and the English university town that had produced Alan Turing, Maurice Wilkes, and the first stored-program computer.

The Modula-3 design committee:

The language's intellectual DNA was shaped by the Cambridge contingent: Cardelli brought European type theory; Jordan brought the systems perspective of British industrial research. The result was a language that sat precisely at the intersection of theoretical rigour and practical deployability.

Language Features

Modula-3 is the third generation of Niklaus Wirth's Modula lineage โ€” Modula-2 was the second โ€” but it replaced Wirth's focus on minimalism with Cardelli's insistence on soundness. The result is a language where the type system genuinely cannot lie:

Type Safety and Garbage Collection

(* Modula-3 is garbage-collected and type-safe by default *)
(* No dangling pointers. No buffer overflows. No use-after-free. *)

MODULE Hello;

IMPORT IO, Fmt;

TYPE
  Person = OBJECT
    name: TEXT;
    age: INTEGER;
  METHODS
    greet(): TEXT
  END;

  PersonImpl = Person OBJECT OVERRIDES
    greet := Greet
  END;

PROCEDURE Greet(self: Person): TEXT =
BEGIN
  RETURN "Hello, " & self.name & "! You are " & Fmt.Int(self.age) & " years old.";
END Greet;

VAR
  p: Person := NEW(PersonImpl, name := "Cardelli", age := 70);

BEGIN
  IO.Put(p.greet() & "\n");
END Hello.

The garbage collector means that NEW(PersonImpl, ...) allocates on the heap and the memory is automatically reclaimed. In 1988, this was radical: the conventional wisdom was that GC and static typing were incompatible at systems performance levels. Cardelli and the SRC team proved the conventional wisdom wrong, and Java inherited the proof.

Interfaces โ€” Before Java

Modula-3's OBJECT TYPE hierarchy with opaque types pioneered what Java would later call interfaces:

(* Define an interface via opaque partial reveal *)
INTERFACE Database;

TYPE
  T <: REFANY;  (* opaque type - caller sees only T, not the implementation *)

PROCEDURE Connect(host: TEXT; port: INTEGER): T;
PROCEDURE Query(db: T; sql: TEXT): TEXT;
PROCEDURE Close(db: T);

END Database.
(* Implementation module โ€” the concrete type is private *)
MODULE Database;

REVEAL
  T = REF RECORD
    socket: INTEGER;
    host: TEXT;
    (* internal fields hidden from callers *)
  END;

PROCEDURE Connect(host: TEXT; port: INTEGER): T =
VAR conn: T;
BEGIN
  conn := NEW(T, host := host, socket := 0);
  (* establish connection... *)
  RETURN conn;
END Connect;

(* ... *)

END Database.

The caller sees only the opaque T type โ€” they cannot access internal fields, cannot cast to implementation types, cannot break abstraction barriers. This information hiding is enforced at compile time, not convention. Java's interface keyword and TypeScript's structural types both trace their lineage to this Modula-3 pattern, developed by Cardelli at Olivetti Research Cambridge.

First-Class Threads and Mutexes

Modula-3 standardised concurrent programming before Java's synchronized existed:

MODULE ConcurrentCounter;

IMPORT Thread, Mutex;

TYPE
  Counter = OBJECT
    mu: MUTEX;
    value: INTEGER := 0;
  METHODS
    increment();
    get(): INTEGER;
  END;

  CounterImpl = Counter OBJECT OVERRIDES
    increment := Increment;
    get := Get;
  END;

PROCEDURE Increment(self: Counter) =
BEGIN
  LOCK self.mu DO
    INC(self.value);
  END;
END Increment;

PROCEDURE Get(self: Counter): INTEGER =
BEGIN
  LOCK self.mu DO
    RETURN self.value;
  END;
END Get;

(* Spawn a thread *)
PROCEDURE Worker(arg: REFANY): REFANY =
VAR c: Counter := arg;
BEGIN
  FOR i := 1 TO 1000 DO c.increment() END;
  RETURN NIL;
END Worker;

BEGIN
  VAR c := NEW(CounterImpl, mu := NEW(MUTEX));
  VAR t1 := Thread.Fork(NEW(Thread.Closure, apply := Worker, arg := c));
  VAR t2 := Thread.Fork(NEW(Thread.Closure, apply := Worker, arg := c));
  Thread.Join(t1);
  Thread.Join(t2);
  (* c.get() = 2000, guaranteed by LOCK semantics *)
END ConcurrentCounter.

MUTEX, LOCK, and Thread.Fork are in the standard library โ€” not a third-party package, not an OS-specific import. The Modula-3 specification defines their semantics precisely, including deadlock prevention rules that the compiler can partially enforce. Java's synchronized, wait(), and notify() are direct descendants of this design.

Exception Handling

MODULE SafeDatabase;

IMPORT Database, IO;

EXCEPTION ConnectionFailed(TEXT);
EXCEPTION QueryError(TEXT);

PROCEDURE FetchData(host: TEXT): TEXT
  RAISES {ConnectionFailed, QueryError} =
VAR
  db: Database.T;
  result: TEXT;
BEGIN
  TRY
    db := Database.Connect(host, 5432);
    TRY
      result := Database.Query(db, "SELECT 1");
      RETURN result;
    FINALLY
      Database.Close(db);  (* always executed, even on exception *)
    END;
  EXCEPT
    Database.Error(msg) => RAISE ConnectionFailed("Cannot connect: " & msg);
  END;
END FetchData;

BEGIN
  TRY
    IO.Put(FetchData("db.example.com") & "\n");
  EXCEPT
    ConnectionFailed(msg) => IO.Put("Failed: " & msg & "\n");
  | QueryError(msg) => IO.Put("Query error: " & msg & "\n");
  END;
END SafeDatabase.

TRY/EXCEPT/FINALLY with typed exceptions and checked exceptions (procedures declare what they raise) โ€” this is Modula-3's 1988 exception system. Java adopted all three: typed exceptions, checked exceptions (the throws clause), and finally. The design was Cardelli's.

cm3 โ€” The Open-Source Modula-3 Compiler

CM3 (Critical Mass Modula-3) is the primary open-source implementation of Modula-3. It compiles to native code via a C backend and supports Linux on x86 and amd64:

# Install from source on Ubuntu/Debian
apt-get install -y gcc make g++ libglib2.0-dev

# Build CM3 from source (available on GitHub: modula3/cm3)
git clone https://github.com/modula3/cm3.git
cd cm3/scripts
./do-cm3-core.sh

# Or use the pre-built binary releases
# tar.gz available for Linux/amd64

# Compile a Modula-3 program
cd my-project
cm3 -build

# Run
cm3 -run

CM3 includes the full standard library: Thread, Mutex, IO, Fmt, Text, Rd (readers), Wr (writers), OS, Pathname, and network programming interfaces. It compiles to native binaries with performance comparable to C for compute-bound workloads.

Deploying to Europe with sota.io

(* src/Server.m3 โ€” minimal HTTP server in Modula-3 *)
MODULE Server;

IMPORT IO, Fmt, TCP, IP, Thread;

CONST PORT = 8080;

PROCEDURE HandleClient(arg: REFANY): REFANY =
VAR
  conn: TCP.T := arg;
  response: TEXT;
BEGIN
  response := "HTTP/1.0 200 OK\r\n" &
              "Content-Type: text/plain\r\n" &
              "\r\n" &
              "Modula-3 on sota.io โ€” EU infrastructure, GDPR-compliant\r\n";
  (* write response to connection *)
  TCP.Close(conn);
  RETURN NIL;
END HandleClient;

BEGIN
  VAR server := TCP.Listen(IP.Endpoint{IP.Any, PORT});
  IO.Put("Modula-3 server on :" & Fmt.Int(PORT) & "\n");
  LOOP
    VAR conn := TCP.Accept(server);
    EVAL Thread.Fork(NEW(Thread.Closure, apply := HandleClient, arg := conn));
  END;
END Server.
FROM debian:bookworm AS build

RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc g++ make git \
    libglib2.0-dev \
    && rm -rf /var/lib/apt/lists/*

# Build CM3 from source
RUN git clone --depth 1 https://github.com/modula3/cm3.git /tmp/cm3
WORKDIR /tmp/cm3
RUN cd scripts && ./do-cm3-core.sh 2>&1 | tail -20

ENV PATH="/tmp/cm3/bin:$PATH"

WORKDIR /app
COPY src/ ./src/
COPY m3makefile ./

RUN cm3 -build

FROM debian:bookworm-slim
WORKDIR /app
COPY --from=build /app/server .
EXPOSE 8080
CMD ["./server"]
# Deploy to EU infrastructure
curl -fsSL https://cli.sota.io/install.sh | sh
sota login
sota deploy --region eu-central-1

sota.io runs on Hetzner infrastructure in Germany, ISO 27001 certified, GDPR-compliant by architecture. Your Modula-3 services stay in EU jurisdiction โ€” no Schrems II exposure, no US CLOUD Act reach.

The Olivettiโ€“Cambridgeโ€“Cardelli Lineage

Modula-3 occupies a precise node in the genealogy of modern type systems. Following the lineage reveals how thoroughly European programming language research shaped the tools that power the global software industry:

Modula-2 (Niklaus Wirth ๐Ÿ‡จ๐Ÿ‡ญ, ETH Zรผrich, 1978)
    โ†“
Modula-3 (Cardelli ๐Ÿ‡ฎ๐Ÿ‡น + Jordan ๐Ÿ‡ฌ๐Ÿ‡ง, Olivetti Research Cambridge, 1988)
    โ”œโ”€โ”€ Java (James Gosling, Sun, 1995)
    โ”‚       โ†’ cited Modula-3 GC + interfaces + threads
    โ”‚       โ†’ today runs 3 billion devices
    โ”œโ”€โ”€ C# (.NET, Microsoft, 2000)
    โ”‚       โ†’ built by Anders Hejlsberg ๐Ÿ‡ฉ๐Ÿ‡ฐ on Java/Modula-3 concepts
    โ””โ”€โ”€ TypeScript (Anders Hejlsberg ๐Ÿ‡ฉ๐Ÿ‡ฐ, MSR Cambridge, 2012)
            โ†’ type theory by Cardelli ๐Ÿ‡ฎ๐Ÿ‡น at MSR Cambridge ๐Ÿ‡ฌ๐Ÿ‡ง
            โ†’ System F<: (Cardelli 1994) = foundation of TS generics

Anders Hejlsberg ๐Ÿ‡ฉ๐Ÿ‡ฐ, who designed both C# and TypeScript, worked at Microsoft Research Cambridge alongside Cardelli. The structural type system of TypeScript โ€” where {name: string, age: number} is a subtype of {name: string} because it has all required fields โ€” implements the subtype polymorphism theory from Cardelli's 1985 paper "On Understanding Types, Data Abstraction, and Polymorphism."

Every TypeScript developer writing interface User { name: string } is working with a type system whose foundations Luca Cardelli developed at Olivetti Research Cambridge in 1988.

EU Regulatory Relevance

GDPR Article 25 โ€” Data Protection by Design: Modula-3's opaque type system enforces information hiding at compile time. A Database.T opaque type cannot expose internal fields to modules that don't have explicit REVEAL access. This compile-time enforcement of access boundaries is precisely what "data protection by design" means translated into language semantics: the compiler prevents access to private data, rather than relying on runtime checks or developer discipline.

EU AI Act Article 9 โ€” Risk Management: Modula-3's checked exception system (RAISES clauses) requires procedures to declare every failure mode. A function that can raise ConnectionFailed or QueryError must declare both; callers that don't handle them fail to compile. For AI systems that must demonstrate exhaustive error handling (required by EU AI Act Art. 9 for high-risk systems), language-enforced checked exceptions provide a stronger guarantee than documentation or convention.

NIS2 Directive โ€” Thread Safety for Critical Infrastructure: Modula-3's MUTEX and LOCK semantics are formally specified in the language standard. Unlike C's POSIX threads (library calls with undefined behaviour on misuse) or Python's GIL (a runtime workaround), Modula-3's thread model provides compiler-verifiable mutual exclusion. For NIS2-regulated operators of essential services who must demonstrate secure concurrent design, Modula-3's formal thread model is directly relevant.

Legacy and Influence

Modula-3's direct descendants include the most widely used languages in the world:

The Modula-3 system at DEC SRC also produced two influential papers: Cardelli's "A Semantics of Multiple Inheritance" (1984) and "On Understanding Types, Data Abstraction, and Polymorphism" (1985, with Peter Wegner) โ€” papers that appear in the bibliography of virtually every PhD thesis in programming language theory written since.

See Also


See also: Deploy Modula-2 to Europe โ†’ โ€” Niklaus Wirth ๐Ÿ‡จ๐Ÿ‡ญ (ETH Zรผrich 1978), Modula-3's direct predecessor, the language that invented the module system as we know it today. Deploy Eiffel to Europe โ†’ โ€” Bertrand Meyer ๐Ÿ‡ซ๐Ÿ‡ท (ETH Zรผrich/EPFL 1985), Design by Contract and the contemporaneous European approach to provably correct OOP. Deploy ALGOL W to Europe โ†’ โ€” Niklaus Wirth ๐Ÿ‡จ๐Ÿ‡ญ + Tony Hoare ๐Ÿ‡ฌ๐Ÿ‡ง (Stanford 1966), the language in the same Wirth lineage that introduced records and strings.

โ†’ Start your free deploy at sota.io