Файл: Анализ языков программирования.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.10.2020

Просмотров: 474

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

скалярная

строгая

Типизация:

неявная

типизированная

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

GNU bc

bc — язык вычислений произвольной точности с C-подобным синтаксисом.

Часто используется в Unix-системах в качестве калькулятора с интерфейсом командной строки.

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

Элементы синтаксиса: Комментарий до конца строки #

Комментарии, которые не могут быть вложенными /* ... */

Регулярное выражение идентификатора переменной [a-z][_a-z0-9]*

Присваивание значения переменной =

Объявление переменной variable

Объявление переменной с присваиванием значения variable = value

Блок { ... }

Равенство ==

Неравенство !=

Сравнение < > <= >=

Определение функции define f(p1, p2, ...) ...

Вызов функции f(a, b, ...)

Вызов функции без параметров f()

Если - то if (condition) ...

Если - то - иначе if (condition) ... else ...

Бесконечный цикл while (1) ...

Цикл с предусловием while (condition) ...

Цикл for - next для диапазона целых чисел с инкрементом на 1 for (i = 1; i <= 10; i++) ...

Цикл for - next для диапазона целых чисел с декрементом на 1 for (i = 10; i > 0; i--) ...

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

Примеры:

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

Факториал: Пример для версий GNU bc 1.06

Используется рекурсивное определение факториала. ! /usr/bin/env bc

define factorial(n) {

if (n == 0) return(1);

return(n * factorial(n - 1));

}

for (n = 0; n <= 16; n++) {

print n; "! = "; factorial(n);

} quit Hello, World!: Пример для версий GNU bc 1.06 print "Hello, World!\n";

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

Числа Фибоначчи: Пример для версий GNU bc 1.06

Используется рекурсивное определение чисел Фибоначчи.

define fibonacci(n) {

if (n <= 2) return(1);

return(fibonacci(n-1)+fibonacci(n-2));

}

for (n = 1; n <= 16; n++) {

print fibonacci(n); ", "

} print "..." quit

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

Числа Фибоначчи: Пример для версий GNU bc 1.06

Используется формула Бине. Следует отметить, что bc — калькулятор произвольной точности, поэтому выводить числа приходится с округлением до целого. Для этого устанавливается точность 0 знаков после десятичной точки, и x округляется вручную (встроенной функции округления в bc нет).

for (n = 1; n <= 16; n++) {

scale = 10

x = (((1 + sqrt(5)) * .5) ^ n - ((1 - sqrt(5)) * .5) ^ n) / sqrt(5)

scale = 0

print (x+0.5)/1; ", "

} print "..."

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

Boo

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

Создан под влиянием:Python

Парадигма:

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

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

объектно-ориентированная

скалярная

Типизация:

вывод типов

неявная

статическая

типизированная

Принятые расширения файлов:

.boo

Boo — объектно-ориентированный статически типизированный язык программирования, разработка которого началась в 2003 году. Синтаксис языка Boo похож на синтаксис языка Python.

Среди особенностей языка стоит отметить мультиметоды, генераторы, макросы, замыкания, опциональная неявная типизация; функции являются first-class объектами.

Boo распространяется под open-source лицензией в стиле MIT/BSD.

Boo может использоваться с Microsoft .NET или с Mono.

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

Элементы синтаксиса: Комментарий до конца строки //

Комментарии, которые могут быть вложенными /*...*/

Присваивание значения переменной =

Объявление переменной variable as type

Объявление переменной с присваиванием значения variable = value или variable as type = value


Блок отступ в начале строки

Равенство ==

Неравенство not

Сравнение < > <= >=

Определение функции def f(p1 as type1; p2 as type2; ...) : ... return value

Вызов функции f(a, b, ...)

Вызов функции без параметров f()

Последовательность конец строки

Если - то if condition: ...

Если - то - иначе if condition: ... else condition: ...

Бесконечный цикл while true: ...

Цикл с предусловием while condition : ...

Цикл for - next для диапазона целых чисел с инкрементом на 1 for i in range(0, 10): ...

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

IDE/Редакторы:

SharpDevelop

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

Примеры: =

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

Hello, World!: Пример для версий boo 0.7.6.2237, boo 0.8.2

print("Hello, World!")

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

Факториал: Пример для версий boo 0.7.6.2237, boo 0.8.2

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

def factorial(n as long) as long:

if n == 0:

return 1

else:

return n * factorial(n - 1)

for n in range(0, 17): print("${n}! = ${factorial(n)}")

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

Факториал: Пример для версий boo 0.8.2

В примере используется итеративное определение факториала. Переменная fact объявляется как принадлежащая к типу long в явном виде; иначе ее тип будет автоматически определен как int, и вычисление 13! вызовет ошибку переполнения.

fact as long = 1 for i in range(17):

print("${i}! = ${fact}")

fact = fact * (i+1)

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

Числа Фибоначчи: Пример для версий boo 0.8.2

Используется итеративное определение чисел Фибоначчи.

a = array(int, 16) a[0] = a[1] = 1 for i in range(2,16):

a[i] = a[i-1] + a[i-2]

s="" for i in range(16):

s = s + a[i] + ", "

print(s + "...")

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

Числа Фибоначчи: Пример для версий boo 0.8.2

В этом примере показано использование генератора fib — конструкции, которая инициализирует внутренние переменные a и b и при каждом следующем обращении изменяет их значения и выдает наружу. Функция zip “склеивает” элементы двух перечислений (в данном случае range(16) и генератора) в пары, создавая новое перечисление.

def fib():

a, b = 0, 1

while true:

yield b

a, b = b, a + b

s="" for i, n in zip(range(16), fib()):

s = s+n+", "

print(s+"...")

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

Квадратное уравнение: Пример для версий boo 0.8.2

A = int.Parse(prompt("A = ")) if A==0 :

print "Not a quadratic equation."

return

B = int.Parse(prompt("B = ")) C = int.Parse(prompt("C = ")) D = B*B-4*A*C if D==0 :

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

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

Аналитик

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

ПРОФТ