powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Какое значение имеет тип переменной для компилятора? Например, "String str;"
25 сообщений из 28, страница 1 из 2
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024528
Переменные лежат в стеке. Это просто набор байт - адрес в куче, где лежит объект. Объект имеет структуру: поля, их размер, значение. Вот компилятор получил адрес, перешёл по нему в кучу. А дальше как он узнает, по какому смещению где что лежит? Либо в переменной хранится не только адрес объекта в куче, но и вся структура объекта, либо только адрес, а информация о смещениях - где-то ещё, откуда компилятор ее берет вместе с адресом переменной.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024530
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафига Вам это нужно?

Как ходит человек?
Легко - переставляет ноги.
Объясните, как он понимает, когда подвинуть левую, когда подвинуть правую?
хм....хм....

Вы, с одной стороны, бред спрашиваете - который и так понятен.
С другой, корректный ответ на данный вопрос боюсь это достаточно толстенькая книжка.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024535
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Компилятор не получает адреса - он их назначает.
И как назначающий - компилятор знает, что и где лежит.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024561
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Basil A. SidorovКомпилятор не получает адреса - он их назначает.
И как назначающий - компилятор знает, что и где лежит.

Для C - наверное да.
Для Java (и C++) - IMHO все будет немного сложнее. Скорее, все же, за обращение до "байтов" отвечать будет JVM. Компилятору до "байтов" дела быть не должно. Т.ч. вопрос автора плавно перетечет в JVM, runtime type information (не знаю как это в Java), пакет java.lang.reflect, Class Loader, управление heap'ом и так далее и так далее....
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024651
Leonid KudryavtsevНафига Вам это нужно?

Как гуманитарий, я не могу понять, зачем мне нужно указывать тип переменной, если в переменной хранится только адрес начала объекта в куче? То есть адреса выглядят одинаково - и без разницы что с этого адреса начинается: примитивный тип или объект класса. Кроме того, есть операция приведения типов... Получается, что тип переменной - это не только адрес начала объекта в памяти.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024656
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПолучается, что тип переменной - это не только адрес начала объекта в памяти.
это и размер занимаемой переменной и как интерпретировать данные в памяти при операциях с ними и пр. мелочи
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024762
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваши обрывочные знания перемешаны с непониманием каких-то базовых принципов.
летатель космосаПеременные лежат в стеке.
Локальные переменные, уж если на то пошло.

летатель космосаЭто просто набор байт - адрес в куче, где лежит объект.
Допустим.

летатель космосаОбъект имеет структуру: поля, их размер, значение.
Поля это тоже переменные.

летатель космосаВот компилятор получил адрес, перешёл по нему в кучу.

Лолшто? Компилятор транслирует Java код в байт-код. Он в кучу по адресу не ходит. Речь про интерпретатор или что?

летатель космосаА дальше как он узнает, по какому смещению где что лежит?
Какое такое смещение? В переменной не примитивного типа хранится адрес значения в куче. Какое ещё смещение? Относительно начала кучи? Так JVM его знает когда кучу создаёт.

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

летатель космосалибо только адрес, а информация о смещениях - где-то ещё, откуда компилятор ее берет вместе с адресом переменной.

Читайте статьи по теме, так как ваши собственные догадки с реальностью мало связаны
http://programmers.stackexchange.com/questions/65281/stack-and-heap-memory-in-java
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024764
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
летатель космосаКакое значение имеет тип переменной для компилятора? Например, "String str;"
Тип переменной это опциональная фича языков. Особенно интерпретируемых. Но её прелесть в том что строгая типизация позволяет предотвратить множество ошибок ещё на этапе компиляции.

Мне не дано понять как subj связан с текстом вашего вопроса. Вам нужно разобраться в основах - строгая\не строгая типизация, компиляция\интерпретация, ручное и автоматизированное управление памятью, стэк\куча. После этого уже можно будет думать об адресах и организации памяти.

Суть Java в том что программисту не нужно знать об адресах, смещениях, и прочих системных вещах. О них заботится JVM и делает она так как ей позволяет делать спецификация. Возможно, вам стоит обратить внимание на С++, чтобы больше понять о компиляции и управлении памятью на низком уровне, если именно это вас интересует.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024828
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
летатель космосаLeonid KudryavtsevНафига Вам это нужно?

Как гуманитарий, я не могу понять, зачем мне нужно указывать тип переменной,


Ты ещё гуманитарий, а уже задаёшь правильные вопросы.
Молодец!
Именно проблема в том, что в 90% в Java тип переменной не нужен.
Но Java -- язык, созданный упёртым дуболомом, из-за этого он и получился таким пуленепробиваемо дуболомным,
что любой идиот на нём может написать программу, и, если она скомпилируется, то с большой долей вероятности будет после этого работать.

Но есть другие языки, похожие на Java, и работающие на JVM, намекаю на Groovy, хотя есть и другие.
Там вовсе не обязательно объявлять тип каждой переменной.

летатель космосаесли в переменной хранится только адрес начала объекта в куче? То есть адреса выглядят одинаково - и без разницы что с этого адреса начинается: примитивный тип или объект класса. Кроме того, есть операция приведения типов... Получается, что тип переменной - это не только адрес начала объекта в памяти.

Ну... Я не знаю, как там в JVM внутри, но можно пофантазировать. Итак, у нас есть два типа переменных -- объекты и элементарные типы (int и так далее). Если нужно обрабатывать объект, достаточно хранить только ссылку (адрес) на него. Тип объекта будет лежать вместе с данными уже в самом объекте. Если нужно обрабатывать элементарный тип, то храниться он может только в стеке, так ? Так. Тогда нам уже достаточно не хранить его тип, а просто иметь значение определённого типа и
набор комманд по обработке значения этого типа в P-коде виртуальной машины. Каждой команде достаточно указывать адрес переменной в стеке вирт. машины, а то, какого она типа, уже будет закодировано в самой команде.
При этом тип переменной должен быть известен на этапе компиляции компилятору, но на этапе выполнения кода он уже не нужен, на его основе будут сгенерены комманды для обработки переменных этого фиксированного типа.

Например, нужно сложить два int и получить результат.

Команда p-кода может выглядить так:

СЛОЖИТЬ_INT_INT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА.

нужно сложить два float

СЛОЖИТЬ_FLOAT_FLOAT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА.

и так далее.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39024833
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕсли нужно обрабатывать элементарный тип, то храниться он может только в стеке, так ? Так.
Не "элементарный", а "примитивный". По-твоему в куче нет места примитивам? Тебе не кажется это слегка неправдоподобным?
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39025086
Blazkowicz, сформулирую, что уже понимаю (надеюсь):
1. Переменная=локальная переменная. Хранится в стеке. Либо это примитивный тип, либо ссылка на объект в куче.
2. Поле объекта. Если это переменная примитивного типа - она оборачивается в класс-обертку (упаковка в терминах с#). В итоге получается как бы "целостность" объекта - он полностью лежит в куче.

Спасибо за ссылку. Ещё не дочитал - по-английски медленно читаю.

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

Например, нужно сложить два int и получить результат.

Команда p-кода может выглядить так:

СЛОЖИТЬ_INT_INT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА.

нужно сложить два float

СЛОЖИТЬ_FLOAT_FLOAT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА.

и так далее.
Вон оно как... То есть все эти приведения типов проводятся до этапа компиляции, потом уже виртуальная машина в код не вмешивается, ничего не проверяет и не корректирует?
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39025104
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
летатель космоса1. Переменная=локальная переменная. Хранится в стеке. Либо это примитивный тип, либо ссылка на объект в куче.

Да.

летатель космоса2. Поле объекта. Если это переменная примитивного типа - она оборачивается в класс-обертку (упаковка в терминах с#). В итоге получается как бы "целостность" объекта - он полностью лежит в куче.
Нет. Примитивы могут лежать в куче без всяких оберток. Просто они не лежат отдельными сущностями, а находятся внутри объектов как поля либо элементы массивов.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39025480
BlazkowiczНет. Примитивы могут лежать в куче без всяких оберток.
Тогда отложу этот вопрос на потом - сейчас с этим вопросом разобраться.
Из того, что читал, включая соседнюю ветку по c#, тип переменной нужен еще и для определения методов:
псевдокод
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Dog {
  String name;
  method(this, String name){
       this.name = name;
  };
}

Dog dog1 = new Dog();
Dog dog2 = new Dog();

dog1.method(this, "boo");
dog2.method(this, "woo");


Транслятор смотрит, какого типа переменная, идет куда-то, где лежит описание типа Dog, смотрит, есть ли в нем метод method(this, String name)? Если есть, то делает замену вызова метода на:
Код: java
1.
2.
dog1.method(this, "boo"); => method(dog1, "boo");
dog2.method(this, "woo"); => method(dog2, "woo");
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39025557
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39025669
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДля Java (и C++) - IMHO все будет немного сложнееРабота компилятора слабо зависит от языка.
Компилятор любого языка транслирует высокоуровневое (текстовое) представление в промежуточный или объектный код.
В любом случае, компилятор знает представление компилируемых сущностей и решает, что и где будет расположено.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39026475
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovРабота компилятора слабо зависит от языка....

Жесть. Примерно как реклама стирального порошка: "Если все порошки одинаковы - зачем переплачивать" ( C )

В случае не-ООП языков - вопрос автора более-менее прост и относительно корректен.

В случае C++ - уходим в runtime type information (появилось в BC 3.x) или, раньше, в таблицу виртуальных методов.

В случае Java - даже не знаю.
Basil A. Sidorov...компилятор знает представление компилируемых сущностей и решает, что и где будет расположено.
А если компилятор компилирует "что-то" получающее на вход не класс, а интерфейс. Можно сказать, он "знает представление компилируемых сущностей" ? А если переменная/параметр объявлена просто как Object ?

IMHO & AFAIK В случае Java, в некоторых случаях типизация может произойти только на этапе classloader'а или выполнения. AFAIK (могу ошибаться!) Не даром, за безопасность кода отвечает не компилятор, а classloader

P.S.
Специально все под спойлер убирал, дабы можно дикий флейм завести на пустом месте и до посинения спорить: "что есть компилятор", "что есть JVM" и кто за что отвечает. Да и вообще: Java это компилируемый язык или интерпретируемый? )))

Другое дело, что если вопрос автора связан с реальной жизнью, то, возможно, ему нужен более конкретный (практический) ответ по какому-то конкретному поведению. Например по classloader'у или рефлекшион.

Ну или если у него чисто теоретический интерес - то да, подаваться в C или Assembler.

P.P.S.
Лично у меня, при теоретических раздумьях над Subj и где что хранится, мозг съезжал на этапе "множественного наследия" и "виртуальных предков в C++" ))) Дабы понять, что там за VMT и как какой предок туда мог отобразиться - мозгов у меня никогда не хватало.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39026490
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovLeonid KudryavtsevДля Java (и C++) - IMHO все будет немного сложнееРабота компилятора слабо зависит от языка.

Как раз зависит от того, что и куда компилируем.
Правда, в java байт-код не сильно отличается от исходного текста (в сравнении с С++ к примеру).


Basil A. SidorovКомпилятор любого языка транслирует высокоуровневое (текстовое) представление в промежуточный или объектный код.
В любом случае, компилятор знает представление компилируемых сущностей и решает, что и где будет расположено.

В java не решает.

Вообще начиная с идеи, давшей старт созданию C++ и eiffel (первых ООП-языков со статической типизацией) всё выглядит примерно так:
- ссылка на объект ведёт на структуру, в которой в одном из первых полей (в delphi в первом, в java- не первом) лежит ссылка на объект класса.
- объект класса содержит таблицу виртуальных методов. Компилятор при вызове метода знает его порядковый номер и вызывает соответствующий метод. Это для классов- интерфейсы в java сделаны через другой (задний) проход- ради экономии места (при этом JIT, если сможет, оптимизирует этот АДЪ по скорости).
- там же, в объекте класса, есть полезная информация, типа имени класса, имён всех методов/функций, ссылки на суперкласс (т.к. в API она одна, то нельзя ввести множественное наследование).

Т.е. компилятор вставляет ссылку на объект, а виртуальная машина (точнее JIT) находит, что это объект типа "java.lang.String" с набором методов.

В общем- писать всё лень- топикстартер не понимает заданного вопроса- но всё там просто- можно для начала почитать устройство объектов c++/delphi (последние вообще простые, как табуретка), потом с java просто разобраться.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39026566
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominВ java не решаетРешает - именно компилятор (JLS->байт-код) решает, что и где находится в пуле констант и переменных, а затем, как и положено для промежуточного представления, бэкэнд (JIT или ad-hoc) решает, каким машинным кодом всё это будет представлено.
В обоих случаях именно кодогенератор решает, что и где будет находиться.

P.S. Кодогенератор - чтобы не зарубаться с интерпретацией
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39026588
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема фейковая от начала и до конца.

Вопрос топик стартера задан полностью бредово и противоречиво. Ответить на него, это примерно как ответить на вопрос Карлсона заданный Фрекин Бок "а Вы перестали пить коньяк по утрам? ". Он спрашивает про все, сразу и вперемешку.

IMHO Более менее читабельные и относительно корректные ответы уже даны и 17987029 и 18000000
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39026594
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov...В обоих случаях именно кодогенератор решает, что и где будет находиться.

P.S. Кодогенератор - чтобы не зарубаться с интерпретацией

А у топик стартера вопрос еще более не простой и флеймогонный. Он явно про класс String спрашивает. Вот интересно, кто решает, где объект данного класса будет храниться? Уж явно не компилятор... )))

У меня вообще подозрение, что класс String (как минимум в предыдущих версиях Java) "жестко закоден" в коде JVM. Т.ч. там явно компилятор ничего решать не может ))) Все уже американские (или индусские) программисты за компилятор решили. IMHO
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39027158
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevОн явно про класс String спрашивает. Вот интересно, кто решает, где объект данного класса будет храниться? Уж явно не компилятор... )))String - такой же класс, как и любой другой.
Вот массивы - да, специальный вид объектов, создаёт которые сама JVM.У меня вообще подозрение, что класс String (как минимум в предыдущих версиях Java) "жестко закоден" в коде JVMНе класс - имя класса. Точно так же, как и Class и ClassLoader.Т.ч. там явно компилятор ничего решать не может )))Ему и не надо ничего решать - это головная боль того, кто реализует библиотеку классов.
Компилятор не барон Мюнхаузен и на некоторые вещи он просто обязан опереться. Но реализация этих "некоторых вещей" - в цемент не залита.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39028197
Не хотел раздувать такую бучу. Как устроена JVM, JIТ и прочее - это для их разработчиков, им лучше знать.

BlazkowiczВозможно, вам стоит обратить внимание на С++, чтобы больше понять о компиляции и управлении памятью на низком уровне, если именно это вас интересует.
Наверное - не уверен точно. У меня чисто меркантильный маленький интерес, связанный с непониманием механизма приведения типов (включая приведение к интерфейсу) и "как так компилятор определяет, что вот эти методы есть у этого объекта?".

Alexey TominВ общем- писать всё лень- топикстартер не понимает заданного вопроса- но всё там просто- можно для начала почитать устройство объектов c++/delphi (последние вообще простые, как табуретка), потом с java просто разобраться.
Вот так как вы описали, я почти так и представлял себе механизм (кроме таблицы виртуальных методов). Просто схема. По "устройство объектов С++" нашел интересную статью, но только для с#:)): http://habrahabr.ru/post/263935/
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39028201
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczMasterZivЕсли нужно обрабатывать элементарный тип, то храниться он может только в стеке, так ? Так.
Не "элементарный", а "примитивный". По-твоему в куче нет места примитивам? Тебе не кажется это слегка неправдоподобным?

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

Разве не так ?
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39028203
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczлетатель космоса1. Переменная=локальная переменная. Хранится в стеке. Либо это примитивный тип, либо ссылка на объект в куче.

Да.

летатель космоса2. Поле объекта. Если это переменная примитивного типа - она оборачивается в класс-обертку (упаковка в терминах с#). В итоге получается как бы "целостность" объекта - он полностью лежит в куче.
Нет. Примитивы могут лежать в куче без всяких оберток. Просто они не лежат отдельными сущностями, а находятся внутри объектов как поля либо элементы массивов.

Ну самостоятельно-то они не могут лежать в куче.
...
Рейтинг: 0 / 0
Какое значение имеет тип переменной для компилятора? Например, "String str;"
    #39028229
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv...

Разве не так ?
не так. даже если прямое использование адресной арифметики для программиста запрещено - с точки зрения компилятора - не так.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Какое значение имеет тип переменной для компилятора? Например, "String str;"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]