프로그래밍 언어
프로그램을 구성하는 명령어가 하드웨어에 전달되려면 2진수 형태로 저장되고서, 최종적으로는 전기 신호로 변환되어야 한다.
소프트웨어 초기에는 프로그램을 하드웨어에 적합한 2진수 형태의 기계어로 작성했다. 하지만 프로그램을 편리하게 작성하기 위해 사람이 사용하는 언어에 가까운 프로그래밍 언어가 필요했다.
고급 언어(High level language) : 사람이 이해하기 쉬운 프로그래밍 언어(C언어, Java, Python 등)
저급 언어(Low level language) : 기계어에 가까운 언어로 컴퓨터 내부에서 바로 처리가 가능하다(어셈블리어).
기계어 : 컴퓨터가 읽고 바로 실행 가능한 언어로 하드웨어를 실행시킨다. 0과 1로만 이루어져 있다.
컴파일(Compile) : 고급 언어를 기계어로 바꾸는 변환 과정
프로그램의 실행 과정
- 개발자가 고급 언어를 작성
- 고급 언어는 운영체제가 이해하는 코드로 변환되어서 운영체제로 전달됨
- 운영체제는 하드웨어가 이해하는 기계어로 변환한다.
자바에서는 JDK(자바 개발 키트)의 JVM이 각 운영체제에 맞게 변환시켜주기 때문에 플랫폼에 관계없이 실행시킬 수 있다.
컴파일러
- 고급 언어로 작성된 프로그램 전체를 번역한 후 컴퓨터에서 실행 가능하도록 기계어로 변환해주는 프로그램
- 초기 스캔시간이 오래 걸리지만, 한번 실행 파일이 만들어지고 나면 빠르다.
- C, C++
링킹(Linking) 작업
- 여러 개의 목적 코드 및 라이브러리 파일들을 서로 연결해주는 과정
- A라는 소스 파일의 함수를 B라는 소스 파일에서 사용하는 경우 A와 B 소스 파일을 각각 컴파일 하면 B에서 A의 함수를 찾지 못하게 된다. 이런 경우에 A와 B를 연결해주는 작업이 필요한데 이를 링킹 이라고 하고 링킹 작업은 링커(Linker)를 통해 이뤄진다.
- 정적 링크 : 컴파일된 목적 코드들을 연결
- 동적 링크 : 프로그램 실행 중 프로그램 외부에 존재하는 코드를 찾아 연결
인터프리터
- 고급 언어로 작성된 프로그램을 한 줄 단위로 받아들여 번역하고, 번역과 동시에 프로그램을 한 줄 단위로 실행하는 프로그램을 만든다.
- 컴파일러와 달리 목적 코드를 만들지 않아서 링킹 작업도 하지 않는다.
- CPU 사용 시간의 낭비가 크다.
- Python, JavaScript

하이브리드
- 컴파일러와 인터프리터의 장점을 섞어놓은 프로그램
- 하이브리드는 VM 위에서 동작하여 어느 플랫폼에서든 동작(컴파일러의 단점 보완)
- 자바 컴파일러는 .java 파일을 javac(java compiler)가 바이트코드로 쓰여진 .class 파일로 변환한다.
- 자바 인터프리터는 자바 컴파일러에 의해 변환된 클래스 파일내의 바이트코드를 특정 환경의 기계에서 실행될 수 있도록 변환한다.
- 컴파일 과정과 인터프리팅 과정을 둘 다 거치기 때문에 실행 속도가 느리다.

하이브리드 동작 과정
- 컴파일러가 소스 코드를 바이트 코드로 변환
- VM 위에서 동작하는 인터프리터가 해당 바이트 코드를 기계어로 변환
자바의 하이브리드 단점 보완
- 미리 기계어로 컴파일해서 실행하는 JIT 컴파일(Just In Time Compile)이나 자바 파일을 이진 파일인 EXE 파일로 만들어 주는 Java2Exe 등 많은 유틸리티가 개발되고 있다.
정적타입 언어
컴파일시 변수 타입이 결정되는 언어
장점
- 컴파일 시 타입 체크를 통해 오류를 사전에 발견할 수 있다.
- 컴파일 시에 미리 타입을 결정하기 때문에 실행 속도가 빠르다.
단점
- 매번 타입을 미리 결정해야되는 번거로움이 있다.
동적타입 언어
런타임시 변수의 타입이 결정되는 언어
- ex) JavaScript, Ruby, Python, Dart
장점
- 타입을 매번 지정해주지 않아도 되서 코드 짜기가 쉽다.
단점
- 실행 도중에 변수에 예상치 못한 자료형이 들어와 타입 에러를 발생할 수 있다.
## 자바 플랫폼
자바 플랫폼은 자바 프로그램을 개발하고 실행하기 위한 환경으로, 자바 API와 JVM으로 구성된다.
자바 API
- API(Application Programming Interface) : 프로그램이 시스템 자원을 사용하기 위해서는 운영체제나 프로그램 언어가 제공하는 기능을 사용하는데 이런 기능을 제어하는 매개체
- 보통 시스템 자원을 운영체제가 직접 관리하기 때문에 응용 프로그램(application)에서 직접 접근하지 못한다. 따라서 개발자는 API를 통해서만 시스템에서 제공하는 자원에 접근 가능하다.
- 개발 관점에서는 자바 클래스 라이브러리의 집합
JVM
- 자바 프로그램(.java)는 자바 컴파일러(javac.exe)로 변환하여 바이트 코드(.class)로 저장된다.
- 그리고 인터프리터로서 기능을 하는 JVM(java.exe)에 의해 바이트 코드가 실행된다.
바이너리 코드(기계어) VS 바이트 코드
바이너리 코드(Binary Code)
- 메모리에 올려서 실행할 수 있는 실행 코드
- 이진법 체계로 이루어진 기계어
- 플랫폼에 의존적
바이트 코드(Byte Code)
- 자바 소스 파일을 컴파일하면 만들어지는 코드
- JVM만 해석할 수 있는 코드 형태(.class)
- 플랫폼에 독립적
- 대규모 기업 환경에서 개발할 때 사용
- 여러 컴퓨터간의 분산 처리와 서블릿/JSP 개발에 사용하는 환경