INTERCAL

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

INTERCAL (Compiler Language With No Pronouncable Acronym) ist eine esoterische Programmiersprache, die am 26. Mai 1972 von Donald R. Woods und James M. Lyon entwickelt wurde. Erst 1990 wurde eine erste UNIX-Implementierung von Eric S. Raymond programmiert. Heute ist INTERCAL auch auf DOS verfügbar.

INTERCAL wurde mit dem Ziel entwickelt, Programmiersprachen zu parodieren sowie das Programmieren schwierig zu gestalten und die entstehenden Programme effektiv unlesbar zu machen. Insofern ähnelt INTERCAL keiner der bekannten Programmiersprachen, hat sehr wenige Sprachkonstrukte und ist schwierig zu erlernen.

INTERCAL wird von einer kleinen Fan-Gemeinde gepflegt und kann dem interessierten Programmierer zur Erheiterung oder Rätsellösung dienen. Auf einer SUN SPARCStation-1 benötigte ein INTERCAL-Programm über 17 Stunden, um mittels des Sieb des Eratosthenes sämtliche Primzahlen kleiner als 65536 zu berechnen. Auf einer IBM 360/91 dauerte es 30 Sekunden, um einen 16-bit Integer (d. h. eine Zahl kleiner als 65536) zu dividieren.[1]

Besonderheiten[Bearbeiten]

Besonders bekannt ist INTERCAL für den COME FROM-Befehl. Dieser parodiert das GOTO, das in einigen anderen Programmiersprachen, wie etwa BASIC, vorkommt.

So gut wie alle Programmiersprachen erlauben Kommentare im Programm, die vom Compiler ignoriert werden – wie zum Beispiel /* ... */ in C++. INTERCAL besitzt zwar die Möglichkeit, den Code zu kommentieren – gleichzeitig aber wird alles, was keinem gültigen Befehl entspricht, vom Compiler „ick“ ignoriert, was eine interessante Möglichkeit, Kommentare zu setzen, eröffnet. Aus demselben Grund gestaltet sich die Fehlersuche in einem INTERCAL-Programm als extrem schwierig.[2]

Das Programm kompiliert nicht, wenn der Programmierer zu wenig freundlich ist und zu selten PLEASE schreibt (Fehler "E079 PROGRAMMER IS INSUFFICIENTLY POLITE"). Auf der anderen Seite wird der Compiler selbstverliebt und verweigert seine Tätigkeit, wenn dieses Wort zu oft vorkommt ("E099 PROGRAMMER IS OVERLY POLITE").[3]

Beispiel ROT13-Programm[Bearbeiten]

   (10) PLEASE DON'T GIVE UP
   (1) DO .2 <- '?.1$#64'~'#0$#65535'
   DO .2 <- '&"'.1~.2'~'"?'?.2~.2'$#32768"~"#0$#65535“'"$".2~.2“'~#1
   DO .3 <- '?#91$.1'~'#0$#65535'
   DO .3 <- '&"'#91~.3'~'"?'?.3~.3'$#32768"~"#0$#65535“'"$".3~.3“'~#1
   DO (11) NEXT
   DO (2) NEXT
   DO (12) NEXT
   (11) DO (13) NEXT
   PLEASE FORGET #1
   DO (12) NEXT
   (13) DO (14) NEXT
   PLEASE FORGET #2
   DO (12) NEXT
   (14) DO STASH .1
   DO .1 <- .3
   DO (1000) NEXT
   DO .1 <- .3
   DO .2 <- #1
   PLEASE DO (1000) NEXT
   DO RETRIEVE .1
   PLEASE RESUME .3
   (12) PLEASE FORGET #1
   DO .2 <- '?.1$#96'~'#0$#65535'
   DO .2 <- '&"'.1~.2'~'"?'?.2~.2'$#32768"~"#0$#65535“'"$".2~.2“'~#1
   DO .3 <- '?#123$.1'~'#0$#65535'
   DO .3 <- '&"'#123~.3'~'"?'?.3~.3'$#32768"~"#0$#65535“'"$".3~.3“'~#1
   PLEASE DO (15) NEXT
   PLEASE DO (3) NEXT
   DO (16) NEXT
   (15) DO (17) NEXT
   PLEASE FORGET #1
   DO (16) NEXT
   (17) DO (18) NEXT
   PLEASE FORGET #2
   DO (16) NEXT
   (18) PLEASE STASH .1
   DO .1 <- .3
   DO (1000) NEXT
   DO .1 <- .3
   DO .2 <- #1
   DO (1000) NEXT
   PLEASE RETRIEVE .1
   PLEASE RESUME .3
   (16) PLEASE FORGET #1
   DO RESUME #1
   (2) DO .2 <- #65
   DO (1010) NEXT
   PLEASE .1 <- .3
   PLEASE .2 <- #13
   DO (1000) NEXT
   DO STASH .3
   DO .1 <- .3
   DO .2 <- #26
   DO (1040) NEXT
   DO .1 <- .3
   DO (1030) NEXT
   DO .2 <- .3
   DO RETRIEVE .3
   DO .1 <- .3
   DO (1010) NEXT
   DO .1 <- .3
   DO .2 <- #65
   DO (1000) NEXT
   DO .1 <- .3
   DO RESUME #1
   (3) DO .2 <- #97
   DO (1010) NEXT
   DO .1 <- .3
   DO .2 <- #13
   DO (1000) NEXT
   DO STASH .3
   DO .1 <- .3
   DO .2 <- #26
   DO (1040) NEXT
   DO .1 <- .3
   DO (1030) NEXT
   DO .2 <- .3
   DO RETRIEVE .3
   DO .1 <- .3
   DO (1010) NEXT
   DO .1 <- .3
   DO .2 <- #97
   DO (1000) NEXT
   DO .1 <- .3
   DO RESUME #1
   DO COME FROM (10)
   DO .4 <- #0
   DO .5 <- #0
   DO STASH .4 + .5
   DO ,1 <- #1
   DO COME FROM (33)
   DO WRITE IN ,1
   DO .1 <- ,1 SUB #1
   DO (31) NEXT
   PLEASE DO .6 <- #1
   PLEASE DO (34) NEXT
   (32) PLEASE RESUME '?.1$#256'~'#256$#256'
   (31) DO (32) NEXT
   DO FORGET #1
   DO .6 <- #0
   PLEASE DO (34) NEXT
   (33) DON'T GIVE UP
   (34) DO .6 <- "?!6'$#1"~#3
   DO (40) NEXT
   DO GIVE UP
   (40) DO (41) NEXT
   PLEASE FORGET #1
   DO (42) NEXT
   (41) DO RESUME .6
   (42) DO FORGET #1
   DO RETRIEVE .4
   DO .2 <- .4
   DO (1000) NEXT
   DO .4 <- .3~#255
   DO .3 <- .4
   DO STASH .4
   DO .1 <- .3
   DO (1) NEXT
   DO .3 <- !1~#15'$!1~#240'
   DO .3 <- !3~#15'$!3~#240'
   DO .2 <- !3~#15'$!3~#240'
   DO .1 <- .5
   DO (1010) NEXT
   DO .5 <- .2
   DO ,1 SUB #1 <- .3
   PLEASE READ OUT ,1
   PLEASE RESUME #1

Literatur[Bearbeiten]

  • Oliver Lau: Hexenwerk – Ein Plädoyer für esoterische Programmiersprachen. In: c’t, 22/07, S. 192–199 sowie c’t extra, 02/09, S. 40–45.

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. The A–Z of Programming Languages: INTERCAL (Interview mit Donald R. Woods, englisch)
  2. Michael Mateas, Nick Montfort: A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics (PDF).
  3. C-INTERCAL 0.29 Revamped Instruction Manual. catb.org