Est. 1996 Advanced

Terse

TERSE is a one-man commercial programming language for the Intel x86, written by Jim Neil of Melbourne, Florida: a symbolic, free-format, machine-level notation in which eax = ebx; means Mov eax,ebx and { dx-; }<>; is a whole loop. The compiler emits .ASM text rather than object code so that any Intel-mnemonic assembler can act as its back end, it shipped on a single 1.44 MB diskette with a 220-page bound manual for $49, and terse.com is still selling that DOS diskette today

Created by Jim Neil (who signs the 1995 article and the site copyright as JimNeiL), an assembly-language programmer working from Melbourne, Florida. The 1995 article's byline describes him as "currently an Algorithm Designer with AuthenTec, Inc. in Melbourne Florida", and elsewhere he describes contracting and moonlighting work, so he is best read as a working programmer who sold TERSE on the side rather than as a full-time vendor. He says he has earned a living writing assembly language since 1972, first programmed the Intel 8086 in October 1978, and published TERSE himself under the imprint JimNeil Press. There is no company behind the language beyond him

Paradigm Imperative and machine-level. TERSE is a symbolic, structured notation for x86 assembly: the programmer still allocates registers, still chooses instructions and still reads the flags, but writes them with operators rather than mnemonics. Catalogues that file the language under Functional are wrong on every count - it has no functions in that sense, no expressions that evaluate to values, and no data structures beyond what the underlying assembler provides
Typing None of its own. TERSE inherits the data typing of whatever assembler it emits to, since it emits .ASM text and passes anything it does not recognise straight through. Operand sizes come from the registers named in the statement, and declarations use the assembler's segment, Equ and data-definition machinery
First Appeared 1996 as a public, purchasable product: that is the year of the copyright notice on the site, the year the 220-page manual was published, the year the Internet Archive first captured terse.com, and the year the x86 Assembly Language FAQ recorded that Jim Neil had "just announced" the language. The language itself is older, but only the author's own account attests to that: every version of the site since 1996 says TERSE was "conceived in 1986, implemented in 1987" and has been used in real applications "since 1988". Catalogue entries giving 1993 have no support in any surviving source
Latest Version TERSE was never publicly version-numbered. The product on the order page is a single compiler executable, terse.com, described as 23,917 bytes, together with asm2t.com, batch files, a skeleton program and six sample programs on one 1.44 MB diskette. The earliest capture of the site (December 1996) claims support "from the 8088 through the P6"; the current site claims "the 8088 through the Pentium 4 and beyond", which is the clearest visible sign that anything changed between roughly 1996 and 2001. The site does not say whether that reflects any change to the compiler, and given that TERSE emits assembly text and passes unrecognised statements through, it need not

TERSE is what happens when one working assembly-language programmer decides that forty years of mnemonics were a mistake, spends a year building the alternative, and then spends the next thirty years selling it on a floppy disk.

It is a machine-level language for the Intel x86, and only for the Intel x86. It gives up nothing to the assembler: you still choose the registers, you still choose the instructions, you still know exactly which bytes come out. What it takes away is the notation. Where MASM makes you write Mov eax,ebx, TERSE lets you write what you were thinking anyway:

eax = ebx;      \ Mov  eax,ebx
bx  + dog;      \ Add  bx,dog
cat - 14;       \ Sub  cat,14
cx  & 0Fh;      \ And  cx,0Fh
dx  - 123?      \ Cmp  dx,123

That last line is the whole design in miniature. An arithmetic comparison is a subtraction whose result is discarded, so TERSE writes it as a subtraction — and swaps the terminating semicolon for a question mark to say “I only wanted the flags.” Its author calls ? the “just asking” operator.

Where it came from

Jim Neil had been writing assembly language for a living since 1972 when he first sat down with an Intel 8086, in October 1978, and found he disliked it intensely. The 8086 assembler, he wrote later, “was much more like a compiler than an assembler”: it had data typing, long symbol names, procedure definitions, data structures, a segmented address space and a plethora of special-purpose registers. His first response was reactionary — he wrote his own 8086 assembler modelled on the 8080’s, used it for about a year, decided it had made his bug rate worse, admitted the mistake and went back to Intel’s syntax.

The second response was the interesting one. Facing a large assembly project on machines with 64 KB of memory and 160 KB single-sided floppy drives — too tight for any high-level language — he designed a language instead. His account puts the idea in 1986 and the working compiler in 1987, though the sources do not quite line up on when: the 1995 article places the second project “a few months later” than the year he spent on his own assembler, which would mean around 1980, while the site’s “Joy of Hex” page dates the finished compiler to “some seventeen years” after his first programming class in the late 1960s. The article’s own “Copyright © 1987-1995” line and every version of the site since favour the mid-1980s reading. He says the compiler was itself written in x86 assembly, with fully table-driven lexical and syntax analysis and heavy use of Xlat and Lodsb. He describes it as “the last x86 assembly language program I ever wrote.”

Everything before 1996 rests on that account alone. What is externally verifiable is the launch: in 1996 the manual appeared under Neil’s own imprint, terse.com went up, and Raymond Moon’s x86 Assembly Language FAQ — the reference document for the newsgroup at the time — gained a section reading “Jim Neil has just announced his TERSE Programming Language.” Catalogue entries that date the language to 1993 have nothing behind them; neither the author’s story nor the public record has anything to say about that year.

What the language actually is

TERSE is horizontal. Neil’s central complaint about assembly language is that it is vertical — one statement per line, column-oriented — which wastes the screen of a full-screen editor and hides the shape of a routine. TERSE is free-format with multiple statements per line, and the intended style packs a thought per statement and several statements per line, with a comment column on the right.

Flow control is structural rather than label-based. Braces delimit blocks; the operator after the closing brace says what kind of block it was:

eax - 10 ? =={ eax = 1; },{ eax = 0; };   \ if eax == 10 then 1 else 0
dx = 1000; { dx-; }<>;                    \ while dx != 0: dx--

Read the second one as: initialise dx, then decrement it and loop back while the result is non-zero — a Mov, a Dec and a Jnz, and no invented label. Neil’s pitch for this is not abstraction but hygiene: “there is never the need to invert another conditional or invent yet another meaningful label. Copy and paste all day long and never have a label conflict!”

Chained and compound statements collapse the assembler’s redundancy:

es = ax = 0A000h;   \ Mov ax,0A000h;  Mov es,ax
ax + bx - cx & dx;  \ Add ax,bx;  Sub ax,cx;  And ax,dx
=ax =bx =cx;        \ Push ax;  Push bx;  Push cx
ax= bx= cx=;        \ Pop  cx;  Pop  bx;  Pop  ax

Chained assignments run right to left, computations left to right. The es = ax = 0A000h idiom is the language’s favourite example, because the x86 cannot load a segment register with an immediate and every assembly programmer therefore writes the same two-instruction dance; TERSE writes the single thought as a single statement and calls ax a work register. Elsewhere there is built-in pointer advancement (al=[bx+];), postfix + and - for increment and decrement, !21h for Int 21h, and, in comparisons, >> for unsigned above against > for signed greater than — chosen, Neil explains, because unsigned operands are potentially larger numbers, so they get the physically larger operator. The same doubling rule runs through the operator set in other contexts, where it means “a bit more work”: outside comparisons > and < are shifts while >> and << are rotates, * is a signed multiply and ** an unsigned one, and ++ is add-with-carry rather than plain addition. Comments run to end of line after a \, picked as a lowercase character that was “pleasing to the eye and not requisite for the specification of any processor operation”.

The operator choices are not incidental to the product. The manual’s selling point is that it explains the reasoning behind every operator, on the theory that a remembered reason is a remembered operator. The site’s slogan for this is that TERSE is “as simple as 2 = 1 + 1”.

The compiler that refuses to be a compiler

The design decision that makes TERSE unusual among assembly-syntax projects is that it does not generate object code at all. It generates .ASM text, and hands it to whatever assembler the customer already owns.

Neil’s reasoning is stated plainly in the 1995 article: object file formats are numerous and getting them all right is hard, so don’t. Use the assembler as a “common code generator”. The consequence is that TERSE is compatible with any object format, any linker, any librarian, any debugger and any high-level language toolchain the customer already has, and that it inherits the assembler’s directives, macros, conditional assembly, structures and equates for free. Anything the compiler does not recognise as a TERSE statement is passed through untouched — which means standard assembly can be mixed line-by-line with TERSE, and any instruction Intel adds in future becomes available the moment the assembler supports it, with no compiler upgrade. A companion program, asm2t.com, converts existing assembly source to the pass-through-compatible form so that an existing codebase can be migrated a routine at a time.

The cost is a second pass over the source, and Neil’s answer to that was to make the compiler extremely fast — written, he says, as if it were a real-time program, with fully table-driven lexical and syntax analysis, jump tables, huge I/O buffers and heavy use of Xlat and Lodsb.

The speed claim itself should be read as advertising rather than as a benchmark. The site says TERSE “compiles thousands of statements per second”; the 1995 article puts the same claim as “compilation times are measured in thousands of lines per second”. Both figures are the vendor’s own, they are not stated consistently, and neither comes with a processor, a clock speed, a source corpus or a baseline to compare against. No independent measurement of a TERSE compile has ever been published. The 23,917-byte executable size, by contrast, is a specific figure the vendor has quoted unchanged for thirty years.

The product

TERSE was never free, never downloadable and never open. Per the order page, $49 plus $9 shipping ($19 outside the US) bought a bound manual the site advertises as 220 pages — the Library of Congress record collates it as “xvii, 197 p.”, so the round number is presumably the physical extent rather than the numbered pages — with a tear-out “Memory Jogger” reference card, the complete language BNF, assembly-to-TERSE and TERSE-to-assembly lookup tables, and a 1.44 MB 3.5-inch diskette containing terse.com, asm2t.com, batch files for driving the compiler, assembler, linker and exe2bin, a reusable .com skeleton and six sample programs. The licence permits one copy on one machine, forbids networking it, and forbids copying the manual. Neil offered a 30-day money-back guarantee and shipped US orders by Express Mail.

The stated system requirements are the clearest single fact about how the language aged: an 8088 or better, 256 KB of memory, a 1.44 MB diskette drive, DOS 2.0 “or equivalent (e.g., Windows)”, any assembler using Intel mnemonics — MASM, TASM and NASM are the three named — and any editor that writes plain ASCII. That list has not changed on the site in a quarter of a century. Whatever “clearly it has been ported to other OSes” meant to observers in 2003, the vendor has never documented a build for anything but DOS.

Reception

The reception was not kind, and the record of it is unusually candid because most of it happened in one thread.

On 11 December 2003 Bryan Parkoff asked comp.lang.asm.x86 what people thought of terse.com. Michael Brown replied that it “definately doesn’t replace assembler”: it performs no instruction reordering, so peak performance still requires hand-written or inline assembly; there is no support for SIMD instructions except through pass-through assembly; and it was probably good “back in the pre-pentium days, where you only had to worry about cycle counting” but out of date for out-of-order CPUs. Toby Thain said the site’s “thicket of marketing speak and overheated boosterism was utterly impenetrable” — a fair reading of pages headed The Joy of Hex, Extreme Programming, He Laughed When I Told Him I Had Invented A New Language and I’m Not A Programmer, What Can TERSE Do For Me?, the last of which asks consumers to demand the TOP logo on the software they buy.

The most striking post is Randall Hyde’s. Hyde — himself the author of a high-level assembly syntax, HLA — wrote that he was “not at all sure” the language had been substantially updated since the days of DOS, that, as he recalled it, several people in the assembly community turned on Neil over the $50 price, that Neil had spent that period patiently answering beginners’ questions in the newsgroup, and that after sustained personal and professional attacks and after “someone decided to ‘ruin’ the product by releasing their own free version of Terse, we never heard from Jim again. What a real shame.” Ed Beroset, replying, thought it was the evangelism rather than the price that had done it, and cautioned that neither recollection might be correct. The free-software world’s own summary, in the Linux Assembly HOWTO, splits the difference: the most compact assembler syntax for the x86 family — “however, it is evil proprietary software” — with a note that the free clone was abandoned “after worthless pretenses that the syntax would be owned by the original author”, and an open invitation to build a TERSE-syntax front end for NASM. Nobody took it up.

Where it stands

terse.com is still there. Fetch it today and you get the same pages, the same claims, the same Melbourne, Florida phone number and the same offer: send $58 and a diskette will arrive. Nothing on it has been revised in roughly twenty-five years — the newest fact on the site is the Pentium 4 — and there is no download, no repository, no forum, no mailing list, no successor and no version 2. For a language whose entire distribution channel is a physical 3.5-inch floppy for DOS, “dormant” is generous.

What survives in public is thin: one PDF article, one 176-byte 99 Bottles of Beer program, a paragraph in an assembler FAQ, a paragraph in a Linux HOWTO, and a seven-message argument from 2003. The manual is scarce enough that library catalogues carry a single record for it, with the title misspelled.

Why it matters

TERSE is worth remembering for two reasons, and neither is commercial success.

The first is that it is a genuinely thought-out point in a design space most people never notice exists. The space between C and assembly language has been probed repeatedly — Wirth’s PL360, Hyde’s HLA, the structured macro packages that ship with MASM and TASM, and today’s inline-assembly intrinsics — and TERSE stakes out the extreme end of it: keep all of the machine, change only the notation. Its refusal to optimise is not a limitation it apologises for but the entire premise — the compiler, in the site’s phrase, “doesn’t generate anything without being ’told to’”, and the optimising is left entirely to the programmer. That is a defensible position, and the 2003 critique — that a language which does no scheduling is worthless on out-of-order hardware — is the strongest argument against it, made by people who had thought about it just as hard.

The second is as a case study in what it costs to be a one-person commercial language in the internet era. TERSE had a real implementation, a real manual, real documentation, a real design rationale for every operator and, on the author’s account, a decade of production use before it was ever offered for sale. It had no free tier, no source, no community, no package repository and no way to try it before paying, and it met a newsgroup culture that had recently been given NASM for nothing. What it had instead was one man’s enthusiasm, expressed at a volume that convinced very few people and irritated a good many. Thirty years later the site is still up, the price is still $49, and the language survives in the reference lists mostly as a garbled entry — commonly filed as a 1993 functional research language, which is wrong in the year, wrong in the paradigm and wrong in the field.

Timeline

1978
October: Jim Neil programs an Intel 8086 for the first time and, by his account, hates it - the assembler "was much more like a compiler than an assembler", with data typing, long symbol names, procedure definitions and a segmented architecture unlike anything in his 8080-era experience. He responds by writing his own 8080-style assembler for the 8086, uses it for about a year, decides the experiment made his bugs worse, and goes back to Intel's syntax
1986
Facing a large 8086 assembly project on machines with 64 KB of memory and 160 KB single-sided floppies, and unable to use a high-level language for reasons of space and speed, Neil conceives TERSE: a structured, symbolic, free-format low-level language. Every version of the site since 1996 gives this year for the idea. The 1995 article tells the same story but places it "a few months" after the year he spent on his own 8080-style assembler, which would put it around 1980; the site's own "Joy of Hex" page, which dates the finished compiler to "some seventeen years" after his first programming class in the late 1960s, supports the mid-1980s date, as does the article's own "Copyright (c) 1987-1995" line. The narrative and the stated year cannot both be read literally
1987
The compiler is implemented. It is written in x86 assembly language with table-driven lexical and syntax analysers, and Neil describes it as "the last x86 assembly language program I ever wrote". This is the year the language itself dates from, on the author's account
1988
The year from which Neil says TERSE has been used in "medical, military, industrial and commercial applications". No customer or product from this period is ever named, on the site or anywhere else
1995
Neil writes "terse: Relief for the Forlorn Programmer", a seven-page article with the subtitle "A language with hi-level look-and-feel, low-level control", carrying a "(c) 1995, JimNeiL" line and ending with the Dr. Dobb's Journal sign-off "DDJ". The site describes it as "written for Dr. Dobb's Journal"; whether any issue of the magazine actually carried it could not be confirmed, and the byline giving Neil's phone number in the 407 area code is consistent with a mid-1990s draft. It is the fullest technical description of the language in public: it walks through the operators, explains why each was chosen, and ends with a complete Sieve of Eratosthenes in TERSE
1996
TERSE goes on sale. The manual, The TERSE Programming Language, is published by JimNeil Press (ISBN 0-9652660-0-1); the site copyright notice reads "Copyright (c) 1996 Jim Neil, 3375 Areca Palm Ave., Melbourne, FL"; the Internet Archive captures terse.com for the first time on 28 December; and on 19 August section 35 of Raymond Moon's widely mirrored x86 Assembly Language FAQ is updated to read "Jim Neil has just announced his TERSE Programming Language". The December 1996 home page calls it a "Symbolic Assembly Language" and says it has been "proven in real world applications for nine years"
2001
22 May: the 1995 article is distilled to PDF (the PDF's own creation timestamp) and put on the site. Around this period the site is rewritten: TERSE becomes an "Algebraic Assembly Language" rather than a symbolic one, the processor claim moves from "the P6" to "the Pentium 4 and beyond", and the home page adds that TERSE "has virtually replaced assembly language for time and/or space critical applications in embedded x86 based and PC applications" and has been used by "Fortune 250 corporations, universities, and programmers on six continents since 1996". The phone and fax numbers carry Melbourne's 321 area code, which only came into use in November 1999
2003
11-13 December: the last substantial public discussion of the language that survives, a seven-message comp.lang.asm.x86 thread titled "C/C++ is dead -- Terse is alive???", opened by Bryan Parkoff. Randall Hyde, author of the High Level Assembler, writes that he is "not at all sure" TERSE had been substantially updated since the DOS era, that several people in the assembly community attacked Neil over the $50 price, that "someone decided to 'ruin' the product by releasing their own free version of Terse", and that "we never heard from Jim again". Ed Beroset replies that in his recollection it was the evangelical marketing rather than the price that grated, adding that "it's of course possible that neither is correct". Michael Brown faults the language for doing no instruction reordering and having no SIMD support except through pass-through assembly
2005
20 April: a TERSE implementation of 99 Bottles of Beer is submitted anonymously to 99-bottles-of-beer.net as entry 444. The program's header credits "[email protected] (Jim Neil)" and states that it "Runs under any version of DOS, 176 byte .COM file". This entry, filed there under a category the site fills in as "real language", is how TERSE reached most language catalogues - and why so many of them get its date and paradigm wrong
2026
terse.com is still online, still served in full, and still selling the same product: a diskette and a bound manual, ordered by credit card, cheque, fax or post, for $49 plus $9 shipping. The system requirements have never been updated - an 8088 or better, 256 KB of memory, a 1.44 MB drive and DOS 2.0 "or equivalent (e.g., Windows)". No download, no repository, no mailing list and no update to the language have ever appeared

Notable Uses & Legacy

The TERSE compiler's own sample programs

The six programs shipped on the distribution diskette are the largest body of TERSE source anyone outside the customer base has seen listed: a tone generator (beep.t), a time and date stamper (tds.t), the Sieve of Eratosthenes (sieve.t), a starfield simulation (startrek.t), a kaleidoscope (kaleidm.t) and what the order page calls a "Unique 29.9-Bit to 9-Digit ASCII Converter" (99.t). sieve.t is printed in full as Listing One of the 1995 article, computing every prime below 65,536 and noting in its own comments that printing takes roughly a hundred times longer than the computation

99 Bottles of Beer, entry 444

A 176-byte DOS .COM program submitted to 99-bottles-of-beer.net in April 2005 without an author name in the entry itself; the header comment carries Jim Neil's name and address, so it is presumably his. It was, until 99-bottles-of-beer.net stopped resolving to a web server some time in 2026, the only complete TERSE program of any size freely readable on the open web, and it is a fair sample of the language: a Group directive placing data before code, DOS interrupt calls written as ah = 9; !21h;, a loop written as { ... }-.; and a subroutine call written =.Bottles

The Linux Assembly HOWTO

Section 3.4.11 of the HOWTO, in its list of x86 assemblers, calls TERSE "a programming tool that provides THE most compact assembler syntax for the x86 family" - and immediately adds "however, it is evil proprietary software", reporting that a free clone project existed somewhere and was abandoned, and inviting readers to write a terse-syntax front end to NASM instead. Nobody ever did. It is the closest thing TERSE has to an entry in the free-software record

The TOP Developer's Program

Neil's attempt at building an ecosystem: a free scheme under which any owner of TERSE who sent him a written statement that they had used it in a shipping product, plus an estimate of the gains, earned the right to put the TOP ("Optomized Performance") logo on their software - explicitly modelled on "Intel Inside". The site promised to list participating products. No such list was ever published, which is the single strongest indication of how small the user base really was

Unnamed medical, military and industrial systems

The vendor's own claim, repeated on the site since 1996 and in the 1995 article, is that TERSE has been used in medical, military, industrial and commercial applications since 1988 and by Fortune 250 corporations since 1996. Not one of these users has ever been named by Neil or identified by anyone else, and the claim should be read as marketing rather than as documented adoption

Running Today

Run examples using the official Docker image:

docker pull
Last updated: