Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
19 / 19 / 2
Регистрация: 13.07.2012
Сообщений: 164

Зачем в jvm нужны строковые константы

12.09.2017, 17:32. Показов 1779. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу небольшую 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 час 58 минут
Ну я как обычно задал вопрос а потом сам разобрался. Строковые константы utf8 необходимы для хранения различной мета-информации, необходимой jvm для функционирования. В пример можно привести работу инструкции new, которая в качестве аргумента, получает адрес в пуле констант, на котором хранится строковая константа с сигнатурой класса. Например для :

new String();

компилятор сгенерирует инструкцию new, аргумент которой будет ссылаться на ячейку пула констант типа utf8 с содержимым - java/lang/String.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2017, 17:32
Ответы с готовыми решениями:

Строковые константы и указатели
Здравствуйте. Не работает следующий код из книги "С++. Шаг за шагом" (Дейтел): #include "pch.h" #include...

Строковые константы - Too many initializers for 'char []'
P.S плохо с русским Парни кто может мне помочи....со строковыми константы вроде я чегота не понемаю Нижу приведу пример моего кода но...

Как задаются строковые константы?
Можете привести примеры

7
12.09.2017, 17:44

Не по теме:

Цитата Сообщение от Serbis Посмотреть сообщение
Пишу небольшую jvm (не очень строго соблюдая спецификацию) и компилятор под это дело.
Для чего? Для саморазвития? По-ходу, вроде, если не соблюдать строго-настрого спецификацию, то и jvm-ом называть нельзя

0
19 / 19 / 2
Регистрация: 13.07.2012
Сообщений: 164
12.09.2017, 17:54  [ТС]
Не совсем. Я разрабатываю встраиваемые системы, основными потребителями которых являются различные инженеры и технологи. С некоторых пор, мне потребовалось возможность управления логикой работы устройств, без необходимости модификации прошивки. Т. е. необходимости значительно изменять логику работы устройства, без прямого доступа к аппаратной части. Например - есть контроллер промышленной печи. В стандартном решении является обычным пид-регулятором. Нужно сделать так, что бы конечный пользователь смог запрограммировать нелинейный температурный профиль, например - 10 минут постепенный нагрев до 300 градусов, потом резкое охлаждение до 200, при этом при температуре 250 на этом этапе нужно уведомить оператора о достижении порогового значения звуковым сигналом. Реализовать такое средствами конфигурационных файлов довольно трудно, поэтому я пришел к выводу, что создание виртуальной машины, для доступа к аппаратным функциям будет довольно неплохим решением. Т е конечному пользователю, для того что бы это сделать, нужны будут минимальные навыки программирования и знание api конкретного устройства. Пока данная затея, оправдывает себя целиком и полностью.
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
12.09.2017, 18:18
Serbis, интересная затея. Правильно ли я понимаю: Вы пишите новую JVM под архитектуру, для которой её не существует? Иначе, не совсем понятно, почему нельзя обойтись просто новой библиотекой с соответствующей API, делающей то, что Вам нужно.
0
19 / 19 / 2
Регистрация: 13.07.2012
Сообщений: 164
12.09.2017, 18:54  [ТС]
Цитата Сообщение от Kukstyler Посмотреть сообщение
ли
В принципе да, jvm реализаций под Cortex M4 я не видел. Но тут нужно оговорится вот о чем, это не совсем jvm, так как микроконтроллерная специфика ставит разработчика вм в крайне жесткие условия. Например по спецификации я обязан загрузить class файл в память перед началом работы с ним. На мк это сделать невозможно, так как в моем распоряжении только 256кб sram на все. Поэтому пришлось изощрятся с прямым чтением элементов class файла в память. Еще пример сложность это хип. При работе jvm на ос, хип динамический, там имеет место быть собственный менеджер памяти, который через например через nmap (nix) расширяет границу памяти процесса. Тут же память динамически расширить невозможно, а стандартный менеджер памяти, не позволяет отследить сколько места выделено под какие указатели. Пришлось написать свой менеджер, с возможность отслеживания таких параметров как занятое место. Третий пример сложностей, это соседство с ROTS, а именно с FreeRTOS, поскольку эта система сама имеет определенные виды на память, придется как подружить свой менеджер памяти с ее. До этого я пока еще не дошел. Ну это так сказать первая причина/ы почему я "изобретаю велосипед".

Вторая причина кроется в компиляторе. Дело в том, что мне необходимо, что бы компилятор понимал такую абстракцию как аппаратная функция. Это то самое API устройства, доступное пользователю. Т. е. например есть функция получения температуры с некоторого датчика - getTemp(int sNuber). На уровне байт кода вм, она выглядит как специальная инструкция - invokehardware, аргументом которой, выступает номер аппаратной функции. Вм видит этот номер, берет параметры со стека, и вызывает функцию уже в коде самой прошивки, после чего управление выходит из вм и передается коду самой железки, которая потом возвращает результат на стек. Так вот нужно что бы компилятор, понимал, что int temp = getTemp(9), это:

bipush 9
invokehardware 0
istore 0

а например runCounter(), который объявлен как метод класса это :
invokespеtial 0x7D

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

В принципе саму вм я написал, там ничего такого сложного нет, инструкции она выполняет, фреймами оперирует, классы загрузчик грузит. Сейчас вот пишу компилятор, и вот иногда такие вот глупые вопросы, как первый пост темы в голову приходят.

Скажем так, я использую jvm spec как мануал по написанию вм, то не следую ей буквально, ввиду вышеописанных причин.
2
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
13.09.2017, 13:29
Serbis, если не секрет, то сколько по времени это уже заняло?
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
13.09.2017, 14:31
Serbis, спасибо за детальное описание! Жаль, что я в этом всём недавно, а то бы с удовольствием помог всем, чем смог. (Уж слишком интересная тема).
Удачи Вам, и если не затруднит, отпишитесь о результатах. Надеюсь, у Вас всё получится.
0
19 / 19 / 2
Регистрация: 13.07.2012
Сообщений: 164
13.09.2017, 16:03  [ТС]
Не могу определенно сказать, много работы помимо этой, в среднем я уделяю этому делу 10-12 часов в неделю. Начал месяца где-то три назад. Плюс делаю я не с нуля, так как были раньше попытки уже писать вм и компиляторы, код и алгоритмы почерпнул из этих старых самоделок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2017, 16:03
Помогаю со студенческими работами здесь

Как/где размещаются строковые константы
вызываю какую нибудь функцию и передаю туда текст, например myfunc("some text") когда выделяется память под текст? когда эта память...

Где в АРМах хранить строковые константы?
Подскажите пожалста, где в АРМах хранить строковые константы? И вооще, может статью в сообщество напишете, каким образом программа...

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

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Зачем нужны объекты?
Зачем нужны объекты?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru