Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Анализ языков программирования

.docx
Скачиваний:
20
Добавлен:
24.07.2017
Размер:
76.25 Кб
Скачать

x = -0.5*B/A

print "x = ${x}"

return

if D>0 :

x1 = 0.5*(-B-System.Math.Sqrt(D))/A

x2 = 0.5*(-B+System.Math.Sqrt(D))/A

print "x1 = ${x1}"

print "x2 = ${x2}"

else :

r = -0.5*B/A

i = 0.5*System.Math.Sqrt(-D)/System.Math.Abs(A)

print "x1 = (${r},${i})"

print "x2 = (${r},-${i})"

[редактировать]

Brainfаk

Дата создания:1993

Повлиял на:Hanoi Love

Парадигма:

императивная

на уровне значений

Типизация:бестиповая Принятые расширения файлов:

.bf

Диалекты:

Boolfаk

BrainSub

Braincopter

Brainfork

Brainloller

COW

Ook!

Pi

Smallfаk

Spoon

Unary

pbrain

Реализации и версии:

Campbell's weave.rb

EsCo (Brainfаk)

Müller's Brainfаk

Brainfаk — один из известнейших эзотерических языков программирования, отличающийся особым минимализмом. Состоит из восьми команд, каждая из которых записывается одним символом.

Brainfаk был создан в 1993 году Urban Müller, и авторская реализация остается фактическим стандартом языка. Его базовая спецификация достаточно проста, и он не был стандартизирован. Существует ряд любительских реализаций, ни одна из которых не представляет коммерческой ценности.

Brainfаk породил множество диалектов, отличающихся набором команд, способом их записи или деталями реализации, например, максимальным значением числа, хранящегося в ячейке, или ситуациями, вызывающими ошибку интерпретации.

Brainfаk был изобретен при попытке создать Тьюринг-полный язык программирования с наименьшим возможным компилятором. Авторский компилятор имел размер 240 байт, а более поздние реализации достигают менее 200 байт.

Теоретически Brainfаk действительно обладает свойством Тьюринг-полноты и следовательно, может выполнить любую задачу. На практике, впрочем, этот язык совершенно непригоден для решения задач из реальной жизни; выполнение даже простейших заданий становится вызовом для разработчика. Поэтому Brainfаk используется исключительно как математическая модель или для развлечения.

Создателя Brainfаk вдохновил язык False, а его 6 команд (за исключением команд ввода-вывода) в точности совпадают с командами языка P”, но остается неизвестным, влиял ли последний на разработку Brainfаk.

Brainfаk использует модель машины, напоминающую машину Тьюринга и состоящую из следующих элементов:

программа — последовательность односимвольных команд языка и, возможно, других символов (при обработке игнорируются);

указатель инструкций — указывает на команду, которая будет исполнена на следующем шагу, после ее исполнения передвигается на другую (обычно следующую справа) команду;

память — моделируется одномерным массивом ячеек, в каждой ячейке хранится один байт; начальное значение ячейки — ноль;

указатель данных — указывает на текущую ячейку памяти; начальное значение — самая левая ячейка массива; по команде двигается либо изменяет

значение, хранящееся в текущей ячейке;

потоки ввода и вывода — последовательности байтов в кодировке ASCII.

[редактировать]

Команды языка:

+ : увеличить на 1 значение в текущей ячейке;

- : уменьшить на 1 значение в текущей ячейке;

> : сдвинуть указатель данных на одну ячейку вправо;

< : сдвинуть указатель данных на одну ячейку влево;

[

: “начало цикла”: если значение в текущей ячейке положительно, сдвинуть указатель инструкций на одну команду вправо, иначе сдвинуть его на команду, следующую за парной командой ];

]

: “конец цикла”: если значение в текущей ячейке нулевое, сдвинуть указатель инструкций на одну команду вправо, иначе иначе сдвинуть его на команду, следующую за парной командой [. Может также быть представлен как безусловный переход указателя инструкций на парную команду [, т.к. [ выполняет отдельную проверку на вход в тело цикла;

. : вывести значение в текущей ячейке в поток вывода как символ с соответствующим ASCII-кодом;

, : прочитать символ из потока ввода и сохранить его ASCII-код в текущую ячейку.

Следует отметить, что из-за специфики языка команды условного перехода [ и ] используются при реализации практически всех операций, являющихся элементарными в других языках (присвоение значения, математические и логические операции и т.д.).

Все символы, кроме восьми командных, обычно игнорируются при обработке, так что комментарии, не содержащие этих символов, могут добавляться в любое место программы без ограничений.

[редактировать]

Элементы синтаксиса: Бесконечный цикл [-]+[]

Цикл с предусловием condition[...]

Цикл с постусловием [...condition]

Цикл for - next для диапазона целых чисел с инкрементом на 1 [-][...+]

Цикл for - next для диапазона целых чисел с декрементом на 1 [-]-[...-]

[редактировать]

Примеры:

[редактировать]

=Hello, World!: Пример для версий EsCo 0.511 (Brainfаk), Müller's Brainfаk 2.0, weave.rb

Существует много способов сказать “Hello, World!” на Brainfаk. Ниже приведен самый простой из них: использовать только одну ячейку памяти и последовательно изменять ее значение на ASCII-код каждой буквы сообщения. Каждая строка примера выводит один символ.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. +++++++++++++++++++++++++++++. +++++++. . +++.

.

.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++. ++++++++++++++++++++++++. +++.

.

.

.

[редактировать]

Hello, World!: Пример для версий EsCo 0.511 (Brainfаk), Müller's Brainfаk 2.0, weave.rb

В этом примере используется три основные ячейки памяти — первая для прописных букв ‘H’ и ‘W’, вторая для строчных букв и третья для знаков препинания ‘,’, ‘ ‘ и ‘!’ — и три дополнительные индексные ячейки для сокращения записи изменений ASCII-кодов. Использованная память выглядит следующим образом:

(индексная ячейка 1) (ячейка прописных букв) (индексная ячейка 2) (ячейка строчных букв) (индексная ячейка 3) (ячейка знаков препинания)

++++++[>++++++++++++<-]>. >++++++++++[>++++++++++<-]>+. +++++++. . +++. >++++[>+++++++++++<-]>. <+++[>----<-]>. <<<<<+++[>+++++<-]>. >>. +++.

.

.

>>+.

[редактировать]

Числа Фибоначчи: Пример для версий EsCo 0.511 (Brainfаk), Müller's Brainfаk 2.0, weave.rb

В примере используется итеративное определение чисел Фибоначчи: два последних числа хранятся в ячейках-переменных c4 и c5 (в начале c4=0, c5=1), число c5 посимвольно выводится на печать (это действие занимает большую часть кода), затем вычисляется следующее число (c6 = c5+c4), и числовая пследовательность сдвигается на одно число вперед (c4 = c5, c5 = c6). Низкоуровневое описание приведено в комментариях к коду, запись “cXvY” означает, что после выволнения команд в строке указатель данных находится в ячейке X, и значение в этой ячейке равно Y.

Классический интерпретатор Brainfаk использует переменные типа byte для хранения значений в ячейках памяти, и 14-16 числа Фибоначчи вызовут ошибку переполнения. Написание длинной арифметики на Brainfаk — задача достаточно трудоемкая, поэтому в примере предполагается, что в ячейках памяти могут храниться числа типа integer. ++++++++++++++++++++++++++++++++++++++++++++ c1v44 : ASCII code of comma

>++++++++++++++++++++++++++++++++ c2v32 : ASCII code of space

>++++++++++++++++ c3v11 : quantity of numbers to be calculated

> c4v0 : zeroth Fibonacci number (will not be printed)

>+ c5v1 : first Fibonacci number

<< c3 : loop counter

[ block : loop to print (i)th number and calculate next one

>> c5 : the number to be printed

block : divide c5 by 10 (preserve c5)

> c6v0 : service zero

>++++++++++ c7v10 : divisor

<< c5 : back to dividend

[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<] c5v0 : divmod algo; results in 0 n d_n%d n%d n/d

>[<+>-] c5 : move dividend back to c5 and clear c6

>[-] c7v0 : clear c7

>> block : c9 can have two digits; divide it by ten again

>++++++++++ c10v10: divisor

< c9 : back to dividend

[->-[>+>>]>[+[-<+>]>+>>]<<<<<] c9v0 : another divmod algo; results in 0 d_n%d n%d n/d

>[-] c10v0 : clear c10

>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]] c12v0 : print nonzero n/d (first digit) and clear c12

<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]] c11v0 : print nonzero n%d (second digit) and clear c11

<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-] c8v0 : print any n%d (last digit) and clear c8

<<<<<<<.>. c1c2 : print comma and space

block : actually calculate next Fibonacci in c6

>>[>>+<<-] c4v0 : move c4 to c6 (don't need to preserve it)

>[>+<<+>-] c5v0 : move c5 to c6 and c4 (need to preserve it)

>[<+>-] c6v0 : move c6 with sum to c5

<<<- c3 : decrement loop counter]

<<++... c1 : output three dots

[редактировать]

C

[редактировать]

C#

[редактировать]

C++

[редактировать]

COBOL

[редактировать]

Cyclone

[редактировать]

D

[редактировать]

Delphi

[редактировать]

ECMAScript

[редактировать]

Eiffel

[редактировать]

Erlang

[редактировать]

Euphoria

[редактировать]

F#

[редактировать]

Factor

[редактировать]

Forth

[редактировать]

FORTRAN

[редактировать]

FP

[редактировать]

Funky

[редактировать]

G

[редактировать]

gnuplot

[редактировать]

Go

[редактировать]

Groovy

[редактировать]

Hack VM

[редактировать]

Hanoi Love

[редактировать]

Haskell

[редактировать]

HQ9+

[редактировать]

Icon

[редактировать]

INTERCAL

[редактировать]

ISWIM

[редактировать]

J

[редактировать]

Java

[редактировать]

KRC

[редактировать]

Lisp

[редактировать]

Logo

[редактировать]

Lua

[редактировать]

Mercury

[редактировать]

Miranda

[редактировать]

ML

[редактировать]

Modula

[редактировать]

Modula-3

[редактировать]

Nemerle

[редактировать]

Nesla

[редактировать]

Oberon

[редактировать]

Objective-C

[редактировать]

Omgrofl

[редактировать]

Onyx

[редактировать]

Oz

[редактировать]

Pascal

[редактировать]

Perl

[редактировать]

PHP

[редактировать]

PL/I

[редактировать]

POP-11

[редактировать]

Prolog

[редактировать]

Python

[редактировать]

REFAL

[редактировать]

Roco

[редактировать]

Ruby

[редактировать]

S-lang

[редактировать]

Sanscript

[редактировать]

SASL

[редактировать]

Scala

[редактировать]

Scratch

[редактировать]

Seed7

[редактировать]

Simula

[редактировать]

Smalltalk

[редактировать]

SNOBOL

[редактировать]

SQL

[редактировать]

STAF/STAX

[редактировать]

Tcl

[редактировать]

Termware

[редактировать]

TeX

[редактировать]

Unix shell

[редактировать]

Whitespace

[редактировать]

Wolfram Mathematica

[редактировать]

Аналитик

[редактировать]

ПРОФТ