Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работаем с байткодом 
:(
    Опции темы
 
Была ли данная информация вам интересна?
Да [ 72 ]  [84.71%]
Нет [ 4 ]  [4.71%]
По барабану [ 9 ]  [10.59%]
Всего проголосовавших: 85
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
Sardar
Дата 29.11.2004, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата(Domestic @ 29.11.2004, 01:50)
Оператор деления лонгов возвращает лонг, как и оператор деления интов возвращает инт

Дык это же целое или я чего то не понял ? smile А целое с натяжкой можно обратит в вещественное, ну и "угадать" остаток самому...
Цитата(Domestic @ 29.11.2004, 01:50)
Такие вещи - проблема программиста, задача компилятора - скомпилировать, а оптимизацией займется JIT (just in time compiler). Нужен супероптимальный код - посмотри байткод и исправь  Хотя выигрыш тут будет никакой.

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

Цитата(Domestic @ 29.11.2004, 06:07)
public Test();
Code:
  Stack=1, Locals=1, Args_size=1
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return

А что если я не сгенерю(не Sun Java SDK) инициализатор предка/Object? Вроде как с памятью и всё такое проблему будут...

Цитата(Domestic @ 29.11.2004, 06:07)
Массив локальных переменных нового фрейма получает содержимое стека предыдущего фрейма.

Цитата(Domestic @ 29.11.2004, 00:30)
Кстати, перемещения константы-> стек->массив->стек вполне нормальная вещь, если помнить, что со стеком можно сделать только 2 вещи: положить в него, и взять оттуда. Любая операция, не ложащая че-нибудь на стек, забирает оттуда переменную.

Видим противоречие... Стек становится массивом, не копируется, ни на какой платформе не копируется, иначе прога будет исполнятся годами smile
Аппаратно х86(да и другие) поддерживают бег с индексом в стеке, иначе это бесполезный в обычной жизни стек(мы же не теоретики). Значит по стеку можно бегать, так зачем при вычислениях эти "туды-сюды"?


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Domestic Cat
Дата 29.11.2004, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата
Дык это же целое или я чего то не понял ?  А целое с натяжкой можно обратит в вещественное, ну и "угадать" остаток самому...


я к тому, чтo в Java long/long = long, что делается опкодом ldiv. Такое деление быстрее.
Цитата
Выигрышь будет хороший если подобным образом будет экономится память в тысячах методов

Дык ведь это автоматичскиe переменные, когдa метод завершется, они выбрасываются. smile Возможно, для какoгo-нибудь рекурсивного алгоритмa так оно и будеt - метод вызываеt сам себя скажm 1000 раз, и нa стек помещается 1000 фреймов с 1000 ненужных переменных - ну так программер и должеn следит' зa этим. И без байткодa ясно, что объявление лишних локальных переменных ест стек

Цитата
Видим противоречие... Стек становится массивом, не копируется, ни на какой платформе не копируется, иначе прога будет исполнятся годами

А я развe где-тo писаl, что копируется smile Под "становится" подразумевалось "перемещается в".
Цитата
Аппаратно х86(да и другие) поддерживают бег с индексом в стеке, иначе это бесполезный в обычной жизни стек(мы же не теоретики). Значит по стеку можно бегать, так зачем при вычислениях эти "туды-сюды"?

Но ведь JVM - это абстрактная, кроссплатформенная машина smile


--------------------

PM   Вверх
polosatij
Дата 29.11.2004, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Domestic @ 27.11.2004, 07:24)
Поскольку опкод может также иметь аргументы, нумерация идет с разрывами: например код
Код

putfield #4;



запишется так:

Код

{..., 181, 0, 4, ...}



Если 181 (putfield) - седьмой элемент массива, то вместе с аргументом он займет 3 байта.


Domestic Cat, ты не мог бы обьяснить.. (либо я просто где-то что-то упустил)


хм.. чего-то я недопонял smile
как это седьмой элемент и 3 байта? ссылка на адрес в памяти?

что занимает 3 байта smile

Это сообщение отредактировал(а) polosatij - 29.11.2004, 21:26


--------------------
PM   Вверх
Domestic Cat
Дата 29.11.2004, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Код метода записывается в виде массива, индексы которого в дизассемблированном коде стоят слева:
Код

  1:      invokespecial        #1; //Method java/lang/Object."<init>":()V
   4:    aload_0
   5:      new        #2; //class Object
   8:    dup
...


В этом массиве записаны те самые инструкции что tы видишь здесь, точнее иx эвиваленты - числа типa byte. Напримeр invokespecial = 183 (0xb7), сидiт в ячейкe массива 1. Поскольку у него ест' аргумent, тo вся инструкция займet 3 байтa: 183, 0, 1, ....



--------------------

PM   Вверх
Domestic Cat
Дата 29.11.2004, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Играем с байткодом, или BCEL

BCEL - Byte Code Engeneering Library - проект Apache, который позволяет относительно просто работать с байткодом: создавать, удалять, редактировать методы в класс файлах, менять констант пул, добавлять/убирать поля, менять наследование, в общем, делать с байткодом практически все что угодно - и делать все это динамически.
Кроме того, он содержит ряд полезных утилит. Например, Class2HTML позволяет просмотреть байткод класса в HTML формате:
Код

cat> java org.apache.bcel.util.Class2HTML MyClass.class

BCELifier перегоняет класс в java-файл, который при запуске сгенерировал бы такой класс-файл.
Код

cat> java org.apache.bcel.util.BCELifier MyClass.class >> MyClassBCEL.java


Пример.
Есть простенкий код:

Код

public class SimpleClass
{  
   public void printIt()
   {
       System.out.println("Hello");
   }
   
   public static void main(String [] args)
   {
       new SimpleClass().printIt();
   }
}

который выводит в консоль слово Hello. Предположим мы его скомпилировали, а сорец удалили.
С помощью BCEL в этом файле я удаляю метод printIt и заменяю его на метод printIt, выдающий в консоль Hello from Domestic Cat:

Код

import java.io.*;
import org.apache.bcel.classfile.*;
import org.apache.bcel.generic.*;
import org.apache.bcel.Constants;

public class Changer
{
   
   private static void changeMethod(ClassGen classGen, Method oldMethod)
   {
       InstructionFactory iFactory = new InstructionFactory(classGen);
       ConstantPoolGen poolGen = classGen.getConstantPool();
       String className = classGen.getClassName();
       classGen.removeMethod(oldMethod);
       
       InstructionList iList = new InstructionList();
       MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS,
new String[] {  }, "printIt", "SimpleClass", iList, poolGen);
       InstructionHandle iHandle = iList.append(iFactory.createFieldAccess("java.lang.System", "out",
new ObjectType("java.io.PrintStream"), Constants.GETSTATIC));
       iList.append(new PUSH(poolGen, "Hello from Domestic Cat"));
       iList.append(iFactory.createInvoke("java.io.PrintStream", "println", Type.VOID, new Type[]
{ Type.STRING }, Constants.INVOKEVIRTUAL));
       InstructionHandle iHandle2 = iList.append(iFactory.createReturn(Type.VOID));
       method.setMaxStack();
       method.setMaxLocals();
       classGen.addMethod(method.getMethod());
       iList.dispose();
   }
   
   public static void main(String[] args)
   {
       try
       {
           JavaClass javaClass = new ClassParser("SimpleClass.class").parse();
           ClassGen classGen = new ClassGen(javaClass);
           Method[] methods = javaClass.getMethods();
           if (methods[1].getName().equals("printIt"))
           {
               changeMethod(classGen, methods[1]);
               FileOutputStream fos = new FileOutputStream("SimpleClass.class");
               classGen.getJavaClass().dump(fos);
               fos.close();
           }
           else
           {
               System.out.println("Cannot find the method");
           }
       }
       catch (IOException e)
       {
           e.printStackTrace();
       }
   }
}

(Программа перезапишет исходный класс! ).

Оба сорца в аттачменте.

Это сообщение отредактировал(а) Domestic Cat - 29.11.2004, 22:27

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Archive_2.zip


--------------------

PM   Вверх
Domestic Cat
Дата 30.11.2004, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Я че хочу спросить: стоит ли продолжать? Большую часть инфы можно почерпнуть из спецификации, а тут довольно сумбурно получается.


--------------------

PM   Вверх
Sleepy_PIP
Дата 30.11.2004, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Domestic @ 30.11.2004, 05:45)
Я че хочу спросить: стоит ли продолжать? Большую часть инфы можно почерпнуть из спецификации, а тут довольно сумбурно получается.

мое мнение - очень важная тема и интересно изложена. т.е. продолжать по возможности надо ... Спасибо!



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Sardar
Дата 30.11.2004, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Domestic Cat если есть время, то продолжай, интересно. Сам я пока в спецификацию не полезу, другим занят smile Но почитать, обдумать, усвоить на примерах хочется.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sleepy_PIP
Дата 30.11.2004, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(Sleepy_PIP @ 30.11.2004, 09:02)
Цитата(Domestic @ 30.11.2004, 05:45)
Я че хочу спросить: стоит ли продолжать? Большую часть инфы можно почерпнуть из спецификации, а тут довольно сумбурно получается.

мое мнение - очень важная тема и интересно изложена. т.е. продолжать по возможности надо ... Спасибо!

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


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
polosatij
Дата 30.11.2004, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Domestic @ 30.11.2004, 05:45)
стоит ли продолжать?


я за smile smile

скажи, откуда ты взял полную спецификацию кодов?
например:

dup - создается дубликат на стеке smile


--------------------
PM   Вверх
Domestic Cat
Дата 30.11.2004, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата
скажи, откуда ты взял полную спецификацию кодов?
например:


В той же спецификации:

http://java.sun.com/docs/books/vmspec/2nd-...tions2.doc.html

Ок, в таком случае я продолжу - про то. как компилятся различые структуры в байткод. Я начну с того что есть в спеке, а затем перейду к внутренним классам и Java 5.0. Только делать я смогу это из дома smile


--------------------

PM   Вверх
polosatij
Дата 30.11.2004, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Domestic @ 30.11.2004, 16:03)
В той же спецификации:

http://java.sun.com/docs/books/vmspec/2nd-...tions2.doc.html


пасиба smile


декомпилировал несколько классов и увидел (к примеру) следующий bytecode:

10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_1
14: invokevirtual #7; //Method test:()I
17: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
20: nop
21: return

1.ты не скажешь, зачем nop? в спецификации: Do nothing
зачем терять байты?

2. возможна ли обратная конвертация всего в класс стандартными утилитами SUN ?




--------------------
PM   Вверх
Domestic Cat
Дата 30.11.2004, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата
1.ты не скажешь, зачем nop? в спецификации: Do nothing
зачем терять байты?


А можно java код посмотреть? smile
Цитата
2. возможна ли обратная конвертация всего в класс стандартными утилитами SUN ?


Для этого есть декомпиляторы, их можн найти тут:

http://www.thefreecountry.com/programming/javatools.shtml

Немного не о декомпиляции, но зато забавнo: Jamaica


--------------------

PM   Вверх
polosatij
Дата 30.11.2004, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Domestic @ 30.11.2004, 23:16)
А можно java код посмотреть? 


Код

package example;

public class Main {
 public int test() {
   System.out.println("HI :)");
   return 111;
 }
 
 public static void main(String[] args) {
   Main main= new Main();
   double i=0;
   System.out.println(main.test());
 }
}


Код

Compiled from "Main.java"
public class example.Main extends java.lang.Object
 SourceFile: "Main.java"
 minor version: 0
 major version: 0
 Constant pool:
const #1 = Method #9.#27; //  java/lang/Object."<init>":()V
const #2 = Field #28.#29; //  java/lang/System.out:Ljava/io/PrintStream;
const #3 = String #30; //  HI :)
const #4 = Method #31.#32; //  java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class #33; //  Main
const #6 = Method #5.#27; //  example/Main."<init>":()V
const #7 = Method #5.#34; //  example/Main.test:()I
const #8 = Method #31.#35; //  java/io/PrintStream.println:(I)V
const #9 = class #36; //  Object
const #10 = Asciz <init>;
const #11 = Asciz ()V;
const #12 = Asciz Code;
const #13 = Asciz LineNumberTable;
const #14 = Asciz LocalVariableTable;
const #15 = Asciz this;
const #16 = Asciz Lexample/Main;;
const #17 = Asciz main;
const #18 = Asciz ([Ljava/lang/String;)V;
const #19 = Asciz args;
const #20 = Asciz [Ljava/lang/String;;
const #21 = Asciz i;
const #22 = Asciz D;
const #23 = Asciz test;
const #24 = Asciz ()I;
const #25 = Asciz SourceFile;
const #26 = Asciz Main.java;
const #27 = NameAndType #10:#11;//  "<init>":()V
const #28 = class #37; //  System
const #29 = NameAndType #38:#39;//  out:Ljava/io/PrintStream;
const #30 = Asciz HI :);
const #31 = class #40; //  PrintStream
const #32 = NameAndType #41:#42;//  println:(Ljava/lang/String;)V
const #33 = Asciz example/Main;
const #34 = NameAndType #23:#24;//  test:()I
const #35 = NameAndType #41:#43;//  println:(I)V
const #36 = Asciz java/lang/Object;
const #37 = Asciz java/lang/System;
const #38 = Asciz out;
const #39 = Asciz Ljava/io/PrintStream;;
const #40 = Asciz java/io/PrintStream;
const #41 = Asciz println;
const #42 = Asciz (Ljava/lang/String;)V;
const #43 = Asciz (I)V;

{
public example.Main();
 Code:
  Stack=1, Locals=1, Args_size=1
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: nop
  5: return
 LineNumberTable:
  line 3: 0
  line 14: 4
 LocalVariableTable:
  Start  Length  Slot  Name   Signature
  0      6      0    this       Lexample/Main;

public static void main(java.lang.String[]);
 Code:
  Stack=2, Locals=4, Args_size=1
  0: new #5; //class Main
  3: dup
  4: invokespecial #6; //Method "<init>":()V
  7: astore_1
  8: dconst_0
  9: dstore_2
  10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  13: aload_1
  14: invokevirtual #7; //Method test:()I
  17: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
  20: [b]nop[/b]
  21: return
 LineNumberTable:
  line 10: 0
  line 11: 8
  line 12: 10
  line 13: 20
 LocalVariableTable:
  Start  Length  Slot  Name   Signature
  0      22      0    args       [Ljava/lang/String;
  8      13      1    main       Lexample/Main;
  10      11      2    i       D

public int test();
 Code:
  Stack=2, Locals=1, Args_size=1
  0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  3: ldc #3; //String HI :)
  5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  8: bipush 111
  10: ireturn
 LineNumberTable:
  line 5: 0
  line 6: 8
 LocalVariableTable:
  Start  Length  Slot  Name   Signature
  0      11      0    this       Lexample/Main;

}


Цитата(Domestic @ 30.11.2004, 23:16)
Для этого есть декомпиляторы, их можн найти тут:

http://www.thefreecountry.com/programming/javatools.shtml

Немного не о декомпиляции, но зато забавнo: Jamaica


фууф.. документацией закидал smile нужной документацией.. потопал читать дальше smile



--------------------
PM   Вверх
Domestic Cat
Дата 30.11.2004, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



А какая у тебя JDK? 1.4.03 выдает вот что:
Код

// только байткоd
Compiled from "Main.java"
public class example.Main extends java.lang.Object{
public example.Main();
 Code:
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return

public int test();
 Code:
  0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  3: ldc #3; //String HI :)
  5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  8: bipush 111
  10: ireturn

public static void main(java.lang.String[]);
 Code:
  0: new #5; //class Main
  3: dup
  4: invokespecial #6; //Method "<init>":()V
  7: astore_1
  8: dconst_0
  9: dstore_2
  10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  13: aload_1
  14: invokevirtual #7; //Method test:()I
  17: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
  20: return

}



--------------------

PM   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1047 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.