System Programming/Compiler

    LLVM Compiler Under the hood #1 컴파일 흐름 이해

    Compiler 구현 사고방식: 계산기계산기는 수식을 인식할 수 있으므로 이를 기능이 단순한 컴파일러로 볼 수 있다. 계산기 구현을 통해 컴파일러의 구현 사고 방식을 분석해볼 수 있다. 설계할 목표 계산기의 주요 기능 파라미터는 다음과 같다. 피연산자: 정수와 소수 지원연산자: 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산 및 지수 연산 지원괄호: 소괄호 지원위의 계산기를 구현하려면 일반적으로 다음의 기본 단계를 거쳐야한다. 어휘 분석: 수식 내의 피연산자, 연산자 및 괄호를 스캔하여 토큰 스트림 생성구문 분석: 연산자의 우선순위, 결합 법칙 등의 규칙에 따라 토큰을 조직하여 구문 분석 트리 구축해석 실행: 구문 분석 트리에 따라 연산 결과 계산 어휘 분석: 피연산자와 연산자 식별수석 123+456 을 예로 ..

    Compiler 개발 #1 컴파일러 동작 원리

    컴파일러란컴파일러: 소스 언어 → 타겟 언어로 번역하는 프로그램┌──────────────┐ ┌──────────────┐ ┌──────────────┐│ Source Code │ ──▶ │ Compiler │ ──▶ │ Target Code ││ (C, Java) │ │ │ │ (기계어/어셈블리)│└──────────────┘ └──────────────┘ └──────────────┘ 인터프리터와의 차이구분컴파일러인터프리터동작전체 번역 후 실행한 줄씩 즉시 실행속도실행 빠름 ✅실행 느림디버깅에러 위치 파악 어려움에러 진단 쉬움 ✅예시C, C++, GoPython, Ruby 컴파일러 구조두 부분으로 나뉨Analysis (..

    LLVM #1 IR 이해 하기

    llvm 은 컴파일러의 중간 단계에 위치한다. 언어 기능을 단순화한 후지만, 특정 머신 아키텍처(x86, ARM 등)를 타겟으로 하는 백엔드 이전 단계다.llvm의 ir은 꽤 저수준이다. 일부 언어에는 있지만 다른 언어에는 없는 언어 기능을 포함할 수 없다. (예: 클래스는 c++에는 있지만 c 에는 없다.) 명령어 집합을 접해본적이 있다면 llvm ir은 RISC 명령어 집합이다. 결과적으로 LLVM IR은 어셈블리를 좀더 읽기 쉽게 만든 형태로 보인다. LLVM IR은 머신 독립적이므로 레지스터 개수, 데이터 타입 크기, 호출 규약이나 기타 머신별 세부사항들을 걱정할 필요가 없다. 따라서 고정된 개수의 물리 레지스터 대신 LLVM IR 에서는 무제한의 가상 레지스터 세트(%0, %1, %2, %3...

    LLVM #0 LLVM 구조와 동작원리

    #include int factorial(int n) { if (n 1단계: Clang으로 LLVM IR 생성clang -O3 -emit-llvm hello.c -c -o hello.bc -O3: 최대 최적화 수준 (인라이닝, 루프 언롤링 등)-emit-llvm: C 코드를 기계어 대신 LLVM IR로 변환-c: 컴파일만 하고 링크는 안 함-o hello.bc: 출력 파일 (비트코드 형식)생성된 파일:hello.bc: LLVM 비트코드 (바이너리 형식)비트코드를 사람이 읽을 수 있는 형태로 보려면llvm-dis hello.bc -o hello.ll hello.ll 내용; ModuleID = 'hello.bc'source_filename = "hello.c"define dso_local i32 @..