21 октября 2009

Своё - родное. Кирилица в java

Вступление...
Хотелось ли вам когда нибудь изобрести свой язык программирования, который бы позволял всё писать на кирилице и идентификаторы, и названия процедур-функций, и команды. Что то вроде:

Цикл ( целый И = 0 ; И < КоличествоДвигателей ; И++ )
Если (НеобходмаяМощность[И] < ДоступныйРесурс[И] ) Тогда
выделитьЕщёРесурсов(НеобходмаяМощность);
И--;
Иначе
запуститьПроцессПереработки();
Конец Если;
Конец Цикл;

Скажете бред. Вовсе нет, среди множества русскоговорящих программистов около 60% владеют английским языком на уровне pre-intermediate(ниже среднего) или еще ниже. Так что код, в котором все слова были бы интуитивно понятны вероятно для них был бы роднее. Так считаю не только я.
В любимом всеми читателями этого бложка язык программирования JAVA также сделал первый шаги в эту сторону. Нет, выше приведенный сегмент кода не будет работать, он даже не скомпилируется.
Продолжение...
Но вот следующий пример красочно демонстрирует лояльность java к кирилице, и совсем уж не ясно почему на просторах интернетов столько тем с комбинациями с трёх слов: java+кирилица+проблемы.


public class Гражданин {
private String Фамилия;
private String Имя;
private String Отчество;
private String Родина;
private int Возраст;
private boolean Беспартийный;
private boolean Судимый;

public String getФамилия() {
return Фамилия;
}
public void setФамилия(String фамилия) {
Фамилия = фамилия;
}
public String getИмя() {
return Имя;
}
public void setИмя(String имя) {
Имя = имя;
}
public String getОтчество() {
return Отчество;
}
public void setОтчество(String отчество) {
Отчество = отчество;
}
public String getРодина() {
return Родина;
}
public void setРодина(String родина) {
Родина = родина;
}
public boolean isБеспартийный() {
return Беспартийный;
}
public void setБеспартийный(boolean беспартийный) {
Беспартийный = беспартийный;
}

public boolean isСудимый() {
return Судимый;
}
public void setСудимый(boolean судимый) {
Судимый = судимый;
}
public void setВозраст(int возраст) {
Возраст = возраст;
}
public String toString(){
return
(Беспартийный?"Беспартийный":"Партийный")+" гражданин "+
Фамилия+" "+Имя+" "+Отчество+
" проживающий в "+Родина+
" "+Возраст+" лет отроду"
+(Судимый?" имеет судимости":" судимостей не имеет");
}

public static void Распечатать(Object подозреваемыйОбъект){
System.out.println(подозреваемыйОбъект);
}

public static void main(String []строчка){
Гражданин петров = new Гражданин();
петров.setФамилия("Иванов");
петров.setИмя("Иполит");
петров.setОтчество("Васильевич");
петров.setРодина("КНДР");
петров.setВозраст(45);
петров.setБеспартийный(false);
петров.setБеспартийный(false);
Распечатать(петров);

}

}


И получаем следующий вывод:

d:\projects\eclipse\Test\bin>java Гражданин
Партийный гражданин Иванов Иполит Васильевич проживающий в КНДР 45 лет отроду судимостей не имеет


Как показывает пример - идентификаторы, параметры, названия методов, и даже названия классов могут состоять из кирилических символов. Единственное что остаётся для меня пока тайной - в какой версии была введена такая возможность, существовала ли она всегда. Десяти минутное насилование googla не дало ответ на этот вопрос.

P.S.: необходимо заметить что практическое применения второго примера (комбинация английских и русских слов в коде) довольно низкая, из за постоянного переключения раскладок и соответственно низкой скорости набора.

6 комментариев:

Andrey Rybin комментирует...

Java full unicode с самого начала.

Т.е. так писать можно было всегда.


По опыту 1С скажу что так писать неудобно, не только из-за переключений расскладки (в 1С не надо переключаться, там и операторы на русском), а из-за склонений и длины слов.

В английском слова "константы". red означает и красный и красная и красное и тд и они обычно короче.



Что касается проблем java+кирилица+проблемы, то они в другой области - взаимодействия с внешним миром, который не full unicode.

Например - написали мы наш .java, а ещё интереснее .jsp файл в кодировке cp1251 с русскими, есть шанс увидеть абракадабру:
Tomcat под linux ничего не знает про cp1251.
Надо прописать кодировку .jsp файла и кодировку в которой генерировать результирующий документ, а если генерируем html, то нелишне и в нем указать кодировку.

Когда весь внешний мир перейдет на UTF-8, проблема практически исчезнет - уже сейчас она не такая острая, как несколько лет назад.

Andrey Rybin комментирует...

Или пример, который вам теперь ближе - вставляем запись в таблицу БД:

- в java - unicode,
- между java - БД - может быть своя кодировка,
- таблица в третьей (а ещё collation можно хитро подкрутить)

Rumoku комментирует...

спасибо за информативные коментарии.
действительно средняя длинна английских слов составляет 4.24 буквы, в то время как русских 5.13. Что почти на 20% больше.

p.s.: относительно java+кирилица+проблемы - это была наживка, что бы заинтересовать читателя:)
естественно приведённые примеры только касаються, но не описывают сполна возможностей java по работе с кирилицей.

Skynin комментирует...

Сам знаю английский препаршиво, но когда нужно обозвать переменную - спрашиваю гуглбота-переводчика в GTalk'е да и все.

Потому что как-то столкнулся с библиотекой на немецком. Вот то была песТня- Kopf вместо Head, zuruck'и и прочее. И оказалось - читать такие исходники невозможно, английский прямо как родной вспоминался.

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

Словарь же самих языков обычно маленький, заучить что if это не "если" а такой иероглиф что обозначает проверку условия - просто.

Анатоль комментирует...

Да... Работаю с французким кодом - тоже парни жгут. Потому уж лучше инглиш...

iPhone комментирует...

Блин, круто, я только сейчас наткнулся на этот блог.. интересно и с пользой.

Костя, спасибо за интересный материал.