INTERCAL – prawdopodobnie pierwszyezoterycznyjęzyk programowania. Jego oficjalna nazwa to CLWNPA, czyliCompiler Language With No Pronounceable Acronym (kompilowany język o niewymawialnym skrócie). Wyglądem przypominaasembler, lecz jego składnia jest tak skonstruowana, aby maksymalnie utrudnić pisanie programów i uczynić listingi jak najbardziej zagmatwanymi.
Cechy INTERCALA:
PLEASE
, gdyż inaczej program zostanie uznany za nieuprzejmy, a co za tym idzie – odrzucony. Nadużywanie tego słowa spowoduje natomiast zaklasyfikowanie programu jako zbyt lizusowskiego.COME FROM
będąca skokiemz, a niedo etykiety. Pojawiła się w późniejszych wersjach języka i stała się inspiracją do stworzenia wielowątkowego INTERCALA.NEXT
, która wykonuje skok do etykiety i przypadkiem odrzuca adres nastos.ABSTAIN FROM STASHING
spowoduje ignorowanie instrukcjiSTASH
, natomiastREINSTATE STASHING
z powrotem przywróci ją do działania.Oficjalna specyfikacja języka jest napisana w sposób humorystyczny. Zawiera dużo paradoksalnych, nielogicznych lub zabawnych w jakiś inny sposób zdań. Ponadto autorzy zastosowali autorskie nazewnictwo znakówASCII, np. apostrofy i cudzysłowy zwane są tam odpowiednio "iskrami" oraz "króliczymi uszkami".
INTERCAL posiada kilka operatorów pracujących na słowach procesora, niespotykanych w innych językach programowania. Dwuargumentowe operatory to:
Ponadto istnieją trzy jednoargumentowe operatory:AND,OR,EXOR. Wykonują one swą pracę na kolejnych parach bitów w argumencie.
Pomimo niespotykanych rozwiązań, INTERCAL jest językiem zupełnym w sensie Turinga. Oznacza to, iż posiadając odpowiednio dużą pamięć, można w nim rozwiązać każdy problem algorytmiczny, z jakim radzą sobiemaszyny Turinga (czyli m.in. komputery). Rozwiązywanie pochłania jednak znacznie więcej czasu. Wykonany benchmark pokazał, że znajdowanieliczb pierwszych mniejszych niż 65536, które programowi w C zabiera 0,5 sekundy, analogiczny program w INTERCALU rozwiązywał w 17 godzin.
Klasyczny program „Hello, world!” wC wygląda tak:
#include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; }
zaś w INTERCALU można go zapisać następująco:
DO ,1 <- #13 PLEASE DO ,1SUB#1 <- #234 DO ,1SUB#2 <- #112 DO ,1SUB#3 <- #112 DO ,1SUB#4 <- #0 DO ,1SUB#5 <- #64 DO ,1SUB#6 <- #194 DO ,1SUB#7 <- #48 PLEASE DO ,1SUB#8 <- #22 DO ,1SUB#9 <- #248 DO ,1SUB#10 <- #168 DO ,1SUB#11 <- #24 DO ,1SUB#12 <- #16 DO ,1SUB#13 <- #214 PLEASE READ OUT ,1 PLEASE GIVE UP
1GL | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2GL/ Język drugiej generacji/ Asembler | |||||||||||||||
3GL / Język trzeciej generacji |
| ||||||||||||||
4GL/ Język czwartej generacji/ Język dziedzinowy |
| ||||||||||||||
5GL/Logiczne | |||||||||||||||
Ezoteryczne | |||||||||||||||
Inne |