Fortran II and Algol and most conventional computer languages provide for user defined subroutines with parameters. Parameters may be viewed as names selected by the routine builder to designate (bind to) things specified by the caller at run time. Such bindings are incipient capabilities. Such capabilities included length information and write permission distinct from read permission. Indeed the Burroughs 5500 was predicated on Algol60 and the compiler used hardware registers specifically designed to implement parameters. The subroutine could not easily access storage except that it was originally endowed with or that which was provided by the caller as a parameter. There was no concept of casting an integer to an address. Storage locations had addresses but programs did not deal in such addresses. I don’t know if C compilers were produced for such machines. There were, however, insecurities in the B5500 system that were not easy to fix.

Algol68 reified the references that were implicit in Algol60. Identifiers might refer to integers or alternatively to locations where integers might be stored. An assignment required that the expression to the left of the assignment operator evaluate to a reference. That would identify a storage location into which a computed value would be placed. Storage was allocated on the stack or on the heap. References to stack items were available and if preserved beyond the lifetime of the stack frame became illegal to use. Few Algol68 systems checked such use and thus such systems were insecure. Aside from this concession to efficiency the Algol68 references could be viewed as explicit capabilities. Secure systems were developed on Algol68 which allocated “stack” frames on the heap when there was code that might produce persisting references to the stack items. Algol68 has anonymous procedures expressions, nested scoping and thus has much of the power of Scheme with typing.

The language Mary extended the Algol 68 reference concept.