Pull to refresh

Hi Programming Language: начинаем конструировать

Reading time5 min
Views2.1K
Мы приступаем к конструированию языка программирования Hi. Здесь ввод в курс дела и некоторые ответы на вопросы, зачем это нужно. Впрочем, и без веских причин конструирование языка – это необыкновенно интересная задача, если относиться к делу серьёзно.

Следуя нашему тезису максимальной доступности для обучения, постараемся логично интегрировать все основные элементы языка из широко используемых элементов других алгоритмических языков. Здесь мы следуем внутренней логике, заданной в первой статье и тому предположению, что композиция сущностей нескольких популярных языков позволит легче схватить новое содержание с меньшими усилиями, так как люди обладают встроенной интегрирующей машиной на базе нейронных сетей, которая автоматически вастнавливаят semantics parte наруш. soobщeniй.

Идея конструирования новых языков из элементов уже известных имеет давнюю историю. Более 140 лет назад доктор Заменгоф создал искусственный язык Эсперанто из составных частей других естественных языков. Язык получился настолько логичным и легким в усвоении, что оказался жизнеспособен и дожил до наших дней. Например, он есть в Google – переводчике. Saluton Habr! Bonvenon sub la kat!

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

Комментарии


Для однострочного комментария используем символ # (Python, R, Ruby). Сочетание // (С и множество других языков) применим в качестве оператора деления целых чисел для получения результата операции как вещественного числа, чтобы не использовать в этом случае немного тяжеловесное выражение конверсии вида CGFloat(int), как в Swift.

PRINT “Hi world\n”
# печатает Hi world с переходом на новую строку

Для выделения многострочных комментариев используем сочетание ##.
## Это многострочный комментарий.
Интересно, почему он не используется в Python ##

Выбор символа # также удобен тем, что в будущем он будет использоваться интерпретатором Hi language для обработки мета-тегов в тексте программы, которые могут быть синтезированы из текста комментариев. Это немного похоже на работу препроцессора в С/C++, где, кстати, тоже используется символ #.

Элементарные типы данных


Hi language в basic edition использует три элементарных типа данных:

Бинарный: BOOL
Возможные операции: & (and), | (or), ~ (not)
LET true = TRUE 
LET false = FALSE
PRINT true & true   # печатает TRUE
PRINT true | false   # печатает TRUE
PRINT ~true   # печатает FALSE

Целые числа: INT
Возможные операции: +, -, *, / (целочисленное деление), % (остаток), // (деление с автоматической конверсией результата на тип REAL)
VAR i = 0
PRINT (i + 6 – 2) * 3 / 5   # печатает 2

Вещественные числа: REAL
Возможные операции: +, -, *, /
VAR pi = 3.1415926535

Строки


Строки являются составным типом, так как рассматриваются как цепочка Unicode — символов
LET the_force = “flow through you”

Одинарные кавычки для выделения строковых литералов не используем, так как знаки, особенно расположенные на стандартной клавиатуре – это ценный ресурс на будущее.
Стандартные операции над строками:
# Конкатенация
VAR language = “C”
LET statement  = “ – the best language ever”
LET proposition = language + statement
language = “Python”

Пока нам нет необходимости вводить тип данных вида Character; для решения практических задач можно использовать…
# Доступ к элементу строк
LET secondSym = language[2]

Результат присваивания в том случае, когда ссылка по индексу выходит за пределы строки равен “” и не приводит к run-time error.

Константы и переменные


Как мы уже увидели в примерах выше, Hi — язык со статической типизацией для снижения вероятности ошибок использования идентификаторов и лучшего понимания их назначения. Константы (LET) и переменные (VAR) должны быть объявлены до момента первого использования объекта. Объявление эргономичнее делать без явного указания конкретного типа через присваивание исходных значений; в этом случае вывод типа становится очевиден.
## вместо 
LET one: INT = 1 лучше использовать: ##
LET one = 1
VAR boolean = TRUE

Концепция объявления констант и переменных let и var заимствована из Swift, но в Hi возможно сделать множественное объявление с присвоением одного значения:
VAR i, j, k = 0

Стандартный ввод и вывод


Ввод данных с клавиатуры осуществляется командой INPUT:
VAR startFrom: INT
PRINT "Start from: "; INPUT startFrom

Для ввода значения типа BOOL не нужно печатать true или false. Мобильное приложение для программирования, которое мы готовим к выходу в AppStore достаточно умно, чтобы в этом случае вывести только две кнопки с бинарным выбором. Точно также будет отображаться цифровая клавиатура без точки для ввода целого числа и обычная клавиатура для ввода текстового значения.

Команда PRINT печатает строки на экране с консольным типом отображения. По умолчанию используется режим 20 строк по 40 символов. Можно выбрать режим с крупными символами 10 Х 20 или мелкими: 40 Х 80.
PRINT "Сегодня мы изучили калькулятор для Hi language"

Hi Calculator Language


Теперь у нас есть всё, чтобы в терминах языка Hi сформировать грамматику калькулятора с интерактивным вводом – выводом в форме EBNF.
1. The Syntax of HI Programming Language

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
capital = "A" | ... | "Z".
small = "a" | ... | "z".
addOperator = "+" | "-" | "|".
mulOperator = "*" | "/" | "//" | "%" | "&".
relation = "==" | "~=" | "<" | "<=" | ">" | ">=".

integer = digit {digit}.
real = digit {digit} "." {digit}.
string = """ {Unicode_character} """.

number = integer | real.
letter = capital | small.

keyword = capital capital {capital}.
ident = letter {letter | digit}.
type = keyword.

factor = number | string | TRUE | FALSE | ident | "(" expression ")" | "~" factor.
term = factor {mulOperator factor}.
simpleExpression = ["-"] term {addOperator term}.
expression = simpleExpression [relation simpleExpression].
assignment = ident "=" expression.

identList = ident {"," ident}.
expList = expression {"," expression}.
constDeclaration = LET identList [":" type] "=" expression.
varDeclaration = VAR identList [":" type] ["=" expression].
funcCall = keyword [expList ].

statement = assignment | funcCall | constDeclaration | varDeclaration 
statementSequence = statement {("\n" | ";") statement}.

2. Standard Data Types

BOOL	INT	REAL	STRING

3. Standard Procedures and Functions

INPUT	PRINT

4. Other Keywords

FALSE	LET	TRUE	VAR

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

В следующей статье введем в язык Hi составные типы данных в дополнение к STRING. Для нашего простого языка они достаточно мощные, чтобы легко выражать идеи оперирования множествами объектов, массивами и словарями.
Tags:
Hubs:
Total votes 6: ↑4 and ↓2+2
Comments26

Articles