컴파일러

실행 전에 전체 프로그램을 기계어로 변환.

컴파일러는 C++, Java, Python과 같은 고급 프로그래밍 언어로 작성된 소스 코드를 컴퓨터 프로세서가 이해하고 실행할 수 있는 저수준 언어, 일반적으로 기계 코드 또는 중간 표현(바이트코드 등)으로 변환하는 특수한 유형의 컴퓨터 프로그램입니다. 컴파일이라고 알려진 이 변환 과정은 여러 단계를 포함합니다. 첫째, 소스 코드를 스캔하여 토큰으로 분해합니다(어휘 분석). 그런 다음, 이러한 토큰은 종종 추상 구문 트리(AST)를 생성하면서 언어의 문법에 따라 계층적 구조로 구성됩니다(구문 분석 또는 파싱). 이어서 의미 분석은 의미와 타입의 일관성을 확인합니다. 중간 코드 생성은 기계에 독립적인 표현을 생성합니다. 마지막으로, 코드의 효율성을 개선하기 위해 최적화 기법이 적용되고, 대상 아키텍처에 특정한 기계 코드가 생성됩니다(코드 생성). 컴파일러는 소프트웨어 개발에 필수적이며, 개발자가 사람이 읽을 수 있는 언어로 코드를 작성하면서도 하드웨어에서 효율적으로 실행될 수 있도록 합니다. 그 대가로 컴파일 과정 자체에 시간이 걸리고 리소스가 필요하다는 점이 있으며, 이는 별도의 사전 컴파일 단계 없이 코드를 한 줄씩 실행하는 인터프리터 언어와 비교됩니다.

        graph LR
  Center["컴파일러"]:::main
  Rel_interpreter["interpreter"]:::related -.-> Center
  click Rel_interpreter "/terms/interpreter"
  Rel_function["function"]:::related -.-> Center
  click Rel_function "/terms/function"
  Rel_functional_programming["functional-programming"]:::related -.-> Center
  click Rel_functional_programming "/terms/functional-programming"
  classDef main fill:#7c3aed,stroke:#8b5cf6,stroke-width:2px,color:white,font-weight:bold,rx:5,ry:5;
  classDef pre fill:#0f172a,stroke:#3b82f6,color:#94a3b8,rx:5,ry:5;
  classDef child fill:#0f172a,stroke:#10b981,color:#94a3b8,rx:5,ry:5;
  classDef related fill:#0f172a,stroke:#8b5cf6,stroke-dasharray: 5 5,color:#94a3b8,rx:5,ry:5;
  linkStyle default stroke:#4b5563,stroke-width:2px;

      

🧠 지식 테스트

1 / 4

🧒 5살도 이해할 수 있게 설명

프랑스어로 된 책을 통째로 읽어서 당신이 읽기 전에 미리 한국어로 다 번역해 놓는 번역가와 같아요. 나중에 한국어판을 아주 빠르게 읽을 수 있게 해주죠.

🤓 Expert Deep Dive

컴파일 과정은 프로그램의 고수준 추상 표현을 대상 기계의 구체적이고 저수준의 지침으로 매핑하도록 설계된 복잡한 변환 시퀀스입니다. 최신 컴파일러는 정적 단일 할당(SSA) 형식, 루프 펼치기, 명령어 스케줄링, 죽은 코드 제거를 포함한 정교한 최적화 기법을 사용하여 실행 시간과 메모리 사용량을 최소화하는 것을 목표로 합니다. LLVM IR 또는 Java 바이트코드와 같은 중간 표현(IR)은 재타겟팅 및 모듈식 최적화 패스를 용이하게 합니다. Just-In-Time(JIT) 컴파일은 런타임 중에 코드를 컴파일하여 성능을 향상시키는 Ahead-Of-Time(AOT) 컴파일 및 인터프리터와의 격차를 해소합니다. 컴파일러 설계에는 컴파일 속도, 최적화의 철저함, 생성된 코드의 성능 간의 복잡한 절충이 포함됩니다. 최적화 또는 코드 생성에서 발생할 수 있는 미묘한 버그를 최소화하기 위해 컴파일러의 정확성을 보장하기 위해 형식 메서드 및 컴파일러 검증 기법이 사용됩니다.

📚 출처