The history of the programming language Scheme begins with the development of earlier members of the Lisp family of languages during the second half of the twentieth century. During the design and development period of Scheme, language designers Guy L. Steele and Gerald Jay Sussman released an influential series of Massachusetts Institute of Technology (MIT) AI Memos known as the Lambda Papers (1975–1980). This resulted in the growth of popularity in the language and the era of standardization from 1990 onward. Much of the history of Scheme has been documented by the developers themselves.[1]
Prehistory
The development of Scheme was heavily influenced by two predecessors that were quite different from one another: Lisp provided its general semantics and syntax, and ALGOL provided its lexical scope and block structure. Scheme is a dialect of Lisp but Lisp has evolved; the Lisp dialects from which Scheme evolved—although they were in the mainstream at the time—are quite different from any modern Lisp. Scheme falls within the large Lisp family of languages that includes Common Lisp, Scheme, ISLisp, EuLisp, XLisp, and AutoLisp.
Lisp
Lisp was invented by John McCarthy in 1958 while he was at the Massachusetts Institute of Technology (MIT). McCarthy published its design in a paper in Communications of the ACM in 1960, entitled "Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I"[2] (Part II was never published). He showed that with a few simple operators and a notation for functions, one can build a Turing-complete language for algorithms.
The use of s-expressions which characterize the syntax of Lisp was initially intended to be an interim measure pending the development of a language employing what McCarthy called "m-expressions". As an example, the m-expression car[cons[A,B]] is equivalent to the s-expression (car (cons A B)). S-expressions proved popular, however, and the many attempts to implement m-expressions failed to catch on.
Die erste Implementierung von Lisp erfolgte auf einer IBM 704 durch Steve Russell , der McCarthys Artikel gelesen und die darin beschriebene eval-Funktion in Maschinencode umgesetzt hatte. Die in Lisp geläufigen (aber für Neulinge verwirrenden) Bezeichnungen CAR und CDR für das erste und das letzte Element einer Liste entwickelten sich aus zwei IBM-704- Assemblerbefehlen: „Contents of Address Register“ und „Contents of Decrement Register“. Jeder dieser Befehle gab den Inhalt eines 15-Bit-Registers zurück, das Segmenten eines 36-Bit -IBM-704-Befehlsworts entsprach .
Der erste vollständige Lisp-Compiler, geschrieben in Lisp, wurde 1962 von Tim Hart und Mike Levin am MIT implementiert. [ 3 ] Dieser Compiler führte das Lisp-Modell der inkrementellen Kompilierung ein, bei dem kompilierte und interpretierte Funktionen frei miteinander vermischt werden können.
Die beiden für die Entwicklung von Scheme wichtigsten Lisp-Varianten wurden beide am MIT entwickelt: LISP 1.5 [ 4 ], entwickelt von McCarthy und anderen, und Maclisp [ 5 ] , entwickelt für das MIT- Projekt MAC , ein direkter Nachfolger von LISP 1.5, das auf den Systemen PDP-10 und Multics lief.
Seit seinen Anfängen war Lisp eng mit der Forschungsgemeinschaft für künstliche Intelligenz (KI) verbunden, insbesondere auf dem PDP-10 . Die 36-Bit-Wortgröße des PDP-6 und PDP-10 wurde durch die Nützlichkeit beeinflusst, zwei 18-Bit- Lisp- Zeiger in einem Wort unterzubringen . [ 6 ]
ALGOL
ALGOL 58 , ursprünglich IAL (für „International Algorithmic Language“) genannt, wurde 1958 von einem Komitee europäischer und amerikanischer Informatiker auf einem Treffen an der ETH Zürich gemeinsam entwickelt . ALGOL 60 , eine spätere Überarbeitung, die auf dem ALGOL-60-Treffen in Paris entstand und heute allgemein als ALGOL bekannt ist , wurde zum Standard für die Veröffentlichung von Algorithmen und hatte trotz des mangelnden kommerziellen Erfolgs und der Einschränkungen der Sprache einen tiefgreifenden Einfluss auf die zukünftige Sprachentwicklung. Tony Hoare bemerkte dazu: „Diese Sprache war ihrer Zeit so weit voraus, dass sie nicht nur eine Verbesserung gegenüber ihren Vorgängern, sondern auch gegenüber nahezu allen ihren Nachfolgern darstellte.“ [ 7 ]
ALGOL führte die Verwendung von Blockstrukturen und lexikalischen Gültigkeitsbereichen ein. Es war außerdem berüchtigt für seinen umständlichen Mechanismus zur Übergabe von Standardparametern per Namensaufruf . Dieser erforderte, dass der formale Parameter während der Ausführung einer Prozedur oder Funktion durch den Ausdruck, der den Arbeitsparameter repräsentierte, ersetzt wurde. Dadurch musste der Arbeitsparameter bei jedem Zugriff neu ausgewertet werden. Die ALGOL-Implementierer entwickelten daraufhin einen Mechanismus namens „ Thunk“ , der den Kontext des Arbeitsparameters erfasste und so dessen Auswertung während der Ausführung der Prozedur oder Funktion ermöglichte.
Carl Hewitt, das Schauspielermodell und die Entstehung von Scheme
1971 entwickelten Sussman, Drew McDermott und Eugene Charniak ein System namens Micro-Planner , eine unvollständige und unbefriedigende Implementierung von Carl Hewitts ambitioniertem Planner- Projekt. Sussman und Hewitt arbeiteten gemeinsam mit anderen an Muddle (später MDL) , einer erweiterten Lisp-Sprache, die Bestandteil von Hewitts Projekt war. 1972 entwickelten Drew McDermott und Sussman die Lisp-basierte Sprache Conniver , die die ihrer Ansicht nach unproduktive automatische Rückverfolgung in Planner überarbeitete. Hewitt bezweifelte, dass die komplexe Kontrollstruktur von Conniver eine Lösung für die Probleme von Planner darstellte. Pat Hayes bemerkte: „Ihre [Sussman und McDermott] Lösung, dem Benutzer Zugriff auf die Implementierungsprimitive von Planner zu gewähren, ist jedoch ein Rückschritt (welche Semantik hat Conniver?).“ [ 8 ]
Im November 1972 entwickelten Hewitt und seine Studenten das Aktormodell als Lösung für die Probleme mit Planner. [ 9 ] Eine Teilimplementierung von Aktoren wurde unter dem Namen Planner-73 (später PLASMA) entwickelt. Steele, damals Doktorand am MIT, hatte diese Entwicklungen verfolgt, und er und Sussman beschlossen, eine Version des Aktormodells in ihrem eigenen, auf Maclisp basierenden „Tiny Lisp“ zu implementieren , um das Modell besser zu verstehen. Darauf aufbauend begannen sie, Mechanismen zur Erstellung von Aktoren und zum Versenden von Nachrichten zu entwickeln. [ 10 ]
Die Verwendung des lexikalischen Gültigkeitsbereichs in PLASMA ähnelte dem Lambda-Kalkül . Sussman und Steele beschlossen, Aktoren im Lambda-Kalkül zu modellieren. Sie nannten ihr Modellierungssystem Schemer und änderten es später in Scheme, um die Sechs-Zeichen-Beschränkung des ITS- Dateisystems auf ihrer DEC PDP-10 einzuhalten . Bald kamen sie zu dem Schluss, dass Aktoren im Wesentlichen Closures sind, die nie zurückkehren, sondern stattdessen eine Fortsetzung aufrufen . Daher entschieden sie, dass Closure und Aktor für ihre Untersuchung im Wesentlichen identische Konzepte sind. Sie eliminierten den ihrer Ansicht nach redundanten Code und entdeckten dabei, dass sie einen sehr kleinen und leistungsfähigen Lisp-Dialekt geschrieben hatten. Hewitt blieb kritisch gegenüber der „komplexen Kontrollstruktur“ in Scheme [ 11 ] [ 12 ] und betrachtete die in der Scheme-Implementierung verwendeten Primitiven (z. B. `int` START!PROCESS, STOP!PROCESS`string` und ` EVALUATE!UNINTERRUPTIBLYstring`) als Rückschritt.
25 Jahre später, 1998, stellten Sussman und Steele fest, dass der Minimalismus von Scheme kein bewusstes Designziel, sondern vielmehr ein unbeabsichtigtes Ergebnis des Designprozesses war. „Wir wollten eigentlich etwas Kompliziertes entwickeln und entdeckten dabei zufällig, dass wir versehentlich etwas entworfen hatten, das all unsere Ziele erfüllte, aber viel einfacher war als beabsichtigt … Wir erkannten, dass der Lambda-Kalkül – ein kleiner, einfacher Formalismus – als Kern einer leistungsstarken und ausdrucksstarken Programmiersprache dienen konnte.“ [ 10 ]
Andererseits blieb Hewitt dem Lambda-Kalkül als Grundlage für Berechnungen gegenüber kritisch und schrieb: „Tatsächlich kann der λ-Kalkül zwar einige Arten sequentieller und paralleler Kontrollstrukturen ausdrücken, aber im Allgemeinen nicht die im Aktormodell ausgedrückte Nebenläufigkeit. Das Aktormodell hingegen kann alles im λ-Kalkül und mehr ausdrücken.“ Er kritisierte auch Aspekte von Scheme, die sich vom Lambda-Kalkül ableiten, wie die Abhängigkeit von Fortsetzungsfunktionen und das Fehlen von Ausnahmen. [ 13 ]
Die Lambda-Papiere
Zwischen 1975 und 1980 arbeiteten Sussman und Steele an der Weiterentwicklung ihrer Ideen zur Verwendung des Lambda-Kalküls, Fortsetzungen und anderer fortgeschrittener Programmierkonzepte wie der Optimierung der Endrekursion und veröffentlichten diese in einer Reihe von KI-Memos , die zusammenfassend als Lambda Papers bezeichnet wurden . [ 14 ]
Liste der Dokumente
- 1975: Scheme: Ein Interpreter für den erweiterten Lambda-Kalkül
- 1976: Lambda: Das ultimative Gebot
- 1976: Lambda: Die ultimative Deklarativfunktion
- 1977: Die Entlarvung des Mythos vom „teuren Prozeduraufruf“ oder: Prozeduraufruf-Implementierungen, die als schädlich gelten, oder: Lambda: Die ultimative GOTO-Funktion
- 1978: Die Kunst des Interpreten oder der Modularitätskomplex (Teile Null, Eins und Zwei)
- 1978: RABBIT: Ein Compiler für SCHEME
- 1979: Entwurf von LISP-basierten Prozessoren, oder SCHEME: Ein Dialekt von LISP, oder Finite Memories Considered Harmful, oder LAMBDA: Der ultimative Opcode
- 1980: Compileroptimierung basierend auf der Betrachtung von LAMBDA als RENAME + GOTO
- 1980: Entwurf eines Lisp-basierten Prozessors
Beeinflussen
Scheme war der erste Lisp-Dialekt, der sich für lexikalischen Gültigkeitsbereich entschied . Es war auch eine der ersten Programmiersprachen nach Reynolds' Definitional Language [ 15 ] , die First-Class -Continuations unterstützte . Es hatte großen Einfluss auf die Bemühungen, die zur Entwicklung seiner Schwestersprache Common Lisp führten , zu der Guy Steele mitwirkte. [ 16 ]
Standardisierung
Die Programmiersprache Scheme ist im offiziellen Standard des Institute of Electrical and Electronics Engineers (IEEE) [ 17 ] und im De-facto-Standard „ Revised Report on the Algorithmic Language Scheme“ ( RnRS ) standardisiert . Der am weitesten verbreitete Standard ist R5RS (1998) [ 18 ] , und ein neuer Standard, R6RS [ 19 ], wurde 2007 ratifiziert. [ 20 ] Neben den RnRS-Standards existieren auch Scheme Requests for Implementation- Dokumente ( SRI ), die zusätzliche Bibliotheken enthalten, welche von Scheme-Implementierungen hinzugefügt werden können.
Zeitleiste
| 1958 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LISP 1, 1.5, LISP 2 (aufgegeben) | |||||||||||||||
| Maclisp | |||||||||||||||
| Interlisp | |||||||||||||||
| MDL | |||||||||||||||
| Lisp-Maschine Lisp | |||||||||||||||
| Schema | R5RS | R6RS | R7RS klein | ||||||||||||
| NULL | |||||||||||||||
| ZIL (Zork Implementation Language) | |||||||||||||||
| Franz Lisp | |||||||||||||||
| muLisp | |||||||||||||||
| Common Lisp | ANSI-Standard | ||||||||||||||
| Le Lisp | |||||||||||||||
| MIT-Schema | |||||||||||||||
| XLISP | |||||||||||||||
| T | |||||||||||||||
| Chez Scheme | |||||||||||||||
| Emacs Lisp | |||||||||||||||
| AutoLISP | |||||||||||||||
| PicoLisp | |||||||||||||||
| Gambit | |||||||||||||||
| EuLisp | |||||||||||||||
| ISLISP | |||||||||||||||
| OpenLisp | |||||||||||||||
| PLT-Programm | Schläger | ||||||||||||||
| newLISP | |||||||||||||||
| GNU Guile | |||||||||||||||
| Visual LISP | |||||||||||||||
| Clojure | |||||||||||||||
| Bogen | |||||||||||||||
| LFE | |||||||||||||||
| Hy | |||||||||||||||
Referenzen
- ^ Steele, Guy (2006). „History of Scheme“ (PDF) . Sun Microsystems Laboratories . Archiviert vom Original am 02.03.2023 . Abgerufen am 05.04.2023 .
{{cite web}}: CS1 Wartung: Bot: Status der ursprünglichen URL unbekannt ( Link ) - ^ McCarthy, John . „Rekursive Funktionen symbolischer Ausdrücke und ihre maschinelle Berechnung, Teil I“ . Archiviert vom Original am 4. Oktober 2013. Abgerufen am 13. Oktober 2006 .
- ^ Hart, Tim; Levin, Mike. „AI Memo 39, The New Compiler“ (PDF) . Archiviert vom Original (PDF) am 06.07.2017 . Abgerufen am 13.10.2006 .
- ^ McCarthy, John ; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1985). LISP 1.5 Programmer's Manual . MIT Press . ISBN 978-0-262-13011-0Die
- ^ „Maclisp-Referenzhandbuch“ . 3. März 1979. Archiviert vom Original am 14.12.2007.
- ^ Hurley, Peter J. (18. Oktober 1990). „Die Geschichte von TOPS oder Leben in den schnellen ACs“ . Newsgroup : alt.folklore.computers . Usenet: 84950@tut.cis.ohio-state.edu .
Das PDP-6-Projekt begann Anfang 1963 als
24-Bit-
Maschine. Für LISP, ein ursprüngliches Designziel, wurde sie auf 36 Bit erweitert.
- ^ Hoare, Tony (Dezember 1973). Hinweise zum Entwurf von Programmiersprachen (PDF) . S. 27. (Diese Aussage wird manchmal fälschlicherweise Edsger W. Dijkstra zugeschrieben , der auch an der Implementierung des ersten ALGOL 60- Compilers beteiligt war .)
- ^ Hayes, Pat (1974). „Einige Probleme und Nicht-Probleme in der Repräsentationstheorie“. Gesellschaft für das Studium der künstlichen Intelligenz und der Simulation von Verhalten .
- ^ Hewitt, Carl ; Bishop, Peter; Steiger, Richard (1973). „Ein universeller modularer Akteurformalismus für künstliche Intelligenz“. IJCAI.
{{cite journal}}: Zeitschrift zitieren erfordert|journal=( Hilfe ) - Sussman , Gerald Jay ; Steele Jr., Guy L. ( Dezember 1998). „ The First Report on Scheme Revisited“ (PDF) . Higher-Order and Symbolic Computation . 11 (4): 399–404 . doi : 10.1023/A:1010079421970 . ISSN 1388-3690 . S2CID 7704398. Archiviert vom Original (PDF) am 15.06.2006 . Abgerufen am 19.06.2006 .
- ^ Hewitt, Carl (Dezember 1976). „Kontrollstrukturen als Muster der Nachrichtenübermittlung betrachten“. AI Memo 410 .
- ^ Hewitt, Carl (Juni 1977). „Viewing Control Structures as Patterns of Passing Messages“. Journal of Artificial Intelligence . 8 (3): 323–364 . doi : 10.1016/0004-3702(77)90033-9 . hdl : 1721.1/6272 .
- ^ Hewitt, Carl (2009). „ActorScript: Industrielle Integration lokaler und nichtlokaler Parallelverarbeitung für Client-Cloud-Computing“. arXiv : 0907.3330 [ cs.PL ].
- ^ „Online-Version der Lambda Papers“ . scheme.org . 2025. Abgerufen am 04.12.2025 .
- ^ Reynolds, John (1972). „Definitionsinterpreter für Programmiersprachen höherer Ordnung“. ACM Conference Proceedings . Association for Computing Machinery.
- ^ „Common Lisp Hyperspec – 1.1.2 History“ . LispWorks . 2005. Abgerufen am 2. Dezember 2018 .
- ^ 1178-1990 (R1995) IEEE-Standard für die Scheme-Programmiersprache
- ^ Kelsey, Richard; Clinger, William; Rees, Jonathan; et al. (August 1998). „Revised 5 Report on the Algorithmic Language Scheme“ . Higher-Order and Symbolic Computation . 11 (1): 7–105 . doi : 10.1023/A:1010051815785 .
- ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; Findler, Robby; Matthews, Jacob (August 2009). „Revised 6 Report on the Algorithmic Language Scheme“ . Journal of Functional Programming . 19 (S1): 1–301 . CiteSeerX 10.1.1.154.5197 . doi : 10.1017/S0956796809990074 . S2CID 62724224 .
- ^ "Ergebnisse der Abstimmung über die Ratifizierung des R6RS" .