|
|
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Переменные лежат в стеке. Это просто набор байт - адрес в куче, где лежит объект. Объект имеет структуру: поля, их размер, значение. Вот компилятор получил адрес, перешёл по нему в кучу. А дальше как он узнает, по какому смещению где что лежит? Либо в переменной хранится не только адрес объекта в куче, но и вся структура объекта, либо только адрес, а информация о смещениях - где-то ещё, откуда компилятор ее берет вместе с адресом переменной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2015, 17:06 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Нафига Вам это нужно? Как ходит человек? Легко - переставляет ноги. Объясните, как он понимает, когда подвинуть левую, когда подвинуть правую? хм....хм.... Вы, с одной стороны, бред спрашиваете - который и так понятен. С другой, корректный ответ на данный вопрос боюсь это достаточно толстенькая книжка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2015, 17:10 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Компилятор не получает адреса - он их назначает. И как назначающий - компилятор знает, что и где лежит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2015, 17:17 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovКомпилятор не получает адреса - он их назначает. И как назначающий - компилятор знает, что и где лежит. Для C - наверное да. Для Java (и C++) - IMHO все будет немного сложнее. Скорее, все же, за обращение до "байтов" отвечать будет JVM. Компилятору до "байтов" дела быть не должно. Т.ч. вопрос автора плавно перетечет в JVM, runtime type information (не знаю как это в Java), пакет java.lang.reflect, Class Loader, управление heap'ом и так далее и так далее.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2015, 17:38 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНафига Вам это нужно? Как гуманитарий, я не могу понять, зачем мне нужно указывать тип переменной, если в переменной хранится только адрес начала объекта в куче? То есть адреса выглядят одинаково - и без разницы что с этого адреса начинается: примитивный тип или объект класса. Кроме того, есть операция приведения типов... Получается, что тип переменной - это не только адрес начала объекта в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2015, 20:48 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
авторПолучается, что тип переменной - это не только адрес начала объекта в памяти. это и размер занимаемой переменной и как интерпретировать данные в памяти при операциях с ними и пр. мелочи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2015, 21:04 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Ваши обрывочные знания перемешаны с непониманием каких-то базовых принципов. летатель космосаПеременные лежат в стеке. Локальные переменные, уж если на то пошло. летатель космосаЭто просто набор байт - адрес в куче, где лежит объект. Допустим. летатель космосаОбъект имеет структуру: поля, их размер, значение. Поля это тоже переменные. летатель космосаВот компилятор получил адрес, перешёл по нему в кучу. Лолшто? Компилятор транслирует Java код в байт-код. Он в кучу по адресу не ходит. Речь про интерпретатор или что? летатель космосаА дальше как он узнает, по какому смещению где что лежит? Какое такое смещение? В переменной не примитивного типа хранится адрес значения в куче. Какое ещё смещение? Относительно начала кучи? Так JVM его знает когда кучу создаёт. летатель космосаЛибо в переменной хранится не только адрес объекта в куче, но и вся структура объекта Переменная ссылочного типа это ссылка, на значение. летатель космосалибо только адрес, а информация о смещениях - где-то ещё, откуда компилятор ее берет вместе с адресом переменной. Читайте статьи по теме, так как ваши собственные догадки с реальностью мало связаны http://programmers.stackexchange.com/questions/65281/stack-and-heap-memory-in-java ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2015, 09:07 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
летатель космосаКакое значение имеет тип переменной для компилятора? Например, "String str;" Тип переменной это опциональная фича языков. Особенно интерпретируемых. Но её прелесть в том что строгая типизация позволяет предотвратить множество ошибок ещё на этапе компиляции. Мне не дано понять как subj связан с текстом вашего вопроса. Вам нужно разобраться в основах - строгая\не строгая типизация, компиляция\интерпретация, ручное и автоматизированное управление памятью, стэк\куча. После этого уже можно будет думать об адресах и организации памяти. Суть Java в том что программисту не нужно знать об адресах, смещениях, и прочих системных вещах. О них заботится JVM и делает она так как ей позволяет делать спецификация. Возможно, вам стоит обратить внимание на С++, чтобы больше понять о компиляции и управлении памятью на низком уровне, если именно это вас интересует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2015, 09:11 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
летатель космосаLeonid KudryavtsevНафига Вам это нужно? Как гуманитарий, я не могу понять, зачем мне нужно указывать тип переменной, Ты ещё гуманитарий, а уже задаёшь правильные вопросы. Молодец! Именно проблема в том, что в 90% в Java тип переменной не нужен. Но Java -- язык, созданный упёртым дуболомом, из-за этого он и получился таким пуленепробиваемо дуболомным, что любой идиот на нём может написать программу, и, если она скомпилируется, то с большой долей вероятности будет после этого работать. Но есть другие языки, похожие на Java, и работающие на JVM, намекаю на Groovy, хотя есть и другие. Там вовсе не обязательно объявлять тип каждой переменной. летатель космосаесли в переменной хранится только адрес начала объекта в куче? То есть адреса выглядят одинаково - и без разницы что с этого адреса начинается: примитивный тип или объект класса. Кроме того, есть операция приведения типов... Получается, что тип переменной - это не только адрес начала объекта в памяти. Ну... Я не знаю, как там в JVM внутри, но можно пофантазировать. Итак, у нас есть два типа переменных -- объекты и элементарные типы (int и так далее). Если нужно обрабатывать объект, достаточно хранить только ссылку (адрес) на него. Тип объекта будет лежать вместе с данными уже в самом объекте. Если нужно обрабатывать элементарный тип, то храниться он может только в стеке, так ? Так. Тогда нам уже достаточно не хранить его тип, а просто иметь значение определённого типа и набор комманд по обработке значения этого типа в P-коде виртуальной машины. Каждой команде достаточно указывать адрес переменной в стеке вирт. машины, а то, какого она типа, уже будет закодировано в самой команде. При этом тип переменной должен быть известен на этапе компиляции компилятору, но на этапе выполнения кода он уже не нужен, на его основе будут сгенерены комманды для обработки переменных этого фиксированного типа. Например, нужно сложить два int и получить результат. Команда p-кода может выглядить так: СЛОЖИТЬ_INT_INT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА. нужно сложить два float СЛОЖИТЬ_FLOAT_FLOAT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА. и так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2015, 10:52 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
MasterZivЕсли нужно обрабатывать элементарный тип, то храниться он может только в стеке, так ? Так. Не "элементарный", а "примитивный". По-твоему в куче нет места примитивам? Тебе не кажется это слегка неправдоподобным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2015, 10:56 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, сформулирую, что уже понимаю (надеюсь): 1. Переменная=локальная переменная. Хранится в стеке. Либо это примитивный тип, либо ссылка на объект в куче. 2. Поле объекта. Если это переменная примитивного типа - она оборачивается в класс-обертку (упаковка в терминах с#). В итоге получается как бы "целостность" объекта - он полностью лежит в куче. Спасибо за ссылку. Ещё не дочитал - по-английски медленно читаю. MasterZivПри этом тип переменной должен быть известен на этапе компиляции компилятору, но на этапе выполнения кода он уже не нужен, на его основе будут сгенерены комманды для обработки переменных этого фиксированного типа. Например, нужно сложить два int и получить результат. Команда p-кода может выглядить так: СЛОЖИТЬ_INT_INT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА. нужно сложить два float СЛОЖИТЬ_FLOAT_FLOAT( АДРЕС_1, АДРЕС_1 ) => АДРЕС_РЕЗУЛЬТАТА. и так далее. Вон оно как... То есть все эти приведения типов проводятся до этапа компиляции, потом уже виртуальная машина в код не вмешивается, ничего не проверяет и не корректирует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2015, 14:49 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
летатель космоса1. Переменная=локальная переменная. Хранится в стеке. Либо это примитивный тип, либо ссылка на объект в куче. Да. летатель космоса2. Поле объекта. Если это переменная примитивного типа - она оборачивается в класс-обертку (упаковка в терминах с#). В итоге получается как бы "целостность" объекта - он полностью лежит в куче. Нет. Примитивы могут лежать в куче без всяких оберток. Просто они не лежат отдельными сущностями, а находятся внутри объектов как поля либо элементы массивов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2015, 15:01 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНет. Примитивы могут лежать в куче без всяких оберток. Тогда отложу этот вопрос на потом - сейчас с этим вопросом разобраться. Из того, что читал, включая соседнюю ветку по c#, тип переменной нужен еще и для определения методов: псевдокод Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Транслятор смотрит, какого типа переменная, идет куда-то, где лежит описание типа Dog, смотрит, есть ли в нем метод method(this, String name)? Если есть, то делает замену вызова метода на: Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2015, 12:14 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2015, 17:56 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevДля Java (и C++) - IMHO все будет немного сложнееРабота компилятора слабо зависит от языка. Компилятор любого языка транслирует высокоуровневое (текстовое) представление в промежуточный или объектный код. В любом случае, компилятор знает представление компилируемых сущностей и решает, что и где будет расположено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2015, 09:31 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
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 и как какой предок туда мог отобразиться - мозгов у меня никогда не хватало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2015, 16:34 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
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 просто разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2015, 16:44 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Alexey TominВ java не решаетРешает - именно компилятор (JLS->байт-код) решает, что и где находится в пуле констант и переменных, а затем, как и положено для промежуточного представления, бэкэнд (JIT или ad-hoc) решает, каким машинным кодом всё это будет представлено. В обоих случаях именно кодогенератор решает, что и где будет находиться. P.S. Кодогенератор - чтобы не зарубаться с интерпретацией ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2015, 18:24 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Тема фейковая от начала и до конца. Вопрос топик стартера задан полностью бредово и противоречиво. Ответить на него, это примерно как ответить на вопрос Карлсона заданный Фрекин Бок "а Вы перестали пить коньяк по утрам? ". Он спрашивает про все, сразу и вперемешку. IMHO Более менее читабельные и относительно корректные ответы уже даны и 17987029 и 18000000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2015, 18:52 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov...В обоих случаях именно кодогенератор решает, что и где будет находиться. P.S. Кодогенератор - чтобы не зарубаться с интерпретацией А у топик стартера вопрос еще более не простой и флеймогонный. Он явно про класс String спрашивает. Вот интересно, кто решает, где объект данного класса будет храниться? Уж явно не компилятор... ))) У меня вообще подозрение, что класс String (как минимум в предыдущих версиях Java) "жестко закоден" в коде JVM. Т.ч. там явно компилятор ничего решать не может ))) Все уже американские (или индусские) программисты за компилятор решили. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2015, 19:02 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevОн явно про класс String спрашивает. Вот интересно, кто решает, где объект данного класса будет храниться? Уж явно не компилятор... )))String - такой же класс, как и любой другой. Вот массивы - да, специальный вид объектов, создаёт которые сама JVM.У меня вообще подозрение, что класс String (как минимум в предыдущих версиях Java) "жестко закоден" в коде JVMНе класс - имя класса. Точно так же, как и Class и ClassLoader.Т.ч. там явно компилятор ничего решать не может )))Ему и не надо ничего решать - это головная боль того, кто реализует библиотеку классов. Компилятор не барон Мюнхаузен и на некоторые вещи он просто обязан опереться. Но реализация этих "некоторых вещей" - в цемент не залита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2015, 16:01 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Не хотел раздувать такую бучу. Как устроена JVM, JIТ и прочее - это для их разработчиков, им лучше знать. BlazkowiczВозможно, вам стоит обратить внимание на С++, чтобы больше понять о компиляции и управлении памятью на низком уровне, если именно это вас интересует. Наверное - не уверен точно. У меня чисто меркантильный маленький интерес, связанный с непониманием механизма приведения типов (включая приведение к интерфейсу) и "как так компилятор определяет, что вот эти методы есть у этого объекта?". Alexey TominВ общем- писать всё лень- топикстартер не понимает заданного вопроса- но всё там просто- можно для начала почитать устройство объектов c++/delphi (последние вообще простые, как табуретка), потом с java просто разобраться. Вот так как вы описали, я почти так и представлял себе механизм (кроме таблицы виртуальных методов). Просто схема. По "устройство объектов С++" нашел интересную статью, но только для с#:)): http://habrahabr.ru/post/263935/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2015, 22:43 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
BlazkowiczMasterZivЕсли нужно обрабатывать элементарный тип, то храниться он может только в стеке, так ? Так. Не "элементарный", а "примитивный". По-твоему в куче нет места примитивам? Тебе не кажется это слегка неправдоподобным? Ну на примитивы нельзя сделать ссылку, т.е. их нельзя разделять между несколькими кусками кода в смысле видимости, поэтому можно предположить, что они могут лежать только в стеке. Разве не так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2015, 22:48 |
|
||
|
Какое значение имеет тип переменной для компилятора? Например, "String str;"
|
|||
|---|---|---|---|
|
#18+
Blazkowiczлетатель космоса1. Переменная=локальная переменная. Хранится в стеке. Либо это примитивный тип, либо ссылка на объект в куче. Да. летатель космоса2. Поле объекта. Если это переменная примитивного типа - она оборачивается в класс-обертку (упаковка в терминах с#). В итоге получается как бы "целостность" объекта - он полностью лежит в куче. Нет. Примитивы могут лежать в куче без всяких оберток. Просто они не лежат отдельными сущностями, а находятся внутри объектов как поля либо элементы массивов. Ну самостоятельно-то они не могут лежать в куче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2015, 22:49 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39024528&tid=2125060]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
215ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 260ms |
| total: | 588ms |

| 0 / 0 |
