java class file format

47
JAVA CHOBO STUDY SEMINAR 2013. 12. Eminency http://cafe.naver.com/javachobostudy

Upload: jongyoung-park

Post on 19-Jan-2015

339 views

Category:

Technology


3 download

DESCRIPTION

Java Class File Format 세미나 자료

TRANSCRIPT

Page 1: Java Class File Format

JAVA CHOBO STUDY SEMINAR2013. 12.

Eminency

http://cafe.naver.com/javachobostudy

Page 2: Java Class File Format

CONTENTS 1. What is ‘Format’2. Bytecode Concept3. Compile4. Class File Format

Page 3: Java Class File Format

WHAT IS ‘FORMAT’

Page 4: Java Class File Format

BYTES 컴퓨터에서 처리되는 모든 것은 byte 의 흐름(Stream)

(File)0x03, 0x22, 0x00, 0x3a, …

(Memory)0xff, 0xdf, 0x32, 0x4a, …

(Network Data)0x9d, 0x34, 0x05, 0x80, …

Page 5: Java Class File Format

그럼 어떤 데이터를 어떻게 구분해서 사용할 수 있지 ?

-> 미리 약속된 DATA FORMAT 에 따라 입출력하게 됨 (NETWORK 의

경우 프로토콜이라고 불림 )

Page 6: Java Class File Format

FILE FORMAT • 8 byte 짜리 파일 “ what.dat”

“0x04, 0x68, 0x9f, 0x6f, 0x79, 0x0a, 0xc8, 0x55”

• Format 을 모르면 무용지물• short(2), int(4), byte(1), byte(1) 일

수도• Double(8) 일 수도• 단지 String 일 수도 있음 (text file)

• 기본적으로 문자 코드 (Ascii code, UTF-8, EUC-KR, …) 로만 이루어져 있으면 텍스트 파일 , 그 외에는 바이너리 파일이라고 보면 됨 .

• 에디터에서 잘 보이면 텍스트 파일 -_-

Page 7: Java Class File Format

FILE FORMAT • 확장자로 파일을 구분하는 것은 ‘사람’을 위한 것

• 누가 야동 파일 확장자를 avi 에서 hwp 로 바꿔 놓으면 어떻게 암 ?

• 군대에서 영창 갈 뻔…

• 리눅스 / 유닉스에서는 ( 주로 알려진 ) 파일 포맷을 검사하는 file 이란 툴 존재

Page 8: Java Class File Format

* JAVA 에서 바이너리 데이터 읽기

• 파일이든 네트웍이든 DataInputStream 쓰면 다 된다 -_-

• 예• readShort() : 2 바이트 읽어서 short

로 리턴해 줌• readInt() : 4 바이트 읽어서 int 로

리턴해 줌

Page 9: Java Class File Format

BYTECODE CONCEPT

Page 10: Java Class File Format

ASSEMBLY • 컴퓨터는 기계어를 이해한다 .• 기계어를 처리하는 것은 CPU 다 .• CPU 는 (32 비트 기준 ) 극단적으로 말해

스위치 32 개를 가진 회로이다 .• 즉 이 32 개의 스위치 -> 32 개의 비트 (4

바이트 ) 를 어떤 방식으로 켜고 끄느냐에 따라 CPU 가 하는 일이 달라진다 .

Page 11: Java Class File Format

ASSEMBLY • 즉 CPU 는 순서대로 들어오는 기계어 명령을 곧이 곧대로 처리할 뿐 , 변수니 함수니 메써드니 클래스니 하는 개념 따위는 전혀 없다 .

• 예 : 2+3 을 실행하면 컴퓨터는 다음과 같이 처리함

1. Stack 에 2 저장 .2. Stack 에 3 저장 .3. Stack 에서 숫자 두 개 빼서 더한 후 결과를

다시 stack 에 저장4. Stack 에서 pop -> 결과는 5

Page 12: Java Class File Format

BYTECODE • JVM Bytecode 도 실행 원리는 어셈블리와 동일 .

• Bytecode 와 stack 과 ‘정해진 갯수’의 임시 변수만 갖고 모두 처리

• 우리가 쓰는 Java Code 는 ‘사람이 보기 편한’ 형태일 뿐 . 사실은 한 마디로 말해서 C 든 Java 든 죄다 컴퓨터가 이해 못하는 언어임 .

Page 13: Java Class File Format

WHY BYTECODE?

• ( 복잡해 보이겠지만 ) 구현이 간단함 .• CPU 가 처리하는 어셈블리 코드랑 형태가

비슷

• 계산기를 프로그래밍한다고 생각해 보면 ,

• 예 : 3+4*2-1• 한 번에 계산식을 읽으면서 중간중간

계산 해서 최종 결과를 내는 방식도 있겠지만

• 계산식이 복잡해질 수록• 4*2 -> (a)• 3 + (a) -> (b)• (b) – 1

• 이런 식으로 작은 수식으로 분해 ( 혹은 트리구조 분해 ) 해서 각각의 계산을 처리하는 방식이 훨씬 용이

• 처음 식이 Java code 라면 작은 수식들이 바이트코드인 셈

Page 14: Java Class File Format

COMPILE PROCESS

Page 15: Java Class File Format

COMPILE? • Source code 를 기계어 파일 – 실행파일이나 라이브러리로 번역하는 과정

• 컴파일의 과정• Tokenizing• Syntax parsing• Optimization• Code Generation

Page 16: Java Class File Format

TOKENIZING • 언어에 정의된 각각의 토큰을 체크하는 과정

• if ( a >= 1) continue;->• IF, LP, STR, GTR, NUM, RP,

CONTINUE, SEMICOL

Page 17: Java Class File Format

PARSING • 각 토큰들이 문법에 맞게 제대로 배치되었는지 확인

• IF, LP, STR, GTR, NUM, RP, CONTINUE, SEMICOL

• 예 )• if 다음엔 반드시 왼쪽 괄호가 오므로

LP 가 아닌 경우 에러• >= 다음엔 숫자 외에도 변수 , 메써드

등이 올 수 있으므로 NUM 이 아닌 경우에도 무조건 에러가 나오진 않음 . 하지만 바로 오른쪽 괄호가 온다면 에러

Page 18: Java Class File Format

SYNTAX TREE

Page 19: Java Class File Format

OPTIMIZATION • 말 그대로 코드 최적화

• 예 )• For 문 100 만번 도는데 안에 a=1

밖에 없다 . -> for 문 삭제• If (a > 0 && a > 1) -> 왼쪽 조건 삭제

• 이런 것들은 SQL 실행시에 DBMS 에서도 수행함

• 사람보다 낫다 -_-

Page 20: Java Class File Format

CLASS FILE FORMAT

Page 21: Java Class File Format

OVERALL FORMAT

Magic number(4)

Minor version(2)

Major version(2)

Constant pool

Access flags(2)

This class(2)

Super class(2)

Interface information

Field information

Method information

Attributes

• (n) = n bytes• 숫자가 없는 필드들은 사이즈 가변

적 , 즉 실제 코드와 비례해서 많아지는 데이터들

Page 22: Java Class File Format

HEADER • Magic Number : class 파일임을 나타내는 특정 숫자 . 무조건 0xCAFEBABE 의 값을 가짐 .

• Major, Minor version : 클래스 파일 포맷 버전 .

• Constant pool : 문자열 상수 및 클래스 이름 , 메써드 이름 등의 정보를 가짐 .

• Access flags : 클래스 접근 권한• This class, super class : 현재 클래스와

부모 클래스 이름 및 정보 . Constant pool의 인덱스 번호임

Page 23: Java Class File Format

ACCESS FLAGS

• 예• 1025 -> 0x0401-> 0x0400 | 0x0001-> public abstract class

값 의미0x0001 public

0x0010 final

0x0020 super

0x0200 interface

0x0400 abstract

Page 24: Java Class File Format

JAVA TYPE SIGNITURE

Signature Type

B byte

C char

D double

F float

I int

J long

L<class name>; class

S short

Z boolean

[ array

Method 의 타입을 표현할 때 이 signature 를 써서 ‘ ( 인자들 ) 리턴형’ 형태로 사용함

Page 25: Java Class File Format

SIGNATURE EXAMPLE

double divide(int i, int j)

-> (II)D

Object mymethod(int i, double d, Thread t)

-> (IDLjava/lang/Thread;)Ljava/lang/Object;

Page 26: Java Class File Format

CONSTANT POOL

Constant Pool Count(2)

Constant Info #1

Constant Info #2

Constant Info #n

전체 POOL 구성

각 Constant Info 구성tag(1)

(constant type 표시 )

data(tag 에 따라 사이즈 다름 )

Page 27: Java Class File Format

CONSTANT TAGType Value

CONSTANT_Class 7

CONSTANT_Fieldref 9

CONSTANT_Methodref 10

CONSTANT_InterfaceMethodref 11

CONSTANT_String 8

CONSTANT_Integer 3

CONSTANT_Float 4

CONSTANT_Long 5

CONSTANT_Double 6

CONSTANT_NameAndType 12

CONSTANT_Utf8 1

각각의 자세한 정보는 JVM specification 참고

Page 28: Java Class File Format

CONSTANT INFO

• 하지만 그냥 넘어가면 서운하니 몇 가지만…

tag(1)

class index(2) -> CP

Name and type index(2) -> CP

CONSTANT_Methodref_Info

tag(1)

name index(2) -> CP

CONSTANT_Class_Info

tag(1)

length(2)

Utf8 string (length)

CONSTANT_Utf8_Info

Page 29: Java Class File Format

CONSTANT INFO EXAMPLE

1) #35 의 tag 10 은 MethodRef 이며 1 은 Class 인덱스 , 36 은 Name and Type 의 인덱스

2) #1 의 tag 는 ClassInfo 이며 index 2 값은 클래스 이름을 가리킴

3) #36 은 NameAndType 이며 이름 인덱스가 37, 타입 인덱스가 22.

index tag Index1(or value)

index2

#1 7 2

#2 1 my/test/Test

#22 1 (II)I

#35 10 1 36

#36 12 37 22

#37 1 add

시작 ->

4) #37 은 ‘ add’ 이며 #22 는 ‘ (II)I’5) 그러므로 #35 가 가리키는 메써드는

my.test.Test 클래스에 속한 int add(int i1, int i2) 임을 알 수 있음 .

* 파라미터의 변수 이름은 현재 단계에서는 알 수 없으나 클래스 파일의 메써드 정보에서 Local Variables 정보로 확인 가능

Page 30: Java Class File Format

CONSTANT IFNO • 복잡해 보이지만 파일 사이즈를 줄이려면 최대한 중복을 줄여야 하니 어쩔 수 없음 .

• Database 설계 및 사용시 중복 데이터를 줄이기 위해 정규화를 하고 각종 테이블로 나눠놓고 또 복잡하게 foreign key 참조해서 join 해서 불러다 쓰고 하는 걸 경험해 본 분들도 계실텐데 결국 같은 사상을 깔고 있는 것임 .

Page 31: Java Class File Format

THIS CLASS, SUPER CLASS

• 각 2 바이트를 차지하는 것에서 유추 가능하듯 , 이 부분은 따로 정보를 갖고 있는게 아니라 각각 Constant Info 의 해당 Class Info 번호를 가리킴

Page 32: Java Class File Format

INTERFACE INFO

• 이 클래스가 구현하는 인터페이스 정보들

• 첫번째 2 바이트는 인터페이스 갯수를 의미하며 , count 수만큼 각 2 바이트의 인터페이스 정보를 가리키는 constant pool 인덱스가 있다 .

• 즉 , this class, super class 와 같은 방식 .

Interface Count(2)

Interface Info #1 (2)

Interface Info #2 (2)

Interface Info #n (2)

Page 33: Java Class File Format

FIELD INFO

• 클래스가 갖고 있는 필드 –인스턴트 변수 및 클래스 변수 - 에 대한 정보 .

Field Count(2)

Field Info #1

Field Info #2

Field Info #n

Access flags(2)

Name index(2) -> CP

Descriptor index(2) -> CP

Attribute count(2)

Attributes[count]

Field Info 전체 구성

각 Field Info 구성

Page 34: Java Class File Format

ACCESS FLAGS

• 예• 25-> 0x0019-> 0x0010 | 0x0008 | 0x0001-> public static final 변수

값 의미0x0001 public

0x0002 private

0x0004 protected

0x0008 static

0x0010 final

0x0040 volatile

0x0080 transient

Page 35: Java Class File Format

METHOD INFO

• 클래스가 갖고 있는 인스턴트 메써드 및 클래스 메써드에 대한 정보 .

• 필드 정보와 구성 동일

Method Count(2)

Method Info #1

Method Info #2

Method Info #n

Access flags(2)

Name index(2) -> CP

Descriptor index(2) -> CP

Attribute count(2)

Attributes[count]

Method Info 전체 구성

각 Method Info 구성

Page 36: Java Class File Format

ACCESS FLAGS 값 의미0x0001 public

0x0002 private

0x0004 protected

0x0008 static

0x0010 final

0x0020 synchronized

0x0100 native

0x0400 abstract

0x0800 strictfp

Page 37: Java Class File Format

ATTRIBUTE• 클래스 , 메써드 , 필드의 기본 정보

( 접근 권한 , 타입 등 ) 이외에 추가적인 속성에 대한 정보가 기록됨

• 속성이 속성을 또 가질 수 있음 .

• 속성이란 단어를 쓰지만 필수적인 정보들도 있음

- 예를 들어 메써드 같은 경우는 Code 란 속성이 필수적이며 Code 는 LineNumberTable, LocalVariableTable 에 대한 속성이 있음 .

Page 38: Java Class File Format

ATTRIBUTE

Attribute Name Index (2)

Attribute Length (4)

Attribute Data

Attribute Name 에 따라 Data 구성은 다름

종류 (Name) 의미ConstantValue 상수값

Code 메써드의 바이트코드Exceptions 예외들

InnerClasses 내부 클래스Synthetic

SourceFile 소스 파일 정보LineNumberTable 바이트 코드와

매칭되는 실제 소스 코드 라인번호

LocalVariableTable 지역변수 정보Deprecated

Page 39: Java Class File Format

CODE ATTRIBUTE

Name index(2)

Attribute Length(4)

Max Stack(2)

Max Local(2)

Code Length(4)

Code

Exception Table

Attributes

Page 40: Java Class File Format

METHOD DECOMPILE EXAMPLE

Method Info

Access flags : public

Name : minus

Type : (II)I

Max stack : 2

Max local : 3

Code:0x1B0x1C0x640xAC

LocalVariableTable

Start PC

Length Name Type Index

0 4 this Lmy/test/Test; 0

0 4 a I 1

0 4 b I 2

LineNumberTable

Start PC

Line

0 7

Page 41: Java Class File Format

METHOD DECOMPILE EXAMPLE(CODE 설명 )

• 0x1B (iload_1) -> local 변수 1 을 스택에 로드

• 0x1C (iload_2) -> local 변수 2 를 스택에 로드

• 0x64 (isub) -> stack 에서 두 개의 아이템을 꺼내 뺄셈하고 결과를 다시 stack 에 넣음

• 0xAC (ireturn) -> stack 의 아이템을 메써드 결과값으로 리턴

Page 42: Java Class File Format

METHOD DECOMPILE EXAMPLE

#1

• 0x1B (iload_1) -> local 변수 1 을 스택에 로드

변수 1 은 LocalVariableTable 에 따라 int a

STACK

a

Page 43: Java Class File Format

METHOD DECOMPILE EXAMPLE

#2

• 0x1C (iload_2) -> local 변수 2 를 스택에 로드

변수 2 는 LocalVariableTable 에 따라 int b

STACK

ba

Page 44: Java Class File Format

METHOD DECOMPILE EXAMPLE

#3

• 0x64 (isub) -> stack 에서 두 개의 아이템을 꺼내 뺄셈하고 결과를 다시 stack 에 넣음

STACK

ba

a - b

Page 45: Java Class File Format

METHOD DECOMPILE EXAMPLE

#4

• 0xAC (ireturn) -> stack 의 아이템을 메써드 결과값으로 리턴

STACK

a - b

return

Page 46: Java Class File Format

METHOD DECOMPILE EXAMPLE

#5

• 메써드 정보에서 이 메써드의 이름이나 타입을 모두 알 수 있음 .

• 메써드 signature 와 LocalVariableTable 를 비교해서 인자 변수 이름도 모두 파악 가능

• LineNumberTable 과 대조해 보면 한 줄짜리 메써드라는 것이 파악됨 .

결과 ) my.test.Test 클래스 안의 7 번째 라인의 minus 메써드 .

public int minus(int a, int b) { return a-b;}

Page 47: Java Class File Format

REFERENCES• Java VM spec : http://goo.gl/52JCW

• Wikipedia Bytecode Instruction : http://goo.gl/pncN9

• Demo Code : https://code.google.com/p/javaseminar/