#java #компиляция #jvm #виртуальная_машина
Пишу небольшую jvm (не очень строго соблюдая спецификацию) и компилятор под это дело. Столкнулся с таким вот вопросом. По спецификации в пуле констант class файла, имеет место быть константа типа Utf8, служащая как я понял для представления строк. Мне не совсем понятно, для чего она нужна, так как у меня имеется следующая цепочка рассуждений. В jvm нет строк, их можно представить только как int[]. Для того что бы конечный пользователь не возился с массивами, был сделан класс String, который на вход принимает как раз этот int[] (на уровне java это char[]). А выражение вида: String str = "abc"; Разворачивается компилятором таким образом: char[3] t; t[0] = 'a'; t[1] = 'b'; t[2] = 'c'; String str = new String(t); Те строка так же оказывается пуле констант, но уже как константы типа int (так как char c utf символом разворачивается в short, а все short на уровне вм это int, а любой int > 127 попадает в пул констант (до 127 заносится в стек напрямую через инструкцию bipush)). Вопрос - зачем нужны константы utf8 (вероятно я неправильно понимаю механику работы строк?)? P. S. При этом если использовать занесение строк в пул констант как я написал, то получается просто сумасшедшая экономя места, так как для строки например из 1000 кириллических символов, придется выделить 2кб памяти в пуле констант, а для хранения их как int, всего 2 * 4 * кол-во одинаковых символов в строке. Т. е. если например используются только буквы русского алфавита, вся строка займет в пуле всего 66 байт.
Ответы
Ответ 1
Ну я как обычно задал вопрос а потом сам разобрался. Строковые константы utf8 необходимы для хранения различной мета-информации, необходимой jvm для функционирования. В пример можно привести работу инструкции new, которая в качестве аргумента, получает адрес в пуле констант, на котором хранится строковая константа с сигнатурой класса. Например для : new String(); компилятор сгенерирует инструкцию new, аргумент которой будет ссылаться на ячейку пула констант типа utf8 с содержимым - java/lang/String.Ответ 2
В скомпилированном class-файле нет понятия строковой константы. Возможно, вы имели в виду пул констант. Согласно спецификации Java 7: 4.4. Пул констант Инструкции в виртуальной машине Java не полагаются на строение классов, интерфейсов, экземпляров классов и массивов. Вместо этого они указывают на записи в таблице constant_pool. 4.4. The Constant Pool Java Virtual Machine instructions do not rely on the run-time layout of classes, interfaces, class instances, or arrays. Instead, instructions refer to symbolic information in the constant_pool table. То есть он хранит не только строки и метаинформацию, а вообще всё, что должно быть размещено в пямяти (а не прямо по месту вызова).
Комментариев нет:
Отправить комментарий