Last active
June 25, 2023 10:06
-
-
Save alextretyak/68824d364150c2bf078f78c50eb87a8e to your computer and use it in GitHub Desktop.
Статья для Хабра №10 ‘Русский язык в программировании’
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[[[ | |
[[[Хабы: Программирование]]] | |
[[[Заголовок: Русский язык в программировании]]] | |
[[[Метки: [[[программирование на русском, ]]]русский язык]]] | |
]]][[[ | |
В своё время меня сильно впечатлила ‘информация о победе’[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