В данной статье приводится мой краткий обзор некоторых языков программирования и решений, которые позволяют программировать на русском.
Язык 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.
На этом у меня всё. Спасибо за внимание.
ссылка на оригинал статьи https://habr.com/ru/post/680148/
Добавить комментарий