Кириллатиница

Статус русского языка в ИТ и в обществе. Аргументы за программирование на русском языке: история, культура, производительность труда, цивилизационная идентичность. Информационная безопасность.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Кириллатиница

Сообщение БудДен » 06.04.20 19:44

Продолжаем мозговой штурм по переводу кода на русский язык и восстановлению позиций кириллицы в ИТ. С Кои-7 идея, ясное дело, плоха отсутствием латиницы. Но её можно развивать в разных направлениях, чтобы латиница появилась.

Последняя идея, к-рая пришла в голову - следующая. Иногда нам не так уж важно, написан ли текст в кириллице или латинице. В этом случае мы просто возьмём да и добавим в кириллицу недостающие буквы из латиницы. А те, которые пересекаются, будем считать идентичными и присвоим им общий код. При идентификации будем использовать яролит взад, цитирую:

Код: Выделить всё

    a b c d e f g h i j k l m n o p q r s t u v w x y z
    а б ц д е ф г ш и й к л м н о п ь р с т у в ю х ы з
Но не весь, а часть букв выкинем (по ходу дела разберёмся, какие). Тут сразу есть проблема с b и p, которые при одинаковом написании имеет разные смыслы. Но на первый взгляд алфавит для представления латиницы получается такой:

Код: Выделить всё

a б ц д э ф г h i j к л м н о п q r s т u в w х y з
Итого мы добавили h i j q r s u w - всего 8 букв. Вся кириллица остаётся на месте, итого получается:

Код: Выделить всё

а б в w г д е ё ж з и i й j к л м н о п q р r с s т у u ф х ц ч ш h щ ъ ы ь э ю я
Протестируем:

Возьмём, например, произвольный текст из «Авторевю»

Код: Выделить всё

    Ездит на автомобилях Mitsubishi Lancer Evolution IX и ГАЗ-21Р
    Ездит на автомобилях Мiтsuбishi Ланцеr Эволuтioн IХ и ГАЗ-21Р. 
Уффф. Хрень какая-то. Но на то и мозговой штурм, чтобы обсуждать хрень.

Плюсами является:

- если впихнуть кириллатиницу в одну раскладку, будет гораздо удобнее печатать. Перевод с английского на русский такой масштабной вещи, как ОС, может быть только поэтапным, поэтому длительное время останется необходимость постоянно переключаться. Эта необходимость очень неприятна.
- некоторые мнемоники (MOV какой-нибудь или ls) вообще вряд ли имеет смысл переводить. Поэтому, если не сделать единую раскладку, неудобство сохранится навсегда. Если же применить кириллатиницу и единую раскладку, то будет лучше.
- если совпадающие буквы поместить в ASЦII, возникнет неявная кириллизация исходных текстов. Хотя предикат isАлпha станет сложнее. Но эта сложность коснётся только новых идентификаторов, содержащих непересекающиеся с латиницей буквы

Минусы:

- для случаев, когда нам нужна именно латиница, придётся отвести отдельные коды букв и изменённые начертания. В Uнiцодэ вряд ли найдётся для них место, хотя я ХЗ. Но это не только минус, но и плюс. Т.к. проблема совпадения начертаний некоторых кириллических и латинских букв достаточно актуальна и всё равно то, что в шрифтах они пишутся одинаков - это баг современных шрифтов
- не совсем ясно, как осуществлять поиск. По идее, поиск по кириллатинице может происходить так:
- если по слову «жук» ясно, что это кириллица, ищем в кириллице
- если по слову «worд» ясно, что латиница, ищем в латинице
- слово «мама» ищем два раза (мама и mama)
- слово «wой» ищем как слово в кириллатинице - не русское и не английское ,

Источник:

https://www.linux.org.ru/forum/talks/15623682

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Кириллатиница

Сообщение БудДен » 06.04.20 19:46

Так я думал ты общий алфавит написал.
Общий алфавит добавил в пост.
Ты уже сделал замену c -> ц, значит ты можешь сделать s -> с. Аналогично i -> и, j -> ж. Что ж ты маешься?
Касаемо i, есть два слова в русском языке, мир и мiр, их смысл совершенно разный. «Война и мiр» = «Война и общество». Мы потеряли часть выразительности русского языка, выкинув i, поэтому логично его вернуть, из соображений, далёких от ИТ.

Касаемо с, может возникнуть путаница между сцs. Вообще, чем больше букв, тем короче можно записать. Если с, ц и s помещаются в пространстве глифов, кодировке и на клавиатуре, то нет причин их не оставить.

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

Код: Выделить всё

Mitsubishi
Митсубисши
В минималистичном варианте можно вообще полностью впихнуть латиницу в кириллицу - по сути дела опять возвращаемся к кои-7 или яролиту взад, т.е.

Код: Выделить всё

a b c d e f g h i j k l m n o p q r s t u v w x y z
а б ц д е ф г ш и й к л м н о п ь р с т у в ю х ы з
Ссылка:
https://www.linux.org.ru/forum/talks/15 ... d=15624924

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Кириллатиница

Сообщение БудДен » 06.04.20 19:47

Я пока что склоняюсь к жёсткому варианту максимального объединения, когда останется только 33 буквы, из-за раскладки. Кириллица и так на клавиатуру не помещается, впихнуть ещё дополнительные буквы без больших неудобств не получится. Кроме того, этот вариант самый простой для запоминания.

https://www.linux.org.ru/forum/talks/15 ... d=15625268

Павиа
Сообщения: 136
Зарегистрирован: 23.05.19 21:28

Re: Кириллатиница

Сообщение Павиа » 07.04.20 14:55

Жуть какая.

Павиа
Сообщения: 136
Зарегистрирован: 23.05.19 21:28

Re: Кириллатиница

Сообщение Павиа » 07.04.20 14:58

Ещё минус. Лексико-графическая сортировка усложняется.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Кириллатиница

Сообщение БудДен » 07.04.20 21:45

Можно и на эту тему пофантазировать - сортировать слова вместе, не разбирая языка, просто по их написанию. Навскидку особых проблем не вижу.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Кириллатиница

Сообщение БудДен » 07.04.20 22:59

Пример трансформации одного модуля из A2:

Код: Выделить всё

"МОДУЛЕ ЮМИнпутМетшодс;	(** АУТШОР \"ТФ\"; ПУРПОСЕ \"Абстрацт инпут метшод едитор\"; *)

ИМПОРТ
	Стреамс, Стрингс, Цонфигуратион, Техтс, ТехтУтилитиес, Цоммандс, Модулес;

ЦОНСТ
	ЦР = 0ДХ; ЛФ = 0АХ;

ТЫПЕ
	ИМЕИнтерфаце* = РЕЦОРД
		АцьуиреТехт*, РелеасеТехт* : ПРОЦЕДУРЕ {ДЕЛЕГАТЕ};
		ИнсертУЦС32* : ПРОЦЕДУРЕ {ДЕЛЕГАТЕ} (атПоситион : СИЗЕ; ЦОНСТ стринг : Техтс.УЦС32Стринг);
		ГетЦурсорПоситион* : ПРОЦЕДУРЕ {ДЕЛЕГАТЕ} () : СИЗЕ;
		ГетЦурсорСцреенПоситион* : ПРОЦЕДУРЕ {ДЕЛЕГАТЕ} (ВАР х, ы : СИЗЕ);
		СетЦурсорИнфо* : ПРОЦЕДУРЕ {ДЕЛЕГАТЕ} (поситион : СИЗЕ);
	ЕНД;


	ИМЕ* = ОБЙЕЦТ
	ВАР
		интерфаце : ИМЕИнтерфаце;
		валид : БООЛЕАН; (* иф ТРУЕ, алл делегатес ин <интерфаце> аре нот НИЛ *)

		ПРОЦЕДУРЕ &Инит*;
		БЕГИН
			интерфаце := Ноне;
			валид := ФАЛСЕ;
		ЕНД Инит;

		ПРОЦЕДУРЕ ГетНаме*() : Стрингс.Стринг;
		БЕГИН
			РЕТУРН НИЛ
		ЕНД ГетНаме;

		ПРОЦЕДУРЕ СетИнтерфаце*(и : ИМЕИнтерфаце);
		БЕГИН {ЕХЦЛУСИВЕ}
			АССЕРТ(
				 ((и.АцьуиреТехт # НИЛ) & (и.РелеасеТехт # НИЛ) & (и.ИнсертУЦС32 # НИЛ) &
					(и.ГетЦурсорПоситион # НИЛ) & (и.ГетЦурсорСцреенПоситион # НИЛ) & (и.СетЦурсорИнфо # НИЛ))
				ОР
				 ((и.АцьуиреТехт = НИЛ) & (и.РелеасеТехт = НИЛ) & (и.ИнсертУЦС32 = НИЛ) &
					(и.ГетЦурсорПоситион = НИЛ) & (и.ГетЦурсорСцреенПоситион = НИЛ) & (и.СетЦурсорИнфо = НИЛ))
			);
			СЕЛФ.интерфаце := и;
			валид := интерфаце.АцьуиреТехт # НИЛ;
		ЕНД СетИнтерфаце;

		ПРОЦЕДУРЕ ИнсертЦшар*(уцс : СИЗЕ);
		ВАР буф : АРРАЫ 2 ОФ Техтс.Цшар32;
		БЕГИН {ЕХЦЛУСИВЕ}
			ИФ валид ТШЕН
				интерфаце.АцьуиреТехт;
				интерфаце.СетЦурсорИнфо(1);
				буф[0] := уцс(Техтс.Цшар32); буф[1] := 0;
				интерфаце.ИнсертУЦС32(интерфаце.ГетЦурсорПоситион(), буф);
				интерфаце.РелеасеТехт;
			ЕНД;
		ЕНД ИнсертЦшар;

		ПРОЦЕДУРЕ ИнсертМултиЦшар*(ЦОНСТ уцс : АРРАЫ ОФ СИГНЕД32);
		ВАР буф : АРРАЫ 2 ОФ Техтс.Цшар32; пос, и : СИЗЕ;
		БЕГИН {ЕХЦЛУСИВЕ}
			ИФ валид ТШЕН
				интерфаце.АцьуиреТехт;
				пос := интерфаце.ГетЦурсорПоситион();
				интерфаце.СетЦурсорИнфо(ЛЕН(уцс));
				буф[1] := 0;
				ФОР и := 0 ТО ЛЕН(уцс) - 1 ДО
					буф[0] := уцс[и];
					интерфаце.ИнсертУЦС32(пос, буф);
				ЕНД;
				интерфаце.РелеасеТехт;
			ЕНД;
		ЕНД ИнсертМултиЦшар;

		ПРОЦЕДУРЕ ИнсертУТФ8Стринг*(ЦОНСТ стринг : АРРАЫ ОФ ЦШАР);
		ВАР р : Стреамс.СтрингРеадер;
			пос, и, м: СИЗЕ;
			темпУЦС32 : АРРАЫ 1024 ОФ Техтс.Цшар32;
			цш, ласт : Техтс.Цшар32;
		БЕГИН {ЕХЦЛУСИВЕ}
			ИФ валид ТШЕН
				интерфаце.АцьуиреТехт;
				пос := интерфаце.ГетЦурсорПоситион();
				НЕЮ(р, ЛЕН(стринг));
				м := ЛЕН(темпУЦС32) - 1;
				р.Сет(стринг);
				и := 0;
				РЕПЕАТ
					ИФ ТехтУтилитиес.ГетУТФ8Цшар(р, цш) ТШЕН
						ИФ и = м ТШЕН темпУЦС32[и] := 0; интерфаце.ИнсертУЦС32(пос, темпУЦС32); ИНЦ(пос, м); и := 0 ЕНД;
						ИФ (ласт # ОРД(ЦР)) ОР (цш # ОРД(ЛФ)) ТШЕН
							ИФ цш = ОРД(ЦР) ТШЕН темпУЦС32[и] := ОРД(ЛФ)
							ЕЛСЕ темпУЦС32[и] := цш
							ЕНД;
							ИНЦ(и)
						ЕНД;
						ласт := цш
					ЕНД
				УНТИЛ (р.рес # Стреамс.Ок);
				темпУЦС32[и] := 0; интерфаце.ИнсертУЦС32(пос, темпУЦС32);
				интерфаце.РелеасеТехт;
			ЕНД;
		ЕНД ИнсертУТФ8Стринг;

		ПРОЦЕДУРЕ ГетЦурсорСцреенПоситион*(ВАР х, ы : СИЗЕ);
		БЕГИН {ЕХЦЛУСИВЕ}
			ИФ валид ТШЕН
				интерфаце.ГетЦурсорСцреенПоситион(х, ы);
			ЕЛСЕ
				х := 0; ы := 0;
			ЕНД;
		ЕНД ГетЦурсорСцреенПоситион;

		ПРОЦЕДУРЕ КеыЕвент*(уцс : СИЗЕ; флагс : СЕТ; кеысым : СИЗЕ);
		ЕНД КеыЕвент;

		ПРОЦЕДУРЕ Шиде*;
		ЕНД Шиде;

		ПРОЦЕДУРЕ Финализе*;
		БЕГИН
			СетИнтерфаце(Ноне);
		ЕНД Финализе;

	ЕНД ИМЕ;

	(* тше инсталлер юилл регистер тше ИМЕ *)
	ИМЕИнсталлер*  = ПРОЦЕДУРЕ;

	(* тше сюитцш ис цаллед то лет тше оюнер оф тше сюитцш кною, тшат тше ИМЕ шас беен сюитцшед *)
	ИМТоолСюитцшЦаллбацк* = ПРОЦЕДУРЕ;

ВАР
	дефаултИМЕ- : ИМЕ;
	ацтивеИМЕ- : ИМЕ;
	тоолСюитцш* : ИМТоолСюитцшЦаллбацк;
	Ноне- : ИМЕИнтерфаце;

(* Ретурнс тше инсталлер процедуре оф тше десиред ИМЕ *)
ПРОЦЕДУРЕ ГетИМЕ*(ЦОНСТ наме : АРРАЫ ОФ ЦШАР; ВАР рес : ИНТЕГЕР) : ИМЕИнсталлер;
ВАР
	цонфиг, инсталлерНаме, мсг : АРРАЫ 128 ОФ ЦШАР;
	модулеНаме, процедуреНаме : Модулес.Наме;
	инсталлер : ИМЕИнсталлер;
БЕГИН
	рес := -1;

	(* лоок ин тше цонфиг филе фор тше аппроприате инсталлер'с наме *)
	цонфиг := \"ИМЕ.\"; Стрингс.Аппенд(цонфиг,наме);
	Цонфигуратион.Гет(цонфиг,инсталлерНаме,рес);
	(* ретриеве тше процедуре *)
	ИФ (рес = 0) ТШЕН
		Цоммандс.Сплит(инсталлерНаме, модулеНаме, процедуреНаме, рес, мсг);
	ЕНД;
	ИФ (рес = 0) ТШЕН
		ГЕТПРОЦЕДУРЕ(модулеНаме,процедуреНаме,инсталлер);
	ЕНД;
	РЕТУРН инсталлер;
ЕНД ГетИМЕ;

(* сюитцшес тше он/офф-стате оф тше дефаулт ИМЕ *)
ПРОЦЕДУРЕ СюитцшИМЕ*() : ИМЕ;
БЕГИН
	(* сет тше ацтиве ИМЕ то тше дефаулт ИМЕ ор то НИЛ, респецтивелы *)
	ИФ ацтивеИМЕ = НИЛ ТШЕН
		ацтивеИМЕ := дефаултИМЕ;
	ЕЛСЕ
		ацтивеИМЕ := НИЛ;
	ЕНД;

	(* Иф ан ехтернал тоол регистеред а сюитцш процедуре, ит ис цаллед ною *)
	ИФ тоолСюитцш # НИЛ ТШЕН
		тоолСюитцш;
	ЕНД;

	(* ретурн тше цуррентлы ацтиве ИМЕ *)
	РЕТУРН ацтивеИМЕ
ЕНД СюитцшИМЕ;

ПРОЦЕДУРЕ СюитцшИМЕЦомманд*(цонтехт : Цоммандс.Цонтехт) : ИМЕ;
ВАР думмы : ИМЕ;
БЕГИН
	ИМЕ := СюитцшИМЕ();
ЕНД СюитцшИМЕЦомманд;

(* сетс а нею дефаулт ИМЕ анд сетс ит ацтиве иф тше олд ИМЕ юас ацтиве *)
ПРОЦЕДУРЕ ИнсталлИМЕ*(неюИМЕ : ИМЕ);
БЕГИН
	дефаултИМЕ := неюИМЕ;
	ИФ (ацтивеИМЕ # НИЛ) ТШЕН
		ацтивеИМЕ := неюИМЕ;
	ЕНД;
ЕНД ИнсталлИМЕ;

БЕГИН
	Ноне.АцьуиреТехт := НИЛ; Ноне.РелеасеТехт := НИЛ; Ноне.ИнсертУЦС32 := НИЛ;
	Ноне.ГетЦурсорПоситион := НИЛ; Ноне.ГетЦурсорСцреенПоситион := НИЛ;
ЕНД ЮМИнпутМетшодс.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Кириллатиница

Сообщение БудДен » 13.04.20 19:17

Сначала я подумал, что кириллатиница - это очень здорово. ПОтом - что пользы от неё нет. Теперь прихожу к середине:

1. В чатах можно применять, при условии, что поиск английского слова ищет и транслит. То же должно быть и для русского - поиск должен опционально включать транслит.
2. Если какая-то сущность полностью находится под нашим контролем и у неё нет ничего во внешнем мире, то тоже можно её транслитерировать вместо или до перевода. Смысл здесь в том, чтобы кириллица доминировала. Тогда нужно будет меньше переключать раскладку и дальше пойдёт легче.

Но если сущность существенно завязана на внешний мир, как имеет место для различных АПИ, то тут нужно подумать. Кириллизация в одном месте с сохранением латиницы в другом месте может усложнить жизнь.

Также я подумал, что для интерфейсных сущностей, которые у нас уже есть, нужен не перевод, а русскоязычный синоним. Потому что невозможно отследить все внешние ссылки на объект, обращение к которому идёт по строковому имени. Такая строка может быть синтезирована. Например, мы переведём Kurbelwelle как коленчатый вал, при этом "Kurbel" - это ручка, а Welle - это вал. Обращение может синтезироваться как Ausführen("Kurbel" || "welle"). Если переводить пословно, получится
Выполни("Ручка" || "вал"), что выполнится как Выполни("Ручкавал"), при том, что должно получиться Выполни("Коленчатыйвал")

Соответственно, нужно сохранить старое имя и добавить новое. Для внутренних сущностей, используемых только внутри модуля и не вызываемых по строке динамически, можно делать полный перевод.

Но это не в тему.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Кириллатиница

Сообщение БудДен » 13.04.20 19:31

Нда, и тут напрашивается ещё два решения.

1. Раскладка, в которой кириллица и латиница находятся на одной и той же кнопке.
2. Команда "транслитерируй последнее введённое слово"

Ответить