What is published on the ELIZA Archaeology Code page is actually the complete, full original 1965 source code written by Joseph Weizenbaum (around 420 lines of MAD code).
However, if modern C++ or JavaScript ports look significantly larger, here is why modern translations make it seem like a small subset:
1. The Missing SLIP Library
Weizenbaum wrote ELIZA on top of SLIP (Symmetric List Processor), a list-processing extension library he created for languages like MAD and FORTRAN.
Routines like POPTOP, SEQRDR, NEWBOT, IRALST, LSPNTR, and LISTRD were system library functions provided by the CTSS operating environment.
When modern developers port ELIZA to C++, Web/JS, or Python, they have to write hundreds of lines of custom data-structure plumbing (doubly linked lists, reader pointers, garbage memory recycling, BCD character conversions) to recreate what SLIP handled automatically behind the scenes in 1965.
2. Low-Level CTSS Operating System Dependencies
The original 1965 program relied on the IBM 7094 / CTSS runtime environment for primitive tasks like:
In modern high-level languages like JS or C++, string parsing and memory management are handled differently, requiring re-implementations of BCD character mapping functions (e.g., DOCBCD, FRBCD, DELBC).
Summary
The MAD code on the page is 100% of ELIZA's high-level application logic. Modern C++ or JS reconstructions only look larger because they have to bundle the entire 1960s SLIP runtime environment, memory layout, and custom data structures directly into the program to make it run on modern devices.
In 1965, high-level abstractions like "lists" or "dynamic arrays" didn't exist in standard languages, so Joseph Weizenbaum had to build SLIP (Symmetric List Processor) as an extended framework. Modern languages didn't lose these capabilities—they absorbed them into their standard libraries, runtime environments, or core syntax, making manual memory management unnecessary.
The shift in design priorities highlights key differences between the original platform and modern ecosystems:
1. Data Structures: Built-in vs. Manual Architecture
1965 (MAD-SLIP): Basic languages like MAD or Fortran only understood raw memory locations and primitive fixed-size arrays. To store sentence trees and key-value rules, SLIP was created to manage explicit doubly linked lists, node pointers, list reader cursors (SEQRDR), and manual reference counting for memory cleanup.
Modern (Python / TypeScript): Types like Array, Map, Set, or List are built into the core language. Modern garbage collectors handle memory allocation and cleanup automatically without needing pointer manipulation routines.
2. Live Runtime Editing
1965 (CTSS Mainframes): Disk access was slow, compiling was expensive, and running job queues could take hours. ELIZA's CHANGE module allowed users to edit, add, or swap rules live in memory while the program was running, avoiding a full recompile or program restart.
Modern Systems: Live script modification exists today via interpreted REPLs, hot-reloading (like in Node.js or Webpack), and dynamic script loading (e.g., parsing JSON/YAML configuration rules on the fly). Modern systems simply handle this at the application or framework level rather than building custom commands directly inside the engine loop.
3. Word Packing & Bitwise Layouts
1965 (IBM 7094): Memory was measured in 36-bit words. String manipulation required manual packing of characters (via BCD formats) into machine words using bitwise bit-shifts.
Modern Systems: Strings are native, dynamic UTF-8/UTF-16 objects with rich built-in string methods (split(), slice(), replace(), regex matching), eliminating the need for character-packing routines.
Summary
The MAD-SLIP platform didn't have more features—it required more explicit code because low-level memory layout, pointer traversal, and custom data structures had to be handled manually. Today, modern languages provide higher-level abstractions that hide all of that boilerplate under the hood.