== jasmin == * assembler for java vm * jasminì—서 사용하는 ë°”ì´íŠ¸ì½”ë“œë¡œ ëœ .j(jasmin assembly) 파ì¼ì„ .class(JVM bytecode) 파ì¼ë¡œ 만들어주는 ì—í• . * JVMì—서 ê³µì‹ ì–´ì…ˆë¸”ë¦¬ í¬ë§·ì„ 공개한 ê²ƒì´ ì—†ê¸° 때문. * .class ì—서 .j를 만들어주는 classfileanalyzer ë¼ëŠ” ê²ƒë„ ìžˆìŒ. == ClassFileAnalyzer == * .java --( javac ) --> .class * .j --(classFileAnalyzer/jasper/..) --> .class * classFileAnalyzerì— .classì„ ì¤˜ì„œ 실행하면 assembly codeê°€ ìƒì„±ë¨ == 왜 jasminì„ ì“°ëŠ”ê°€? == * 컴파ì¼ëŸ¬ë¥¼ ë§Œë“ ë‹¤ê³ í–ˆì„ ë•Œ ì‹¤ì œë¡œ high level언어ì—서 ë¨¸ì‹ ì½”ë“œê¹Œì§€ 만드는 경우는 별로 ì—†ìŒ. * ë¨¸ì‹ ì½”ë“œë¥¼ ìƒì„±í•˜ëŠ” ë¶€ë¶„ì€ í•´ë‹¹ ê¸°ê¸°ì— ì˜ì¡´í•˜ëŠ” ë¶€ë¶„ì´ ìžˆê¸° ë•Œë¬¸ì— ì‹¤ì œë¡œëŠ” 어셈블리까지 ë§Œë“¤ê³ ê·¸ ì´í›„ì— ë¨¸ì‹ ì½”ë“œë¥¼ 만드는 ë¶€ë¶„ì€ ë”°ë¡œ ë§Œë“ ë‹¤ê³ í•¨. == javap == * javaì˜ .class 파ì¼ì„ ì—어셈블 하는 프로그램. 콘솔ì—서 사용 (prints java's descriptions) {{{ javap JavapTest.class // signature ë§Œ 표시ë¨. ì‹¤ì œ ë‚´ìš©ì€ ì•ˆë‚˜ì˜¤ê³ ì„ ì–¸ë§Œ. javap -c JavapTest.class // ì‹¤ì œ .class파ì¼ì˜ ë‚´ìš©ì´ ë°”ì´íЏ 코드 수준으로 표시ë¨. }}} == translate와 compileì˜ ì°¨ì´ == * high levelì—서 high level로 변환하는 ê²ƒì€ ì¼ë°˜ì 으로 translate * high levelì—서 low level로 변환하는 ê²ƒì„ ì£¼ë¡œ compileì´ë¼ê³ ë§í•¨. * high levelê³¼ low levelì˜ ì°¨ì´ëŠ” ì‹¤ì œ ë¨¸ì‹ ì—서 수행ë 형태ì¸ê°€ ì•„ë‹Œê°€ì˜ ì—¬ë¶€. == GCC Verbose == * gccì˜ -v 옵션 {{{ gcc -v VerboseTest.c -o VerboseTest // 와 ê°™ì€ í˜•íƒœë¡œ 콘솔ì—서 실행 }}} * 실행 시 리눅스 기준으로 COLLECT_GCC_OPTIONSì— /tmp/ccIVwQV1.s 와 ê°™ì€ í˜•íƒœë¡œ .s 파ì¼ì„ ìƒì„±í•˜ëŠ” ê²ƒì„ ë³¼ 수 있ìŒ. * 해당 .s파ì¼ì„ ì¶œë ¥í•´ë³´ë©´ 어셈블러 코드가 ì¶œë ¥ë¨. * .c -> FE -> BE -> assembly file -> assembler -> machine code ì—서 assembly fileì˜ ìƒì„±ê¹Œì§€ê°€ ccì˜ ì—í• . ì´í›„ .s를 .o로 만드는 ê²ƒì´ ì–´ì…ˆë¸”ëŸ¬ê°€ 하는 ì—í• . 윈ë„ìš°ì—서는 윈ë„ìš°ì— ë§žëŠ” ë¨¸ì‹ ì½”ë“œë¥¼ 만들기 위한 다른 어셈블러가 실행ë¨. # cc(c컴파ì¼ëŸ¬)로 어셈블리파ì¼ì„ 만듦 {{{ // macì—서 수행시. /usr/llvm-gcc-4.2/bin/../libexec/gcc/i686-apple-darwin11/4.2.1/cc1plus -quiet -v -imultilib x86_64 -iprefix /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/ -D__DYNAMIC__ nca.cpp -fPIC -quiet -dumpbase nca.cpp -mmacosx-version-min=10.8.5 -m64 -mtune=core2 -auxbase nca -version -D__private_extern__=extern -o /var/folders/zn/v_hqwzws1nx4l19qsdz86xn80000gn/T//ccGprRXs.s }}} * .s 파ì¼ì€ assembly íŒŒì¼ {{{ /var/folders/zn/v_hqwzws1nx4l19qsdz86xn80000gn/T//ccGprRXs.s }}} * s파ì¼ë¡œ 다시 o 파ì¼ì„ 만듦 {{{ /usr/llvm-gcc-4.2/bin/../libexec/gcc/i686-apple-darwin11/4.2.1/as -arch x86_64 -force_cpusubtype_ALL -o /var/folders/zn/v_hqwzws1nx4l19qsdz86xn80000gn/T//ccrYBpRg.o /var/folders/zn/v_hqwzws1nx4l19qsdz86xn80000gn/T//ccGprRXs.s }}} == java bytecode == mnemonic : 작업 수행, opcodeë“¤ì´ mnemonic - dup : stackì˜ íƒ‘ì„ ìŠ¤íƒì— ë³µì œ, directive : 지시어, assemblerì—게 ì§€ì •í•˜ëŠ” ëª…ë ¹ì–´, .으로 시작 opcode(operator) operand * bytecode instruction list ([http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings ì°¸ê³ ]) * new mnemonicê³¼ invokespecial 다른ì - new는 ê°ì²´ë¥¼ ë©”ëª¨ë¦¬ì— í• ë‹¹, - invokespecial <init>ì€ í• ë‹¹ëœ ê°ì²´ë¥¼ 초기화 * invokestaticì€ thisê°€ 필요없다! # invokevirtual * invokespecial VS invokevirtual invokespecial - invokespecialì€ ìŠ¤íƒì˜ top를 파ë¼ë©”터로 ë°›ê³ , 스íƒì˜ topì—서 ë‘번째를 this(initì˜ ì£¼ì²´)로 쓴다. <- dup를 하는 ì´ìœ - ìƒì„±ìžëŠ”void return invokevirtual - ëª¨ë“ ê°ì²´ì˜ 함수는 invokevirtual - virtualì´ëž€ 실행ë 함수를 compile ì‹œê°„ì— ê²°ì •í• ìˆ˜ ì—†ê³ run timeì— ê²°ì •. (vtable lookup, c는 virtual 함수만 vtableì— ê¸°ë¡ë¨) invokeinterface - 구체 í´ëž˜ìŠ¤ë¥¼ this로 받아야함 * ë ˆí¼ëŸ°ìФ 타입 ([http://en.wikipedia.org/wiki/Java_bytecode ì°¸ê³ ]) Ljava/io/InputStream <- java/io/InputStreamì˜ ë ˆí¼ëŸ°ìФ - 스íƒì— ê°ì²´ì˜ 주소가 들어있ìŒ. premitive 변수가 아니면 ì „ë¶€ ë ˆí¼ëŸ°ìФ 타입 - ë©”ì„œë“œì˜ ìœ„ì¹˜ë¥¼ 나타낼때는 java/io/InputStream/read ì´ëŸ°ì‹ìœ¼ë¡œ. * jvmì˜ data type int : I int[] : [I String : Ljava/lang/string; String[][] : [[Ljava/lang/string; * jvmì˜ í•¨ìˆ˜ java/lang/string.length(V)I <- bytecode는 알수없는 코드로 구분, jasminì€ /로 구분 () ê´„í˜¸ì•ˆì— íŒŒë¼ë©”í„° astore_# <- ì½”ë“œì— ì„ ì–¸ëœ #번째 ì§€ì—ë³€ìˆ˜ì— ì €ìž¥. aload_# <- ì½”ë“œì— ì„ ì–¸ëœ #번째 ì§€ì—ë³€ìˆ˜ì— ì €ìž¥ëœ ê°’ì„ ê°€ì ¸ì˜´. * (1+2)*3.1ì„ jasmin assembly로 나타내면 {{{ getstatic java/lang/system/out Ljava/io/printstream; iconst_1 iconst_2 iadd i2d ldc 3.1 dmul invokevirtual java/io/printstream/print(D)V return }}}