BCPL - BCPL

BCPL
Paradigma prozedural , zwingend , strukturiert
Entworfen von Martin Richards
Erstmals erschienen 1967 ; Vor 54 Jahren ( 1967 )
Schreibdisziplin typlos (alles ist ein Wort )
Beeinflusst von
CPL
Beeinflusst
B , C , Go

BCPL (" Basic Combined Programming Language ") ist eine prozedurale , zwingende und strukturierte Programmiersprache . Ursprünglich zum Schreiben von Compilern für andere Sprachen gedacht , wird BCPL nicht mehr allgemein verwendet. Sein Einfluss ist jedoch immer noch spürbar, da eine abgespeckte und syntaktisch veränderte Version von BCPL, genannt B , die Sprache war, auf der die Programmiersprache C basierte. BCPL führte mehrere Funktionen vieler moderner Programmiersprachen ein, einschließlich der Verwendung von geschweiften Klammern zum Abgrenzen von Codeblöcken. BCPL wurde erstmals 1967 von Martin Richards von der University of Cambridge implementiert .

Entwurf

BCPL wurde so konzipiert, dass kleine und einfache Compiler dafür geschrieben werden können; angeblich könnten einige Compiler in 16 Kilobyte ausgeführt werden . Außerdem war der ursprüngliche Compiler, der selbst in BCPL geschrieben war, leicht portierbar. BCPL war daher eine beliebte Wahl für das Bootstrapping eines Systems. Ein Hauptgrund für die Portabilität des Compilers lag in seiner Struktur. Es wurde in zwei Teile geteilt: Das Frontend analysierte die Quelle und generierte O-Code, eine Zwischensprache . Das Backend nahm den O-Code und übersetzte ihn in den Maschinencode für die Zielmaschine. Nur 15 des Codes des Compilers musste umgeschrieben werden, um eine neue Maschine zu unterstützen, eine Aufgabe, die normalerweise zwischen 2 und 5 Mannmonaten dauerte . Dieser Ansatz wurde später gängige Praxis (zB Pascal , Java ).

Die Sprache ist insofern ungewöhnlich, als sie nur einen Datentyp hat : ein Wort , eine feste Anzahl von Bits, die normalerweise so gewählt werden, dass sie mit dem Maschinenwort der Architektur übereinstimmt, und von ausreichender Kapazität, um jede gültige Speicheradresse darzustellen. Für viele Maschinen dieser Zeit war dieser Datentyp ein 16-Bit-Wort. Diese Wahl erwies sich später als erhebliches Problem, wenn BCPL auf Maschinen verwendet wurde, bei denen das kleinste adressierbare Element kein Wort, sondern ein Byte war, oder auf Maschinen mit größeren Wortgrößen wie 32-Bit oder 64-Bit.

Die Interpretation jedes Wertes wurde von den Operatoren bestimmt, die zur Verarbeitung der Werte verwendet wurden. (Zum Beispiel +zwei Werte zusammenaddiert und als Ganzzahlen behandelt ; !indirekt über einen Wert, effektiv als Zeiger behandelt.) Damit dies funktioniert, bietet die Implementierung keine Typprüfung . Die ungarische Notation wurde entwickelt, um Programmierern zu helfen, versehentliche Typfehler zu vermeiden.

Die Nichtübereinstimmung zwischen BCPL des Wort Orientierung und byteorientierten Hardware wurde auf verschiedene Weise angegangen. Eine bestand darin, Standardbibliotheksroutinen zum Packen und Entpacken von Wörtern in Byte-Strings bereitzustellen. Später wurden zwei Sprachfunktionen hinzugefügt: der Bitfeldauswahloperator und der Infixbyte-Indirektionsoperator (bezeichnet mit %).

BCPL behandelt auf einzigartige Weise Bindungen, die sich über separate Kompilierungseinheiten erstrecken . Es gibt keine vom Benutzer deklarierbaren globalen Variablen; stattdessen gibt es einen globalen Vektor, ähnlich wie "blank common" in Fortran . Alle zwischen verschiedenen Kompilierungseinheiten geteilten Daten umfassen Skalare und Zeiger auf Vektoren, die an einer im Voraus angeordneten Stelle im globalen Vektor gespeichert sind. Auf diese Weise werden die Header-Dateien (Dateien, die während der Kompilierung mit der Direktive "GET" eingeschlossen werden) zum wichtigsten Mittel zum Synchronisieren globaler Daten zwischen Kompilierungseinheiten, die Direktiven "GLOBAL" enthalten, die Listen von symbolischen Namen präsentieren, die jeweils mit einer Zahl gepaart sind, die den Namen mit . verknüpft das entsprechende numerisch adressierte Wort im globalen Vektor. Neben Variablen enthält der globale Vektor Bindungen für externe Prozeduren. Dadurch ist ein dynamisches Laden von Kompilierungseinheiten sehr einfach zu erreichen. Anstatt sich auf den Link Loader der zugrunde liegenden Implementierung zu verlassen, gibt BCPL dem Programmierer effektiv die Kontrolle über den Linking-Prozess.

Der globale Vektor machte es auch sehr einfach, Standardbibliotheksroutinen zu ersetzen oder zu erweitern. Ein Programm könnte den Zeiger des globalen Vektors auf die ursprüngliche Routine speichern und ihn durch einen Zeiger auf eine alternative Version ersetzen. Die Alternative könnte das Original als Teil seiner Verarbeitung aufrufen. Dies könnte als schnelle Ad-hoc- Debugging-Hilfe verwendet werden.

BCPL war die erste Programmiersprache für geschweifte Klammern, und die geschweiften Klammern überlebten die syntaktischen Änderungen und wurden zu einem gebräuchlichen Mittel zur Bezeichnung von Programmquellcode-Anweisungen. In der Praxis verwendeten Quellprogramme auf begrenzten Tastaturen des Tages oft die Sequenzen $(und $)anstelle der Symbole {und }. Die einzeiligen // Kommentare von BCPL, die von C nicht übernommen wurden , tauchten in C++ und später in C99 wieder auf .

Das Buch BCPL: Die Sprache und ihr Compiler beschreibt die Philosophie von BCPL wie folgt:

Die BCPL-Philosophie gehört nicht zu den Tyrannen, die glauben, es am besten zu wissen, und die Gesetze darüber erlassen, was erlaubt ist und was nicht; BCPL handelt eher wie ein Diener, der seine Dienste nach besten Kräften ohne Klagen anbietet, selbst wenn er mit offensichtlichem Unsinn konfrontiert wird. Es wird immer vorausgesetzt, dass der Programmierer weiß, was er tut, und wird nicht durch kleinliche Beschränkungen eingeengt.

Geschichte

BCPL wurde erstmals 1967 von Martin Richards von der University of Cambridge implementiert . BCPL war eine Reaktion auf Schwierigkeiten mit seinem Vorgänger, der Cambridge Programming Language, die später in Combined Programming Language (CPL) umbenannt wurde und in den frühen 1960er Jahren entwickelt wurde. Richards schuf BCPL, indem er "die Merkmale der vollständigen Sprache entfernte, die die Kompilierung erschweren". Die erste Compiler-Implementierung für die IBM 7094 unter dem Compatible Time-Sharing System (CTSS) wurde geschrieben, als Richards im Frühjahr 1967 das Projekt MAC am Massachusetts Institute of Technology (MIT) besuchte. Die Sprache wurde erstmals in einer Veröffentlichung beschrieben präsentiert auf der Frühjahrs-Computerkonferenz 1969.

Es wird gemunkelt, dass BCPL ursprünglich für "Bootstrap Cambridge Programming Language" stand, aber CPL wurde nie erstellt, da die Entwicklung bei BCPL eingestellt wurde, und das Akronym wurde später für das BCPL-Buch neu interpretiert.

BCPL ist die Sprache, in der das ursprüngliche Hello-World-Programm geschrieben wurde. Der erste MUD wurde ebenfalls in BCPL ( MUD1 ) geschrieben.

Mehrere Betriebssysteme wurden teilweise oder vollständig in BCPL geschrieben (zB TRIPOS und die frühesten Versionen von AmigaDOS ). BCPL war auch die ursprüngliche Sprache, die im bahnbrechenden Xerox PARC Alto- Projekt, dem ersten modernen Personal Computer, verwendet wurde ; Neben anderen Projekten wurde das Dokumentvorbereitungssystem Bravo in BCPL geschrieben.

Ein früher Compiler, der 1969 gebootet wurde, indem er mit einem Papierband des O-Codes des Atlas 2- Compilers von Martin Richards begann , zielte auf die ICT 1900-Serie ab . Die beiden Maschinen hatten unterschiedliche Wortlängen (48 vs. 24 Bit), unterschiedliche Zeichenkodierungen und unterschiedliche gepackte String-Darstellungen – und das erfolgreiche Bootstrapping erhöhte das Vertrauen in die Praktikabilität der Methode.

Bis Ende 1970 gab es Implementierungen für Honeywell 635 und Honeywell 645 , IBM 360 , PDP-10 , TX-2 , CDC 6400 , UNIVAC 1108 , PDP-9 , KDF 9 und Atlas 2 . 1974 wurde bei BBN ein Dialekt von BCPL implementiert, ohne den dazwischenliegenden O-Code zu verwenden. Die anfängliche Implementierung war ein Cross-Compiler, der auf den TENEX PDP-10s von BBN gehostet wurde und direkt auf die PDP-11s abzielte, die in BBNs Implementierung der IMPs der zweiten Generation im ARPANET verwendet wurden .

Es gab auch eine Version, die Mitte der 1980er Jahre für die BBC Micro von Richards Computer Products produziert wurde, einer Firma, die von John Richards, dem Bruder von Dr. Martin Richards, gegründet wurde. Das BBC Domesday Project nutzte die Sprache. Versionen von BCPL für die Computer Amstrad CPC und Amstrad PCW wurden auch 1986 vom britischen Softwarehaus Arnor Ltd. veröffentlicht. MacBCPL wurde 1985 von Topexpress Ltd, Kensington, England, für den Apple Macintosh veröffentlicht.

Sowohl das Design als auch die Philosophie von BCPL beeinflussten B stark , was wiederum C beeinflusste . Programmierer diskutierten damals, ob ein eventueller Nachfolger von C "D", der nächste Buchstabe im Alphabet, oder "P", der nächste Buchstabe im Namen der Muttersprache, heißen würde. Die am meisten als Nachfolger von C akzeptierte Sprache ist C++ (mit ++dem Inkrementoperator von C ), obwohl es mittlerweile auch eine D- Programmiersprache gibt.

1979 existierten Implementierungen von BCPL für mindestens 25 Architekturen; die Sprache geriet allmählich in Ungnade, als C auf Nicht-Unix-Systemen populär wurde.

Martin Richards unterhält auf seiner Website eine moderne Version von BCPL, die zuletzt 2018 aktualisiert wurde. Diese kann so eingerichtet werden, dass sie auf verschiedenen Systemen läuft, darunter Linux, FreeBSD und Mac OS X. Die neueste Distribution umfasst Grafik- und Soundbibliotheken, und es gibt eine umfassendes Handbuch. Er programmiert weiterhin darin, unter anderem für seine Forschungen zur musikalischen automatischen Partiturverfolgung .

Ein üblicher informeller MIME-Typ für BCPL ist text/x-bcpl .

Beispiele

Wenn diese Programme mit der aktuellen Cintsys-Version von Martin Richards (Dezember 2018) ausgeführt werden, müssen LIBHDR, START und WRITEF in Kleinbuchstaben geändert werden, um Fehler zu vermeiden.

Fakultäten drucken:

GET "LIBHDR"

LET START() = VALOF $(
	FOR I = 1 TO 5 DO
		WRITEF("%N! = %I4*N", I, FACT(I))
	RESULTIS 0
$)

AND FACT(N) = N = 0 -> 1, N * FACT(N - 1)

Zählen Sie Lösungen für das N-Damenproblem :

GET "LIBHDR"

GLOBAL $(
	COUNT: 200
	ALL: 201
$)

LET TRY(LD, ROW, RD) BE
	TEST ROW = ALL THEN
		COUNT := COUNT + 1
	ELSE $(
		LET POSS = ALL & ~(LD | ROW | RD)
		UNTIL POSS = 0 DO $(
			LET P = POSS & -POSS
			POSS := POSS - P
			TRY(LD + P << 1, ROW + P, RD + P >> 1)
		$)
	$)

LET START() = VALOF $(
	ALL := 1
	FOR I = 1 TO 12 DO $(
		COUNT := 0
		TRY(0, 0, 0)
		WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", I, COUNT)
		ALL := 2 * ALL + 1
	$)
	RESULTIS 0
$)

Verweise

Weiterlesen

  • Martin Richards, The BCPL Reference Manual (Memorandum M-352, Project MAC , Cambridge, MA, USA, Juli 1967)
  • Martin Richards, BCPL – ein Werkzeug für das Schreiben von Compilern und die Systemprogrammierung ( Proceedings of the Spring Joint Computer Conference , Bd. 34, S. 557–566, 1969)
  • Martin Richards, Arthur Evans, Robert F. Mabee, Das BCPL-Referenzhandbuch (MAC TR-141, Project MAC , Cambridge, MA, USA, 1974)
  • Martin Richards, Colin Whitby-Strevens, BCPL, die Sprache und ihr Compiler (Cambridge University Press, 1980) ISBN  0-521-28681-6

Externe Links