프로그램 언어란
기계어 : 0과 1 이진수 명령어로 구성된 언어
어셈블리어 : add, sub, move 등 의 표현하기 쉬운 mnemonic symbol ( 니모닉 기호 )
기계어와 일대일 대응시킨 언어.
어셈블리어 역시 사람이 이해하기 어려워 사람의 언어로 구현한 고급언어가 생겨나게됨
컴파일 : 고급언어(C/C++/Java)를 기계어로 변환하는 과정
플랫폼 독립성 : 운영체제나 하드웨어에 상관없이 JVM (Java Virtual Machine)만 있다면 동일하게 실행될수있는 특성
이게 가능한 이유는 바이트 코드가 있기 때문인데,
바이트 코드 : 가상머신이 이해할수있도록 중간 코드로 컴파일한 것
원시코드에서는 컴파일되지만 가상머신에서 실행될땐 인터프리터로 해석
컴파일러(compiler)
전체 파일을 스캔하여 한꺼번에 번역한다.
초기 스캔시간이 오래 걸리지만, 한번 실행 파일이 만들어지고 나면 빠르다.
기계어 번역과정에서 더 많은 메모리를 사용한다.
전체 코드를 스캔하는 과정에서 모든 오류를 한꺼번에 출력해주기 때문에 실행 전에 오류를 알 수 있다.
대표적인 언어로 C, C++, JAVA 등이 있다.
인터프리터(interpreter)
프로그램 실행시 한 번에 한 문장씩 번역한다.
한번에 한문장씩 번역후 실행 시키기 때문에 실행 시간이 느리다.
컴파일러와 같은 오브젝트 코드 생성과정이 없기 때문에 메모리 효율이 좋다.
프로그램을 실행시키고 나서 오류를 발견하면 바로 실행을 중지 시킨다. 실행 후에 오류를 알 수 있다.
대표적인 언어로 Python, Ruby, Javascript 등이 있다.
자바언어 -> 바이트 코드로 컴파일 -> JVM의 인터프리터를 사용해 기계어로 번역
그러면 가상머신에서 인터프리터로 해석하는데 C/C++보다 느려지는거 아닌가?
그래서 나온게 JIT(Just In Time) 컴파일
인터프리터에서 같은 부분을 계속 해석하는것 대신 캐싱해 사용한다
백준을 풀면서 항상 시간초과나오면 PYPY써라 했었는데
PYPY도 JIT컴파일을 사용하여 인터프리터라 느리다는 단점이 있던 파이썬을 개선한 언어였다
참고 : https://www.youtube.com/watch?v=OxvtGYvVkRU
JDK (Java Development Kit)
자바 프로그램을 개발 및 실행 - 개발자 - 자바 컴파일러, JRE 포함
JRE (Java Runtime Environment) - JVM, 라이브러리 클래스 포함
자바 프로그램을 실행만 - 사용자