CS 스터디를 시작했다. 기본부터 시작하는 CS 스터디... 알고 있다고 생각한 개념도 설명하려니 알고 있는게 아니었다는 생각이 들었다. 휘발되기전에 정리해두자.
세상에는 크게 두 종류의 프로그래밍 언어가 있다.
1. 인터프리터 언어 - Python
C
, JAVA
하지만 Java는 단순한 컴파일러 언어가 아니다. Java는 코드를 바이트 코드로 변환하는 컴파일러와 JVM 실행 엔진 내의 인터프리터를 동시에 갖추고 있다.
과거에는 윈도우에서 C 언어로 작성된 코드를 서버 컴퓨터나 다른 운영체제에서 실행하려면 각 운영체제에 맞는 기계어로 번역해주는 컴파일러가 필요했다. 이로 인해, “내 컴퓨터에서는 작동하지 않는데?“라는 문제가 빈번하게 발생했다.
이 문제를 해결하기 위해 Java는 컴파일러와 운영체제 사이에 JVM이라는 한층의 레이어를 추가했다.
Java는 소스 코드를 바이트 코드로 컴파일한 후, JVM이 이 바이트 코드를 읽어 각 OS에서 실행될 수 있는 형태로 해석한다. JVM 덕분에 Java는 플랫폼 독립적인 실행 환경을 제공할 수 있다.
프로그램을 실행하기 위해 JVM이라는 가상 머신으로 각 OS위에 한층의 가상화를 쌓아서 플랫폼 독립적인 실행 환경을 제공한 것이다.
자바뿐만 아니라 Kotlin, Groovy 등도 JVM 위에서 실행 가능하다. 이들 언어는 Java와 마찬가지로 바이트 코드로 컴파일되어 JVM에서 실행된다.
가능할 것으로 생각된다. 만약 다른 프로그래밍 언어처럼 기계어 수준으로 일반적인 컴파일을 진행한다면, Java의 플랫폼 독립성과 동적 최적화의 장점을 잃게 되어 비효율적일 수 있다.
운영체제의 프로세스 관계에서 부모 프로세스는 다른 프로세스를 생성하고, 자식 프로세스는 부모의 메모리와 환경을 복사하여 독립적으로 실행된다. (각각 고유한 메모리 공간과 PID를 가짐)
하지만 JVM은 운영체제 내에서 독립적인 프로세스로 실행되며, Java 프로그램은 JVM 프로세스 내부에서 스레드로 동작한다.
JVM이 실행하는 각 Java 프로그램의 스레드들은 동일한 메모리 공간(Heap)을 공유한다.
따라서 JVM과 프로그램은 프로세스-스레드 관계로, 부모-자식 프로세스 관계가 아니다.