Fact-checked by Grok 2 weeks ago

ALGOL 60

ALGOL 60 is an imperative, designed for the clear and unambiguous expression of algorithms in a machine-independent form. Officially known as the Algorithmic Language 1960, it was formalized in a report authored by an international committee of 13 computer scientists, including John W. Backus and (as editor), and published following a conference in from January 11 to 16, 1960. The language emphasized through features like block structure and lexical scoping, making it suitable for both algorithmic description and practical computation across diverse hardware. A revised version of the report, incorporating clarifications, appeared in 1963. The development of ALGOL 60 stemmed from efforts to create a for exchange among researchers and programmers, building on earlier work like the 1958 conference that produced the preliminary report. Organized jointly by the Association for Computing Machinery (ACM) and the Society for Applied Mathematics and Mechanics (GAMM), the project involved contributions from European and American experts to address limitations in existing languages like . The resulting specification was the first programming language fully defined using Backus-Naur Form (BNF) for its syntax, enabling precise and formal description. Key innovations in ALGOL 60 included compound statements for grouping code, call-by-value and call-by-name parameter passing, and support for recursive procedures, which advanced modular and readable code design. It lacked built-in facilities to maintain platform independence, instead relying on external procedures for such operations. These elements promoted clarity in expressing computational processes, distinguishing it from contemporaries focused more on numerical computation. Despite limited commercial adoption in the United States due to Fortran's dominance, ALGOL 60 profoundly shaped subsequent languages, serving as the foundation for Pascal, , and indirectly C through intermediate designs like CPL and . Its emphasis on formal syntax and structure influenced standards in programming language design and remains a milestone in the evolution of practices.

History and Development

Origins and Design Process

The development of ALGOL 60 originated as a successor to the outcomes of the conference, which was initiated by the Association for Computing Machinery (ACM) and the German Association for Applied Mathematics and Mechanics (GAMM) in 1958. The meeting, held from May 27 to June 1, 1958, brought together representatives from both organizations to propose the International Algebraic Language (IAL), aiming to standardize algorithmic expression amid the proliferation of machine-specific languages. This preliminary report, published in Communications of the ACM, laid the groundwork for a unified approach to describing computational processes, influencing subsequent refinements that led to ALGOL 60. The design involved 13 key experts from Europe and the United States, including John W. Backus, , , Charles Katz, John McCarthy, , Alan J. Perlis, Heinz Rutishauser, Klaus Samelson, Bernard Vauquois, Joseph H. Wegstein, Adriaan van Wijngaarden, and Michael Woodger. Backus contributed the Backus Normal Form (BNF) for formal syntax description, while Naur served as editor, refining semantics and ensuring clarity in the report's structure; Bauer and Samelson advanced early concepts in formula translation and syntax from the GAMM side, and Perlis and Katz represented ACM's focus on practical applicability. These contributors, drawn from the original ACM and GAMM committees, collaborated through multiple preparatory meetings to evolve the IAL proposals into a more robust specification. The was finalized at the meeting from January 11 to 16, 1960, attended by the 13 representatives, where a new draft by Naur was adopted as the basis, resolving key issues such as parameter passing mechanisms like call-by-name and call-by-value. The original was published in Communications of the ACM in May 1960, providing a complete defining description of ALGOL 60. The primary goals were to create an international, machine-independent for the clear description and expression of algorithms, prioritizing readability akin to over computational efficiency to facilitate publication and mechanical translation. This emphasis on clarity built briefly on IAL proposals, seeking to enable effective communication of numerical methods across diverse computing environments.

Standardization Efforts

The standardization of ALGOL 60 was spearheaded by the International Federation for Information Processing (IFIP) Working Group 2.1, which assumed responsibility for the following the April 1962 conference in that produced the Revised . This group coordinated efforts to refine and formalize the language specification, addressing ambiguities identified in early implementations and publications. Their work established ALGOL 60 as a foundational algorithmic , influencing subsequent international norms. The Revised Report on the Algorithmic Language ALGOL 60, edited by and published in January 1963 in Communications of the ACM, served as the initial canonical definition, correcting errors and clarifying ambiguities from the 1960 preliminary report. It introduced three official language levels to facilitate precise description and implementation: the Reference Language, using a for abstract syntax; the Publication Language, adapted for human-readable printed or handwritten forms; and Hardware Representations, allowing machine-specific encodings while preserving semantic equivalence. These levels ensured the language's portability across diverse computing environments. Subsequent refinements culminated in the Modified Report on the Algorithmic Language ALGOL 60, prepared under IFIP 2.1 authority by R. M. de Morgan, I. D. Hill, and B. A. Wichmann, and published in The Computer Journal in 1976. This document provided minor technical revisions and textual clarifications, notably resolving ambiguities in parameter passing mechanisms—specifying "call-by-value" as pre-execution assignment of actual parameter values and "call-by-name" as textual substitution within the body. It also refined the "for" statement by detailing iterative semantics for clauses like step, until, and while, ensuring consistent control variable behavior across iterations. Additionally, type specifications were tightened, limiting values to signed s including zero and defining to yield exact results via a specified . These efforts led to formal international recognition, with the first ISO recommendation, ISO/R 1538 (Programming Language ), issued in 1972 as a compilation of key ALGOL 60 documents, later withdrawn in 1977. The definitive international standard, ISO 1538 (Programming Languages — 60), was published in its first edition in 1984, stabilizing the language based on the Modified Report without further substantive changes. This standard affirmed ALGOL 60's role in numerical algorithm expression and automatic translation to .

Early Implementations Timeline

The first complete implementation of ALGOL 60 was developed by and Jaap A. Zonneveld at the Mathematical Centre in for the Electrologica X1 computer, becoming operational in August 1960. This compiler, written in for the X1's 40-bit architecture, supported core features including and block structure, marking a significant milestone as the earliest full realization of the language just months after its specification was published in May 1960. In 1961, several key early compilers emerged, reflecting rapid adoption among hardware vendors. Burroughs Corporation released its ALGOL compiler as part of the B5000 system, a stack-based machine designed specifically to optimize high-level languages like through single-pass compilation and hardware support for procedure calls. Concurrently, Elliott Brothers introduced an compiler for the Elliott 803 transistor-based computer, providing one of the first block-structured implementations for scientific computing in the UK. That same year, Sperry Rand developed an early recursive implementation for the 1107, addressing challenges in runtime stack management for nested procedures on large-scale mainframes. By 1962, momentum continued with the PsYco compiler for the computer, a syntax-directed system that translated ALGOL 60 to while handling complex syntax tables for efficient . A survey from that year documented at least 21 active ALGOL 60 compilers across various platforms, indicating widespread interest despite the language's youth. However, the absence of standardized facilities in the ALGOL 60 report prompted vendors to introduce proprietary extensions, such as Burroughs' stream procedures and Elliott's device-specific I/O primitives, which enhanced usability but fragmented portability. Adoption accelerated in through the late , with the 1900 series—introduced in 1968—featuring robust compilers tailored for its modular , supporting over 4K words of in basic configurations and becoming a staple for academic and industrial computing in the UK. By the mid-1970s, the total number of implementations and dialects exceeded 70, spanning diverse from minicomputers to supercomputers and influencing subsequent designs.

Language Specification

Syntax and Notation

ALGOL 60's syntax is formally defined in its Revised Report using metalinguistic formulae, a notation closely resembling Backus-Naur Form (BNF), which enables precise and recursive descriptions of the language's structure. This approach, pioneered by and refined by , marked the first comprehensive use of such a for specifying a programming language, allowing complex syntactic rules to be expressed through productions like <non-terminal> ::= alternative1 | alternative2. For instance, the syntax for an identifier is given as <identifier> ::= <letter> | <identifier> <letter> | <identifier> <digit>, illustrating the recursive nature of the definition. The language employs core keywords functioning as delimiters with fixed syntactic roles, including begin, end, if, then, else, procedure, for, do, go to, while, until, step, own, array, switch, integer, real, Boolean, label, value, comment, true, and false. These are not strictly reserved words in the modern sense—meaning they could potentially be used as identifiers in certain contexts depending on the parser's disambiguation—but their primary use is as structural keywords, and implementations typically treat them as reserved to avoid ambiguity. Restricted identifiers such as integer, real, and Boolean denote type specifiers and cannot be redefined without qualifiers like own. Standard operators include arithmetic ones (+ for addition, - for subtraction, * for multiplication, / for real division, ÷ or div for integer division, and for exponentiation), relational operators (=, , <, , >, ), and logical operators (typically symbols like ¬, , , but often represented in implementations as words not, and, or). Key syntax rules emphasize clarity and structure: semicolons (;) serve as separators between declarations within a block head and between statements in a compound tail, but do not terminate statements as in some later languages. Blocks are delimited by begin and end pairs, encapsulating declarations followed by statements, such as begin integer i; i := 1; end, which introduces a new lexical scope. Unlike languages with curly braces for blocks or semicolons as mandatory terminators, ALGOL 60 relies on these explicit delimiters and separators for readability and precision, with no support for implicit termination. This block structure briefly ties to scoping, where begin-end pairs define local name visibility.

Data Types and Declarations

ALGOL 60 features a strict static type system with a limited set of built-in scalar types, emphasizing compile-time type checking to ensure program correctness. The primary numeric types are integer for whole numbers and real for floating-point values, allowing representation of positive, negative, and zero values as appropriate. Additionally, the Boolean type supports logical values true and false, facilitating conditional expressions without numeric encoding. Notably absent are primitive types for strings or individual characters, requiring programmers to simulate such functionality using arrays of integers or other constructs. Variables are declared within to specify their type and , using the <type> <variable list> for local dynamic storage or own <type> <variable list> for static storage that persists across multiple invocations of the enclosing . For example, [integer](/page/Integer) i, j; declares two variables, while own real sum; ensures the variable sum retains its value between block executions. This declaration mechanism binds identifiers to specific types, enforcing that all subsequent uses conform to the declared type, with strict type checking, though integers are implicitly promoted to reals in arithmetic expressions. Arrays in ALGOL 60 extend the to support multidimensional data structures, declared as <type> array <identifier> [<bound pairs>], where bounds can be dynamic expressions evaluated at . An example is integer array a[1:l];, where l is a previously declared variable determining the upper bound, allowing flexible sizing while maintaining . Subscripted variables access array elements, and the type of the array governs all elements uniformly. Beyond standard scalars, ALGOL 60 includes as a type for designating targets, declared implicitly by usage or explicitly in some contexts, and switch as a composite type for ordered lists of labels or other designators, declared via switch <identifier> := <label list>;. For instance, switch S := L1, L2, L3; creates a switch type indexed by non-negative integers for selection purposes. User-defined types are not supported, limiting extensibility to built-in constructs. These types underscore ALGOL 60's focus on precise, verifiable semantics within block-structured scopes.

Scoping and Block Structure

ALGOL 60 employs lexical (static) scoping, where the visibility of a variable is determined by its position in the program's text structure, making it accessible from the point of declaration to the end of the enclosing . In this model, nested blocks inherit the scope of outer blocks, allowing non-local identifiers to retain their meaning from enclosing scopes unless explicitly redeclared locally. This static resolution of identifiers at promotes predictable behavior and modularity in program design. The block structure in ALGOL 60 is defined using the begin and end keywords to enclose a sequence of declarations followed by statements, creating a self-contained unit that introduces a new level of nomenclature. Declarations within a block specify local identifiers, which have no existence outside that block, while the block may also contain its own local declarations that do not affect outer scopes. For example, a simple block might appear as:
begin
    integer i;
    i := 1;
    ... statements ...
end
Here, i is local to the block and invisible externally. This mechanism enables structured nesting without global interference, as all identifiers must be declared within a block or procedure, eliminating any global variable scope. A distinctive feature of ALGOL 60's scoping is the support for dynamic array bounds, where array dimensions are specified by arithmetic expressions evaluated at runtime upon block entry, allowing flexible sizing based on current values. For instance, an array declaration like array A[1:L] where L is a non-local integer would have its upper bound L computed dynamically each time the block is entered, facilitating adaptive data structures within local scopes. This runtime evaluation integrates seamlessly with the lexical scoping rules, ensuring bounds are resolved in the context of the block's visibility.

Key Features

Control Structures

ALGOL 60 introduced structured control mechanisms that emphasized sequential execution with alternatives and repetitions, reducing reliance on unstructured jumps while still permitting them for flexibility. The language's control structures operate on statements, which can be simple or compound, and conditions evaluate to values. The conditional statement provides branching based on a Boolean expression. Its syntax is if <boolean expression> then <unconditional statement> else <statement>, where the else clause is optional; if omitted and the condition is false, execution proceeds to the next statement. This construct allows alternative courses of action, with the then branch executing if the condition is true and the else branch otherwise. For instance:
if x > 0 then y := 1 else y := -1
ALGOL 60 also supports conditional expressions within arithmetic contexts, using the syntax if <boolean expression> then <arithmetic expression> else <arithmetic expression>. This evaluates to the first arithmetic expression if the condition holds, or the second otherwise, enabling concise ternary-like operations. An example is list_size := if n > 0 then n else 0. Iteration in ALGOL 60 is primarily handled by the for statement, which assigns values to a from a for list and executes a repeatedly. The general syntax is for <variable> := <for list> do <statement>, where the for list can include elements such as a single arithmetic expression (for one ), <arithmetic expression> step <arithmetic expression> until <arithmetic expression> (for a sequence), or <arithmetic expression> while <boolean expression> (for conditional repetition). The step-until form generates an : starting from the initial value, adding the step (defaulting to 1 if omitted) repeatedly until exceeding the upper bound, with the taking each value in turn. For example:
for i := 1 step 2 until 10 do sum := sum + i
This iterates i over 1, 3, 5, 7, 9. The while form initializes the variable once, then repeats the statement only while the remains true, re-evaluating it after each . Unlike later languages, ALGOL 60 provides no dedicated break or continue statements; early loop exit requires an if condition followed by a go to. Unconditional transfer of control is achieved via the go to statement, with syntax go to <designational expression>, where the designator is typically a label. This interrupts the current execution sequence and resumes at the labeled statement, enabling jumps within or across blocks. Labels are declared before statements, such as L: <statement>. While powerful, the report notes that structured constructs like if and for often suffice without go to for clarity. Compound statements group multiple statements into a single unit, using the syntax begin <statement>; <statement>; ... end. This allows control structures like for or if to encompass multi-line bodies, executed sequentially, and introduces a new scope level for declarations. For example:
begin
  integer sum;
  sum := 0;
  for i := 1 step 1 until 5 do sum := sum + i
end
The final value of the after a is undefined, emphasizing its local role within the .

Procedures and Parameter Passing

ALGOL 60 introduced as a mechanism for defining reusable blocks of , enabling modular of algorithms into subroutines that could be invoked from the main program or other . A declaration consists of a heading that specifies the name, formal , and their specifications, followed by a body of statements or a compound statement. The syntax for a declaration is procedure <procedure identifier> <formal parameter part>; <[value](/page/Value) part> <specification part> <procedure body>, where the formal parameter part lists identifiers in parentheses, the part optionally declares certain parameters for call-by- passing, and the specification part details types or kinds such as integer, [array](/page/Array), or [procedure](/page/Procedure). For instance, the declaration procedure Spur (a) [Order](/page/Order): (n); [value](/page/Value) n; [array](/page/Array) a; [integer](/page/Integer) n; real s; begin [integer](/page/Integer) k; s := 0; for k := 1 step 1 until n do s := s + a[k, k] end defines a to compute the of a square , with n as an and a as a two-dimensional . Procedure invocation occurs via a , syntactically <procedure identifier> <actual parameter part>, where the actual parameter part supplies expressions, variables, arrays, or other procedures matching the formals in number, , and type. Actual parameters must conform to restrictions, such as variables or expressions for value-compatible formals and arrays of compatible dimensions for array formals. The supports two distinct parameter passing mechanisms to bind actual to formal : call-by-value and call-by-name. These modes promote flexibility in argument handling, with call-by-name serving as the default for unspecified parameters. Call-by-value, indicated by including formal parameter names in the value clause of the heading (e.g., value n;), copies the current of each actual to a corresponding named after the formal at procedure entry, before executing the body. This isolates the procedure from side effects on the caller's arguments and is particularly efficient for scalar types like integers or reals, as it avoids repeated computations, though it incurs copying costs for larger structures like arrays. Upon procedure exit, changes to parameters do not affect the originals. The mechanism ensures predictable behavior akin to pass-by-value semantics, making it suitable for simple inputs where is not intended. Call-by-name, applied to formals not listed in the value part, performs textual of the actual directly into the wherever the formal appears, treating the actual as an unevaluated expression in its original . This re-computes the actual each time the formal is referenced, allowing dynamic behavior such as passing arithmetic expressions or even calls as arguments, which enables higher-order programming constructs like passing functions to procedures. Semantically equivalent to creating a —a that delays evaluation until needed—it supports advanced features but can lead to high computational expense due to potential multiple evaluations and scope interactions. For example, in a call like Innerproduct(A[t, p, u], B[p], 10, p, y), the expressions A[t, p, u] and B[p] would substitute into the , re-evaluating t, p, and u as needed during execution. Procedures that return values, functioning as mathematical functions, are declared with a type specifier prefixing the keyword, such as integer procedure Step(u); real u;, followed by the heading and body. The return value is specified by assigning to the identifier itself within the body, e.g., Step := if 0 ≤ u ∧ u ≤ 1 then 1 else 0, with the most recent such determining the result upon normal exit. These value-returning procedures integrate seamlessly into expressions, allowing their use in arithmetic or conditional contexts, and inherit the same passing rules, where formals can be value or name parameters to control input handling.

Recursion and Dynamic Arrays

ALGOL 60 provided full support for through its , allowing procedures to call themselves or other procedures without requiring special syntax. This capability relied on stack-based records, where each procedure invocation created a new frame on the to store local variables, parameters, and addresses, ensuring proper nesting and isolation of recursive calls. The Revised Report on ALGOL 60 implicitly enabled this by defining procedures as blocks with lexical , where occurred upon entry and deactivation upon exit, facilitating recursive definitions in the language's syntax for expressions and statements. Implementations, such as those described in early compilers, utilized a display or static links in records to resolve non-local references during , maintaining lexical scoping integrity. Dynamic arrays in ALGOL 60 were declared with bounds specified as arithmetic expressions, which were evaluated at elaboration time—specifically, upon entry to the declaring or —allowing array sizes to vary at based on computed values. This dynamic sizing effectively mimicked pointer-based flexibility in later languages, as the array's storage was allocated on the proportional to the evaluated bounds, with subscript checks ensuring access within limits. For instance, an declaration like integer [array](/page/Array) A[1:l, 1:m] would compute l and m at block entry, allocating space accordingly and treating the array as a contiguous accessible via subscripted variables. The Revised specified that such bounds must result in upper limits not smaller than lower ones for the array to be defined, with occurring once per block entrance to support variability across invocations. The interplay between and s enabled the creation of nested, runtime-variable structures, particularly useful in algorithms like tree traversals where recursive calls could instantiate arrays sized based on subtree depths or counts. In a recursive for traversing a , each call might declare a to store information, with bounds derived from the current depth, leading to stacked allocations that mirrored the recursion depth. For example, a procedure traverse([node](/page/Node), depth); value depth; integer depth; begin integer [array](/page/Array) path[1:depth]; ... traverse(left, depth+1); ... end would allocate progressively larger or nested arrays on the per recursive level, demonstrating how activation records encapsulated both control and data locality. This approach, as implemented in compilers like the ALGOL 60 compiler, leveraged the for efficient, temporary storage without explicit pointer management. However, ALGOL 60's reliance on allocation for both and dynamic arrays imposed limitations, as there was no provision for allocation, confining all to and risking in cases of deep or large arrays. Implementations typically imposed practical limits, such as a maximum nesting depth of 64 levels in some systems, beyond which exhaustion could occur, halting execution. This stack-only model, while elegant for block-structured , precluded persistent dynamic data structures across lifetimes, influencing later languages to introduce separate mechanisms for greater flexibility.

Implementations and Extensions

Major Historical Compilers

One of the earliest and most influential ALGOL 60 implementations was the Burroughs BALGOL for the B5000 and B5500 systems, released with the B5000 in 1963. This was natively stack-based, leveraging the hardware's design optimized for ALGOL 60, including support for single-pass compilation and automatic garbage collection. It fully supported through hardware-assisted procedure activation records on the stack and implemented call-by-name via "thunks" generated at , enabling efficient evaluation of complex expressions. The integration with the system's descriptor-based allowed for dynamic arrays and bounds checking without runtime overhead. The and 7600 supercomputers featured ALGOL 60 compilers in the mid-1960s, designed for high-performance scientific computing. These implementations, based on the Regnecentralen design from , included optimizations for the machines' vector processing capabilities, such as efficient handling of floating-point operations and array manipulations critical for numerical simulations. Extensions beyond standard ALGOL 60 provided facilities for parallel execution hints and integration with the operating system, making it suitable for large-scale computational tasks in research environments. For the ICL 1900 series, the , introduced in , was a key implementation derived from earlier English Electric KDF9 efforts. It emphasized portability across the range while adding a comprehensive library for file handling and device interaction, addressing 60's lack of standard I/O. The used an intermediate code interpreter for flexibility, supporting block structure and in a multiprogramming context, though it introduced some vendor-specific syntax for efficiency on hardware. Other notable historical compilers included the from the late , which added double-precision arithmetic and complex numbers for engineering applications on the EXEC II operating system, and the compiler from 1967, developed by DEC and supporting call-by-value/reference with robust debugging via runtime checks. Numerous 60 implementations existed by the 1980s, often featuring vendor-specific reserved words—such as additional keywords in Burroughs BALGOL for stream I/O—to adapt the language to proprietary architectures.

Portability and Variation Issues

One of the primary goals of ALGOL 60 was to create a machine-independent language for expressing algorithms, yet achieving true portability proved challenging due to ambiguities in the specification and inevitable variations in implementations across diverse hardware platforms. The Revised Report on ALGOL 60 intentionally omitted details on machine-specific aspects to promote universality, but this left room for designers to make choices that affected code behavior, leading to non-portable programs in practice. A key portability hurdle was the absence of standardized facilities in the core language. The specification defined no built-in I/O statements or procedures, relying instead on external, implementation-provided routines to handle interactions with the , such as outinteger for integers or inreal for reading real numbers. These procedures varied widely by system—for instance, some implementations used channel-based I/O while others employed direct console or tape interfaces—making programs dependent on the host and often requiring rewriting for transfer to another machine. Implementation variations further compounded portability issues through differences in lexical and syntactic handling. The ALGOL 60 specification included no true reserved words; keywords like if, begin, and procedure were recognized contextually rather than lexically reserved, allowing them to potentially serve as identifiers in non-conflicting positions, though this was rarely practical. However, many compilers introduced reserved status for these keywords and extended the list beyond the 24 recommended standard function names (e.g., arc tan, ln), adding implementation-specific reservations that could cause syntax errors when porting code. Additionally, character sets differed, with some systems (e.g., CDC implementations) lacking lowercase letters, forcing uppercase-only keywords and complicating source code conversion. Numeric representations also introduced inconsistencies, particularly for integers, whose size and range were not fixed by the standard and thus depended on the host machine's word length. Early implementations on machines like the English Electric DEUCE used 32-bit integers, while others, such as the GIER, employed 45-bit words, and some older systems limited integers to 6 or 24 bits, affecting overflow behavior and the valid range for variables like loop counters or array bounds. Without a standard like maxint in the core report (later proposed in commentaries), code assuming a certain integer precision—such as loops iterating up to a large constant—could fail or produce incorrect results across platforms. Array handling presented another source of variation, as the language permitted arbitrary lower and upper bounds (e.g., array a[0:9] or array b[1:10]), evaluated dynamically at block entry. While this flexibility supported independence, implementations differed in default assumptions and restrictions; some compilers, like those for the KDF9, prohibited dynamic own arrays or required static bounds for storage allocation, and others varied in how they handled empty arrays (where lower bound exceeds upper). code that relied on specific indexing conventions—such as assuming 1-based starts for mathematical arrays—often required adjustments, as bounds checking and access semantics could lead to runtime errors or unexpected slicing on different systems. The div and mod operators for integers exemplified semantic ambiguities affecting portability, especially with negative operands. The specification defined div as yielding the integer quotient such that i div j * j + i mod j = i for positive integers, but it was silent on the exact rounding for negatives (e.g., whether -7 div 3 yields -2 or -3) and undefined for zero divisors. Implementations diverged: some truncated toward zero (e.g., -7 div 3 = -2), while others rounded toward negative infinity (-7 div 3 = -3), leading to inconsistent results in algorithms involving remainders or divisions with mixed signs, such as in modular arithmetic or simulation models. The mod operator similarly inherited these issues, exacerbating errors in ported numerical code. These divergences resulted in ALGOL 60 code that was frequently non-portable, confining many programs to their original implementation and hindering the language's goal of widespread algorithmic exchange. To mitigate this, efforts led to the definition of subsets like Minimal ALGOL 60 (or proposed variants such as 60.1), which restricted features to core elements—excluding dynamic arrays, call-by-name, and non-standard I/O—while standardizing behaviors for integers, divisions, and keywords across subsets defined by bodies like IFIP and ECMA. Adhering to such subsets, as recommended in transportability guidelines, allowed libraries to be more reliably shared, though full portability remained elusive without strict conformance to the Revised Report.

Later Extensions and Modern Tools

Following the original ALGOL 60 specification, several extensions emerged to address limitations in specific domains, such as list processing and data handling. LEAP, introduced in 1967 by Jerome Feldman and Daniel G. Bobrow at the and Bolt Beranek and Newman, extends ALGOL 60 with primitives for associative memory, enabling the manipulation of (subject-predicate-object structures), sets, and related operations to facilitate and list-based computations. This extension was implemented on the Lincoln Laboratory TX-2 computer and demonstrated efficiency in applications like and database-like queries, running operational since early 1967. In the , various dialects extended ALGOL 60 to incorporate robust manipulation, which was rudimentary in the base language (limited primarily to procedure parameters and I/O). For instance, implementations like Extended ALGOL on systems such as the Burroughs B5000 added dedicated types and operations for text processing, reflecting efforts by vendors to enhance practicality for non-numeric applications without altering core syntax. These additions allowed for more flexible handling of character sequences, including concatenation and extraction, and were influenced by growing needs in and report generation software during that decade. Modern tools have revitalized ALGOL 60 accessibility through translation and compatibility layers. MARST, released in 2000 as part of the GNU Project by Andrew Makhorin, is an open-source translator that converts ALGOL 60 source code to ANSI C, enabling compilation on contemporary platforms via the GNU Compiler Collection (GCC). It supports key features like block structure, recursion, and call-by-name semantics, producing efficient C output while preserving the original language's portability across architectures. Bridges between ALGOL 68 and ALGOL 60, such as subsets implemented in compilers like Algol 68 Genie, allow partial translation of ALGOL 68 code to ALGOL 60-compatible forms, facilitating migration of legacy algorithms by mapping advanced types (e.g., unions) to equivalent 60 constructs where possible. Emulation efforts preserve historical ALGOL 60 environments on vintage hardware simulations. The (Simulator for Historical computers) project emulates PDP-series machines, including the PDP-11, which hosted native ALGOL 60 compilers like those distributed via DECUS; users can load and execute original binaries, tapes, and disks to run period-specific programs. This open-source framework supports cross-platform operation, including on modern x86 and systems, aiding preservation of 1960s-1970s software ecosystems. In the 2020s, hobbyist projects have ported ALGOL 60 tools to low-cost hardware like the , often leveraging MARST for compilation or for emulation of environments, enabling educational experiments with original code on affordable single-board computers. Today, ALGOL 60 sees niche use in for illustrating principles and in heritage computing to study early algorithmic design, though it has not been employed in mainstream production since the 1990s; its syntactic clarity continues to inform pedagogical tools.

Examples

Basic Program Samples

ALGOL 60 programs are structured as a sequence of declarations followed by a compound statement enclosed in begin and end keywords, allowing for block-level scoping of variables. Input/output operations in ALGOL 60 are implementation-defined and not part of the core language specification, requiring vendor-specific procedures for basic printing. A simple "Hello World" equivalent relies on such I/O procedures; for instance, in some implementations, the following outputs the string "Hello, world!":
begin
  outstring(1, "Hello, world!");
end
This uses outstring to direct output to channel 1, demonstrating the language's minimalistic approach to I/O without standardized facilities. To illustrate basic arithmetic and control flow, consider a program that computes the sum of integers from 1 to n using a , which iterates with a specified step until a is met. The following example sets n to 10 and outputs the result 55:
begin
  integer n, i, sum;
  n := 10;
  sum := 0;
  for i := 1 step 1 until n do
    sum := sum + i;
  outinteger(1, sum);
end
Here, declarations precede assignments with :=, and the loop syntax highlights ALGOL 60's precise iteration control. Block structure in ALGOL 60 enables nested scopes where inner blocks can access outer variables but maintain their own local ones, promoting modular code. The example below declares x in the outer block, then y in the inner block to compute and output 8, after which y is inaccessible:
begin
  integer x;
  x := 5;
  begin
    integer y;
    y := x + 3;
    outinteger(1, y);
  end
end
This demonstrates how begin-end pairs delimit lexical scopes, a foundational feature for structured programming. A more complete sample combines declarations, arrays, loops, and output to sum elements of an integer array initialized with values 1 through 5, yielding 15:
begin
  integer array a [1:5];
  integer i, sum;
  sum := 0;
  for i := 1 step 1 until 5 do
  begin
    a[i] := i;
    sum := sum + a[i];
  end;
  outinteger(1, sum);
end
Array bounds are specified in declarations, and the inner block within the loop ensures sequential and accumulation.

Advanced Feature Demonstrations

ALGOL 60's advanced features, such as call-by-name parameter passing and recursion, enable sophisticated program behaviors that interact dynamically during execution. These mechanisms allow procedures to handle parameters as unevaluated expressions and support self-referential calls, respectively, facilitating flexible and expressive algorithms. The following demonstrations illustrate these capabilities through representative code samples, highlighting their practical application and implications.

Call-by-Name Parameter Passing

Call-by-name in ALGOL 60 treats actual as unevaluated expressions () that are substituted into the body and re-evaluated each time the formal is referenced, which can lead to multiple evaluations and side effects if the expressions involve variables modified elsewhere. A classic example is a swap intended to exchange two values, but when invoked with variables, it reveals the thunk mechanism's behavior due to repeated evaluations. Consider the following procedure definition:
procedure swap(a, b); integer a, b;
  begin
    integer t;
    t := a;
    a := b;
    b := t
  end
When called within nested loops, such as:
begin
  integer i, j, array m[1:10, 1:10];
  for i := 1 step 1 until 10 do
    for j := 1 step 1 until 10 do
      if i > j then
        begin
          m[i, j] := i * j;
          swap(i, j)
        end
      else m[i, j] := 0
end
Here, i and j are passed by name (the default unless specified as value). Each reference to a or b in the swap body re-evaluates i or j, advancing the loop steps multiple times—once for t := a, again for a := b, and finally for b := t. This results in i and j being incremented beyond their intended values, preventing a simple exchange and potentially filling the array incorrectly, as the indices shift unexpectedly. This demonstrates the thunk evaluation's power and pitfalls, where the parameter's context (e.g., loop progression) influences outcomes across multiple uses.

Recursion

Recursion in ALGOL 60 allows procedures to invoke themselves, with each call creating a new activation record for local variables, enabling solutions to problems like computing s through divide-and-conquer. The supports this natively without special keywords, relying on block structure for scope management. A standard recursive procedure is defined as:
real procedure [factorial](/page/Factorial)(n);
  value n;
  integer n;
  begin
    if n <= 1 then
      [factorial](/page/Factorial) := 1
    else
      [factorial](/page/Factorial) := n * [factorial](/page/Factorial)(n - 1)
  end
When invoked, such as outreal(1, factorial(5)), it computes 120 by successive calls: factorial(5) = 5 * factorial(4), unfolding to 5 * 4 * 3 * 2 * 1. The value n declaration passes the by value to avoid modifying the caller's , ensuring each recursive level operates on a copy. This example showcases recursion's elegance for mathematical functions, with the base case (n <= 1) preventing infinite .

Dynamic Arrays

ALGOL 60 permits arrays with dynamic bounds, where subscript limits are expressions evaluated (elaborated) at the time of declaration within a , allowing sizes to depend on runtime values. This feature supports flexible data structures passed to or created within procedures. For instance, a to generate and populate an of size n:
[procedure](/page/Procedure) generate_array(n);
  [integer](/page/Integer) n;
  begin
    [array](/page/Array) a[1 : n];
    [integer](/page/Integer) i;
    for i := 1 step 1 until n do
      a[i] := i * i
  end
Calling generate_array(5) elaborates the bound n to 5 upon entering the 's block, allocating space for a[1:5] dynamically. The is and deallocated on exit, demonstrating bound elaboration's role in runtime adaptability without fixed sizes. If n were passed by name and modified externally, re-evaluation could alter the size mid-execution, though here it is by value for stability. This capability underscores ALGOL 60's support for variable-sized structures in algorithmic expressions.

Orthogonal Combination: For-Loop in Recursive Procedure with Mixed Parameter Passing

ALGOL 60's design allows orthogonal features like for-loops, recursion, and mixed parameter modes ( and name) to combine seamlessly, enabling complex algorithms such as recursive summation over dynamic ranges. Consider a recursive that sums squares in a subrange of a , mixing call-by- for bounds and call-by-name for the array reference:
real procedure sum_squares(arr, low, high);
  integer low, high;
  array arr;
  value low, high;
  begin
    integer i;
    real sum;
    sum := 0;
    for i := low step 1 until high do
      sum := sum + arr[i] * arr[i];
    if low <= 1 then
      sum_squares := sum
    else
      sum_squares := sum + sum_squares(arr, 1, low - 1)
  end
Invoked as outreal(1, sum_squares(a, 5, 10)) where a is a dynamic array (e.g., declared as array a[1:n] with n=10), assuming a has been populated such that a[i] := i for i = 1 to 10, the value mode fixes low and high to avoid side effects in recursion, while arr by name allows the same array reference across calls without copying. The for-loop iterates over the current range, accumulating squares, and the recursive call extends to prior segments until the base case. This integrates loop control for iteration, recursion for decomposition, dynamic bounds for flexibility, and mixed passing for efficiency, computing the total sum of squares from 1 to 10 as 385. Such combinations highlight ALGOL 60's expressiveness for nested computational patterns.

Legacy and Influence

Impact on Programming Languages

ALGOL 60 served as a foundational influence on subsequent programming languages, particularly through its direct descendants. Pascal, developed by in 1970, adopted ALGOL 60's block structure for nested scopes and local variables, enhancing modularity and readability, while introducing records as a new to address limitations in earlier languages like . , created in 1967 by and , extended ALGOL 60 as a superset, incorporating its core syntax and semantics while adding class-based object-oriented features such as and dynamic binding to support . The language's impact extended broadly to other paradigms and systems. , developed by in 1972, inherited ALGOL 60's syntax and principles of indirectly through the lineage of Combined Programming Language (CPL), , and , enabling structured with begin-end blocks and influencing its portable, low-level capabilities. Similarly, Ada (1983) and (1979, also by Wirth) drew from ALGOL 60's structured programming foundations, including type declarations and block concepts, to promote safe, modular designs in defense and systems programming. Most modern imperative languages trace their design to this ALGOL lineage, emphasizing clarity and portability. ALGOL 60 popularized key concepts that shaped language evolution. Its advocacy by in notes on highlighted the use of blocks and conditionals to eliminate statements, fostering goto-less code in descendants like Pascal. Additionally, ALGOL 60's lexical scoping for nested functions influenced dialects; , the first such dialect to adopt it alongside block structure, enabled modular and maintainable programs by determining bindings at . The language's formal syntax also facilitated ACM's publication of collected algorithms starting in 1960, with many early contributions implemented in ALGOL 60 to standardize scientific computing.

Role in Computing History

ALGOL 60 established itself as the first international standard for an algorithmic language, particularly serving as the notation for publishing and algorithms in academic and professional literature. Its syntax, defined using Backus-Naur Form (BNF) in the original report, provided a precise and machine-independent way to describe computational processes, making it ideal for dissemination without tying to specific hardware. The Communications of the ACM (CACM) adopted ALGOL 60's publication form as the required language for its algorithm series starting in 1960, with submissions exclusively in ALGOL 60 until 1966, after which other languages such as were permitted alongside it; ALGOL 60 continued to be accepted into the late 1970s, with the last submission in 1977, solidifying its role in standardizing algorithmic expression. In research, ALGOL 60 profoundly impacted compiler theory by introducing rigorous syntactic specification via BNF, which facilitated advancements in parsing techniques, including recursive descent parsing—a top-down method where the grammar's structure directly maps to recursive procedures for analysis. This enabled theoretical explorations of compiler design, such as those by , who highlighted ALGOL 60's syntax definition as a key innovation that spurred both recursive-descent and table-driven parsing methods in the 1960s. The language also influenced prominent figures like , a member for ALGOL 58 and 60, whose work on and BNF intersected with ALGOL's formalisms, contributing to his 1977 for advancing programming language concepts. Educationally, ALGOL 60 became a cornerstone in university curricula from the through the , especially in and academic settings worldwide, where it was taught as the exemplar of structured, . Its block structure, , and parameter passing mechanisms provided students with a clear foundation for understanding algorithmic thinking and program modularity, often serving as the primary language in courses before the rise of more accessible alternatives like Pascal. Institutions such as the integrated ALGOL 60 into their computing programs during this era, emphasizing its portability and theoretical depth over practical implementation challenges. Historically, ALGOL 60 bridged the gap from low-level assembly languages to sophisticated high-level ones by introducing features like nested blocks and lexical scoping, which abstracted machine details while supporting complex control flows—advancing beyond Fortran's formula-oriented focus toward general-purpose expression. Despite this, its adoption waned in by the late due to Fortran's entrenched dominance, backed by IBM's commercial support and optimized implementations for scientific , leaving ALGOL 60 more as a theoretical than a widespread practical tool. Nonetheless, its emphasis on and structure laid enduring groundwork for theory.

References

  1. [1]
    Revised report on the algorithmic language ALGOL 60
    Revised report on the algorithmic language ALGOL 60. Authors: J. W. Backus ... First page of PDF. Formats available. You can view the full content in the ...
  2. [2]
    History of ALGOL - Software Preservation Group
    Sep 12, 2024 · ... Programming Languages to design a universal algorithmic language. ... The ALGOL 60 conference was held in Paris, producing the ALGOL 60 report.
  3. [3]
    the european side of the last phase of the development of algol 60
    A major influence on the way ALGOL 60 was eventually described came from the pa- per given at the 1959 June UNESCO confer- ence in Paris by John Backus (1959).
  4. [4]
    50 Years of Pascal - Communications of the ACM
    Mar 1, 2021 · In 1960, an international committee published the language Algol 60. It was the first time a language was defined by concisely formulated ...
  5. [5]
    A. J. Perlis - A.M. Turing Award Laureate - ACM
    Arguably one of the most influential programming languages in history, ALGOL-60 had a very complex and controversial history in its early years. Nevertheless, ...
  6. [6]
    Lessons from PL/I: A Most Ambitious Programming Language
    ALGOL 60—Not commercially successful, but widely used in research and hugely influential in language design. One of the first languages to implement function ...
  7. [7]
    [PDF] Preliminary report: international algebraic language
    On 18 April 1958 the committee appointed a subcommittee to prepare a report giving the technical specifications of a proposed language. A comparison of the ACM ...
  8. [8]
    Report on the algorithmic language ALGOL 60 - ACM Digital Library
    Share. First page of PDF. Formats available. You can view the full content ... Revised report on the algorithmic language ALGOL 60 · Read More · Report on the ...
  9. [9]
    [PDF] The History of the ALGOL Effort - Heer de Beer.org
    In the ALGOL 60 report the procedure concept was simplified: input and output parameters were removed, call-by-name and call-by-value parameters introduced.
  10. [10]
    [PDF] revised report - Algol 60
    Both the SHARE and USE organisations established ALGOL working groups and both organisa- tions were represented on the ACM Committee on Programming Languages.
  11. [11]
    [PDF] Report on the Algorithmic Language ALGOL 60
    The ACM Committee met in Washington in. November 1959 and considered all comments on ALGOL that had been sent to the ACM Communications. Also, seven ...
  12. [12]
    [PDF] Revised report on the algorithm language ALGOL 60
    The purpose of the meeting was t,o correct knowii errors in, attempt, to eliminate apparent ambiguities in, and otherwise clarify the ALGOL 60 R.eport.Missing: passing | Show results with:passing
  13. [13]
    [PDF] ALGOL 60 - Software Preservation Group
    NAUR, P. (Editor) (1963). Revised Report on the Algorithmic Language ALGOL 60, CACM, Vol. 6, p. 1; The Computer Journal, ...
  14. [14]
    ISO 1538:1984 - Programming languages — ALGOL 60
    CHF 65.00General information ; Status. : Published ; Publication date. : 1984-10 ; Stage. : International Standard confirmed [90.93] ; Edition. : 1 ; Number of pages. : 18.Missing: IFIP Group 2.1 revised
  15. [15]
    [PDF] International Standard @ I 538
    Oct 15, 1984 · The text presented in this International Standard is based on the Modified Report on the Algorithmic Language ALGOL 60, which is a minor ...Missing: published 1968
  16. [16]
    [PDF] The Dijkstra–Zonneveld ALGOL 60 compiler for the Electrologica X1
    Sep 14, 2018 · The X1 ALGOL 60 system became operational in august 1960 and was used at the. Mathematical Centre until the late sixties. This report ...Missing: Lambert | Show results with:Lambert<|control11|><|separator|>
  17. [17]
    [PDF] BURROUGHS B 5000 - Bitsavers.org
    Extended ALGOL provides the B 5000 programer with complete input-output facilities; STREAM PROCEDURE declarations which allow use of the B 5000 character mode ...
  18. [18]
    Material relating to computer programming
    The Elliott ALGOL Programming System, CS 122a. August 1961. The Elliott 803 ALGOL Operating Procedure, June 1962. The Elliott 803 Programmer's Guide, ...
  19. [19]
    [PDF] ALGOL 60: The Death of a Programming Language and the Birth of ...
    (Early 1960s) Use and Maintaining ALGOL 60. Implementation and use. (August 1960) Dijkstra-Zonneveld compiler; first complete ALGOL. 60 compiler. Many follow ...
  20. [20]
    A syntax directed compiler for ALGOL 60 - Semantic Scholar
    1962. TLDR. The immediate impetus for the work was the existence of PsYco, a compiler for ALGOL 60 on the CDC 1604, which requires a complete "syntax table ...
  21. [21]
    21 Algol 60 compilers in 1962 - The Shape of Code
    Dec 1, 2024 · Compiler implementation know-how received a major boost in 1964 with the publication of the book ALGOL 60 Implementation. The plot below shows ...
  22. [22]
    [PDF] ALGOL 60 Implementation - Software Preservation Group
    The original ALGOL. 60 Report [53] was found to contain various errors and ambiguities, and at a meeting of some of the authors of the Report, in Rome ...
  23. [23]
    [PDF] leL 1900 Series
    ALGOL: ICL offers numerous compilers for two distinct levels of the ALGOL language. Basic ALGOL compilers are available for systems with as little as 4K ...
  24. [24]
    What is a compiler? How source code becomes machine code
    Jan 20, 2023 · There were eventually about 70 implementations of ALGOL 60 and its dialects. ALGOL 68 was intended to replace ALGOL 60 and was extremely ...Fortran · Cobol · Algol
  25. [25]
    Revised Report on the Algorithmic Language Algol 60 - mass:werk
    The thirteen representatives (1), from Denmark, England, France, Germany, Holland, Switzerland, and the United States, conferred in Paris from January 11 to 16, ...
  26. [26]
    [PDF] Revised Report on the Algorithmic Language Algol 60
    Revised Report on the Algorithmic Language Algol 60. By. J.W. Backus, F.L. Bauer, J.Green, C. Katz, J. McCarthy. P. Naur, A.J. Perlis, H. Rutishauser, K ...
  27. [27]
    [PDF] The Origins of Burroughs Extended Algol
    Oct 2, 2019 · Burroughs B5000 / B5500. ◇ Radical departure in hardware architecture. • Specifically designed for Algol-60. • Stack-oriented operation, code ...
  28. [28]
    [PDF] The Burroughs B5000 Conference - University Digital Conservancy
    Sep 6, 1985 · During the B 5000 project, I was manager of Scientific Systems Development that had responsibility for the ALGOL compiler and other scientific ...
  29. [29]
    CDC 6600/7600 optimization | Proceedings of a symposium on ...
    This paper describes the machine conversion of Algol for the Burroughs B5500 to Algol for the CDC 6000 series. CDC Algol is essentially Algol 60 and is a ...
  30. [30]
  31. [31]
    The English Electric KDF9 Computer
    The KDF9 Whetstone and Kidsgrove compilers were pioneering implementations of Algol 60. Brian Wichmann, at NPL, modified the Whetstone interpreter to gather ...
  32. [32]
    (PDF) ALGOL 60 Compilation and Assessment - ResearchGate
    The paper describes how ALGOL 68 came to be implemented for the ICL 1900 Series and adopted as the standard user language of the RRE computing service. The ...
  33. [33]
    [PDF] AN EXTENDED ALGOL 60 COMPILER UNIVAC 1108 - Your.Org
    This manual is intended to be a definitive user's guide to an Algol 60 compiler that has had five years' extensive development and use in the Andrew.
  34. [34]
    [PDF] univac 1108 . i - Bitsavers.org
    UNIVAC 1108 Extended ALGOL deviates from ALGOL 60 in the following areas: A set of reserved identifiers has been defined (see Appendix B) to enable a more.
  35. [35]
  36. [36]
    None
    Summary of each segment:
  37. [37]
    Report on Input-Output Procedures for ALGOL 60 - ACM Digital Library
    A proposal for input-output conventions in ALGOL 60. The ALGOL 60 language as first defined made no explicit reference to input and output processes. Such ...
  38. [38]
    [PDF] ALGOL 60 Programming on the DECSystem 10.pdf - Bitsavers.org
    The PDP-IO ALGOL compiler, however, is a one-pass compiler, aiming for speed of translation through only scanning the programme once, possibly at the ...
  39. [39]
    [PDF] criteria for transportable algol libraries - CWI
    imposed by the use of strict ALGOL 60, nevertheless a number of problems arise when the library is taken to a new compiler. We give a short list of problems ...
  40. [40]
    [PDF] AB38.3.1 A commentary on the ALGOL 60 Revised Report R.M. De ...
    It is unnecessary and confusing to readers who have no knowledge of the preliminary report, and also causes unnecessary ambiguity in the ... the existing wording ...
  41. [41]
    [PDF] The design of the GIER ALGOL compiler Part I
    The report gives a full description of the design of an ALGOL 60 system for the. GIER, a machine having 1024 words of cores and 12800 words on drum. An intro-.
  42. [42]
    algol 60 - Eli
    The Revised Report uses a combination of BNF and English to describe the complete syntax of the language. Because this is an executable specification, we follow ...Missing: original | Show results with:original
  43. [43]
    A commentary on the ALGOL 60 Revised Report
    variations in the various implementations of ALGOL 60 thus impairing the portability of ALGOL 60 algorithms. The body responsible for ALGOL 60,. Working ...
  44. [44]
    An ALGOL-based associative language - ACM Digital Library
    The LEAP sys- tem has been running on the Lincoln Laboratory TX-2 since early 1967 and has been used in a number of applica- tions, some of which are discussed ...
  45. [45]
    [PDF] AN ALGOL-BASED ASSOCIATIVE LANGUAGE - DTIC
    Is quite efficient over a range of problems. The language, LEAP, is an extension of ALGOL (22) to incluae associations, sets and a number of auxiliary ...
  46. [46]
    Algol 60 Standard
    Algol 60 Standards: Revised Report (really it is the initial standard). algol 60 revised report. Modified Report ( with addition of new functions ).<|control11|><|separator|>
  47. [47]
    MARST - GNU Project - Free Software Foundation (FSF)
    Jul 23, 2000 · MARST is an Algol-to-C translator. It automatically translates programs written on the algorithmic language Algol 60 to the C programming language.
  48. [48]
    The Algol 68 Genie project - XS4ALL
    Algol 68 Genie is free software distributed under the GNU General Public License; it is a fast compiler-interpreter which ranks among the most complete ...Missing: bridge | Show results with:bridge
  49. [49]
    SimH "Classic"
    SimH (History Simulator) is a collection of simulators for historically significant or just plain interesting computer hardware and software from the past.Software Kits · Simulator Documentation · Help with SIMH · HP simulators
  50. [50]
    ALGOL 60 at 60: The greatest computer language you've never ...
    May 15, 2020 · GEORGE (GEneral ORGanization Environment) was an ICL 1900 batch operating system with various versions from 1S to 4. I doubt that it had ...
  51. [51]
    ALGOL 60 at 60: The greatest computer language you've never ...
    May 15, 2020 · ALGOL 60 also heavily influenced the Combined Programming Language ... ALGOL 60 turns 60, you could just fire up a modern programming language.
  52. [52]
    Algol
    Here is an example of an ALGOL program. This runs on a Unisys (Burroughs) A-Series mainframe. BEGIN FILE F (KIND=REMOTE); EBCDIC ARRAY E [0:11];
  53. [53]
    Algol 60
    Algol 60 is a "semicolon as separator" language. Other such languages are Algol 68 and Pascal. This is in contrast to languages like C and PHP in which ...
  54. [54]
    [PDF] Subroutines & Parameter Passing
    Oct 20, 2010 · ▫ Call by name problem: hard to write a “swap” routine that works: procedure swap(a, b) integer a, b, t; begin t := a; a := b; b := t end swap.
  55. [55]
    [PDF] 1 - Parameter Passing
    23 - pass-by-name trap, cont'd​​ "computer scientists have shown that there is NO WAY to define a Swap procedure in Algol-60 that works for all parameters"!
  56. [56]
    [PDF] generality and - hierarchy: algol-60 - UTK-EECS
    The committee decided to use clear, precise, un- ambiguous English-language descriptions, which resulted in a report that was readable by potential users, ...
  57. [57]
    The Simula Programming Language - University of Michigan
    Sep 11, 1996 · SIMULA retains the spirit of ALGOL 60 and includes that language as a subset, except for some monor exceptions. The following changes were made ...
  58. [58]
    [PDF] Chapter 2 History of Programming Languages
    Sep 15, 2005 · ALGOL had a profound effect on programming languages design. ▫ Most of the current imperative languages are derivatives of ALGOL (Pascal, Ada, C ...
  59. [59]
    Structured Programming - ACM Digital Library
    Dijkstra, whose Notes on Structured Programming form the first and major section of this book. They clearly expound the reflections of a brilliant programmer on ...
  60. [60]
    Chapter 1. Introduction
    Lexical scoping and block structure are features taken from Algol 60 [16]. Scheme was the first Lisp dialect to adopt lexical scoping and block structure ...
  61. [61]
    The collected algorithms of the ACM - Wiley Interdisciplinary Reviews
    Nov 2, 2009 · In addition to the Handbook series, some 20 other algorithm codes were published in Numerische Mathematik between 1964 and 1971, all in Algol 60 ...
  62. [62]
    Report on the algorithmic language ALGOL 60
    Report on the algorithmic language ALGOL 60. View in the ACM Digital Library. DOI. 10.1145/367236.367262. May 1960 Issue. Published: May 1, 1960. Vol. 3 No. 5.
  63. [63]
  64. [64]
    [PDF] Thirty Years of Programming Languages and Compilers
    I vividly remember the impact of the appearence of the Algol 60 Report. The one most important innovation of Algol 60 was the definition of its syntax with ...<|separator|>
  65. [65]
    John Backus - A.M. Turing Award Laureate
    Backus joined an international committee to design the ALGOrithmic programming Language, ALGOL 58, and its successor, ALGOL 60. The ALGOL language ...
  66. [66]
    [PDF] The History of the ALGOL Effort - TUE Research portal
    60 report, Peter Naur, used a changed version of Backus's notation. The use of the BNF was beneficial for the clean structure of the report. Peter. Naur ...
  67. [67]
    1960 - 1979 - Department of Computer Science, University of York
    The programming languages were Fortran (the greatest demand) and Algol 60 (the best compiler), but also assembly language. Job control and job submission were ...