0. Kotlin이란 GitHub - JetBrains/kotlin: The Kotlin Programming Language.The Kotlin Programming Language. . Contribute to JetBrains/kotlin development by creating an account on GitHub.github.com다들 아시는 내용이겠지만 Kotlin은 JetBrains에서 개발한 멀티 패러다임 언어입니다Kotlin은 Java, Python 등 많은 프로그래밍 언어들처럼 오픈 소스이며, Github에 코드가 오픈되어 있습니다위에 링크를 클릭하면 코드들을 볼 수 있습니다 논외로, Kotlin에 로고 변천사는 위와 같습니다 개인적으로, 현재 로고인 보라색 로고가 저는 가장 마음에..
다들 아시는 내용이겠지만 Kotlin은 JetBrains에서 개발한 멀티 패러다임 언어입니다 Kotlin은 Java, Python 등 많은 프로그래밍 언어들처럼 오픈 소스이며, Github에 코드가 오픈되어 있습니다 위에 링크를 클릭하면 코드들을 볼 수 있습니다
논외로, Kotlin에 로고 변천사는 위와 같습니다 개인적으로, 현재 로고인 보라색 로고가 저는 가장 마음에 드네요
1. 기계어( Machine Code )와 어셈블리어( Assembly Language )
Kotlin이 Java와 100% 호환되는 이유를 정확히 이해하기 위해서는 기계어와 어셈블리어를 먼저 이해할 필요가 있습니다
기계어는 CPU가 이해하는 언어로, CPU는 해당 언어를 읽어들여 연산을 수행합니다 ( 2진수 형태 ) 그리고 어셈블리어는 해당 기계어를 사람이 읽고 쓰기 쉬운 형태로 1:1 대응시켜 놓은 언어입니다 ( 니모닉 형태 ) 그림을 보면 단 번에 이해가 됩니다
기계어는 위의 그림과 같이 Opcode + Operand의 구조로 이루어져 있습니다 이 전체를 통틀어 명령어라고 부릅니다 우리가 프로그램을 실행하면 이러한 2진수 형태의 명령어들이 가상 메모리내에 올라갑니다 ( 정확하게는 Code 영역 ) 그 외 2진수로 기록된 데이터들은 나머지 영역에 올라갑니다 ( 부가 설명을 할려면 리버싱까지 넘어가기에 생략하겠습니다 )
그림에서 기계어 명령어의 의미는 CPU에게 "AX 레지스터와 BX 레지스터의 값을 더하라"는 의미입니다
해당 명령어의 구조인 Opcode + Operand를 사람이 이해하기 쉬운 짧은 영단어인 니모닉으로 각각 1:1 매칭시켜놓은 것이 바로 어셈블리어입니다
디버깅을 통해 메모리를 직접 살펴보면 위의 모습과 같습니다 ( 해당 사진은 가상 메모리 영역중 Code 영역 ) 직접 살펴보면 일반적으로, 2진수 형태가 아닌 16진수로 표현되어 있습니다 이것은 단지 2진수를 16진수로 변환한 것입니다
반응형
2. 컴파일 과정
그렇다면 왜 어셈블리어와 기계어를 먼저 언급했을까요? 바로 아래 그림을 이해하기 위해서입니다
Java는 위와 같은 과정을 거쳐 기계어 형태로 변환된 후, CPU에 전달되어 실행됩니다 여기서 우리가 눈여겨 보아야 할 포인트는 JVM과 Java ByteCode입니다
JVM은 Java Virtual Machine의 약자이며, 이름 그대로 가상 머신입니다 그리고 CPU의 다른 이름은 Machine 입니다 즉, Java Virtual Machine은 다른 말로 Java Virtual CPU라고 볼 수 있습니다
앞에서 배웠듯 CPU에서는 기계어가 해석됩니다 그렇다면 Java Virtual CPU라는 가상 CPU에서 해석되는 기계어 또한 존재 할 것입니다 그것이 바로 Java ByteCode입니다 Java 가상 CPU라는 환경에서 기계어로 취급되는 것이 바로 Java ByteCode입니다 바로 위의 그림과 같습니다 ( IntelliJ에서 View - Show Bytecode를 클릭하면 볼 수 있습니다 )
01
그렇다면 기계어인 Java ByteCode와 1:1로 대응되는 어셈블리어 또한 존재할 것입니다 Java 가상 CPU라는 환경에서의 기계어인Java ByteCode의 어셈블리어는 바로 Jasmin입니다
Jasmin을 보기 위해서는 Windows 전용인 jhoja라는 도구를 이용해야 합니다 1번 사진은 jhoja를 통해 Jasmin으로 변환하는 과정이고, 2번 사진은 Jasmin 파일을 열어본 결과 입니다
3. 그니까 Kotlin이 Java와 100% 호환되는 이유는...
쓰다보니 서론이 길어졌습니다
결론적으로, Kotlin이 Java와 100% 호환이 가능한 이유는 Kotlin 파일을 Java ByteCode로 컴파일 하기 때문입니다 어차피 JavaByteCode로만 컴파일하면 JVM에서 동일하게 실행이 가능하니까요
4. Android도 비슷하다
현재 Java보다는 Kotlin이 자주 사용되는 Android 환경에서는 어떨까요? Android 환경에서의 컴파일 과정은 살짝 다릅니다 아래 그림을 보겠습니다
JVM이라는 가상 머신 대신에 ART( Android RunTime )라는 가상 머신으로 대체됐습니다 그리고 Java ByteCode를 한 번더 컴파일하여 .dex라는 파일로 변환하고 해당 파일을 ART에서 실행합니다 ART가 .dex 파일을 실행하면 해당 파일을 기계어로 번역하여 CPU에게 전달되면서 실행이 되는 구조입니다
눈치채셨겠지만 ART라는 가상 CPU에서의 기계어가 바로 .dex 파일에 기록된 것들이고 해당 기계어에 대응되는 어셈블리어가 바로 smali입니다