차곡차곡 성 쌓기
article thumbnail

본 카테고리는 "혼자 공부하는 컴퓨터구조 + 운영체제" 책과 강의를 기반으로 작성하였습니다.


저급언어

  • 기계어 : 0과 1로 이루어진 명령어로 구성 (2진수, 16진수)
  • 어셈블리어 : 기계어를 읽기 편한 상태로 번역한 저급언어
    • 0101 0101 Push rbp
    • 1100 0011 ret
    img

 

고급 언어

컴퓨터가 이해할 수 있는 기계어로 변환하기 위해 인터프리터나 컴파일러가 필수적으로 요구됨

  • 컴파일 언어
  • 인터프리터 언어

✓ 컴파일 언어

  • 코드가 실행되기 전 컴파일러를 거쳐서 기계어로 변환되어 실행되는 프로그래밍 언어
  • 소스 코드를 전체적으로 컴파일하여 목적 코드(기계어 또는 중간 코드)로 변환
  • 컴파일 과정에서 최적화(주석 제거 등)가 가능하며, 목적 코드는 특정 하드웨어 아키텍처에 최적화되어 실행
  • C, C++(바이트 코드), Java(바이트 코드), Swift

 

❖ 컴파일러란?

고급언어를 기계어로 번역해주는 도구, 또는 논리적 장치

 

 

❖ 바이트 코드란?

가상 컴퓨터(VM : 컴퓨팅 환경을 소프트웨어로 구현)에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.

소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다. 자바와 C#에서 바이트 코드 형태로 컴파일되어 저장되며, 실행 전에 JIT 컴파일러에 의해 기계 코드로 번역된다. 번역으로 인한 지연시간이 발생하지만 인터프리터보다 훨씬 좋은 성능을 보인다.

하드웨어 독립성을 위해 사용한다.

 

 

✓ 인터프리터 언어

  • 런타임 때 코드를 한 줄씩 읽어 기계어로 번역하며 실행하는 언어
  • 매 실행마다 소스 코드를 해석해야 하므로, 반복적으로 실행되는 부분에서 오버헤드 발생
  • 컴파일러 언어 보다 느린 이유  →  최적화 기회가 부족하며, 매번 실행 시 다시 하므로 캐시 활용 어려움 
  • 컴파일 과정이 생략되기 때문에 빠르게 수정할 수 있다.
  • 대표적 언어로는 Python과 자바스크립트기 있다.

 

 

고급언어를 컴파일 해보기

 

Compiler Explorer

 

godbolt.org

 

▶︎  C언어 컴파일

C언어에서 작성한 코드를 컴파일한 결과

x86-64는 CPU를, gcc 13.2 는 컴파일러를 나타낸다.

사진을 보면 소스코드가 어셈블리어로 변환된 것을 볼 수 있다. GCC 컴파일러는 소스코드를 바로 기계어로 변환하는 것이 아니라 어셈블리 코드를 생성하고, 어셈블리 코드를 목적 코드로 변환 후 최종적으로 링크작업을 통해 실행 파일을 생성한다.

 

▶︎ Java 컴파일

Java에서 작성한 코드를 컴파일한 결과

 

 

 컴파일러 작업 수행 과정

컴파일러라고 컴파일 작업만 수행하는 것이 아니다. 일반적으로 여러 단계의 프로세스를 포함한다.

 

1. 전처리 (Preprocessing): 소스 코드에 대한 주석제거, 빈 줄 제거, 매크로 확장 등 수행

2. 컴파일(Compilation): 전처리된 소스 코드를 어셈블리어 코드로 컴파일

3. 어셈블(Assembly) 어셈블리어 코드가 어셈블러에 의해 기계어로 변환

4. 링크(Link) : 여러 개의 목적 파일이나 라이브러리를 하나로 묶어 최정적인 실행 파일 생성

 

목적 파일 : 소스 코드를 컴파일한 결과물 중하나로, 최종 기계어로 변환된 파일이다.

728x90
profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 "좋아요" 해주세요!