Barat을 이용한 Code Transformation Sookmyung Women’s Univ. PSLAB
1. Barat
1.1 Barat에 대하여 Java언어를 위한 전단부 (front-end) Barat의 역할 AST를 구성 이름 분석 및 타입 분석 AST 횡단 (traversal) Visitor 제공 이름 분석 타입 분석 Java Barat AST
1.2 이름 분석 및 타입 분석 이름 분석 타입 분석 사용된 이름의 해당 선언을 찾아 준다. 식에서 필드 이름 사용 extends에서 클래스 이름 사용 레이블 이름 타입 분석 각 Aexression의 타입을 자동 분석 타입분석결과 모든Aexpression에 대해서 메소드type()을 호출한다.
1.3 AST 횡단 (traversal) Visitor 패턴을 기반으로 한 AST 횡단 AST 노드와 방문 코드의 분리 Barat이 제공하는 Visitor DescendingVisitor Depth-first visitor OutputVisitor Depth-first visit Output source code DefaultVisitor 모든visit 메소드를 빈 메소드로 구현 일부AST 노드만을 방문할 때 유용
1.4 Visitor 패턴 B C Barat.reflect Class A { void accept(Visitor v) { AST 노드 예> Barat.reflect Class A { void accept(Visitor v) { v.visitA(this); } Class B { v.visitB(this); Class C { v.visitC(this); Visitor ClassVisitor { visitA(A x) { (x의 Child)B.accept(this); (x의 Child)C.accept(this); } visitB(B x) { … visitC(C x) { ... ① ② ③ ④
2. Project
2.1 Project 목적 J2ME Program의 자원 사용 정보, Trace/Profile을 제공 Exception Event Object Thread
2.2 프로젝트 동기 J2ME의 이용 가능한 자원 한정 효과적인 자원 사용 중요 자원사용 최적화 자원 사용 정보 제공
2.3 프로젝트 구현 + * 프로그램 변환을 이용한 실행 정보 제공(Trace/Profile) Java Program Barat Program Transfer Java Program X AST Java Program X Input Output + Trace정보 Profile정보 실행 정보
3. Event
3.1 동기 [Motivation] Event Analysis JVM에는 Event에 대한 정보를 제공해주는 기능이 없음 현재 Event에 대한 정보를 제공해주는 tool의 부재 Event Driven Program은 Debugging이 매우 어려움 J2ME 프로그램은 모두 Event Driven Program Event Driven Program의 Event에 대한 정보를 쉽게 얻을 수가 없음
3.2 Event Analysis 실행 전 Event에 대한 정보 제공 실행 중 Event에 대한 정보 제공 Implements된 Event Listener Interface를 알려줌 사용되어질 수 있는 Event Handler를 알려줌 실행 중 Event에 대한 정보 제공 Event Trace를 보여줌 Event 발생 시점 어떠한 Object에 어떠한 Event가 발생하는지 Event 처리 과정(시작과 끝을 보여줌) 실행 후 Event에 대한 정보 제공 Event에 log를 기록 어떠한 Event가 몇 번 발생하였는지 어떤한 Object에 어떤 이벤트가 몇 번 발생하였는지
3.3 기능 [Function] 실행 정보 선택 옵션 Trace 정보 제공 Profile 정보 제공 옵션을 통하여 사용자가 원하는 정보를 선택가능 Trace 정보 제공 Event 실행 과정을 프로그래머에게 제공 Profile 정보 제공 실행 결과 Summarization Dynamic Analysis를 하여 나온 결과를 프로그래머에게 제공 실행 결과 Visualization 분석 결과를 Graphical하게 제공
3.4 구조 (Architecture] Transfer과정 TransferEventVisitor.java extend OutputVisitor { Event 정보 출력 Code generate } Source Code Transferred Code (Event에 대한 실행 정보 제공) Trance 정보 Profile 정보 사용자로부터 Option입력받음
3.4 구조2 (Architecture] Visualization Transferred Code 실행 Visualization 프로그래머 옵션 입력 받음 Trance 정보 Profile 정보 저장
TransferEventVisitor 3.5 예 [Example] Dots.java class DotsMouseListener implements MouseListener { private Dots applet; public DotsMouseListener(Dots theApplet) { applet = theApplet; } public void mouseClicked(MouseEvent event) { Point clickPoint = event.getPoint(); applet.setPoint(clickPoint); applet.repaint(); class DotsMouseListener implements java.awt.event.MouseListener { public void implementedEventMethod() { System.out.println("Implemented Event Listener Interface"); System.out.println("java.awt.event.MouseListener"); } private Dots applet; public DotsMouseListener(Dots theApplet) { super(); this.applet = theApplet; public void mouseClicked(MouseEvent event) { System.out.println("Event Handler Name: mouseClicked"); System.out.println("Event Target Component: " + event.getSource()); System.out.println("Event Handler Line: 42line"); System.out.println("Event ID: " + event.getID()); System.out.println("Event's X coordinate: " + event.getX()); System.out.println("Event's Y coordinate: " + event.getY()); System.out.println("Event's Click Total Count: " + event.getClickCount()); Point clickPoint = event.getPoint(); this.applet.setPoint(clickPoint); this.applet.repaint(); TransferEventVisitor Source Code Generate
3.6 구현 [Implement] public class TransferEventVisitor extends barat.OutputVisitor { … visitClass() { getImplementedInterfaces() //Implement된 Event Listener Interface를 filter()를 이용해 찾음 getConcreteMethods() //Event Handler를 찾음 Event Handler의 Line number를 찾음 }//visitClass visitBlock(){ filer() { // 사용 가능한 Event Handler를 찾아서 필요한 정보를 얻어냄 handler() //사용 되어지는 Handler의 Name 정보 getSource() //Event 발생시 Target Component의 정보 LineNumber //발생되어지는 Event Handler의 소스코드내의 위치 getID() //발생되어지는 Event의 Type, 및 그 Event와 관련하는 것 외의 Event 변수는 어떤것인지 나타냄 getX() //발생되어지는 Event의 x좌표 값 getY() //발생되어지는 Event의 y좌표 값 getClickCount()//MOUSE_DOWN Event의 경우, 연속한 클릭 수를 나타냄 }
4. Exception
4.1 Motivation Motivation JVM이 제공하는 Exception 정보의 부족 추가적인 정보 제공 필요 Exception 발생 위치 Exception 처리 과정 Exception 전파 과정 JVM이 제공하는 정보 부족으로 인해 Exception의 실행 정보를 분석하기 위해서는 프로그래머의 수작업 요구 수작업의 번거로움과 분석 결과의 신뢰성이 떨어진다.
4.2 Subject Subject 기존의 정적 분석 툴과는 다르게 Java 프로그램에서 발생할 수 있는 Exception에 대한 실행 정보를 동적으로 분석 Barat을 이용하여 기존의 코드 내에 exception 정보를 자동적으로 출력해줄 수 있도록 코드를 transformation해준다. Barat Transformation 해주는 Visitor 작성 변환 코드 실행을 통한 실행 정보 제공 Exception 발생 정보 Catch문을 통한 Exception처리 정보 Try문 분석을 통한 전파과정 분석 정보 Method 분석
4.3 Program Functions 실행 정보 출력 선택 옵션 제공 실행 결과 summarization 옵션 기능을 통해 사용자가 얻고자 하는 trace정보를 선택 가능하게 함 실행 결과 summarization Dynamic Analysis를 통한 profile 제공 실행 결과 Visualization 분석 결과를 graphical하게 보여준다. 기타 실행 후 분석 정보를 통한 코드의 변환
4.4 Architecture CodeTransformation.java 실행 저장된 정보 분석 및 visualization 변환된 소스코드 public class MyVisitor extends barat.OutputVisitor{ // 옵션 처리 } 원래의 소스코드 + Trace 정보 Profile 정보 실행 정보 저장 메소드 구현 원래의 소스코드 Option 정보 //Exception 실행정보 분석 코드 실행 저장된 정보 분석 및 visualization
4.5 code translation의 예 Transfer Program Public void aaa(){ Throw문을 통한 Exception 발생 정보 Public void aaa(){ System.out.println(“Exception raised at line number : 2”) System.out.println(“Exception type : myException”) Throw new myException(); } System.out.println(“try line number : 5”) System.out.println(“call method : aaa()”) Try{ aaaa(); } catch(myException a){ System.out.println(“catch line number : 7”) System.out.println(“catch type : a.printStackTrace(); : Public void aaa(){ Throw new myException(); } Try{ aaa(); } catch(myException a){ : Transfer Program try문을 통한 Exception 전파 정보 catch문을 통한 Exception 처리 정보
4.6 Implementation Exception 정보분석 방법 Barat-1.6.1을 이용하여 Exception Analysis Barat이 제공해주는 Throw.class, Try.class, Catch.class를 통해서 Exception 정보 분석 Throw.class : throw문이 발생된 위치와 타입 정보 제공 Try.class : try문의 위치와 try 내의 메소드 호출 정보 Catch.class : catch 되는 exception의 타입 정보 제공 line_number(); J2SE 제공 메소드 printStackTrace(); getClass()
4.6 Implementation(cont..) Class CodeTransformation extends OutputVisitor{ visitThrow{ // Exception 발생 위치, 발생 Exception타입 정보 } visitTry{ // Try문 내의 Exception발생 메소드의 위치, 메소드 이름 visitCatch{ // Exception 처리 위치, 처리한 Exception의 type 처리된 Exception 오브젝트를 통한 printStackTrace()호출 visitConcreteMethod{ //Exception을 발생시킨 메소드의 전파과정 분석 // return propagation