본문 바로가기
기타/백엔드 기초

자바 Java | 프로그래밍 언어와 컴파일러: 소스 코드를 기계어로 변환하는 방법

by YUNI Heo 2023. 1. 8.
반응형

 

✅ 프로그래밍 언어

  • 인간이 이해할 수 있는 형태의 명령어를 작성하고, 컴파일러 또는 인터프리터와 같은 도구를 사용하여 기계어로 변환하여 컴퓨터가 이해하고 실행할 수 있는 프로그램을 만드는 도구이다. 
  • 컴퓨터는 이진수로 이루어진 기계어를 이해하며, 이를 이용해 프로그램을 실행한다. 
  • C, C++, Python, JavaScript, Ruby 등 다양한 언어가 있다. 
  • 프로그래머가 복잡한 프로그램을 작성하고 관리할 수 있도록 다양한 기능과 문법을 제공한다.

 

💡 프로그래밍 언어 분류

프로그래밍 언어는 고급언어, 어셈블리어, 기계어로 크게 분류된다.

고급언어

  • 사람이 이해하기 쉽고 추상화된 개념을 다룬다.
  • 대표적으로 Java, C, Python, JavaScript 등이 있다. 
  • 컴파일러인터프리터와 같은 도구를 사용하여 기계어로 변환된 후 실행된다.
  • 일반적으로 읽기 쉽고 유지보수가 용이하다.
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

 


어셈블리어

  • 고급언어와 기계어의 중간 단계로, 단순한 기호를 사용하여 작성된 언어이다. 
  • 어셈블러라는 도구를 사용하여 기계어로 변환된 후 실행된다. 
  • 고급언어에 비해 코드가 직관적이며, 하드웨어를 직접 다룰 수 있다.
; 윈도우즈의 경우 masm을 사용하여 어셈블리어 코드를 컴파일할 수 있다.
.MODEL SMALL
.STACK 100h
.DATA
    message DB 'Hello, World!', '$'
.CODE
    MAIN PROC
        MOV AX, @DATA
        MOV DS, AX
        MOV AH, 09h
        LEA DX, message
        INT 21h
        MOV AH, 4Ch
        INT 21h
    MAIN ENDP
END MAIN


기계어

  • 0과 1로 이루어진 이진수로 작성된 언어이다. 
  • 컴퓨터가 직접 이해할 수 있는 언어이므로, 기계어로 작성된 코드는 바로 실행된다. 
  • 컴퓨터가 이해하기 쉽지만, 사람이 작성하기에는 매우 복잡하다는 단점이 있다.
  • 모든 컴퓨터가 동일한 기계어를 사용하지 않는다.
    • 다양한 아키텍처와 플랫폼이 존재하며, 이에 따라 사용되는 기계어도 다르다.
    • 윈도우 Window 컴퓨터와 맥 Mac 컴퓨터는 서로 다른 기계어를 사용한다.
    • 고급언어와 어셈블리어는 플랫폼에 따라 다른 컴파일러를 사용하여 컴파일되어야 하며, 이를 통해 플랫폼 독립성을 보장할 수 있다.
01001000 01100101 01101100 01101100 01101111 00101100 00100000 01010111 01101111 01110010 01101100 01100100 00100001

 

 

✅ 컴파일러 Compiler

프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 프로그램이다.

 

  • 소스 코드를 읽어서 분석(Analysis) 변환(Translation) 과정을 거친 후, 오브젝트(Object) 파일 또는 실행 파일을 생성한다.
    • 오브젝트 파일은 링커(Linker)를 통해 실행 파일로 결합되며, 실행 파일은 운영체제에 의해 실행된다.
  • 고급 언어로 작성된 코드는 기계어로 직접 변환할 수 없기 때문에, 컴파일러가 중간 단계에서 어셈블리어 또는 바이트 코드(Bytecode)로 변환한다.
  • 소스 코드의 오류를 검출하여 오류가 있는 코드를 수정하도록 돕는 기능도 제공한다.
  • 보안 상의 이유로 코드를 숨기는 Obfuscation 기능을 제공하기도 한다.

 

💡 자바 컴파일러 Java Compiler

자바 언어로 작성된 소스 코드를 기계어로 변환하여 실행 가능한 바이트 코드(Bytecode) 파일을 생성하는 도구이다.

자바 개발자들이 작성한 코드를 컴파일하여 실행 가능한 애플리케이션, 앱, 웹 애플리케이션 등을 만드는 데 사용된다.

 

자바 컴파일러는 일반적으로 JDK(Java Development Kit)와 함께 제공되며, javac라는 명령어를 사용하여 소스 코드를 컴파일한다.

 

  • 자바의 플랫폼 독립성: JVM(Java Virtual Machine)은 운영체제와는 독립적으로 실행되므로, 자바 애플리케이션은 모든 운영체제에서 동일하게 실행된다.
  • JIT(Just-In-Time) 컴파일: 바이트 코드를 실행할 때 해당 코드를 직접 기계어로 변환하여 실행하는 방식이다. 
  • 디버깅: 디버깅 정보를 생성하여 디버깅이 용이하도록 지원한다.
  • 다양한 개발 환경: clipse, IntelliJ 등 다양한 개발 환경에서 사용할 수 있으며, 이를 통해 개발자들은 편리하게 소스 코드를 작성하고 컴파일할 수 있다.

 

자바 코드를 컴파일하는 예시이다.

    • Hello.java 파일을 작성한다.
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

  • 커맨드 라인에서 다음 명령어를 입력한다.
javac Hello.java

  • 명령어를 실행하면, Hello.class라는 바이트 코드 파일이 생성된다.
  • 생성된 파일은 JVM에서 실행 가능한 파일이며, 다음과 같이 실행할 수 있다.
java Hello

  • 명령어를 실행하면, "Hello, World!"라는 메시지가 출력된다.
반응형