선형 스캔 레지스터 할당: 수명 구멍 처리

2025-08-26
선형 스캔 레지스터 할당: 수명 구멍 처리

이 게시물에서는 수명 구멍을 처리하기 위한 선형 스캔 레지스터 할당 알고리즘의 개선 사항을 자세히 설명합니다. 저자는 제어 흐름 그래프를 선형 명령어 시퀀스로 줄임으로써 가상 레지스터의 수명에 불연속성이 발생하는 수명 구멍이 발생하는 메커니즘을 설명합니다. 해결책은 여러 개의 비겹치는 범위를 지원하도록 간격 데이터 구조를 수정하여 이러한 구멍을 식별하고 활용할 수 있도록 하는 것입니다. 그런 다음 선형 스캔 알고리즘을 조정하여 레지스터 할당 중에 이러한 구멍을 고려하여 레지스터 사용률을 개선합니다. 이를 통해 컴파일러의 레지스터 리소스 활용 능력이 향상되어 최종적으로 코드 성능이 향상됩니다.

더 보기

snprintf 안전하게 사용하기: 버퍼 오버플로우 방지

2025-08-19
snprintf 안전하게 사용하기: 버퍼 오버플로우 방지

이 글에서는 `snprintf` 함수의 잘 알려지지 않은 기능, 즉 포맷팅하기 전에 필요한 버퍼 크기를 결정하여 버퍼 오버플로우를 방지할 수 있는 기능을 강조합니다. `snprintf`를 두 번 호출하여(한 번은 크기를 얻기 위해 `NULL`과 0을 사용하고, 다른 한 번은 적절하게 할당된 버퍼를 사용하여) 수동으로 버퍼 크기를 계산해야 할 필요성을 제거합니다. 또한 저자는 더 쉬운 사용을 위해 경량 헤더 전용 라이브러리를 권장합니다.

더 보기

300줄짜리 Python 컴파일러: 클로저 변환 자세히 살펴보기

2025-08-11
300줄짜리 Python 컴파일러: 클로저 변환 자세히 살펴보기

Ghuloum 튜토리얼을 진행하면서 저자는 원래 C로 작성된 컴파일러를 Python으로 재구현하여 테스트를 포함해 300줄의 간결한 버전을 만들었습니다. 이 컴파일러는 클로저 변환을 수행하여 변수 바인딩, 자유 변수 추적, 코드 객체 관리를 처리합니다. 본 게시글에서는 lambda 식과 let 식, 함수 호출을 다루고 테스트 케이스와 어셈블리 코드 예시를 제공하여 구현 세부 사항을 설명합니다. 결과적으로 클로저와 간접 함수 호출을 처리할 수 있는 놀랍도록 컴팩트한 컴파일러가 탄생했으며, 복잡한 문제에 대한 우아한 해결책을 제시합니다.

더 보기

컴파일러 중간 표현(IR) 설계: 지역 정보를 이용한 의사 결정 및 최적화

2025-06-17
컴파일러 중간 표현(IR) 설계: 지역 정보를 이용한 의사 결정 및 최적화

이 글에서는 컴파일러 중간 표현(IR) 설계에 대해 논하며, 지역 정보만을 사용하여 의사 결정을 하는 데 중점을 둡니다. 제어 흐름 그래프(CFG), 레지스터 기반 IR, 정적 단일 할당(SSA) 형식을 비교하고, 정적 단일 정보(SSI) 및 노드의 바다(SoN)와 같은 더욱 고급 설계를 소개합니다. SSA는 각 변수에 한 번만 할당하여 분석을 단순화하지만, SSI는 프로그램의 서로 다른 분기에서 동일한 변수에 더욱 세분화된 정보를 추가할 수 있도록 합니다. SoN은 모든 명령어를 그래프의 노드로 표현하고, 데이터 및 제어 종속성을 명시적으로 표현하여 최적화의 유연성을 높입니다. 이러한 설계는 컴파일러 최적화를 더욱 효율적으로 수행하고, 궁극적으로 최적화된 코드를 생성하는 것을 목표로 합니다.

더 보기
개발 중간 표현

Word2Vec을 사용한 블로그 검색 엔진의 처음부터 구축

2025-05-20
Word2Vec을 사용한 블로그 검색 엔진의 처음부터 구축

저자들은 Python과 Word2Vec을 사용하여 블로그 검색 엔진을 처음부터 구축했습니다. 게시물과 검색 쿼리는 300차원 벡터 공간에 임베딩되고, 코사인 유사도를 사용하여 결과를 순위 매깁니다. 웹 친화적으로 만들기 위해 Word2Vec 모델은 인덱스와 벡터로 분할되고, 필요한 데이터만 다운로드하기 위해 HTTP Range 요청이 사용되어 웹 부하를 크게 줄입니다. 검색 엔진의 정확도를 평가하기 위한 평가 지표가 설계되었으며, 노이즈를 줄이기 위한 TF-IDF 사용 등 향후 개선 사항에 대해서도 논의합니다.

더 보기
개발

프로그래밍 언어에 대한 생각을 바꾼 논문과 블로그 게시글

2025-05-14
프로그래밍 언어에 대한 생각을 바꾼 논문과 블로그 게시글

이 블로그 게시글에서는 프로그래밍 언어와 컴파일러에 대한 저자의 이해를 크게 바꾼 논문과 블로그 게시글 몇 가지를 소개합니다. 다루는 주제는 가비지 컬렉션, 코드 최적화, 레지스터 할당, 정규 표현식 엔진, 머신 러닝, SSA 형식, 컴파일러 설계 등 다양합니다. 저자는 Z3를 증명 엔진으로 사용하는 것, 퍼징을 활용하여 버그를 발견하는 것, 효율적인 식 구문 분석 기법 등 제시된 통찰력 있는 접근 방식을 강조합니다. 이 컬렉션은 저자가 프로그래밍 언어 설계 및 구현의 복잡한 세부 사항에 깊이 천착해 왔음을 보여줍니다.

더 보기
개발

Nix 유도체 수동 생성: 해시 생성에 대한 심층 탐구

2025-04-09
Nix 유도체 수동 생성: 해시 생성에 대한 심층 탐구

이 블로그 게시글에서는 저자가 간단한 Nix 유도체를 수동으로 생성한 과정을 자세히 설명합니다. Farid의 블로그 게시글을 단계별로 분석하여 저자는 Nix 유도체의 내부 동작, 특히 해시 생성 프로세스를 깊이 이해합니다. 이 과정에서 ATerm 표현, SHA256 해싱, Nix 고유의 base32 인코딩과 같은 과제를 극복해야 했습니다. 최종적으로 저자는 Farid의 블로그 게시글과 동일한 해시 값을 생성하고 간단한 "hello world" 유도체를 성공적으로 생성했습니다.

더 보기

100배 속도 향상: Python에서의 가비지 컬렉션과 GPU의 위력

2025-03-25
100배 속도 향상: Python에서의 가비지 컬렉션과 GPU의 위력

이 글에서는 간단한 코드 최적화를 통해 Python 프로그램의 실행 속도를 100배 향상시킨 방법을 설명합니다. 초기 프로그램은 NumPy를 사용하여 병렬 계산을 수행했지만 메모리 관리가 제대로 되지 않아 속도가 느리고 메모리를 많이 소비했습니다. 저자는 사용되지 않는 중간 변수를 해제하는 간단한 가비지 컬렉션 메커니즘을 구현하여 실행 시간을 40초에서 10초로 단축하고 메모리 사용량을 크게 줄였습니다. 그런 다음 CuPy를 사용하여 계산을 GPU로 오프로드하여 실행 시간을 1.5초로 더 단축하여 극적인 성능 향상을 달성했습니다.

더 보기

Cinder JIT: 비트셋과 반격자를 사용한 효율적인 타입 표현

2025-03-11
Cinder JIT: 비트셋과 반격자를 사용한 효율적인 타입 표현

Cinder JIT 컴파일러는 타입을 집합(격자이기도 함)으로 취급하고 컴팩트한 비트셋 표현을 선택하는 독창적인 타입 표현 방식을 사용합니다. 이 글에서는 Cinder가 기본 타입 표현, 타입 유니온, 특수화 처리 등 효율적인 타입 정보 처리를 위해 비트셋과 반격자 구조를 어떻게 활용하는지 자세히 설명합니다. 타입 정보를 비트셋으로 인코딩함으로써 Cinder는 타입 유니온을 효과적으로 표현하고 더욱 세분화된 타입 구분을 가능하게 합니다. 또한 Cinder는 개별 객체의 구체적인 값을 추적하는 특수화 메커니즘을 도입하여 컴파일러의 최적화 효율을 더욱 높입니다. 이 글에서는 Bottom 타입과 타입 격자 생성 방법에 대해서도 설명합니다.

더 보기
개발 비트셋

정적 단일 할당(SSA) 컴파일러 최적화 심층 분석

2025-02-11
정적 단일 할당(SSA) 컴파일러 최적화 심층 분석

이 글은 정적 단일 할당(SSA) 컴파일러 최적화 기술의 수십 년에 걸친 발전 과정을 자세히 설명합니다. 코드 이동과 전역 값 번호 매기기에 대한 초기 논문부터 phi 명령어 최소화에 대한 Cytron의 획기적인 연구, Brandis와 Mössenböck의 단일 패스 생성 방식, Click과 Paleczny의 Sea of Nodes IR까지, 이 글은 몇 가지 중요한 논문을 추적하고 각각의 장점과 단점을 논의합니다. 또한 함수형 프로그래밍과 SSA의 관계에 대한 Appel의 연구, Aycock과 Horspool의 반복적인 phi 노드 제거, 추상 해석에 기반한 최근 접근 방식도 다룹니다. 이 글은 SSA에 대해 더 자세히 알고 싶은 독자에게 더 포괄적인 관점을 제공하기 위해 추가 논문 및 리소스 목록으로 마무리됩니다.

더 보기

CPS 심층 탐구: 함수형 프로그래밍 컴파일 여정

2024-12-25
CPS 심층 탐구: 함수형 프로그래밍 컴파일 여정

이 글에서는 계속 전달 방식(CPS)과 함수형 프로그래밍 언어 컴파일에서의 활용에 대해 자세히 설명합니다. 저자는 간단한 Scheme 유사 언어를 사용하여 CPS 변환기를 단계적으로 구축하고, 최적화 전략과 코드 생성 방법을 설명합니다. 이 글에서는 정수, 변수, 함수 호출, 산술 연산자, 람다 표현식, if 표현식을 CPS 형식으로 변환하는 방법을 자세히 설명하고, 메타 연속 및 상수 접기, 베타 감소와 같은 최적화 기술에 대해서도 논의합니다. 마지막으로 CPS 코드에서 실행 가능한 코드를 생성하는 몇 가지 방법의 개요를 제시하며, C 코드 생성, 트램폴린 사용, 단일 대규모 switch 문 사용 등을 포함합니다.

더 보기
개발