Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Утилита транслитерации русского C/C++ в стандартный

Эта утилита командной строки даст возможность программировать на C/C++ на русском языке, не будучи привязанной к какому-либо компилятору. Её идея проста: берётся исходный текст программы, и если в ней встречаются идентификаторы на кириллице, то они подвергаются транслитерации: «а» -> «a», «б» -> «b», «в» -> «v», «г» -> «g», «д» -> «d», «е» -> «e», «ё» -> «yo», «ж» -> «zh» и т.д. Символ «№» так же считается буквой и при транслитерации наменяется на «Nom». В результате в сформированном утилитой файле программа находится в виде, пригодном для дальнейшей компиляции.

        Запуск утилиты:

cpp-rus.exe from to.cpp -
или
cpp-rus.exe from to.cpp
  • Первый аргумент — имя файла с русским текстом C/C++, в приведённых примерах — это файл «from».
  • Второй аргумент — имя файла, куда следует поместить текст C/C++ после транслитерации, в приведённых примерах — это файл «to.cpp».
  • Третий аргумент регулирует возможность употребления одиночных пробелов внутри идентификаторов. Если третий аргумент присутствует (им может быть любой символ), то в идентификаторах пробел недопустим. Если он отсутсвует, то вы можете употреблять одиночные пробелы в идентификаторах. Эти пробелы заменяются при транслитерации на символ нижнего подчеркивания «_».
        Для удобства между строками входного и выходного файла существует полное соответствие. Поэтому если компилятор нашёл ошибку в строке N файла «to.cpp», то нужно смотреть ту же самую строку N, но файла «from».

        Некоторые программисты находят, что пробелы в идентификаторах улучшают читаемость программ. Согласитесь, что идентификатор «длина входной строки» выглядит предпочтительнее, чем «ДлинаВходнойСтроки» или «длина_входной_строки» (в выходном файле будет записано «dlina_vhodnoj_stroki»). Одиночные пробелы внутри идентификаторов делают их более естественными. Но в таком случае мы теряем право использовать одиночный пробел в качестве разделителя лексем. Т.е. «int i» при транслитерации будет заменено на «int_i», что является ошибкой. Необходимо разделять «int» и «i» двумя пробелами или символом табуляции.
        Если вы находите такое неудобным, надо просто при запуске утилиты задать третий аргумент.

Русификация
        Итак, отличия «русского C/C++» этой утилиты от стандартного C/C++:
  • Возможность употребления русских идентификаторов.
  • Возможность употребления одиночных пробелов внутри идентификаторов.
  • Возможность употребления любых идентификаторов, для этого они ограничиваются с обоих сторон символами «`» (обратный апостроф, на одной клавише с «~», «ё» и «Ё»); индентификатор `если X != Y` после транслитерации будет выглядеть так: eslix20Xx20x21x3Dx20Y.
  • Возможность записи констант в двоичном виде; константы вида 2"1о1о_о11о 111о_оо1о" или 2'1о1о_о11о 111о_оо1о' заменяются в выходном файле на эквивалентное «0xA6E2». Нули внутри константы можно записывать буквами «O» или «o» (как русскими, так и латинскими), а единицы — буквой «l». Допускается при этом пробелы и «_» (в любом количестве и в любом порядке) внутри кавычек для более наглядной записи.
  • Стантарты C и C++ требуют, чтобы символ # команд препроцессора был первым в строке; теперь перед ним можно употреблять пробелы и табуляции, что бывает удобным при форматировании текста:
       #вставка  
       #вставка 
       #если нет	INCLUDE_DEBUG
         #вставка	"debug.c"
       #к если
    
    В выходном тексте на стандартных C и C++ команды препроцессора будут перемещены в начало строки.
        Утилита производит автоопределение кодировок: cp886 или cp1251. Каких символов больше в тексте программы, та кодировка и используется. В файле «replace.csv» находится таблица замен: в первом поле — идентификатор на русском языке, во втором - идентификатор, который должен заменить идентификатор из первого поля в результирующем файле. Например, строка «если;if» означает, что слово «если» входного текста заменит «if» в выходном тексте.

        Эта четвёртая версия утилиты с 1999 года, каждая версия писалась с нуля. Последняя версия написана на чистом C и откомпилирована Tiny C Compiler. При этом программа написана на «русском Си», а Tiny C Compiler, как из известно, кириллицу не поддерживает.

Возможные проблемы при транслитерации

        Поскольку транслитерация не гарантирует однозначного соответствия входного и выходного тестов, то возможны коллизии. Так, слова «пасха» и «паша» будет представлены в выходном тексте одинаково: «pasha». Но за многие годы использования этой программы подобные казусы места не имели.

        Так же следует учитывать, что эта утилита не запрещает употребление латиницы. Смещанное же использование кириллицы и латиницы может приводить к проблемам:
int a;     // a — латинская
int а;     // а — русская, будет произведена транлитетерация в латинскую «a», 
           // компилятор выдаст сообщение о повторном объявлении переменной

Ограничения при использовании

        Представленная утилита является консольным приложением Windows. Задача «втиснуть» её между тестовым редактором IDE и компилятором не является простой и автором она не решена. Поэтому типичным является такой вариант использования: редактирование - запуск bat-ника (см. пример ниже) - запуск откомпилированного exe-файла. Но любителей командной строки такой вариант вполне устроит.

Пример использования

"c:\program files\far2\far.exe" /e %1
cpp-rus.exe %1 %1.c
tcc -o %1.exe %1.c
pause
        Если записать это в файл «edcompil.bat», то запустив «edcompil.bat  myprog», мы
  • редактируем текст программы на кириллице «myprog» текстовым редактором «far» (первая строка),
  • производим транслитерацию теста «myprog» в файл «myprog.c» (вторая строка),
  • компилируем (третья строка) «myprog.c» в «myprog.exe» компилятором «tcc» (или другим; соответственно строка должна быть другой),
  • останавливаемся (четвёртая строка), чтобы увидеть ошибки при компиляции, если таковые есть.
Далее запускаем на выполнение «myprog.exe».

Как использовать русские ключевые слова при программировании?

Версии утилиты, разработанные до сентября 2014 г., для русификации ключевых, служебных и прочих слов использовали переопределение с помощью команд препроцессора, например:
#define		выйти		break
#define		класс		class
#define		конст		const
#define		заново		continue
#define		цикл		do
#define		иначе		else
#define		для		for
#define		если		if
#define		цел		int
#define		длинный		long
#define		вернуть		return
#define		короткий	short
#define		пустой		void
#define		пока		while
        Но командами препроцессора нельзя переопределить сами команды препроцессора. Без этого русификация неполна. Теперь замены слов вносятся в файл «replace.csv», который имеет следующий вид
вернуть;return
вставка;include
выбор;switch
выйти;break
двойн;double
двойной;double
для;for
если;if
заново;continue
иначе;else
        В списке русских ключевых слов ориентировался на Евгения Александровича Зуева, но не на 100%, кое-что заменил на свой вкус. Если что-то не нравится Вам, то Вы тоже можете менять. Эту таблицу можно пополнять, напрмер, для того, чтобы заменить имена библиотечных функций типа «printf» или «fopen» на русскоязычные эквиваленты. При правке следует учитывать:
  • Первое поле таблицы — заменяемые слова, второе — заменяющие.
  • В первом поле символы кириллицы должны быть в кодировке cp1251.
        Такой способ замены не отменяет старого с помощью «#define».

        Использование представленной утилиты делает возможным программировать так:
#include  <iostream.h> 
#define  РАЗМЕР  10
main()
{   целый  массив[РАЗМЕР];
    для (целый  №=0; № < РАЗМЕР; №++)
        вывод << (массив[№] = №) << "\n";
    вернуть  0;
};
        Более развёрнутый пример использования на практике этой утилиты можно посмотреть в следующей статье «Решение системы уравнений методом Гаусса».

        Скачать утилиту транслитерации русского C/C++ в стандартный можно по этой ссылке.
Русификация

Последняя правка: 2016-07-03    14:37

ОценитеОценки посетителей
   ██████████████████████████ 13 (61.9%)
   ████ 2 (9.52%)
   ▌ 0
   ████████████ 6 (28.5%)

Отзывы

     2015/04/01 10:10, rst256

Задача «втиснуть» её между тестовым редактором IDE и компилятором не является простой и автором она не решена.

Не согласен, даже если в IDE нет возможности прописать доп. этап перед компиляцией (хотя я даже таких не встречал) что мешает тупо в лоб подсунуть эту утилиту IDE под видом компилятора сделать свое черное дело, а потом уже оттуда вызвать сам компилятор?
И то, это гемор для тех, у кого окна, sh скрипт такое за 2 команды делает.
Даже подсветку синтаксиса и проч. можно заиметь для подобной бяки для свободных IDE. Переписать грамматику вообще нетривиальная задача, на крайний случай, если кирилические коды символов поганка не примет принципиально (а перейти на другую IDE не позволяет вероисповедание), хакаем файл шрифтов и переносим русские буквы на место латиницы. Обычно там есть доп. место для нац. символов немецкого и т.п. языков. И переопределяем таблицу транслита. Такой ход даже проприентарную IDE проймет.

     2015/12/29 15:08, МозГ3000

Привет. Прикольная тема)
Писать на русском клёво!

Я так понял, что по умолчанию в cpp-rus.exe уже зашиты какие-то варианты ключевых слов как напр. "вернуть" вместо return. Можно узнать полный список, чтобы не морочиться хотя бы в начале с replace.csv? Заранее спасибо.

P.S. у вас тут не упоминается, что судя по всему нужно ставить два пробела, т.к. один пробел заменяется на "_" ,что приводит к синтаксической ошибке.

P.P.S. Было бы прикольно, что бы в программах типа Notepad++ русский вариант синтаксиса тоже выделялся бы цветами. Может, у вас уже есть какие-то на эту тему наработки?

     2015/12/29 16:53, Автор сайта

Выложил новую версию, где «зашит» список в replace.csv. Скачайте ещё раз, после этого replace.csv можно править, как вам хочется.

Да, нужно два пробела (или табуляция) для разделения разных слов. Если одиночный пробел в идентификаторах не устраивает, то укажите третий параметр (выше описано) .

Наработок на тему синтаксических раскрасок в Notepad++ и других редакторах нет и заниматься ими не планирую. Вроде бы кто-то делал подобное, говорят, что не сложно. Попробуйте сами. Но, как вы понимаете, Notepad++ не будет лезть в replace.csv за ключевыми словами.

     2016/03/17 10:32, rst256

Поскольку транслитерация не гарантирует однозначного соответствия входного и выходного тестов, то возможны коллизии. Так, слова «пасха» и «паша» будет представлены в выходном тексте одинаково: «pasha». Но за многие годы использования этой программы подобные казусы места не имели.

А не надо вообще транслитерацию делать! Для кого её делать то? Для компилятора что ли, так ему на внешний вид плевать вообще то.
Нужно просто для каждого русского ид генерировать УНИКАЛЬНЫЙ валидный ид типа __78678 и хранить в асоц. массиве это сопоставление. И легко и просто переводить такие ид снова в богомерзкий русский вид.

Вообще с такими вещами как автогенерация ид не играют, если нет доступа к базе символов всегда будет риск выхватить конфликт или переопределить глобальный ид локально, а это страшно, при этом тебе даже варнинга не вывалит компилятор!

     2016/03/17 11:48, Автор сайта

Эту утилиту делал для себя, и она в таком виде меня устраивает. Делюсь ею по той причине, что никто не предлагает ничего похожего. Ваш подход, по идее, правильнее, и Вы сами могли бы сделать такую утилиту. Это совсем не сложно. Только учтите, что отладке следить за объектом «moya_peremennaya» проще, чем за объектом «__78678».

     2016/04/13 20:12, rst256

Стантарты C и C++ требуют, чтобы символ # команд препроцессора был первым в строке;

Кажется, уже не требуют, смирились. Си точно, с++ я думаю тоже куда он супротив батьки то пойдет

     2016/04/13 20:27, rst256

Только учтите, что отладке следить за объектом «moya_peremennaya» проще, чем за объектом «__78678».

А с чего вы взяли что я вообще увижу при отладке __78678, а увижу именно свой ид, родной так сказать. Что бы быть последовательным я перехвачу вывод компилятора и приведу его к своему виду.
a.exe gcc.exe ....
Хотя это уже немногого пижонство. И все это прекрасно прикручивается к акелпаду, конечно можно и к notepad++, но у него гораздо меньше возможностей.

     2016/04/14 02:28, rst256

Если таблица окажется неупорядоченной, то утилита выдаст номер и содержимое строки, нарущающей общий порядок, и завершит работу, не выполнив создание текста на стандартном C/C++.

Вот это правильно, я бы даже сказал расово верно, а то взяли моду сваливать на машину всю нудную и монотонную работы. Пусть мерзкие хумансы привыкают подавать на вход данные в правильном порядке! Пусть делом займутся и так все за них делаем, так от них будет хоть какая то польза.

     2016/04/15 13:07, Автор сайта

а то взяли моду сваливать на машину всю нудную и монотонную работы.

Вы подловили меня :) Давно само сортируется, когда надо. Надо бы старые тексты перечитать и внести правки. Всё времени нет :( Знаете, нет ни одного человека, который бы хоть что-то высказал мне – хоть плохое, хоть хорошее – по поводу этой утилиты. Никакой обратной связи. Молча скачивают и всё. И вроде бы не боты. Уже примерно 400 закачек.

     2016/07/20 13:35, Алексей

Если скачивают - значит идея стоящая! Иначе ни кто бы и не качал.
А это уже оценка "хорошо".
Писать программы на родном языке гораздо легче и быстрее, а уж тем более разбираться в чужом коде.

     2017/08/21 11:14, bav69

Похожий подход я встречал в компонентном паскале на сайте "Информатика 21". Они применяют его в системе "BlackBox", поскольку используют ее для обучения программированию в школах с 1-го класса. Для детей вполне оправданный подход, а для взрослого человека, наверное, нет. Но это только мое мнение. Думаю данную утилиту можно использовать и для других языков при правильном редактировании файла "replace.csv".

Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Прочее

Новости

Политика размещения комментариев и статей

Предложения и замечания

Все голосования

Компьютерные ребусы и этюды для программистов

●  Найти минимум из двух положительных целых чисел без операций сравнения

Утилита транслитерации русского C/C++ в стандартный

Решение системы уравнений методом Гаусса. Программа на русском C++.

Последние комментарии

2018/10/11 22:29, Автор сайта
Формула расчета точности для умножения

2018/10/08 14:00, Неслучайный читатель
Сколько проходов должно быть у транслятора?

2018/10/06 12:19, Автор сайта
Тексто-графическое представление программы

2018/10/04 17:39, Автор сайта
Об исключенных командах или за что «списали» инструкцию INTO?

2018/09/29 16:52, Автор сайта
Как отличить унарный минус от бинарного

2018/09/22 20:13, Д.Ю.Караваев
Идеальный транслятор

2018/09/22 12:32, Автор сайта
Типы в инженерных задачах

2018/09/22 12:20, Д.Ю.Караваев
О русском языке в программировании