39

diagram showing ASM to binary compilationThe C Programming Language was originally developed by Dennis Ritchie who also co-designed the Unix operating system with which development of the language was closely intertwined.

Is there a specific individual or research group credited with developing the assembler and assembly language syntax that we are now familiar with?

wizzwizz4
  • 18,543
  • 10
  • 78
  • 144
jwzumwalt
  • 4,479
  • 6
  • 24
  • 47

4 Answers4

82

According to Wikipedia, the first assembly language, "Contracted Notation", was developed in 1947 by the late Kathleen Booth (née Britten). The language doesn’t look anything like “modern” assembly though (see the end of this paper); it’s more a mathematical representation of computer operations.

The first mnemonic-based assembler was developed by Maurice Wilkes and David Wheeler for the EDSAC, with single-letter mnemonics; see Assemblers and Loaders, page 7.

The first symbolic assembler is credited to Nathaniel Rochester, who developed an assembler for the IBM 701 in 1954. I can’t find an example of the mnemonics and syntax used then (in any case, mnemonics tended to be assembler-specific rather than machine-specific).

The first modern-looking assembler was the GAS (Generalized Assembly System) for the IBM 7090, developed by a number of people (including Douglas McIlroy, later of UNIX fame, and George Mealy) in the early sixties.

hippietrail
  • 6,646
  • 2
  • 21
  • 60
Stephen Kitt
  • 121,835
  • 17
  • 505
  • 462
  • 29
    Since the gender discrepancy in the title was brought up, I feel compelled to mention that the first compiler was also created by a woman (Grace Hopper), as was the first computer program (Ada Lovelace). In fact, back when "computer" was a job title, most computers were women too. The male-dominated industry we have today is a very recent development. – T.E.D. Apr 26 '18 at 14:05
  • 4
    @T.E.D. that was not the first compiler, and COBOL was not de novo but was based on several other languages. – JDługosz Apr 26 '18 at 17:23
  • 10
    @JDługosz regardless of whether A-0 is considered as a full compiler or not, and whether or not Autocode beat it to be the first compiler, Grace Hopper’s work on the topic was ground-breaking (so much so that no one believed her at first...). – Stephen Kitt Apr 26 '18 at 17:52
  • 1
    At the risk of taking this further off-topic, NPR's Planet Money did an interesting story on When Women Stopped Coding (Podcast, Story). –  Apr 26 '18 at 19:13
  • 10
    @StephenKitt her implementation was unique not in being a translator but in using English-like words rather than math notation. When I studied IBM 360 assembly language, I thought writing a program to turn simple calculator-like expressions into code was an obvious thing to do; that would be a proto-FORTRAN. In fact the term "compiler" comes from these simple helper systems, well before full-blown language translators. – JDługosz Apr 26 '18 at 19:30
  • @JDługosz I’m not sure what you’re getting at, so I’m not sure whether you’re disagreeing with me or not. Regarding the term “compiler”, Grace Hopper invented it, so it’s safe to say it came from her research ;-). – Stephen Kitt Apr 26 '18 at 21:13
  • @T.E.D.: Possibly while the guys were saying "real men program in machine code (or asm)", some women thought it should be easier for everyone and did something about it. That whole "real programmers" (leaving out the "real men" part) attitute is still a pretty macho stereotypical attitude, so I wonder if that had anything at all to do with women being the creators of those two major steps in higher-level programming abstractions. (I think usually it's only used jokingly these days, and hopefully was only ever a joke for most people, though.) – Peter Cordes Apr 27 '18 at 02:59
  • 2
    @T.E.D. Note that Ada Lovelace was neither the first programmer nor the first debugger. She was the first assistant programmer/debugger (as Babbage was, obviously, the first programmer and debugger). Likewise Grace Hopper did not create the first compiler, as JDlugosz says (not to mention, she just worked on a team for COBOL, she was not the sole member of the team). I mean women have done some amazing things in computer science, so I don't get why people always repeat these specific myths. – forest Apr 27 '18 at 03:23
  • 18
    @forest - re Ada Lovelace, yes you're obviously right that the first programs were written by Babbage himself. OTOH to relegate Lovelace's role to "assistant" does do her a disservice; she did write many programs herself, and independently invented a number of concepts, including the first realisation that while Babbage's plans for the analytical engine operated entirely on numbers, those numbers could be used as stand-ins for abstract entities. So she was the first to imagine new applications of computers beyond their designer's original purposes, which is the true calling of a programmer. – Jules Apr 27 '18 at 07:09
  • 3
    @Jules I certainly didn't mean to claim that her being an assistant made her any less important! She obviously had an extremely important role, but calling her the first programmer (when Babbage, despite focusing more on the mechanical properties of his machines, did write programs for them) is simply incorrect. – forest Apr 28 '18 at 11:07
  • As for the first example, I am seeing an abstract paper talking about theory of digital computing and general machine code use. The 2nd example resonates more to assembly. To be fair enough, I only perused briefly the document. – Rui F Ribeiro Apr 29 '18 at 08:24
  • I don't think we can call the opcodes in Wheeler's work "mnemonics". They were the actual machine-code. e.g., the EDSAC 'add' instruction was represented in the machine by the bits that equate to the letter 'A' in the EDSAC paper tape code. – dave Nov 14 '18 at 00:57
  • A typical assembler will serve two purposes: 1. allow programs to be written in a fashion that allows code to use labels that resolve to addresses, in such a fashion that if the address of a label changes, all code using that label will be updated; 2. allow programs to be written using human-readable instructions and labels, rather than using numbers for everything. A program intended for the former purpose could be much smaller than one intended to serve the latter, while making it possible to edit programs stored on punched cards without having to repunch everything. – supercat Sep 15 '22 at 18:43
  • Kathleen Booth just passed away a couple of days ago at the age of 100: https://www.theregister.com/2022/10/29/kathleen_booth_obit/ – hippietrail Oct 31 '22 at 09:28
  • Do we need ‘the late’, though? Many computing pioneers are deceased at this point, yet nobody speaks of ‘the late Alan Turing’. – user3840170 Oct 31 '22 at 13:05
  • 2
    @user3840170 I wanted to include a link to the obituary mentioned by hippietrail above, since it gives useful background and includes links to reference material. If you have a better way of presenting that I’d welcome an edit! – Stephen Kitt Oct 31 '22 at 13:08
  • Would the 1954 symbolic assembler have been the first means of inputting machine code that could be edited in ways that added or removed instructions, without requiring hand adjustment of addresses, or was there any earlier means of entering programs with numerical placeholder labels for addresses? – supercat Oct 31 '22 at 21:48
  • @supercat labels were used on the Whirlwind, see this example; I don’t think that’s the earliest example but it’s earlier than 1954. – Stephen Kitt Nov 01 '22 at 08:56
  • @StephenKitt: Was the code there shown in a form that could be entered into the computer, or would it have been intended for use by a "hand assembler"? If the first automated assembler was 1954, I would think the latter. What I'm curious about is when it would have been possible to e.g. punch a program on cards in such a way that one could add cards in the middle without having to repunch cards containing references to other cards. – supercat Nov 01 '22 at 14:59
  • @supercat I don’t have the answer to that as far as the Whirlwind is concerned, but the EDSAC had something in between — the “Wheeler jump”, which allowed subroutines to be tacked on to the end of a paper tape without modification (the return address was passed to each subroutine in the accumulator, and the subroutine modified its final instruction to jump back to the return address). – Stephen Kitt Nov 01 '22 at 15:16
  • @StephenKitt: I suppose one could also accomplish something similar by deciding to place a jump table at the end of address space, and saying that if e.g. there were 4096 words of RAM, one wanted to add a branch to some address foo, and one had previously coded 9 jumps, one would put a branch to JMP 7766, and add a JMP to the desired address at location 7766. One would likely have to punch a new tape or group of cards for the jump table whenever one changed parts of the program, but that would be far less work than having to rework everything. – supercat Nov 01 '22 at 15:25
  • @StephenKitt: Incidentally, I've also sometimes done something similar on real-world systems when using OTP, but with jump-table entries spaced out slightly with blank storage areas between. If a routine needed to be changed, the JMP could be replaced with an all-bits-zero NOP, and the blank area rewritten with a jump to the address of a replacement function. – supercat Nov 01 '22 at 15:28
  • @supercat you could, but the Wheeler jump means you don’t need to rewrite even a jump table — the code modifies itself in memory, every time it’s called, not on tape. – Stephen Kitt Nov 01 '22 at 15:29
  • @StephenKitt: If the code for a subroutine needed to be changed, how would Wheeler jumps avoid the need to patch calls to the subroutine to use the new address? – supercat Nov 01 '22 at 17:29
  • @StephenKitt: Upon some further consideration, I find myself thinking that using a jump table for almost everything other than short relative branches could have simplified hardware design by eliminating the need for a "long branch" or "long jump" instruction format. If all operations either acted upon registers or upon storage at a base+8-bit displacement address, a program could have a manually-managed list of constants and addresses it used. If there were less than 256 different constants or "long" addresses used in a program (which would likely be the case for... – supercat Nov 01 '22 at 17:36
  • ...programs that could fit in the memory of early machines) deciding that a certain subroutine should be called by storing the current PC to address 35 and then jumping to address held in memory location 36, and then later putting the address of the subroutine into address 36, would avoid the need to edit the cards containing the code making the call if the address of the subroutine changes. – supercat Nov 01 '22 at 17:38
29

As an addition to Stephen's extensive list, Zuse's 'Planfertigungsteil' (a modern translation might be Program Manufacturing Device) as implemented in 1942-1945 for the Z4 computer might be worth mentioning. While not a program, but a hardware device, it allowed the use of abstract operation names as well as symbolic addresses. There was even functionality to check a program for valid operations during entry.

Of course this 'assembler' was quite different from today's notation, but so was the machine.

The Z4 became fully operational for the first time in April 1945, just days before the war ended (in Europe).

So if we include hardware based assemblers, Konrad Zuse is another candidate.

Stephen Kitt
  • 121,835
  • 17
  • 505
  • 462
Raffzahn
  • 222,541
  • 22
  • 631
  • 918
  • 2
    I actually always found it ironic I had to find Zuse by change due to it not being mentioned in school. It is said the Z3 was already an advanced machine. – Rui F Ribeiro Apr 29 '18 at 08:32
  • 5
    @RuiFRibeiro The Z3 is an amazing piece of hardware. It's basically an FPU, but it already works with normalized floating point numbers, has infinities and error signalling for invalid operations and supports five operations (the usual four plus square roots). And all that at a time where the rest of the world considered real numbers to be infeasible for computers. – fuz Apr 29 '18 at 12:11
  • 1
    @RuiFRibeiro I'm right nowl istening to a speech of Horst Zuse at the VCFe in Munich. – Raffzahn Apr 29 '18 at 13:11
6

You might find it interesting to read Don Knuth and Luis Trabb Pardo's paper 'The Early Development of Programming Languages' which lists a good number of early coding and programming systems. Precisely what you count as an 'assembly language' will influence which of these you take to be the first, but you should find a good candidate here.

  • 1
    That is indeed an interesting paper, but it skips the opcode-mnemonic stage in language development which to me corresponds the most closely to “modern” assembly language. It is very useful though to understand the mathematical representation styles used in very early languages. I’d say the language closest to assembly language in the paper is the first AUTOCODE, but even that is one step up from assembly language. – Stephen Kitt Apr 26 '18 at 14:22
  • 1
    @StephenKitt Except, the 'opcode-mnemonic' stage is in itself rather fuzzy concept, as it's not (always) a simple one-on-one relation. Just think Z80 or 8086 where one mnemonic can have various opcodes depending on the arguments used, while others (like /360) got a strict 1:1. – Raffzahn Jun 14 '18 at 22:59
-4

While not actually built (at least not in its perfect, theoretical form), I'd propose the Turing Machine (1936) as the precursor of assembly languages. A machine with a given set of states and their transitions is controlled by the inputs received in the tape, which can move forward or backward. As for the actually implemented assembly languages, I think it's all said in the other answers.

  • 10
    You're saying that the state transition table is the assembly language of the TM? Isn't it more analogous to the machine language? – Barmar Apr 25 '18 at 23:55
  • 4
    Erm, the Question was about an Assembler, a way to translate human input in symbolic form into code needed to operate the machine to run it. – Raffzahn Apr 26 '18 at 07:13
  • 1
    I misinterpreted the question. My bad. I understand the "father of" something is not the first something individual, but its generator (in other words, the father of the first assembly language isn't the first assembly language itself). But reading the question again, realized that it's about the author herself. – Jesus Alonso Abad Apr 26 '18 at 08:16
  • As for the assembly language vs machine code, is there a difference besides the assembly language is human-readable and the machine code is machine-readable?

    The transition table and the states are the analogous of the instruction set, and the inputs, the program itself (although the instructions are implicit in the current state, not explicit in the program)

    – Jesus Alonso Abad Apr 26 '18 at 08:17
  • 1
    The fact that assembly language is human-readable is a huge difference from machine code. – pipe Apr 26 '18 at 08:28
  • 3
    Assembly and machine code is not a one on one relation - usually. For example a LDA mnemonic on a 6502 can result in 6 different machinecodes,depending on the data/addressing used. – Raffzahn Apr 26 '18 at 21:10
  • @JesusAlonsoAbad: Generally, assembly language programs are represented in a fashion that allow code to refer to the addresses of particular instructions that are represented in source, such that if instructions are added or removed in the source code, causing other instructions to move, machine-code references to the latter instructions will automatically be adjusted to refer to their new addresses. – supercat Oct 31 '22 at 21:39