Trawling

최신기사

AI, 개발 도구, 오픈소스, 보안과 인프라의 변화와 이용 조건을 설명하는 최신 기사와 해설입니다.

Rust LSP를 만드는 것이 왜 어려운가 — rust-analyzer와 Rust Glancer의 설계 비교

발행

실험적 Rust LSP인 Rust Glancer를 개발하는 저자가 rust-analyzer와의 비교를 통해 LSP 서버 개발이 왜 어려운지를 아키텍처 수준에서 설명합니다. 컴파일러와 달리 LSP는 불완전한 상태에서도 즉시 유용한 답을 내놓아야 하며, VFS·증분 계산·워크스페이스 탐색 등 곳곳에 설계상의 난제가 숨어 있다는 것이 핵심입니다.

Ubuntu 26.10, cp·mv·rm까지 Rust Coreutils로 전환해 100% 마이그레이션 완료

발행

Ubuntu 26.10이 cp, mv, rm을 포함한 GNU Coreutils 전체를 Rust 기반 uutils로 교체하며 Rust Coreutils 전환을 100% 완료했습니다. 호환성 문제로 보류됐던 핵심 유틸리티까지 넘어오면서 수년간 진행된 재작성 프로젝트가 마무리 단계에 접어들었습니다. 베타는 이달, 정식 릴리스는 10월 15일로 예정되어 있습니다.

Unsize할 수 없는 값을 Unsize하기 — Go에는 되고 Rust에는 안 되는 것

발행

Go의 interface{} 타입 스위치처럼 Rust에서도 dyn Any로 다운캐스트하려 하지만, &str 같은 unsized 타입은 dyn으로 강제 변환(coerce)할 수 없다는 문제를 다룹니다. 저자는 vtable의 내부 구조를 분석한 뒤, 런타임에 vtable을 수작업으로 구성해 &str을 &dyn Any로 변환하고 다시 downcast하는 실험을 보여줍니다.

Verus로 올바름이 증명된 Rust 코드 개발하기 — Amazon의 형식 검증 도구

발행

Amazon이 Rust 코드의 정확성을 수학적으로 증명하는 오픈소스 프로그램 검증 도구 Verus를 소개했습니다. 개발자가 Rust 소스 파일 안에 명세와 증명을 직접 작성하면 자동화된 솔버가 모든 가능한 입력에 대해 코드가 명세를 만족하는지 검사하며, Amazon은 이미 Nitro Isolation Engine의 핵심 프리미티브 검증에 Verus를 활용하고 있습니다.

Veloren이 다르게 설계한 것들 — ECS, chonk, 그리고 살아있는 월드 시뮬레이션

발행

Rust로 개발된 오픈소스 복셀 RPG Veloren의 코어 개발자가 프로젝트의 특이한 설계 결정들을 정리했습니다. ECS 아키텍처, 'chonk'라는 독자적 복셀 자료구조, 물리 기반 월드 생성과 상시 시뮬레이션 시스템 rtsim 덕분에 48스레드 서버에서 500명 이상의 플레이어와 수만 개의 엔티티를 하나의 월드 공간에서 처리합니다.

Java 27 정식 출시 — JDK 27, 9월 15일 GA 선언

발행

Java SE 27의 Reference Implementation인 JDK 27이 2026년 9월 15일 General Availability에 도달했습니다. JSR 402 스펙을 기반으로 JEP 프로세스에 따라 개발되었으며, Oracle의 프로덕션용 GPL 바이너리가 우선 공개되고 다른 벤더의 빌드가 뒤따릅니다. 커뮤니티에서는 Structured Concurrency 프리뷰와 JNI 제한 강화 여부가 주요 화제로 떠올랐습니다.

12년 전 Go로 처음부터 만든 Wolfenstein 3D 클론 — 게임 엔진 없이 OpenGL과 자체 물리 엔진만으로

발행

Go 언어로 게임 엔진 없이 처음부터 작성한 Wolfenstein 3D 클론 gowolfenstein이 공개됐습니다. Unity나 Godot 같은 외부 엔진 없이 raw OpenGL(go-gl)만을 의존성으로 사용하며, 레이캐스팅(raycasting) 렌더링과 충돌 감지를 포함한 자체 물리 엔진을 직접 구현했습니다. 12년 전 개인 테스트 프로젝트로 시작해 90년대 FPS의 향수를 재현한 점이 특징입니다.

Swift 6.4 출시 — 빌드 시스템 통합과 Subprocess 1.0

발행

Swift 6.4가 출시됐습니다. Swift Package Manager의 기본 빌드 시스템이 Swift Build로 바뀌어 Linux·macOS·Windows에서 동일하게 빌드되고, 서브프로세스 라이브러리 Subprocess가 1.0에 도달했으며, WebAssembly 브릿징은 최대 40배 빨라졌습니다.

swap이 유발한 40ms Go GC stop-the-world pause — 프로덕션에서 swap을 켜기 전에 알아둘 것

발행

메모리 스파이크 대응을 위해 프로덕션에서 swap을 사용하던 저자가 Go 런타임의 GC 메타데이터 페이지가 swap-out되면서 stop-the-world pause가 중앙값 51µs에서 최악 40ms까지 폭증하는 현상을 실측했습니다. bpf 스크립트로 확인한 결과 40ms 중 39ms가 228건의 major page fault에서 발생했으며, 이는 GC가 heap 밖의 bookkeeping 영역을 읽는 동안 world가 멈춘 상태에서 swap-in을 기다렸기 때문입니다.

.NET 11 성능 개선 총정리 — 매년 이어지는 JIT·런타임 최적화 리포트

발행

Microsoft가 공개한 .NET 11의 연례 성능 개선 보고서로, JIT 컴파일러의 탈추상화(deabstraction)·가드드 디버추얼라이제이션(GDV)·이스케이프 분석(escape analysis) 등 수백 건의 최적화를 BenchmarkDotNet 마이크로 벤치마크와 함께 소개합니다. 대부분의 개선은 애플리케이션 코드 수정 없이 런타임 업그레이드만으로 이점을 얻을 수 있다는 점이 핵심입니다.

GCC는 어떻게 불필요한 정수 나눗셈을 제거하는가 — 매직 넘버와 역수 곱셈의 원리

발행

GCC가 상수 제수로 나누는 코드를 만나면 div 명령 대신 '매직 넘버' 곱셈과 비교 연산으로 치환하는 최적화를 다룬 글입니다. 저자는 Number Field Sieve 구현 과정에서 이 현상을 관찰하고, Granlund-Montgomery 계열의 round-up·round-down 알고리즘으로 매직 넘버를 직접 도출하는 C 코드를 제시합니다.

Forth를 모르고 Forth를 만든 이야기 — Lua C API 위에서 MoonForth 구현하기

발행

Forth 구현 경험이 없던 개발자가 Lua의 C API 위에서 C로 작성한 Forth 구현체 MoonForth의 개발 과정을 회고한 글입니다. JonesForth의 소스를 참조하되 어셈블리 대신 Lua 스택을 직접 조작하는 C 함수로 코어 워드를 구성했고, 함수 포인터 테이블로 컴파일을 구현해 일주일 만에 조건문과 루프까지 갖춘 실사용 가능한 Forth를 완성했습니다.

Cloudflare가 Rust 메모리 레이아웃 최적화로 DNS 캐시에서 100TB를 줄인 방법 분석

발행

Cloudflare의 Rust 기반 DNS 리졸버 Big Pineapple이 캐시 엔트리의 메모리 레이아웃을 최적화해 엔트리당 메모리를 56% 줄이고, 전체 플릿에서 약 100TB의 메모리를 절감한 사례를 분석한 글입니다. Vec·String을 Box 슬라이스로 교체하고, enum의 대형 variant를 박싱하며, 레코드를 raw bytes로 저장하는 하이브리드 방식이 핵심입니다.

Java 27 정식 출시 — G1이 모든 환경의 기본 GC로

발행

OpenJDK가 Java 27의 레퍼런스 구현인 JDK 27을 GA(Generally Available)로 발표했습니다. G1 가비지 컬렉터의 전 환경 기본화, Compact Object Headers 기본 활성화, TLS 1.3용 포스트퀀텀 하이브리드 키 교환 등 9개의 JEP가 포함된 릴리스입니다.

GDScript: 좋은 점, 나쁜 점, 그리고 아쉬운 점 — TypeScript에서 포팅해본 개발자의 시선

발행

동일한 시스템을 TypeScript와 GDScript로 각각 구현한 개발자가 GDScript를 심층 분석한 글입니다. 게임 로직 전용 언어로서의 강점(네이티브 벡터 타입, 시그널, GC 없는 메모리 관리)을 높이 평가하면서도, 미완성에 가까운 정적 타이핑 시스템과 함수형 프로그래밍 지원 부재를 약점으로 지적합니다.

스핀락 최적화 — 가장 단순한 락에서 피코초까지 쥐어짜기

발행

atomic exchange 루프로 만든 순진한 스핀락을 acquire/release 메모리 순서, test-and-test-and-set, 지수 백오프 순으로 개선해 4스레드 기준 246ns에서 43.0ns로 5.7배 빠르게 하고 에너지 소비도 64.92J에서 11.92J로 5.4배 줄이는 단계별 최적화 과정을 다룹니다. 캐시 라인 소유권 경쟁과 분기 예측 실패가 성능 저하의 원인임을 perf 수치로 보여주며, 저자는 std::mutex가 여전히 올바른 기본값이라고 강조합니다.

루프를 자동 벡터화시키기 — Rust에서 부동소수점 합산과 SIMD 최적화

발행

Rust로 작성한 단순한 내적(dot product) 루프가 자동 벡터화되지 않는 이유는 IEEE 754 부동소수점 덧셈이 결합법칙을 만족하지 않아 컴파일러가 연산 순서를 바꿀 수 없기 때문입니다. 저자는 수동 청킹과 Rust 1.98에서 안정화된 algebraic 연산자로 벡터화를 유도하는 과정을 어셈블리와 함께 보여주며, 컴파일러가 생성한 코드가 naive한 intrinsics 구현보다 빠르다는 결과를 확인합니다.

Ubuntu 26.10, Rust 기반 coreutils 전환 완료 — 보류됐던 cp·mv·rm까지 마이그레이션

발행

Ubuntu 26.10 'Stonking Stingray'가 ls, cat, chmod, du 등 GNU coreutils를 Rust로 재작성한 uutils로 전면 교체하며 Rust 전환을 완료합니다. 보안 문제로 보류됐던 cp, mv, rm의 TOCTOU 취약점이 업스트림에서 수정되면서 마지막 퍼즐이 맞춰졌지만, 커뮤니티에서는 rm의 세그멘테이션 폴트 재현 사례를 들어 성급한 전환이라는 비판도 나옵니다.

빠른 Tokio 애플리케이션을 위한 원칙들 — RustConf Unconf에서 나온 비동기 성능 지침

발행

dial9을 만드는 Russell이 RustConf Unconf의 비동기 디버깅·벤치마킹 논의를 바탕으로 정리한 Tokio 성능 원칙 모음입니다. '지연시간에는 양보(yield), 처리량에는 배칭'이라는 축을 중심으로, schedule latency 히스토그램으로 문제를 진단하고 공정성·전역 리소스·뮤텍스·워커 격리를 다루는 실전 지침을 담고 있습니다.

경험적으로, 프로그래머들은 "reduce"를 싫어한다

발행

Evan Hahn이 코드 리뷰 경험을 바탕으로 관찰한 흥미로운 사회적 현상을 소개합니다. map과 filter는 별다른 반발 없이 받아들여지지만 reduce를 쓰면 "읽기 어렵다"는 피드백이 따라오는 경우가 많았다는 것입니다. 저자는 가독성, 친숙도, 성능, 언어별 표현력 등 여러 가설을 제시하며, 이 같은 경향이 함수형 프로그래밍 관용구의 실제 수용 방식을 보여준다고 이야기합니다.