ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-1] 컴파일 방법 & 과정
    Java 2020. 11. 9. 21:00

    JAVA를 사용하기에 앞서, JVM은 무엇이며 자바 코드는 어떻게 실행 되는지에 대해서 알아보는 과정을 가져보도록 합시다. 이 과정을 알아보기전에 몇가지에 대해서 짚고 넘어가도록 하자

     

    1. 시작

     

    JAVA가 나왔을 당시, 기존 C언어 하고는 꽤나 다른 실행 과정을 가졌다.

    간단하게 살펴보면,

     

    C언어 컴파일 실행 과정

    결국 컴퓨터 (OS)가 알아 들을 수 있게 하기 위해 기계어를 번역하는 과정이다. 

     

    그럼 JAVA 의 실행과정은 어떨까?

     

    꽤나 함축적이고, JVM이 자동으로 저런 과정을 짚어준다는 걸 그림으로만 봐도 알 수 있을 것이다. 물론 통합개발환경에서 놀고 있는 나같은 경우, 어차피 IDE가 다 해주지 않나? 라고 할 수 있지만, JVM을 더 알아보겠지만, 강력한 기능들이 포함 되어있다.

     

    자 그럼 먼저 순서를 바꿔서 JVM이 동작하기전에, 컴파일러에서 어떤 과정을 하길래, JVM이 편하게 도와줄 수 있는지 확인해 볼 필요가 있다. 

     

    2. JAVA의 컴파일 하는법

     

    자바의 컴파일 과정은 총 4가지에서 5가지의 과정이 있다. 

     

    확실히 어려운 단어들이 보이는데, 이런 분석과 과정은 컴퓨터 공학 “컴파일러” 과목에서 간간히 나오는데, 간단하게 짚고 넘어가보도록 하자. (재밌는 부분이 많다)

     

    • 어휘분석 

     

    사진에 보이는, public, class 와 같은 키워드, “Hello World”같은 리터럴, 그리고 연산자인 + 와 같은 오퍼레이터들을 수집한다. 이런 키워드, 연산자, 리터럴을 '어휘소' 라고 하는데, 모두 수집하면,



     

    다음과 같은 모습이 나올 것이다. 자 이렇게 모인 어휘소를 하나의 스트림으로 만들어 주는데 이를 토큰 스트림이라고 한다. 

     

     

    이렇게 토큰 스트림 까지 뽑아내는 과정을 어휘 분석 이라고 한다. 

    • 구문 분석 (Syntax Analysis)

    자 어휘분석을 통해 이쁘게 토큰스트림이 나오도록 하였다. 그러면 이 토큰 스트림을 통해서, 문법에 맞는지 확인하는 과정이 필요한데, 이를 구문 분석에서 도와 주도록 한다. 

     

    출처 : 위키(컴파일러 부분 의 사진내용)

     

    자 여기서 만약에 에러가 발생하면 어떻게 될까? 구문 분석을 하는데 문법이 틀렸다거나, 하는 상황 말이다. 구문 분석을 영어로 하면 Syntax Analysis인데, 자바를 공부하다 보시면, Syntax Error를 많이들 보셨을 것이다. 

     

     

    그리고 실제로 이런 과정은, 컴파일을 직접 실행하면, 에러로 나타나긴 하지만, 이상하게 iterm에서는 보이지 않는다.

    자 터미널로 직접 만든 java 파일이다. 출력 부문에서, ‘세미콜론’( ; ) 하나가 빠져있는데, 이를 컴파일 시키면

    다음 과 같이 에러가 발생하게 되는데, 이 에러는 컴파일러 과정 중 구문분석 에서 발생한다는걸 알아 두자. 

    (SymacticAnalysis -> SyntaxAnalysis.java 인데 수정을 못했네요. 오해 없으시길 바랍니다.)

     

    자 그럼 구문분석을 통과 했다. 그 다음 무슨 과정이 있을까?

     

    • 의미 분석

    말 그대로 의미가 맞는지를 검사하게 된다. 구문분석에서 오류없이 잘 통과가 됬으면,의미 분석에서는 대표적으로 타입 검사 , 자동 타입 변환 같은걸 진행하게 된다. 구문분석에서 에러는 못잡았지만, 여기서 잡히게 된다 만약 String 에 integer값을 입력하게 되면, 구문분석이 아니라, 의미분석에서 에러가 발생한다.

     

     

    당연히 에러가 발생하게 되는데

     

    이런 에러는 의미분석 과정에서 발생하게 된다. 이 과정이 모두 끝나면 마지막으로 중간 코드를 생성하게 된다. 

     

    다음은 중간 코드(바이트 코드)에 대해서 알아보도록 하자

    > [Java-2] 바이트 코드란

    'Java' 카테고리의 다른 글

    [Java-4] JVM의 구조  (1) 2020.11.11
    [Java-3] JVM과 JIT 컴파일러란?  (2) 2020.11.10
    [Java-2] 바이트 코드란  (1) 2020.11.09
    함수형 인터페이스란?  (0) 2020.10.27
    NullPointerException(NPE) 필요한 이유  (0) 2020.10.20

    댓글

Designed by Tistory.