티스토리 뷰

핵심 정리

저급 언어 - 기계어(0·1 비트열)와 어셈블리어(기계어를 사람이 읽기 쉬운 Mnemonic 으로 치환)로 구성- “컴퓨터가 곧바로 실행 가능”
고급 언어 - 인간 친화적 구문(C, C++, Java, Python 등)- 실행 전 반드시 저급 언어로 변환해야 함
컴파일 방식 - 컴파일 → 목적코드 → 링크 → 실행 파일 순서로 한 번만 변환- 실행 단계는 곧바로 네이티브 코드라 속도↑
인터프리터 방식 - 실행 때마다 한 줄씩 해석·실행 → 별도 실행 파일 없음- 수정·테스트 즉시 반영되지만 속도↓
“둘은 배타적” 오개념 경계 - Java · Python처럼 컴파일+인터프리터+JIT 혼합 모델이 보편 

더 깊게 들어가기 —  6가지 학습 포인트

주제 보충 설명 예시

1. 프로그래밍 언어 세대(Generation) 1세대 = 순수 기계어, 2세대 = 어셈블리, 3세대 = C·Java 같은 절차/객체 지향, 4세대 = SQL 등 DSL, 5세대 = 논리/AI 지향( Prolog)  
2. 컴파일 파이프라인 Lexing → Parsing → IR 생성 → 최적화 → 코드 생성 → 링크 IR(Intermediate Representation)이면 LLVM IR·bytecode 등 아키텍처 독립 포맷  
3. JIT & AOT JIT(Just-In-Time): 바이트코드를 런타임에 네이티브로 동적 컴파일 → Java HotSpot, V8 엔진 (Just-in-time compilation) • AOT(Ahead-Of-Time): 미리 네이티브로 고정 컴파일 → Android NDK, Go 1.20의 go build -buildmode=pie  
4. 하이브리드 실행계층 소스 → 바이트코드(컴파일) → 인터프리트 + JIT VM → 네이티브. 덕분에 이식성(bytecode)과 성능(JIT) 동시 확보  
5. 링크 방식 정적 링크: 모든 라이브러리를 실행 파일에 묶음—배포 단순·용량↑ • 동적 링크: OS가 필요한 DLL/SO를 런타임에 연결—메모리 공유·업데이트 용이  
6. 트랜스파일러·크로스컴파일러 타입스크립트→자바스크립트, Emscripten(C/C++→WebAssembly)처럼 “A 언어 → B 언어” 소스-to-소스 변환도 현대 워크플로의 일상  

실전 감각 — 짧은 코드 흐름 비교

/* C (컴파일 언어) */
#include <stdio.h>
int main(){ printf("Hello\\n"); }
$ gcc hello.c -o hello      ← Compile+Link
$ ./hello                   ← 즉시 네이티브 실행
# Python (인터프리터+바이트코드+JIT 가능)
print("Hello")
$ python hello.py           ← .py ⟶ .pyc(bytecode) ⟶ 해석(JIT 가능)

공부 로드맵 & 참고자료

  1. 서적
    • 《컴파일러 : 원리·기술·도구(드래곤북)》— 어휘·구문·IR 전체
    • 《프로그램 실행과 저수준 프로그래밍》— ASM↔C 관계 (Low-level programming language)
  2. 실습 제안
    1. 같은 알고리즘을 C·Python 양쪽으로 작성 → time 명령으로 실행 시간 비교
    2. javap -c 로 Java 바이트코드 열람, python -m dis 로 CPython 바이트코드 열람
    3. LLVM clang -S -emit-llvm 으로 IR 관찰 후 llc → 네이티브 코드로 내려보기
  3. 심화 키워드 : Inline Assembly, Garbage Collection(Stop-the-World vs GC Pause), Dynamic Typing vs Static Typing, WebAssembly (AOT+JIT 혼합).

한 문장으로 압축

저급↔고급 언어 구분은 “하드웨어 추상화 수준”, 컴파일↔인터프리트 구분은 “언제·어떻게 저급 코드로 바꾸느냐”의 차이이며, 현대 언어 실행 엔진은 컴파일·인터프리트·JIT 를 자유롭게 조합해 이식성·개발 편의·성능 세 토끼를 동시에 쫓는다.

Comments
최근에 올라온 글