Skip to content

Instantly share code, notes, and snippets.

@alextretyak
Last active June 25, 2023 10:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alextretyak/68824d364150c2bf078f78c50eb87a8e to your computer and use it in GitHub Desktop.
Save alextretyak/68824d364150c2bf078f78c50eb87a8e to your computer and use it in GitHub Desktop.
Статья для Хабра №10 ‘Русский язык в программировании’
[[[
[[[Хабы: Программирование]]]
[[[Заголовок: Русский язык в программировании]]]
[[[Метки: [[[программирование на русском, ]]]русский язык]]]
]]][[[
В своё время меня сильно впечатлила ‘информация о победе’[https://navalny.com/p/4875/] русских команд на чемпионате мира по спортивному программированию.
]]]Судя по результатам голосований (на compiler.su[http://compiler.su/russkij-yazyk-i-programmirovanie.php] и даже ‘здесь на Хабре’[https://habr.com/ru/post/535988/]) идею программирования на русском поддерживает не так уж и мало людей[[[ другой вопрос — кто все эти люди :)(:]]].
В данной статье приводится мой краткий обзор некоторых языков программирования и решений, которые позволяют программировать на русском.[[[ А также моё видение места русского языка в программировании.]]]
'‘<cut />’'
Н‘Язык 1С:Предприятия’
Несмотря на то, что это самый популярный язык программирования с русскоязычным синтаксисом, я его рассматривать не буду, дабы не разводить холивар. [[[К тому же, данный язык является неразрывной частью соответствующего продукта, нежели самостоятельным языком программирования.]]]По [[[этой же]]]аналогичной причине я не буду рассматривать OneScript[https://oscript.io] и Перфолента.Net[http://promcod.com.ua/cat.asp?cat=perfolenta-programmig-language] (последний хотя и является самостоятельным языком программирования, но его синтаксис основан на встроенном языке 1С:Предприятия[[[, который [язык 1С] мне категорически не нравится]]]).
H‘1C:Исполнитель’
Какая-то странная смесь C# [с его `Console.Write()`], Java [`var obj = new Object()`] и наверное [[[Ruby/]]]Julia[https://ru.wikipedia.org/wiki/Julia_(язык_программирования)] [с `;` вместо `end`].
Также, судя по всему, разработчики 1С:Исполнитель ‘вдохновлялись Scala/Kotlin’[‘так как в Scala и Kotlin для объявления неизменяемых переменных используется ключевое слово `val`, обозначающее “value” — “значение”, сокращённо `знч`’], выбрав ключевое слово `знч` для неизменяемых переменных[[[ (то бишь "констант")]]]. ИМХО, слово [[[`конст` или ]]]`пост` подошло бы лучше (`конст` уже занято).
[[[Также]]]Кроме того, неудачно выбраны ключевые слова `попытка`, `поймать`, `выбросить`.
Выбор ключевого слова `метод`\`method` для объявления функций также вызывает вопросы.
Впрочем, есть и хорошие решения, которые вопросов не вызывают. Например, [[[задание/]]]создание массива [[[с элементами ]]][[[в виде]]]записью `[1, 2, 3]`, множества [[[в виде]]]записью[https://its.1c.ru/db/execdoc#content:20034:hdoc] `{1, 2, 3}` и соответствия (то бишь "словаря") [[[в виде]]]записью `{"a": 1, "b": 2}`. Совсем как в Python.[[[ И даже пустой словарь создать можно (записью `{:}`), чего нельзя в Python.]в Python как раз можно создать пустой словарь (записью `{}`)]]
Но в целом язык подходит лишь для весьма ограниченного круга задач и его практическая ценность пока ещё под вопросом.
Н‘КуМир[https://ru.wikipedia.org/wiki/КуМир]’
Уже исходя из названия (Комплект ~‘Учебных’ МИРов)[[[,]]] понятно, что область применения данного языка ограничена обучением. А это, как я считаю, тупиковый путь. Мало кто захочет серьёзно изучать язык, который кроме обучения программированию, ни для чего не пригоден/не используется.[[[ И учебные языки неизбежно постигнет участь Паскаля (это в лучшем случае), который уступил место [как в обучении, так и на олимпиадах по программированию] более практичным Python и C++.]](а как же Delphi?)]
Однако некоторые идеи и решения, принятые в КуМир-е, можно позаимствовать. Например то, что математические функции в нём оставлены[http://bsosh6.shkola.hc.ru/teachers_pashut/tuzov/kumir/manual.pdf] на английском (sqrt, sin, abs, min, max и т.д.). И я считаю это вполне оправданным. На уроках математики мы же пишем ~‘sin x’[[[, а не `син х`]]] и ничего.
Н‘Компилятор C++ от Интерстрон’
‘Русификация служебных/ключевых слов C++’[http://web.archive.org/web/20070222115121/http://www.interstron.ru/text.asp?id=2090] выполнена автором легендарной статьи ‘‘‘Редкая профессия’’’[http://web.archive.org/web/20181024171054/http://www.interstron.ru/upload/images/pubs/Redkaya_professiya.pdf] Евгением Зуевым.
Евгением была проделана огромная работа, однако в этом и состоит главная проблема: переведённых слов слишком много, и специфика их такова, что запомнить русскоязычный эквивалент для них слишком трудно.
Н‘Глагол’
Проблема Глагола[https://traditio.wiki/Глагол_(язык_программирования)] в том, что он основан на непопулярном языке [Oberon-2], и к тому же использует достаточно нетрадиционную терминологию, например:
. «вид», а не «тип»;
. «ряд», а не «массив»;
. «задача», а не «процедура»/«функция»;
. «отдел», а не «модуль»;
. [[[«ячейка»/]]]«ячцел», а не «байт»;
. «знак», а не «символ»;
. «кольцо», а не «цикл»/«повтор».
В этом отношении я согласен с Юрием [автором сайта compiler.su[http://compiler.su]]:
>[http://ruscomp.bb24.ru/viewtopic.php?id=20#p411]:‘> То есть обычные русские слова уже не являются для вас "общепринятым" языком?
Общепринятые – это те, которые я читаю в книгах, в том числе по программированию. Когда читаю «байт», мне всё понятно. Это общепринятое. Когда я прочитаю «запись размером 40 слогов» - я буду долго размышлять. А вот «файл размером 40 байтов» - мне сразу понятно, да и Вам тоже. Да, там заимствованные слова, но не я их заимствовал и не я их глубоко внедрил в наш язык. Чтобы быть понятым, я вынужден их использовать.’
Н‘RuSL’
RuSL[http://compiler.su/entuziasty-razrabotchiki-kompilyatorov-i-ikh-proekty.php#rusl] (Russian Scripting Language) — новый скриптовый язык программирования с синтаксисом на русском языке. После беглого знакомства с языком я выделил несколько [возможно субъективных] недостатков:
. Для объявления переменных используется нетрадиционное ключевое слово `изм`[[[ (традиционное `пер` используется в 1С:Исполнитель и в Глаголе)]]].[[[
. Отсутствует простейший вывод типов (необходимо указывать тип переменной даже при инициализации её значением).]]]
. Нет поддержки целых чисел (все числа вещественные).
. Операторы присваивания `+=`, `-=` и т.д. записываются[https://russlang.ru/pages/documentation/operators.php] [[[в непривычном виде]]]в обратном порядке (т.е. `=+`, `=-` и т.д.). Особенно забавно получается с записью `n=-n`, которая работает не как `n = -n`, а как `n-=n`, т.е. `n = n - n` :)(:
. Для стандартных функций `input()` и `print()` был выбран перевод `ввести()` и `вывести()` вместо более привычного `ввод()` и `вывод()`.
Н‘11l’
Семантика 11l[https://11l-wikipedia.github.io/ru] берёт за основу язык Python (самый популярный язык программирования на данный момент [согласно рейтингам TIOBE[https://www.tiobe.com/tiobe-index/], PYPL[https://pypl.github.io/PYPL.html], ‘IEEE Spectrum’[https://spectrum.ieee.org/top-programming-languages/]]), а синтаксис разработан/спроектирован с учётом когнитивно-эргономического подхода таким образом, что забыть его [синтаксис 11l] практически невозможно ([[[при условии, что]/]]особенно если это первый изучаемый язык программирования).
Для перевода названия метода `map` в 11l было выбрано слово `применить`, т.к. как ‘сказано в Википедии’[https://ru.wikipedia.org/wiki/Map_(программирование)] "в функциональной форме `map` часто называется ~‘«применить-ко-всем»’".
‘Также слово «применяет»/«применение» используется в различных описаниях функции `map()` в Python’{
>‘pyneng.readthedocs.io/ru/latest/book/10_useful_functions/map.html’[https://pyneng.readthedocs.io/ru/latest/book/10_useful_functions/map.html <- google:‘функция map’]:‘Функция map *‘применяет’ функцию к каждому элементу последовательности и возвращает итератор с результатами.’
>‘Использование функции map в Python’[https://www.digitalocean.com/community/tutorials/how-to-use-the-python-map-function-ru]:‘Встроенная в Python функция `map()` используется для *‘применения’ функции к каждому элементу итерируемого объекта’
>[https://pythonist.ru/python-map-znakomstvo/]:‘map() перебирает элементы итерируемого массива (или коллекции) и возвращает новый массив (или итерируемый объект), который является результатом *‘применения’ функции преобразования к каждому элементу’
}
Для бросания исключения в 11l используется слово `исключение` по аналогии с переводом ключевого слова `throw` Евгением Зуевым. Ключевые подслова `исключение.контроль` и `исключение.перехват` также взяты из перевода Зуева.
Для числовых типов используются вполне общепринятые (принятые в том числе в языке РАЯ[https://dic.academic.ru/dic.nsf/ruwiki/1130547]) названия `Цел`[[[ [`int`]]]] и `Вещ`[[[ [`float`]]]].
Вместо того чтобы выполнять перевод всех и каждой функции стандартной библиотеки языка, в 11l осуществлён перевод лишь тех возможностей языка, которые требуются для решения задач по спортивному программированию. Можно сказать, что сама [[[~‘]]]суть русскоязычных имён в 11l — выделить подмножество языка, достаточное для решения задач по спортивному программированию[[[’]]].
‘Вот примеры решения задач на русском 11l’{
Задача ‘‘Mocha и прогулка’’[https://codeforces.com/contest/1559/problem/C] (на основе ‘этого решения’[https://codeforces.com/contest/1559/submission/126421811]):
#(11l)‘
цикл 1..Цел(ввод())
пер n = Цел(ввод())
пер a = ввод().разделить(‘ ’).применить(Цел)
пер ответ = (0 .< n).применить(н -> н + 1) // можно сократить до `пер ответ = Массив(1..n)`
если a.послед == 0
вывод_эл(ответ [+] (n + 1))
иначе
цикл(н) 0 .< a.длина
если a[н] == 1
вывод_эл(ответ[0.<н] [+] (n + 1) [+] ответ[н..])
цикл.прервать
Задача ‘‘Запрещённая подпоследовательность’’[https://codeforces.com/contest/1617/problem/A] (на основе ‘этого решения’[https://codeforces.com/contest/1617/submission/146468818]):
#(11l)‘
цикл 1..Цел(ввод())
пер s = ввод()
пер t = ввод()
s = сортй(Массив(s)).соединить(‘’)
если t == ‘abc’ & (‘a’ св s) & (‘b’ св s) & (‘c’ св s)
s = s[0 .< s.найти_и(‘b’)]‘’(‘c’ * s.колво(‘c’))‘’(‘b’ * s.колво(‘b’))‘’s[s.об_найти_и(‘c’) + 1 ..]
вывод(s)
Задача ‘‘Задача на доске’’[https://codeforces.com/contest/1367/problem/D] (на основе ‘этого решения’[https://codeforces.com/contest/1367/submission/87021102]):
#(11l)‘
цикл 1..Цел(ввод())
пер s = ввод()
пер m = Цел(ввод())
пер b = ввод().разделить(‘ ’).применить(Цел)
пер массив = сортй(Массив(Множество(Массив(s))))
пер ответ = [Символ("\0")] * m // как в Python (1-ый вариант решения)
//пер ответ = "\0" * m // только в 11l (2-ой вариант решения)
цикл сумма(b) != -m
Множество[Цел] индексы
цикл(i) 0 .< m
если b[i] == 0
индексы.доб(i)
b[i] = -1
цикл
пер q = массив.извлечь()
если индексы.длина <= s.колво(q)
цикл(i) индексы
ответ[i] = q // в 11l строки можно изменять
цикл.прервать
цикл(i) индексы
цикл(j) 0 .< m
если b[j] != -1
b[j] -= abs(i - j)
вывод(ответ.соединить(‘’)) // (1-ый вариант решения)
//вывод(ответ) // (2-ой вариант решения)
}
Кроме того, 11l поставляется со скриптом, который переводит код на русском в код на английском (в том числе переводит имена общеупотребимых переменных).
Несмотря на поддержку русских ключевых слов[[[ и]]], названий функций и типов, я считаю, что имена коротких переменных [[[всё же]]]в большинстве случаев целесообразно писать на английском.
Так ‘принято и в учебном алгоритмическом языке’[https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык#Примеры]:
#‘
ввод n; S:=0
А также в русских текстах задач по программированию используются английские/латинские буквы:
>[https://codeforces.com/contest/1559/problem/C?locale=ru]:‘В первой строке находится одно целое число ~‘*‘t’’ ...
Первая строка набора входных данных содержит одно целое число ~‘*‘n’’’
И аналогично в книгах:
>[https://habr.com/ru/post/667022/]:‘Напечатайте все возрастающие последовательности длины k, элементами которых являются натуральные числа от 1 до n.’
На этом у меня всё. Спасибо за внимание.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment