ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의 작동 방식(자바가 돌아가는 구조)
    language/JAVA 2019. 1. 16. 21:07
    반응형


    자바의 작동 방식에 대해서 간략하게 알아보도록 하겠습니다. 먼저 자바 언어 규칙에 따라 만들어진 소스 코드가 필요합니다. 이 소스 코드는 컴파일러로 보내지고 컴파일러에서 바이트코드로 변환되어 나오게 됩니다. 컴파일된 소스코드를 Java virtual machine이 실행합니다.



    자바 코드의 구조입니다. 가장 먼저 클래스가 있고 그 안에 메서드, 메서드 안에는 선언문들이 존재합니다. 클래스와 메서드, 선언문 이 세가지가 자바 코드를 이루는 기본이라고 할 수 있습니다.





    이렇게 코딩 된 코드는 컴파일러로 전달되어 바이트 코드로 바뀌게 됩니다. 컴파일러는 한 언어를 다른 언어로 번역하는 번역기의 역할을 하고 보통은 고급언어를 기계어에 가까운 언어로 바꾸는 역할을 합니다.


    프로그래밍 언어는 대부분 인간이 이해할 수 있는 수준의 언어이고 기계어를 사용하는 컴퓨터는 이해할 수가 없습니다. 때문에 프로그래밍 언어로 작성된 프로그램을 컴퓨터로 실행하기 위해서는 일정한 규칙에 따라 기계어 형식으로 번역돼야 하고 이 때문에 컴파일러가 필요합니다.


    자바 컴파일러는 자바 가상 머신에서 실행할 수 있는 자바 바이트 코드를 만들어 냅니다. 이 바이트 코드를 담은 파일은 class 라는 확장자 명을 가지고 있습니다.


    컴파일러의 구조를 간단하게 살펴 보겠습니다.



    컴파일러는 크게 세개 정도의 모듈로 나눠 볼 수 있습니다.


    먼저 Lexer 입니다. Lexer는 코드를 토큰 단위로 나누는 역할을 합니다. 토큰은 어휘 분석 단계를 통해 생성 되는데 어휘 분석은 문자열로 이루어진 코드에서 의미있는 조각을 검출하는 것입니다. 예를 들면 breaking the surface 에서 가장 작은 의미 단위인 breaking, the, surface 같은 단위로 추출해 내는 것입니다.


    그리고 생성된 토큰들을 parser로 보냅니다. parser는 언어의 문법을 나타내는 패턴을 파악하여 코드를 추상구문트리(Abstract Syntax Tree)로 변환합니다. 이 구문트리는 토큰 간의 우선 순위, 토큰 간 결합 관계 등과 같은 속성을 나타냅니다. 이 과정에서 토큰 간의 관계가 올바르게 생성되었는지를 검사합니다. 즉 문법적으로 올바른지를 검사하고 잘못되었다면 오류를 출력하게 됩니다.


    컴파일러는 또 구문트리를 이용해 연산이 올바른지 (예를 들어 값을 0으로 나누는 등의 의미적으로 올바르지 않은 코드가 있는지)등도 검사하게 됩니다.


    이렇게 파서를 거친 코드를 Generator를 통해 목표 언어의 문법으로 변환하게 됩니다.




    컴파일러를 거쳐 만들어진 바이트코드는 자바가상머신이 실행하게 됩니다.


    자바가상머신은 플랫폼 독립적으로, JVM이 실행 가능한 환경이라면 어디서든 Java 프로그램이 실행될 수 있도록 합니다. Java의 모토인 Write once, Run anywhere는 JVM을 통해 가능해 진다고 할 수 있습니다.


    만약 JVM이 없다면 프로그램을 실행시킬 수 없기 때문에 프로그램을 배포할 때는 프로그램 사용자에게 JVM도 포함시켜 넘겨줘야 합니다.


    자바 가상 머신의 구조와 동작 순서를 조금 더 자세히 알아 보겠습니다.



    그림을 참고하면 위에서 아래로 내려가는 과정을 수행한다고 보면 됩니다.


    컴파일러에서 만들어진 바이트 코드가 저장된 class 파일을 class loader가 runtime data area에 적재합니다. Runtime data area 는 운영체제 위에서 JVM이 할당받는 메모리 영역입니다. class loader에서 준비한 데이터를 보관하는 저장소라고 할 수 있습니다.


    그리고 이것을 Eexcution Engine으로 실행합니다.

    반응형
Designed by Tistory.