1. 자바 개요
자바는 1996년에 JDK 1.0으로 최초 출시되었다. 원래는 다양한 환경에서 작동하는 프로그래밍 언어를 만들기 위해서 고안되었으며, 가전제품 내 탑재되기 위해 개발되었다고 한다.
자바의 특징 중 가장 중요한 점은 JVM(Java Virtual Machine, 자바 실행환경)에서 동작한다는 점이다. 이 덕분에 자바는 운영체제(OS)에 호환되는 JVM만 있다면 어떤 OS에서도 동작이 가능하다.
2. 자바 코드 실행 과정
자바 코드의 실행 과정은 아래 그림으로 요약된다. 여기서 우선 JAVA Compiler가 작동하는 원리에 대해서 이번 글에서 자세히 알아본다.
3. 컴파일 : Java Source -> Java Byte Code
사용자가 java 환경에서 작성하는 코드의 확장자는 .java 이다. 보통 처음 배울 때 class 파일을 작성한다고 배워서 마치 .class 파일을 직접 작성하는 것 같았는데, 직접 작성한 코드의 확장자는 .java임을 잊지 말자. 어쨌든, 이 .java 파일은 JAVA Compiler에 의해 .class 파일로 변환된다고 한다.
.java -> .class로 컴파일 하는 이유, 바이트코드란 무엇인가?
컴퓨터는 기계어(machine code)로 동작한다. 기계어는 0과 1로만 이루어진 숫자의 집합이다. 이 숫자들은 컴퓨터를 이루는 트랜지스터 등의 각 전자 부품에 전압을 줄지 말지를 결정하는 스위치 역할을 하게 된다. 0과 1로만 이루어져있기 때문에 바이너리코드, 이진 코드라고도 불린다.
자바의 .class 파일은 바이트코드이다. 사람이 작성하는 소스 코드와 기계어의 중간 단계가 바이트코드이다. C/C++과 같은 언어는 사용자의 소스 코드를 직접 기계어 코드로 변환하기도 한다. 그런데 자바는 소스코드를 바이트코드로 컴파일 하고, 이 바이트 코드를 다시 기계어로 만든다. 왜 그럴까? 이것은 위에서 언급한대로 자바는 다양한 환경에서 실행될 수 있도록 하는 사상을 갖고 설계되었기 때문이다. 기계어는 결국 데이터의 저장과 제어, 연산이 가능한 마이크로 프로세서(~= CPU, 프로세서)를 작동시키기 위해 작성된다. 그런데 각 마이크로 프로세서는 물리적으로 구성된 구조에 따라 설계된 각자 다른 마이크로 아키텍처를 갖고 있어서 기계어를 적용하는 방식(마이크로 프로그래밍)이 다를 수 있다. 따라서 어떠한 프로세서에서도 작동할 수 있도록 그 이전 단계인 바이트코드로 변환하는 것이다.
바이트코드 -> 기계어
이 바이트 코드는 실시간 번역기 또는 JIT(Just in time) 컴파일러에 의해서 기계어로 변경된다. 그런데 이 기계어는 어떻게 하드웨어를 제어할 수 있게 되는 걸까? 앞서 언급한대로 사실 기계어는 0과 1은 사람이 이해할 수 있도록 만들어놓은 개념일뿐, 실제로는 위에서 언급한 바와 같이 전류를 흘리느냐 마느냐하는 물리적인 개념이다. 어떤 0과 1의 조합이 특정 전자 부품에 전류를 흘리느냐 마느냐를 결정하는 것은 CPU의 구조(아키텍처)와 종류에 따라 달라진다. CPU와 논리회로를 설계하는 사람들이 이 규칙을 정한다. Intel이 만든 CPU인지, ARM, 애플이 만든 CPU인지에 따라 기계어-하드웨어간 인터페이스 규칙이 달라지는 것이다. 이래서 애플이 독자 칩을 설계-개발한다고 한 것일지도?
아주 기초적인 논리연산자, 논리게이트에 대해서는 많은 글에서 다룬다. 이런 연산자에 해당하는 작은 gate 들이 기본이 되서 다음과 같은 구조를 만들어낸다.
논리 게이트 -> 연산자 -> CPU, 메모리, GPU 등 프로세서 -> 컴퓨터
일반적으로 프로그래밍에서 많이 쓰는 if문, for문 등 반복과 조건문도 이런 방식으로 만들어지는 것이라고 이해하면 된다. 다만 단순히 전류를 주거나 주지 않는 방식으로 작동하는 것이 아니라, 전류를 특정 시각까지 유지하거나, 일정한 주기가 되면 원래 값으로 돌아가는 등 복잡한 논리와 하드웨어의 조합을 통해 만들어진다. 이런 내용을 다루는 쪽이 CPU 설계, 논리 회로 분야이다. 더 자세히 알고 싶다면 논리 회로라는 키워드로 공부해나가면 된다. (참조3)
참조
1. 유튜브 남궁성의 자바의 정석 기초편-2019.12
https://www.youtube.com/channel/UC1IsspG2U_SYK8tZoRsyvfg
2. dalpang.e 님 블로그
https://steady-snail.tistory.com/67
3. 위키피디아 : 자바_바이트코드, 논리회로 등
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C
https://ko.wikipedia.org/wiki/%EB%85%BC%EB%A6%AC_%ED%9A%8C%EB%A1%9C
4. 유틸 모음님의 블로그
https://seeutil.tistory.com/82
5. 박성범님의 블로그 - 컴퓨터가 코드를 읽는 아주 구체적인 원리
https://parksb.github.io/article/25.html
6. IT 톺아보기 블로그
https://depletionregion.tistory.com/33
'Programming-[Backend] > Java' 카테고리의 다른 글
[자바 기초] 3. 자바의 동작원리 : Garbage Collection (0) | 2021.12.15 |
---|---|
[자바 기초] 2. 자바의 동작원리 : 클래스 로딩과 JVM 메모리 (0) | 2021.12.14 |
[TIL][작성중] 자바 일급 객체로 소프트웨어 안정성 높이기, 한계점 (0) | 2021.11.17 |
[TIL][TDD] TDD 4편. 자바 Reflection 의 원리와 활용, Spring의 ReflectionTestUtils.invokeMethod (0) | 2021.11.17 |
[TIL] 자바 리스트 2개 이상 stream으로 순차적으로 비교 처리하기 : LongStream, IntStream (0) | 2021.11.16 |