Следуя нашему тезису максимальной доступности для обучения, постараемся логично интегрировать все основные элементы языка из широко используемых элементов других алгоритмических языков. Здесь мы следуем внутренней логике, заданной в первой статье и тому предположению, что композиция сущностей нескольких популярных языков позволит легче схватить новое содержание с меньшими усилиями, так как люди обладают встроенной интегрирующей машиной на базе нейронных сетей, которая автоматически вастнавливаят 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. Для нашего простого языка они достаточно мощные, чтобы легко выражать идеи оперирования множествами объектов, массивами и словарями.
amarao
Очередной паскаль?
Скажите, а как в вашем языке описывается передача замыканий в функцию? Или вы не планируете замыканий?
SergeKotov Автор
1. Лучше, с учетом того, что стоять на плечах гигантов, изучая их опыт конечно удобнее. Pascal для начала 1970-х был хорош для программирования разнообразных задач, несмотря на небольшие недоработки в синтаксисе.
2. Вы наверное имеете в виду, являются ли функции объектами первого класса? Да. Подробнее это будет обсуждаться в одной из последующих статей. EBNF будет расширяться по мере роста функциональности в каждой публикации. Так удобнее следить за поэтапным конструированием языка и легче исправлять возможные ошибки, которые могут быть замечены внимательными читателями.
amarao
А на чьих плечах вы стоите? Т.е. какие языки вы используете как основу? Scala, F#, ocaml, haskell, rust, C++17?
SergeKotov Автор
Исходная концепция пришла не из задачи «оптимизации» выбранной линии языков программирования. Мы решили, что «императивный» стиль программирования более подходит паттернам восприятия и мышления большинства людей. Возможно, если бы в старших классах школ всего мира преподавали SICP, то было бы иначе.
Далее при конструирования синтаксиса для каждого элемента, начиная с комментариев исследовалось, как это сделано в других языках и почему. В этом очень помогает книга: Programming Language Pragmatics (если кто её не знает и интересуется темой языков, то рекомендую). Трудно выделить какой то один язык, но похоже, что по базовым элементам более Swift, так как текущая версия интерпретатора написана на нем и первое приложение будет для AppStore.