표현 문제의 우아한 해결책: 다중 디스패치와 열린 메서드

2025-09-07

이 글에서는 객체 지향 프로그래밍과 함수형 프로그래밍 모두에서 어려움을 겪는 '표현 문제'를 자세히 다룹니다. 기존 코드를 수정하지 않고 새로운 데이터 타입과 연산을 추가하는 방법에 대한 문제입니다. C++와 Haskell의 예시를 통해 저자는 문제의 핵심을 보여줍니다. 전통적인 객체 지향 프로그래밍에서는 타입과 연산을 동시에 확장하는 것이 어렵고, 함수형 프로그래밍도 비슷한 제약이 있습니다. 이 글에서는 비지터 패턴과 그 확장을 자세히 분석하고, 마지막으로 Clojure의 멀티메서드와 프로토콜을 사용하여 다중 디스패치와 열린 메서드가 표현 문제를 우아하게 해결하고 유연하고 확장 가능한 코드를 구현하는 방법을 보여줍니다.

더 보기
개발

표현 문제: 객체 지향과 함수형 프로그래밍에서의 우아한 해결책

2025-09-07

이 글에서는 소프트웨어 설계에서의 "표현 문제"를 자세히 다룹니다. 기존 코드를 수정하지 않고 새로운 데이터 타입과 연산을 추가하는 방법에 대해 논의합니다. C++과 Haskell 예제를 사용하여 객체 지향 프로그래밍과 함수형 프로그래밍에서 이 문제의 한계를 보여주고, 비지터 패턴, Clojure의 멀티 메소드와 프로토콜을 사용한 우아한 해결책을 탐구합니다. Clojure의 접근 방식은 오픈 메소드의 강력한 기능을 활용하여 메소드 정의와 타입 정의를 분리함으로써 기존 코드를 변경하지 않고 유연한 확장을 가능하게 합니다.

더 보기
개발 표현 문제

Forth 재방문: 두 가지 구현과 특이한 언어에 대한 성찰

2025-08-28

저자는 20년 전 처음 접했던 Forth 언어를 다시 방문하여 2개월 동안 두 가지 Forth 인터프리터인 goforth(Go 언어 구현)와 ctil(C 언어 구현)을 구현했습니다. goforth는 순수한 인터프리터로 간단하지만 고급 기능이 부족합니다. 반면 ctil은 전통적인 Forth 구현에 가까워 Forth 자체를 사용하여 언어를 확장할 수 있으며, Forth의 강력함을 보여줍니다. 저자는 Forth의 고유한 강점은 초기 하드웨어 환경에 있었다고 주장하지만, 스택 기반 프로그래밍 모델 때문에 현대 프로그래밍 환경에서는 가독성이 떨어지고 실용성이 부족하며, 컴파일러 원리와 가상 머신을 이해하기 위한 학습 프로젝트로 적합하다고 결론짓습니다.

더 보기

통일 알고리즘: 구현 및 응용

2025-08-18

이 글에서는 기호 항 사이의 방정식을 자동으로 푸는 과정인 통일 알고리즘을 자세히 설명합니다. 논리 프로그래밍과 형식 추론에서 널리 사용됩니다. 패턴 매칭으로 시작하여 통일 개념을 구축하고, Norvig의 개선된 알고리즘을 기반으로 한 Python 구현을 제공합니다. 구현에는 데이터 구조 정의, 핵심 함수 `unify`, 보조 함수 `unify_variable` 및 `occurs_check`, 자세한 코드 예제 및 실행 결과가 포함됩니다.

더 보기
개발 통일

다항식 곱셈, 콘볼루션, 신호 처리의 우아한 연결

2025-05-21

이 글에서는 다항식 곱셈, 콘볼루션, 신호 처리 간의 관계를 탐구합니다. 표와 다이어그램을 사용하여 다항식 곱셈을 시각적으로 설명하고, 그것이 본질적으로 콘볼루션 연산임을 밝힙니다. 그런 다음 이산 신호와 시스템을 소개하고, 선형 시불변 시스템(LTI)에 초점을 맞춥니다. 임의의 신호는 스케일링 및 시프트된 임펄스 신호의 시퀀스로 분해될 수 있으며, LTI 시스템의 응답은 콘볼루션을 사용하여 계산할 수 있음을 설명합니다. 마지막으로, 콘볼루션의 속성과 푸리에 변환과의 관계를 간략하게 언급하고, 콘볼루션의 푸리에 변환은 피연산자의 푸리에 변환의 곱과 같으며, 효율적인 콘볼루션 계산을 가능하게 함을 강조합니다.

더 보기
개발 콘볼루션

블룸 필터: 효율적인 집합 멤버십을 위한 확률적 데이터 구조

2025-05-02

블룸 필터는 최소한의 공간을 사용하여 요소가 집합의 멤버인지 효율적으로 테스트하는 확률적 데이터 구조입니다. 요소를 비트 배열 내 여러 위치에 해싱함으로써 블룸 필터는 빠른 멤버십 테스트를 제공하지만, 가양성의 가능성이 약간 있습니다. 대부분의 쿼리가 음수 결과를 반환하는 시나리오에 이상적이며, 블룸 필터는 조회 속도를 크게 향상시킵니다. 이 기사에서는 기본 원리, 구현(Go 예제 포함), 수학적 유도에 대해 자세히 설명합니다. 1%의 가양성 비율로 10억 개의 항목 집합에 대한 최적 매개변수 계산을 보여주는 실용적인 예는 대규모 데이터 처리에서의 효율성을 강조합니다.

더 보기

효율적인 트랜스포머: 스파스 게이트 믹스처 오브 익스퍼트(MoE)

2025-04-20

트랜스포머 모델의 피드포워드 레이어는 매우 클 수 있으며, 이는 효율성의 병목 현상을 초래합니다. 스파스 게이트 믹스처 오브 익스퍼트(MoE)는 이 문제에 대한 우아한 해결책을 제공합니다. MoE는 큰 피드포워드 레이어를 여러 개의 작은 "전문가" 네트워크로 분할하고, 라우터를 사용하여 각 토큰에 대해 최적의 전문가 하위 집합을 선택함으로써 계산 비용을 크게 줄이고 효율성을 향상시킵니다. 이 글에서는 MoE의 작동 방식을 자세히 설명하고, NumPy를 사용한 구현 예시를 보여주며, 전문가의 부하 분산과 같은 중요한 문제점도 논의합니다.

더 보기

교차 엔트로피: 분류를 위한 손실 함수 심층 분석

2025-04-13

이 게시글은 기계 학습 분류 작업에서 손실 함수로서의 교차 엔트로피의 역할을 명확하게 설명합니다. 정보 이론의 개념인 정보량과 엔트로피부터 시작하여 교차 엔트로피를 구축하고 KL 다이버전스와 비교합니다. 그리고 교차 엔트로피와 최대 우도 추정 간의 관계를 수치 예시를 사용하여 보여주고 기계 학습에서의 적용을 명확히 합니다.

더 보기

네 개의 2로 기적 만들기: 수학 퍼즐의 우아한 해법

2025-02-23

겉보기에는 간단한 수학 퍼즐: 네 개의 숫자 '2'와 임의의 수학 연산자만을 사용하여 임의의 자연수를 생성합니다. 초등학교 산수부터 대학교 수준의 고등 수학까지 누구나 참여할 수 있습니다. 처음에는 간단해 보이지만, 지수, 계승 등이 도입되면 난이도가 급상승합니다. 결국 물리학자 디랙은 중첩된 제곱근과 로그를 사용하여 일반 해를 발견하고, 이 오랜 난제를 우아하게 해결했습니다. 그것도 단 네 개의 2만으로.

더 보기

Python의 JIT 데코레이터: 세 가지 구현 전략

2025-02-03

이 글에서는 Python에서 널리 사용되는 JIT 데코레이터 패턴, 특히 JAX 및 Triton 라이브러리에서의 사용에 대해 자세히 설명합니다. 저자는 단순화된 예시를 사용하여 AST 기반, 바이트코드 기반, 추적 기반의 세 가지 JIT 데코레이터를 처음부터 구현합니다. AST 기반 접근 방식은 추상 구문 트리를 직접 조작하고, 바이트코드 기반 접근 방식은 Python의 바이트코드 인터프리터를 활용하며, 추적 기반 접근 방식은 런타임 시 함수 실행을 추적하여 표현식 IR을 구성합니다. 이 글에서는 각 접근 방식의 장단점을 자세히 설명하고, JAX와 Numba를 예시로 들어 실제 애플리케이션에서의 전략을 설명합니다.

더 보기
개발

Raft 구현: 분산 합의에 대한 심층 분석

2024-12-21

이 글은 분산 합의 알고리즘 Raft와 Go를 사용한 구현에 대한 시리즈의 첫 번째 게시글입니다. Raft는 여러 서버에 걸쳐 결정론적 상태 머신을 복제하는 문제를 해결하여 서버 오류가 발생하더라도 서비스 가용성을 보장합니다. 이 게시글에서는 상태 머신, 로그, 합의 모듈, 리더/팔로워 역할, 클라이언트 상호 작용 등 Raft의 핵심 구성 요소를 소개합니다. 또한 Raft의 내결함성, CAP 정리, Go를 구현 언어로 선택한 이유에 대해서도 설명합니다. 향후 게시글에서는 알고리즘 구현에 대한 자세한 내용을 설명할 것입니다.

더 보기
개발 분산 합의