자바 객체 지향의 원리와 이해 1장의 내용을 정리해보려고 한다.
기술 발전의 흐름
기계어
- 컴퓨터가 이해할 수 있는 유일한 언어이다. 0과 1로 이루어져있다.
어셈블리어
- 어셈블리어로 인해 인간의 언어로 프로그램이 가능해졌다.
- 하지만 '소스코드 : 기계어 = 1:1 매칭'으로 기종별로 어셈블리어가 필요하기 때문에 소스코드도 기종별로 만들어야한다는 단점이 있었다.
C
- m:n 매칭으로 기종별 컴파일러만 있다면 하나의 소스코드를 실행하는게 가능해졌다.
C ++
- 이때부터 객체 지향의 개념이 도입되었다.
- 객체 지향 지원 언어라고도 부를 수 있는데, 그 이유는 순수한 객체지향이지만 객체가 없어도 가능하기 때문이다.
JAVA
- JVM으로 인해 하나의 컴파일러로 모든 기종에서 하나의 소스코드를 실행할 수 있게 되었다. (JAVA가 OS에 종속적이지 않은 이유)
- 단, 기종에 맞는 JRE가 설치되어 있어야한다. (JRE, JVM은 OS에 종속적이다)
신기술도 그때 당시에는 배척 받았다?
C
- 최적화된 컴파일러의 의해 작성된 목적 파일이라고 해도 기계어/어셈블리어로 제작된 프로그램에 비해 매우 느렸다. 그 당시 c언어는 같은 기능을 수행하는 어셈블리어에 비해 cpu/메모리 자원을 효율적으로 사용하지 못했기 때문이다.
C++
- 기존의 절차적/구조적 프로그래밍과 전혀 다른 패러다임을 제시했기 때문에 반발이 심했다.
java
JIT?
북스터디를 진행하던 중 스터디원 한분이 추가로 JIT에 대해 공부해보면 좋을 것 같다는 조언을 주셔서 공부해봤다.
JIT 컴파일은 자바가 사용하는 방식으로 인터프리터와 정적 컴파일 방식을 혼합한 방식이라고 할 수 있다.
인터프리터, 정적 컴파일?
인터프리터 방식은 실행중에 코드를 변환하고, 정적 컴파일 방식은 실행 전에 코드를 컴파일 한다.
JIT 컴파일 방식
JIT 컴파일은 앞에서 말했듯 인터프리터와 정적 컴파일 방식을 혼합한 방식이라고 할 수 있다.
자바 컴파일러가 자바 프로그램 코드를 바이트 코드로 변환한 다음, 실제 바이트 코드를 실행하는 시점에서 자바 가상 머신이 바이트 코드를 jit 컴파일을 통해 기계어로 변환한다.
- 바이트코드 컴파일러는 소스 코드를 중간언어인 바이트코드로 변환한다.
- 바이트코드는 기계어는 아니지만 가상 머신에 의해 기계어로 손쉽게 변환할 수 있는 코드이다.
- JIT 컴파일러는 바이트코드를 읽어 빠른 속도로 기계어를 생성할 수 있다(필요한 부분만)
- 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.