LINUX.ORG.RU

Аналог godbolt.org для Java/JVM

 ,


0

3

На godbolt.org есть Java, но там показан байткод, а я хочу увидеть результат C2 компилятора JVM, нативный ассемблер. Есть такое?

★★★★★

Последнее исправление: MOPKOBKA (всего исправлений: 2)

Оно?

$ go tool objdump chub | grep main.go | head
TEXT main.fatal(SB) /tmp/main.go
  main.go:62		0x45ab80		493b6610		CMPQ SP, 0x10(R14)			
  main.go:62		0x45ab84		0f86d2000000		JBE 0x45ac5c				
  main.go:62		0x45ab8a		55			PUSHQ BP				
  main.go:62		0x45ab8b		4889e5			MOVQ SP, BP				
  main.go:62		0x45ab8e		4883ec48		SUBQ $0x48, SP				
  main.go:62		0x45ab92		48895c2460		MOVQ BX, 0x60(SP)			
  main.go:62		0x45ab97		48897c2470		MOVQ DI, 0x70(SP)			
  main.go:62		0x45ab9c		48894c2468		MOVQ CX, 0x68(SP)			
  main.go:62		0x45aba1		4889442458		MOVQ AX, 0x58(SP)			
go tool objdump: signal: broken pipe

urxvt ★★★★★
()

Компилятор джавы генерирует именно байткод. Нативный код, если и появляется, то только внутри виртуальной машины, и не надо считать эту штуку компилятором. Это оптимизатор, который в зависимости от чего угодно может принять решение оптимизировать работу проги методом замены какого-то куска интерпретируемого байткода на некий нативный код для текущего проца. А может и не принять.

В любом случае, если ты задаёшь такие вопросы, то ничего полезного ты в этих дампах не найдёшь, так что забей.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

В терминологии HotSpot это называется компилятором, попробуй игнорировать темы в которых мало что понимаешь.

Попробуй сам. «Терминология HotSpot» много где отличается от общепринятой, потому что она пришла от коммерсов, и приличные люди в технических обсуждениях к ней не прибегают. Вообще говоря, приличные люди о терминологии вообще никогда не спорят, поэтому не вижу смысла объяснять почему это не компилятор.

anonymous
()
Ответ на: комментарий от urxvt

Компилятором обычно называют штуку, которая из какаго-то высокоуровневого представления делает бинарник. Если же речь про избирательную компиляцию кусков кода в реальном времени - это называют jit-компиляцией, и приставка «jit-» тут существенна и неотделима. Ну, ты конечно можешь про неё забыть и начать придираться к словам, но в таком виде это не общепринятый термин.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от urxvt

Компиляция (программирование) — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера), выполняемая компилятором.

Поэтому «jit-компиляция» это не компиляция. Как NFS не файловая система. Но, как уже заметили выше, спор о терминах - признак профнепригодности. Я-то не претендую, а вот тебе это совсем не нужно.

anonymous
()

JVM (Java Virtual Machine) выполняет байт код. В ней нет понятия «нативного ассемблера». JVM бывают разные от разных «производителей» и они оперируют этим самым кодом каждый по своему.

Хотеть увидеть «нативный ассемблер» для java байткода, тоже самое что хотеть увидеть «нативный ассемблер» для JavaScript или какого-нить лиспа из емакса и т.п.

Сделать для Java бинарную запускалку одно время было можно это называлось «ahead-of-time компилятор», но после Java 1.8 таких вещей я не встречал - 1.8 очень много добавила, потом появились модули, потом пришёл Оракл и стал печь версии как пирожки и бинарные запускался по факту умерли.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от vtVitus

Хотеть увидеть «нативный ассемблер» для java байткода, тоже самое что хотеть увидеть «нативный ассемблер» для JavaScript или какого-нить лиспа из емакса и т.п.

Можешь перейти на godbolt.org и увидеть нативный ассемблер для JavaScript V8.

Уверен elisp после перехода на gccjit тоже позволяет вызвать какой нибудь disassebmly, если поискать в интернете, то можно даже быстро найти https://akrl.sdf.org/img/disass.png

У node.js есть удобные флаги для просмотра ассемблера от V8.

JVM (Java Virtual Machine) выполняет байт код.

Это абсолютно бесполезная информация, речь о реальных реализациях, прежде всего интересует HotSpot. Увидеть ассемблерный код можно, и даже выше написали как, но через дамп в мегабайты смотреть его неприятно, ищу более приятные инструменты.

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 5)
Ответ на: комментарий от MOPKOBKA

Ты понимаешь, что такое «JavaScript V8», а именно V8? Если бы понимал, то задавал бы вопрос аля ассемблерный код который выполняет <имя рек конкретной реализации jvm машины> или gccjit или что-то другое. Просить asm для современные jvm бред.

«Ассемблерный код» для HotSpot полный бред для любого, кто хоть немного понимает, что такое HotSpot и как он работает.

Ещё раз - в старых версиях jvm на твой вопрос можно было натянуть какой никакой, но смысл. Сейчас под текущие jvm твой вопрос полный бред.

В общем гугли что такое AOT – Ahead-of-Time и не дрючь другим мозги.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от vtVitus

Ты понимаешь, что такое «JavaScript V8», а именно V8?

Да, в отличие от тебя, ведь именно ты усомнился в том что можно продемонстрировать ассемблерный выхлоп для JS и Elisp JIT.

вопрос аля ассемблерный код который выполняет <имя рек конкретной реализации jvm машины>

Если следовать этой логики, то нельзя задавать такой же вопрос о С++, потому что он может и интерпретироваться, и компилироваться в байткод. Предлагаю добавить меня в игнор лист если не нравится как я задаю вопросы. В нем кстати указан C2, он хорошо обозначает о чем я говорю.

«Ассемблерный код» для HotSpot полный бред для любого, кто хоть немного понимает, что такое HotSpot и как он работает.

Если для тебя это бесполезная информация, в силу непонимания, то это не значит что другие не смогут из этого что то извлечь.

C/C++ компиляторы тоже имеют разные реализации, pgo, ipo, попробуй для начала добиться закрытия godbolt.

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 3)

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

P.S.: Вот ссылка, неужели так сложно поискать dump assembly openjdk в гугле?

jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 1)
Ответ на: комментарий от vtVitus

Ты понимаешь, что такое «JavaScript V8», а именно V8? Если бы понимал, то задавал бы вопрос аля ассемблерный код который выполняет <имя рек конкретной реализации jvm машины> или gccjit или что-то другое. Просить asm для современные jvm бред.

Не пиши сюда больше, пожалуйста. Всё что ценного можно извлечь из твоих некомпетентных заявлений - что в Java есть свои нюансы, в частности актуальный машинный код следует извлекать во время выполнения приложения, ибо в любых других ситуациях его может просто не быть.

«Ассемблерный код» для HotSpot полный бред для любого, кто хоть немного понимает, что такое HotSpot и как он работает.

Для любого кто хоть немного понимает, как работает процессор, очевидно что если есть код который напрямую на нём исполняется, его можно посмотреть. Для любого, кто хоть немного понимает, что такое HotSpot и как он работает, очевидно что такой код во время её работы есть. Ты же даже немного не понимаешь ни в том, ни в другом.

anonymous
()
Ответ на: комментарий от MOPKOBKA

Я вам указал на способ. А вам хочется чтобы подали на блюдечке, да еще и бесплатно. Если вам хочется онлайн сервис, то делайте сами. Или занесите много денег godbolt чтобы они сделали сомнительную и никому не нужную фичу для одного человека.

jpegqs
()
Ответ на: комментарий от jpegqs

Ты указал ссылку из гугла. Ты реально думаешь что только у тебя гугл есть?

да еще и бесплатно

Ты где то увидел это слово в вопросе? Переставай засорять тред.

MOPKOBKA ★★★★★
() автор топика
Последнее исправление: MOPKOBKA (всего исправлений: 1)