Русский язык в программировании

0c1220aae19d5710dfd29ec0961094c9

Судя по результатам голосований (на 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 часто называется «применить-ко-всем»».

Также слово «применяет»/«применение» используется в различных описаниях функции `map ()` в Python
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 — выделить подмножество языка, достаточное для решения задач по спортивному программированию.

Вот примеры решения задач на русском 11l
Задача «Mocha и прогулка» (на основе этого решения):
цикл 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.


На этом у меня всё. Спасибо за внимание.

© Habrahabr.ru