Пробел

Whitespace е популярен езотеричен език за програмиране, известен с факта, че изходният код на програмата се състои само от непечатаеми символи.

Всички езикови команди се състоят от три типа знаци: интервал (интервал, ASCII 32), раздел (Tab, ASCII 9) и нов ред (LF, ASCII 10). Самите команди са доста дълги (обикновено 3-4 знака) и има много от тях; те се организират чрез използване на префикс (така нареченият параметър за модификация на инструкциите), който обозначава вида на инструкцията: операции на стека, аритметика, достъп до купчина, контрол на програмния поток, I/O.

Езиковата виртуална машина е оборудвана със стек и купчина, които могат да обработват цели числа с произволна ширина. Стекът се използва за изпълнение на команди, а купчината действа като хранилище за данни.

Езикът използва само един тип данни - цели числа в двоично представяне. Числото започва с посочване на неговия знак (интервал - положителен, Tab - отрицателен), последван от двоичен запис на абсолютната стойност на числото (интервал - 0, Tab - 1) и LF, сигнализиращ края на числото.

Етикетът е произволен списък с интервали и раздели, завършени с емисия на редове. Етикетите се използват за контрол на потока на изпълнение на програма и трябва да бъдат уникални в рамките на програмата.

Езикови команди (групирани по тип):

Стек операции

  • Space-Space-Number: добавете число към стека
  • Space-LF-Space: дублирайте номера в горната част на стека
  • Space-LF-Tab: разменете горните два елемента в стека
  • Space-LF-LF: извадете горния елемент от стека и го изхвърлете
  • Space-Tab-Space-Number: копирайте N-ия елемент на стека (индексът, даден от аргумента) в горната част на стека
  • Space-Tab-LF-Number: Преместете N елемента от стека, като същевременно запазите горната част

Последните две команди са разширение, налично от Whitespace 0.3, предназначено да улесни работата с рекурсивни функции.

Аритметика

  • Tab-Space-Space-Space: допълнение
  • Tab-Space-Space-Tab: Изваждане
  • Tab-Space-Space-LF: умножение
  • Tab-Space-Tab-Space: разделяне (цяло число)
  • Tab-Space-Tab-Tab: останалата част от разделението

Операцията се прилага към горните два елемента на стека. Лявият операнд се счита за по-ранния елемент на стека (добавен първи).

Достъп до купчина

Контролиране на потока на изпълнение на програмата

  • LF-Space-Space-Label: Създаване на етикет
  • LF-Space-Tab-Label: Подпрограма за повикване
  • LF-Space-LF-Label: отидете на етикета
  • LF-Tab-Space-Label: преминете към етикет, ако горната част на стека е нула
  • LF-Tab-Tab-Label: Преминаване към етикет, ако горната част на стека е отрицателна
  • LF-Tab-LF: Край на подпрограмата и прехвърляне на контрола към повикващата програма
  • LF-LF-LF: прекратете програмата

Вход изход

Трябва да се отбележи, че когато се използват елементи на стека при изпълнение на команди, в повечето случаи те се отстраняват от стека.

Здравей свят !:

Купчината се използва за съхранение на променливи: 1 - първото число, чийто факториал не е необходим, 2.5 - ASCII-кодове на символи, използвани за печат, 6 и 7 - текущият номер и неговият факториал. Самият факториал се изчислява итеративно: при всяка итерация се отпечатва предварително изчисленият брой и факториал, след това се изчисляват нови и се съхраняват в паметта. След това новото число (клетка 6) се сравнява с клетка 1: ако числото е по-малко, цикълът се повтаря, в противен случай спира.

Интересното е, че в Whitespace нулата е „отрицателна“: числото трябва да съдържа поне един Tab в записа, няма такива в двоичната нотация, така че трябва да зададете знаковия бит и да напишете нула като Tab-LF.

Числа на Фибоначи:

Примерът работи подобно на факториал, но използва по-интензивно съхранението на данни в стека и командата за копиране на горната част на стека, за да се избегнат ненужни достъпи до паметта. Също така в този пример броячът е отрицателен и се увеличава с всяка итерация.