INTERCAL
INTERCAL – prawdopodobnie pierwszy ezoteryczny język programowania. Jego oficjalna nazwa to CLWNPA, czyli Compiler Language With No Pronounceable Acronym (kompilowany język o niewymawialnym skrócie). Wyglądem przypomina asembler, lecz jego składnia jest tak skonstruowana, aby maksymalnie utrudnić pisanie programów i uczynić listingi jak najbardziej zagmatwanymi.
Charakterystyka
[edytuj | edytuj kod]Cechy INTERCALA:
- Uprzejmość – część instrukcji musimy poprzedzić słowem kluczowym
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. - Instrukcja
COME FROM
będąca skokiem z, a nie do etykiety. Pojawiła się w późniejszych wersjach języka i stała się inspiracją do stworzenia wielowątkowego INTERCALA. - Grupowanie wyrażeń będące czymś w rodzaju nawiasów – zamiast nich używane są jednak znaki " i ', co pogarsza czytelność źródeł.
- Brak jawnego mechanizmu wywoływania procedur. Dostępna jest wyłącznie instrukcja
NEXT
, która wykonuje skok do etykiety i przypadkiem odrzuca adres na stos. - W Intercalu nie każda użyta komenda musi na 100% oznaczać jej wykonanie. Może to oznaczać jej wykonanie np. na 80%, jeśli rozpoczyna się od "%80".
- Ignorowanie instrukcji. Przykładowo,
ABSTAIN FROM STASHING
spowoduje ignorowanie instrukcjiSTASH
, natomiastREINSTATE STASHING
z powrotem przywróci ją do działania. - Brak zmiennych lokalnych. Zamiast tego możemy korzystać z mechanizmu tworzenia ramek stosu.
- Liczby są wypisywane na ekran w postaci rzymskiej.
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ów ASCII, np. apostrofy i cudzysłowy zwane są tam odpowiednio "iskrami" oraz "króliczymi uszkami".
Operatory
[edytuj | edytuj kod]INTERCAL posiada kilka operatorów pracujących na słowach procesora, niespotykanych w innych językach programowania. Dwuargumentowe operatory to:
- mingle (lub interleave) ($) – przeplatanie bitów obu argumentów.
- select (~) – wybiera z pierwszego argumentu te bity, których odpowiadające im w drugim argumencie są ustawione; pozostałe są usuwane, a całość jest "upychana w prawo".
Ponadto istnieją trzy jednoargumentowe operatory: AND, OR, EXOR. Wykonują one swą pracę na kolejnych parach bitów w argumencie.
Zupełność
[edytuj | edytuj kod]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ą sobie maszyny Turinga (czyli m.in. komputery). Rozwiązywanie pochłania jednak znacznie więcej czasu. Wykonany benchmark pokazał, że znajdowanie liczb pierwszych mniejszych niż 65536, które programowi w C zabiera 0,5 sekundy, analogiczny program w INTERCALU rozwiązywał w 17 godzin.
Hello World
[edytuj | edytuj kod]Klasyczny program „Hello, world!” w C 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
Linki zewnętrzne
[edytuj | edytuj kod]- Eric Raymond: The INTERCAL Resources Page. [zarchiwizowane z tego adresu].
- Donald R. Woods, James M. Lyon: The INTERCAL Programming Language Reference Manual. [dostęp 2024-05-29].