INTERCAL
"Compiler Language With No Pronounceable Acronym", скраћено INTERCAL, је езoтерични програмски језик који је настао 1972. као шала од стране Дона Вудса (енгл. Don Woods) и Џејмса М. Лиона (енгл. James M. Lyon), два студента на универзитету у Принстону. На сатиричан начин приказује становишта многих програмских језика у то доба,[1] као и ширење устаљених језичких конструкција и система записивања шездесетих година 20. века.
Постоје две тренутно одржаване верзије INTERCAL-а: C-INTERCAL, одржаван од стране Ерика С. Рејмонда (енгл. Eric S. Raymond)[2], и CLC-INTERCAL одржаван од стране Клаудија Калвелија (енгл. Claudio Calvelli). [3]
Историја
[уреди | уреди извор]Према оригиналном приручнику аутора, INTERCAL Reference Manual[4], пун назив језика је "Compiler Language With No Pronounceable Acronym", скраћено "INTERCAL".
Прва имплементација овог језика је користила бушене картице и EBCDIC сет знакова. Да би се омогућило INTERCAL-у да ради на рачуанрима који користе ASCII код, морале су се направити две измене- operator ¢ је замењен са operatorom $, који је представљао "повећање цене софтвера у односу на хардвер"
и оператор ⊻ је замењен са оператором ? као унарни exclusive-or оператор да би "јасно описао реакцију просечног човека када се први пут сусретне са овом наредбом"[4]. у новијим верзијама INTERCAL-а, старији оператори су подржани као алтернативе, а INTERCAL програми се сада могу кодирати у ASCII, Latin-1, или UTF-8 коду.[5]
Детаљи
[уреди | уреди извор]INTERCAL је направљен са циљем да буде потпуно другачији од свих осталих програмских језика. Често коришћене операције у другим језицима имају скривену или преопширну синтаксу у INTERCAL-у. Из приручника INTERCAL Reference Manual:[4]
Прилично је позната и често је практикована чињеница да је високо цењен човек чији је посао тешко докучив. На пример, када би неко изјавио да је најлакши начин да се меморише вредност 65536 на 32-битној променљивој у INTERCAL-у:
DO :1 <- #0¢#256 <br />
сваки разуман програмер би рекао да је та изјава апсурдна. Пошто је то заиста најлакши начин, програмер би изгелдао глупо пред својим шефом, који би се задесио ту, као што шефови иначе раде. Последица не би била ништа мање поражавајућа да је програмер био у праву.
INTERCAL има много карактеристика дизајнираних да учине естетски доживљај програмера још више незадовољавајућим- користи наредбе као што су "READ OUT", "IGNORE", "FORGET", и кључне речи као што су "PLEASE". Постоје два разлога због којих последња кључна реч може да доведе до одбијања програма од стране компилатора: ако се "PLEASE" не појављује довољно често, програм се сматра недовољно учтивим. Са друге стране, ако се поменута кључна реч појављује превише често, програм се сматра претерано учтивим. Мада је ова карактеристика постојала у оригиналном INTERCAL компајлеру, она се у програмском стандарду водила као "undocumented".[6] Упркос ограниченој и развученој синтакси овог језика, INTERCAL је ипак рачунски универзалан програм- уз довољно меморије, INTERCAL може да реши сваки проблем који и Универзална Тјурингова машина може да реши. Ипак, већина имплементација INTERCAL-а извршавају проблеме прилично споро. Бенчмарк Ератостеново сито, рачунајући све просте бројеве мање од 65536, био је тестиран на рачунару серије Sun SPARCstation 1. У програмском језику C, за извршавање овог програма било је потребно мање од пола секунде, док је исти програм у INTERCAL-у извршавао преко седамнаест сати. [7]
Документација
[уреди | уреди извор]Приручник INTERCAL Reference Manual садржи многа парадоксална, бесмислена и хумористичка упутства:
Пажња! Ни у ком случају немојте помешати значење појмова мреже и оператора преплитања, осим у збуњујућим околностима!
Приручник садржи и "крајник", како је објашњено у фусноти:"4)Пошто сви други приручници са напоменама садрже "слепо црево", одлучено је да приручник за INTERCAL садржи неки други тип одстрањивог органа."[4]
INTERCAL приручник даје необична имена свим знаковима ASCII кода који нису алфанумеричког типа- знак '
и "
су редом "искре" и "зечије уши", (изузетак је знак &, јер како програмски речник Jargon File наводи: "Шта би могло бити луцкастије?"). Оператор доделе, који је у многим програмским језицима представљен као знак једнакости, је у INTERCAL-у представљен скупом знакова који представљају стрелицу која показује улево <-
, а састоји се од знака "мање од" и црте, јасно означавајући да леви операнд "добија" вредност.
Синтакса
[уреди | уреди извор]Унос(помоћу инструкције WRITE IN
) и излаз (користећи READ OUT
инструкцију) не користе уобичајене формате записа- у INTERCAL-72, инструкција WRITE IN уписује број чије се цифре записују као текст на енглеском језику (као SIX FIVE FIVE THREE FIVE), а READ OUT га избацује као "исецкане" римске бројеве.[4]
Новије верзије имају сопствени улазно-излазни систем.[3][6] Коментари се могу постићи ако се користе инвертне команде које укључују NOT или N'T.[4]
Структуре података
[уреди | уреди извор]INTERCAL-72 (оригинална верзија INTERCAL-а) има само четири типа података- 16-битни интеџер (представљен са .
, именован "тачка"), 32-битни интеџер (:
, именован "двотачка"), низ од 16-битних интеџера (,
, именован"реп"), и низ од 32-битних интеџера (;
,именован "хибрид"). Постоји 65535 доступних променљивих за сваки тип, означени нпр. бројевима од .1
до .65535
за 16-битне интеџере. Међутим, свака од тих променљивих има свој стек, па на њима могу даље да се извршавају push и pop операције (у INTERCAL-у названи STASH и RETRIEVE), увећавајући комплексност структура података.[4] Више данашњих верзија INTERCAL-а имају или су задржали већину оригиналних структура података, са одговарајућим изменама:
- TriINTERCAL, који модификује радикс сортирање којим су бројеви представљени и може да користи тринарни бројевни систем као основни(10-тритни уместо 16-битног)[6].
- CLC-INTERCAL имплементира значајан број сопствених структура података, као што су "classes and lectures", постизајући да основни типови структура података меморишу више информација радије него да уводе нове типове података.[3] Низови су прорачунавани тако што им се додају вредности ако им је променљива скаларног типа. Константе се могу употребљавати, и представљане су са
#
("мрежа" у INTERCAL-у) и праћене самом константом, записане као децимални број. Константе представљене у интеџерима су подржане само у опсегу од 0 до 65535.
Оператори
[уреди | уреди извор]Постоје само 5 оператера у INTERCAL-72. Коришћење ових оператoра је веома флексибилно и зависи од њихових комбинација, тако да је дато више могућности за већину оператора. Оператери и њихове ознаке су:
- унарни AND (ознака:&)
- унарни OR (ознака:V)
- унарни XOR (ознака:V, backspace, -)
- бинарни MINGLE (ознака:c, backspace, /)
- бинарни SELECT (ознака:~)
Међутим оператери XOR
и MINGLE
имају још неке ознаке, у зависности од екстензије INTERCAL-а.
За разлику од већине других језика, AND
,OR
и XOR
су унарни оператoри. Оператор се поставља између ознаке интерпункције која одређује име променљиве или константу и броја који одређује која је променљива, или само унутар груписаних знакова (тј. Један карактер касније него што би био у програмским језицима као што је C.) SELECT
и INTERLEAVE
(који је познатији и као MINGLE
) су бинарни оператори; SELECT узима бита свог првог операнда који одговарају "1" битовима свог другог операнда и уклања битове који одговарају "0" битовима, померајући се према биту најмање важности (тако 51 (110011 у бинарном) SELECT 21 (10101 у бинарном) је 5 (101 у бинарном)). MINGLE
замењује битoве од првог и другог операнда (на тај начин да је бит најмањег значаја свог другог операнда уједно и бит најмањег значаја у резултату). У INTERCAL-у сви оператори су истог приоритета, што значи да ознаке за груписање морају бити коришћене да би се дошло до жељеног решења. Ознаке за груписања су искра ("spark") која се означава са '
, и зечије уши ("rabbit-ears") које се означавају са "
. Треба бити пажљив приликом уноса ова два оператора, да не се они не би комбиновали или мешали.
Структуре наредби
[уреди | уреди извор]Све наредбе у INTERCAL-у крећу са одређеном наредбом у језику INTERCAL-72, то су DO
,PLEASE
,или PLEASE DO
, које значе исто програму (али превелико коришћење једне од њих доводи до неизвршивости кода,што је карактеристика која се води као "Undocumented" у програмском језику INTERCAL-72, поменута у C-INTERCAL упутсвима за коришћење), или изврнута форма (са NOT
или N'T
које су додате компајлеру). Пре извршења програма може се дати проценат шансе за извршавање линије у формату P
, који подразумева 100%.
У језику INTERCAL-72, главне контролне структуре су NEXT
, RESUME
и FORGET
. DO (line) NEXT
се ограничава на одређену линију, памти следећу линију која би се извршила ако није била на NEXT-у (идентификатори који нису DO могу користити за било коју наредбу, DO је само као пример) ; DO FORGET
израз уклања уносе израза са врха "наслаганих" позива (ово је корисно за избегавање грешке која се иначе дешава када има више од 80 уноса), а израз DO RESUME
уклања уносе израза из "наслаганих" позива и прави "скок" до последње сачуване линије. C-INTERCAL такође пружа COME FROM
инструкцију, написану DO COME FROM LINE
); CLC-INTERCAL и најновије верзије C-INTERCAL-а такође пружају обрађени COME FROM
(DO COME FROM израз) и NEXT FROM
, који је као COME FROM
, али такође чува повратну адресу на NEXT STACK-у.
Алтернативни начини утицаја на ток програма, првенствено у језику INTERCAL-72, су за коришћење IGNORE
и REMEMBER
инструкција за променљиве (што узрокује уписивање у променљиву која се занемарује а затим поново користи, тако да се упутства могу онемогућити, узрокујући да немају ефекта), и ABSTAIN
и REINSTATE
су инструкције које узрокују да линије кода немају ефекта или да се поново користе.
Hello world
[уреди | уреди извор]Традиционални "Hello world" програм показује колико је разликује INTERCAL од стандардних програмских језика. У програмском језику C, то би гласило:
#include <stdio.h>
int main() {
printf("Hello, world!\n");
}
Исти програм у C-INTERCAL-у је дужи и тежи за читање
DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP
Дијалектика
[уреди | уреди извор]Прва верзија INTERCAL-а Вудса Лајона је био веома ограничен у својим улазно / излазним могућностима: једини прихватљиви унос су били бројеви чиеј су цифре биле исписане речима, а једини излаз је проширена верзија римских бројева.
Поновна имплементација C-INTERCAL-а, која је доступна на интернету, учинила је језик привлачнијим корисницима езотеричних програмских језика.[8] Дијалект C-INTERCAL има неколико разлика у односу на прву верзију INTERCAL-а и уведено је неколико нових функција, као што је COME FROM- изјава и средство за извођење текстуалног И / О заснованог на Туринг Текст Моделу. Аутори C-INTERCAL-а такође су креирали TriINTERCAL варијанту, базирану на генерализацији скупа оператора INTERCAL-а. Новија варијанта је Threaded Intercal, који проширује функционалност COME FROM да подржава више процеса у исто време.
Занимљивости
[уреди | уреди извор]У познатом компјутерском часопису, "INTERCAL је описан под насловом "Одбаците разум, ви који долазите овде: INTERCAL". Компилатор и начини коментарисања су у најмању руку чудни:
Компилатор, са правом назван "ICK" ("штуц"), наставља пародију. Све што компајлер не може да разуме, који на нормалном језику резултира грешком компајлирања, једноставно прескочи. Ова "опраштајућа" особина чини проналазак грешке врло тешким. Такође се уводи јединствени систем за додавање коментара програма. Програмер једноставно убацује текст који компилатор не може да преведе било где у програму, пазећи да не случајно запише фракцију неког важећег кода, који компилатор може да препозна, усред свог коментара.
У часопису "Technomasochism" Лев Братишенко карактеризује програмски језик INTERCAL као "доминатрикс"[9].
Ако компилатор не сусреће PLEASE довољно често, програм ће бити одбијен; то јест, игнорисан је без објашњења од стране компајлера. Превише често уношење и опет доводи до одбијања кода од стране компилатора, овога пуат јер је програмер превише превише учтив. У комбинацији са другим речима који се ретко користе у другим програмским језицима, али се појављују као наредбе у INTERCAL-у, код изгледа као нека молба да се изврши програм.
Види још
[уреди | уреди извор]Референце
[уреди | уреди извор]- ^ "The A-Z of Programming Languages: INTERCAL"-Techworld. 2008-07-04. Приступљено 28.10.2018
- ^ "The INTERCAL Resources Page". Catb.org. Приступљено 29.10.2018
- ^ а б в "Clc-Intercal". Clc-Intercal. 2010-04-01. Приступљено 29.10.2018
- ^ а б в г д ђ е "INTERCAL reference manual".Скинуто и архивирано са Internet Archive 28.10.2018
- ^ "INTERCAL". Чланак са Википедије. Приступљено 29.10.2018
- ^ а б в "C-INTERCAL supplemental reference manual". Додатни приручник за C-INTERCAL. Приступљено 29.10.2018
- ^ "Intercal -- the Language From Hell" 23.3.2009. Приступљено 30.10.2018
- ^ Mateas, Michael; Nick Montfort. "A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics" (PDF) 1-3.12.2005. Приступљено 30.10.2018
- ^ Bratishenko Lev 2009. "Technomasochism". Приступљено 30.10.2018