Русский язык в программировании
Судя по результатам голосований (на compiler.su и даже здесь на Хабре) идею программирования на русском поддерживает не так уж и мало людей.
В данной статье приводится мой краткий обзор некоторых языков программирования и решений, которые позволяют программировать на русском.
Язык 1С: Предприятия
Несмотря на то, что это самый популярный язык программирования с русскоязычным синтаксисом, я его рассматривать не буду, дабы не разводить холивар. По аналогичной причине я не буду рассматривать OneScript и Перфолента.Net (последний хотя и является самостоятельным языком программирования, но его синтаксис основан на встроенном языке 1С: Предприятия).
1C: Исполнитель
Какая-то странная смесь C# [с его Console.Write()
], Java [var obj = new Object()
] и наверное Julia[с ;
вместо end
].
Также, судя по всему, разработчики 1С: Исполнитель вдохновлялись Scala/Kotlin, выбрав ключевое слово знч
для неизменяемых переменных. ИМХО, слово пост
подошло бы лучше (конст
уже занято).
Кроме того, неудачно выбраны ключевые слова попытка
, поймать
, выбросить
.
Выбор ключевого слова метод
\method
для объявления функций также вызывает вопросы.
Впрочем, есть и хорошие решения, которые вопросов не вызывают. Например, создание массива записью [1, 2, 3]
, множества записью {1, 2, 3}
и соответствия (то бишь «словаря») записью {"a": 1, "b": 2}
. Совсем как в Python.
Но в целом язык подходит лишь для весьма ограниченного круга задач и его практическая ценность пока ещё под вопросом.
КуМир
Уже исходя из названия (Комплект Учебных МИРов) понятно, что область применения данного языка ограничена обучением. А это, как я считаю, тупиковый путь. Мало кто захочет серьёзно изучать язык, который кроме обучения программированию, ни для чего не пригоден/не используется.
Однако некоторые идеи и решения, принятые в КуМир-е, можно позаимствовать. Например то, что математические функции в нём оставлены на английском (sqrt, sin, abs, min, max и т.д.). И я считаю это вполне оправданным. На уроках математики мы же пишем sin x и ничего.
Компилятор C++ от Интерстрон
Русификация служебных/ключевых слов C++ выполнена автором легендарной статьи «Редкая профессия» Евгением Зуевым.
Евгением была проделана огромная работа, однако в этом и состоит главная проблема: переведённых слов слишком много, и специфика их такова, что запомнить русскоязычный эквивалент для них слишком трудно.
Глагол
Проблема Глагола в том, что он основан на непопулярном языке [Oberon-2], и к тому же использует достаточно нетрадиционную терминологию, например:
- «вид», а не «тип»;
- «ряд», а не «массив»;
- «задача», а не «процедура»/«функция»;
- «отдел», а не «модуль»;
- «ячцел», а не «байт»;
- «знак», а не «символ»;
- «кольцо», а не «цикл»/«повтор».
В этом отношении я согласен с Юрием [автором сайта compiler.su]:
ruscomp.bb24.ru/viewtopic.php? id=20#p411:То есть обычные русские слова уже не являются для вас «общепринятым» языком?Общепринятые — это те, которые я читаю в книгах, в том числе по программированию. Когда читаю «байт», мне всё понятно. Это общепринятое. Когда я прочитаю «запись размером 40 слогов» — я буду долго размышлять. А вот «файл размером 40 байтов» — мне сразу понятно, да и Вам тоже. Да, там заимствованные слова, но не я их заимствовал и не я их глубоко внедрил в наш язык. Чтобы быть понятым, я вынужден их использовать.
RuSL
RuSL (Russian Scripting Language) — новый скриптовый язык программирования с синтаксисом на русском языке. После беглого знакомства с языком я выделил несколько [возможно субъективных] недостатков:
- Для объявления переменных используется нетрадиционное ключевое слово
изм
. - Нет поддержки целых чисел (все числа вещественные).
- Операторы присваивания
+=
,-=
и т.д. записываются в обратном порядке (т.е.=+
,=-
и т.д.). Особенно забавно получается с записьюn=-n
, которая работает не какn = -n
, а какn-=n
, т.е.n = n - n
:)(: - Для стандартных функций
input()
иprint()
был выбран переводввести()
ивывести()
вместо более привычноговвод()
ивывод()
.
11l
Семантика 11l берёт за основу язык Python (самый популярный язык программирования на данный момент [согласно рейтингам TIOBE, PYPL, IEEE Spectrum]), а синтаксис разработан/спроектирован с учётом когнитивно-эргономического подхода таким образом, что забыть его [синтаксис 11l] практически невозможно (особенно если это первый изучаемый язык программирования).
Для перевода названия метода map
в 11l было выбрано слово применить
, так как как сказано в Википедии «в функциональной форме map
часто называется «применить-ко-всем»».
pyneng.readthedocs.io/ru/latest/book/10_useful_functions/map.html:
Функция map применяет функцию к каждому элементу последовательности и возвращает итератор с результатами.
Использование функции map в Python:
Встроенная в Python функцияmap()
используется для применения функции к каждому элементу итерируемого объекта
pythonist.ru/python-map-znakomstvo:
map () перебирает элементы итерируемого массива (или коллекции) и возвращает новый массив (или итерируемый объект), который является результатом применения функции преобразования к каждому элементу
Для бросания исключения в 11l используется слово исключение
по аналогии с переводом ключевого слова throw
Евгением Зуевым. Ключевые подслова исключение.контроль
и исключение.перехват
также взяты из перевода Зуева.
Для числовых типов используются вполне общепринятые (принятые в том числе в языке РАЯ) названия Цел
и Вещ
.
Вместо того чтобы выполнять перевод всех и каждой функции стандартной библиотеки языка, в 11l осуществлён перевод лишь тех возможностей языка, которые требуются для решения задач по спортивному программированию. Можно сказать, что сама суть русскоязычных имён в 11l — выделить подмножество языка, достаточное для решения задач по спортивному программированию.
цикл 1..Цел(ввод())
пер n = Цел(ввод())
пер a = ввод().разделить(‘ ’).применить(Цел)
пер ответ = (0 .< n).применить(н -> н + 1) // можно сократить до `пер ответ = Массив(1..n)`
если a.послед == 0
вывод_эл(ответ [+] (n + 1))
иначе
цикл(н) 0 .< a.длина
если a[н] == 1
вывод_эл(ответ[0.<н] [+] (n + 1) [+] ответ[н..])
цикл.прервать
Задача «Запрещённая подпоследовательность» (на основе этого решения):
цикл 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)
Задача «Задача на доске» (на основе этого решения):
цикл 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 поставляется со скриптом, который переводит код на русском в код на английском (в том числе переводит имена общеупотребимых переменных).
Несмотря на поддержку русских ключевых слов, названий функций и типов, я считаю, что имена коротких переменных в большинстве случаев целесообразно писать на английском.
Так принято и в учебном алгоритмическом языке:
ввод n; S:=0
А также в русских текстах задач по программированию используются английские/латинские буквы:
codeforces.com/contest/1559/problem/C? locale=ru:
В первой строке находится одно целое число t …
Первая строка набора входных данных содержит одно целое число n
И аналогично в книгах:
habr.com/ru/post/667022:
Напечатайте все возрастающие последовательности длины k, элементами которых являются натуральные числа от 1 до n.
На этом у меня всё. Спасибо за внимание.