Алфавит языка программирования Java

 
 
 
Сообщения:68
И снова всем привет! :) На днях задался немного философским, но, тем не менее, интересным вопросом. Всем нам известно, что язык программирования Java, как и любой другой язык программирования, является формальным языком. Любой формальный язык (по аналогии с естественными языками) имеет свой алфавит, благодаря которому можно формировать слова и грамматические конструкции. Так вот, а каков перечень символов входящих в состав алфавита языка программирования Java? Сколько их всего (хотя бы примерно) и какие это символы?

Первоначально я думал, что в алфавит Java входят все Unicode-символы, но вскоре понял, что это не так. Во-первых, стоит учесть, что среди множества всех Unicode-символов можно выделить несколько подмножеств, элементы которых связаны однородной природой. Эти символьные группы достаточно легко перечислить: управляющие символы, графические, модифицирующие (они же форматирующие), нижние и верхние суррогаты, некоторые специальные символы, а также те, которые не имеют никакого графического представления (типа неразрывного пробела нулевой ширины). Существуют даже noncharacters и символы для частного использования (private-use). Все эти группы условно можно поделить на печатные и непечатные символы. Полагаю, что все непечатные символы не могут входить в алфавит, так как они задаются при помощи управляющих Unicode-последовательностей (фактически при помощи ограниченного набора ASCII-символов). В моём понимании к печатным символам можно отнести лишь те, которые имеют графическое представление и их модифицирующих собратьев. Касательно модифицирующих символов я не уверен, так как сами по себе они не несут никакого семантического смысла. Исходя из этой парадигмы, правильно было бы считать, что алфавит Java состоит исключительно из графических Unicode-
символов? Если я ошибаюсь, то поправьте меня, пожалуйста.

И ещё, стоит учесть тот факт, что последняя версия Java SE (версия 10.0) официально поддерживает Unicode 8.0 (так написано в JLS и докумментации класса Character), при том, что последняя версия Unicode под номером 10.0. Означает ли это, что по состоянию на текущий момент в алфавит Java внесены только те символы, которые официально были утверждены в стандарте Unicode 8.0?

Буду премного благодарен всем за Ваши ответы и аргументированную критику в мой адрес! :)
Изменен:17 апр 2018 14:26
 
 
Сообщения:86
Впервые слышу такое понятие как "алфавит языка программирования". В различных конструкциях языка допустимы различные наборы символов. Если их объединить их или взять конструкцию с самым широким набором (полагаю, это комментарии), то по-сути - это весь юникод.
Здесь они описаны.
Юникод - это не только набор символов, но и правил их обработки, алгоритмов. И если утверждается, что поддерживается данная версия юникода, то именно она и поддерживается :) Теоретически, может получиться и так, что алгоритмы, предназначенные для юникода 8, смогут правильно обработать юникод 10.
Изменен:15 апр 2018 06:42
 
 
Сообщения:68
Flashrunner:
Впервые слышу такое понятие как "алфавит языка программирования". В различных конструкциях языка допустимы различные наборы символов. Если их объединить их или взять конструкцию с самым широким набором (полагаю, это комментарии), то по-сути - это весь юникод.
Здесь они описаны.
Юникод - это не только набор символов, но и правил их обработки, алгоритмов. И если утверждается, что поддерживается данная версия юникода, то именно она и поддерживается :) Теоретически, может получиться и так, что алгоритмы, предназначенные для юникода 8, смогут правильно обработать юникод 10.


Благодарю за ответ! Хотелось бы немного подискутировать с Вами, если позволите. Во-первых, вынужден внести небольшую ремарку относительно алфавита. Любой язык программирования является частным случаем формального языка, следовательно, говоря об алфавите языка программирования Java я подразумевал формальный алфавит этого языка. Под формальным алфавитом следует понимать множество атомарных (неделимых) символов какого-либо формального языка.

Насчёт параграфа из JLS, на который Вы сослались... Замечу, что я неоднократно штудировал эту часть спецификации и не нашёл там точной информации относительно алфавита языка программирования Java. Любой входной элемент представляет собой последовательность символов Unicode. В принципе, как Вы правильно заметили, при использовании одних лишь управляющих последовательностей Unicode, состоящих исключительно из ASCII-символов, мы можем получить (в результате лексической трансляции) абсолютно любой Unicode-символ. Только в этом случае, если мы хотим ограничиться escape-последовательностями, наш алфавит будет состоять из 24-х символов (ASCII-символы "\", "u", набор арабских цифр от 0 до 9, латинские прописные и строчные буквы от A (a) до F (f), выступающие в роли шестнадцатиричных цифр, которые эквивалентны десятичным значениям от 10 до 15). Поскольку платформа Java позволяет использовать в нашем исходном коде символы за пределами ASCII-диапазона, то мы можем констатировать, что при желании мы можем напрямую воспользоваться любым Unicode-символом, имеющим графическое представление, просто введя его с клавиатуры или скопировав из буфера обмена. А все остальные символы, к примеру, управляющие, мы не можем ввести напрямую, для этого нам обязательно нужно использовать соответствующие escape-последовательности. Согласны со мной? Или же я в чём-то ошибаюсь? С нетерпением жду продолжения дискуссии! :)
Изменен:16 апр 2018 14:28
 
 
Сообщения:86
Напрямую это действительно проблематично сделать, но это можно сделать программно, на том же java или воспользовавшись hex-редактором. Абстрактный код:
sourceFile.append("\u0001");

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

Нашел подтвеждение своих слов по поводу допустимости всего юникода (по ссылке выше). К примеру в String literals (серый фон). Перейдя StringCharacter > InputCharacter > UnicodeInputCharacter > RawInputCharacter, мы увидим:
Quote:
RawInputCharacter:
any Unicode character
Изменен:16 апр 2018 19:18
 
 
Сообщения:9717
Flashrunner:
Юникод - это не только набор символов, но и правил их обработки, алгоритмов.
Хм. Может ты путаешь юникод (набор символов их их кодов) с его представлениями (способами записать символ в виде байт) типа UTF8, UTF16, etc?
Изменен:16 апр 2018 21:12
 
 
Сообщения:86
Нет. Я имел ввиду такие вещи как регистр, сортировку, принадлежность к какому-либо типу, каноническое равенство и многое другое. В спецификации юникода они называются text processes. Частично реализованы в java в виде статических методов Character.
 
 
Сообщения:68
В общем, пораскинув немного мозгами, пришёл к согласованности с тезисами представленными уважаемым Flashrunner'ом. Действительно, похоже на то, что все Unicode-символы являются неотъемлемой частью языка программирования Java. Стоит заметить, что вопрос наличия/отсутствия глифов для соответствующих символов напрямую зависит от используемого шрифта (который является набором глифов, как правило, одинакового стиля). То есть, я хочу сказать, что графическое представление не является обязательным условием для того, чтобы считать символ частью алфавита. К примеру, в текстовом редакторе Notepad++ можно включить стандартное отображение для пробельных символов и ограничетелей строк, которое не будет зависеть от конкретного шрифта. Если представить текстовый файл в бинарном формате, мы сможем увидеть даже те символы, которые и не должны иметь графического представления по умолчанию. В первую очередь я подразумеваю управляющие символы, основное предназначение которых заключается в выполнении определённого алгоритма действий при использовании оных. Графические же символы просто передают некоторый смысл, который является результатом некоего соглашения между людьми. Да и на счёт ввода с клавиатуры... Если немного покумекать, то при существенной необходимости можно создать индивидуальную раскладку клавиатуры абсолютно на любой манер. Да и сам факт того, что все escape-последовательности проходят через трансляцию в соответствующие Unicode-символы также заставляет задуматься. Что ещё более интересно, так это то, что мы можем попытаться передать в выходной поток символов управляющую последовательность, чей шестнадцатиричный code point не закреплён ни за одним из символов, так как большинство code point'ов зарезервированы на будущее и пока не используются. И это будет работать! Компилятор сгенерирует байт-код и его можно будет запустить на JVM. Вместо символа будет отображён стандартный глиф для символов не имеющих графического представления.

Исходя из последнего, значит ли это, что Java заранее поддерживает все 1,112,064 кодовых позиций Unicode (суррогаты сразу отбрасываем, так как по заверениям Консорциума их code point'ы никогда не будут использоваться)? То есть, если предположить, что всем code point'ам примут в соответствие определённый символ, значит ли это, что Java уже сейчас могла бы работать абсолютно со всеми символами из пространства Unicode? И ещё, следуя этой логике, несмотря на то, что официально в последней версии платформы Java поддерживается версия Unicode 8.0, значит ли вышесказанное, что мы можем использовать символы введённые в 10-й версии стандарта? Благодарю всех за ответы и плодотворную дискуссию!
Изменен:17 апр 2018 00:08
 
 
Сообщения:86
Lexoid:
значит ли это, что Java уже сейчас могла бы работать абсолютно со всеми символами из пространства Unicode?

Смотря что понимать под работой. Если просто чтение/запись значений, то да. Но если нужно узнать является ли символ символом верхнего регистра, буквой, цифрой или знаком пунктуации, то скорее всего нет. Потому что этого символа попросту нету в "базе данных" java. Чтобы точно ответить на этот вопрос, нужно смотреть реализацию юникода, начав с Character. Насколько "жесткие" там границы диапазонов.

Если требуется использовать символы из еще не поддерживаемой версии юникода, то разумнее наверное было бы просто протестировать их и необходимый функционал опытным путем. Либо попробовать поискать библиотеку, в которой уже реализована новая версия юникода.
 
 
Сообщения:68
Flashrunner:
Lexoid:
значит ли это, что Java уже сейчас могла бы работать абсолютно со всеми символами из пространства Unicode?

Смотря что понимать под работой. Если просто чтение/запись значений, то да. Но если нужно узнать является ли символ символом верхнего регистра, буквой, цифрой или знаком пунктуации, то скорее всего нет. Потому что этого символа попросту нету в "базе данных" java. Чтобы точно ответить на этот вопрос, нужно смотреть реализацию юникода, начав с Character. Насколько "жесткие" там границы диапазонов.

Если требуется использовать символы из еще не поддерживаемой версии юникода, то разумнее наверное было бы просто протестировать их и необходимый функционал опытным путем. Либо попробовать поискать библиотеку, в которой уже реализована новая версия юникода.


Частично с Вами согласен! Почему всё-таки частично, а не полностью? Сейчас постараюсь объяснить... Насколько мне известно, то всё пространство кодовых позиций в Unicode заранее поделено на блоки, которые имеют своё уникальное название и зарезервированы под символы определённой письменности. Java заранее может определить относится ли тот или иной символ к определённому блоку исходя из кодовой позиции символа и диапазона допустимых значений самого блока. Таким образом, если в будущем на зарезервированные места будут добавлены новые символы, Java сразу же будет знать к какому именно блоку (и, соответственно, письменности) они относятся. Вот с регистром, возможно, могут возникнуть определённые трудности, но не могу знать наверняка. Как минимум, я точно знаю, что при помощи методов класса Characher мы достаточно легко можем определить, к примеру, имеет ли отношение какой-либо символ к кириллице, латинице или греческому алфавиту, также можно определить иероглифическую идеограмму. И всё-таки у меня только один вопрос, по логике вещей, если я всё правильно понимаю, основными нововведениями для платформы Java являются не столько символы, сколько алгоритмы описанные в Unicode (правила нормализации, двунаправленное письмо и т. д.). То есть, если бы в Unicode 10.0 добавили новые правила нормализации, значит ли это, что текущая версия платформы Java скорее всего не будет их поддерживать, а символ биткоина, который был введён в той же 10-й версии стандарта, будет? Я думаю, что пришло время окончательно разобраться в этом вопросе! :)
 
 
Сообщения:86
Символы юникода подразделяется не только на принадлежность к блокам, но и, например, к категориям:
package test;                                                                                                
  
public class Test {
    public static void main(String[] args) {
        System.out.println("Dollar is a currency symbol: " +
            (Character.getType('$') == Character.CURRENCY_SYMBOL));

        System.out.println("Euro is a currency symbol: " +
            (Character.getType(0x20AC) == Character.CURRENCY_SYMBOL));

        System.out.println("Bitcoin is a currency symbol: " +
            (Character.getType(0x20BF) == Character.CURRENCY_SYMBOL));

        System.out.println("Is Bitcoin unassigned? " +
            (Character.getType(0x20BF) == Character.UNASSIGNED));
    }
}


Quote:
Dollar is a currency symbol: true
Euro is a currency symbol: true
Bitcoin is a currency symbol: false
Is Bitcoin unassigned? true


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

Поэтому, отвечая на вопрос о поддержке биткоина, я скажу - частично :) . Конкретнее не скажу, т.к. юникод знаю поверхностно.
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет