-
buttercrab's profile image
buttercrab
June 20, 2023
Rust의 GC를 직접 구현해보자
서론 Rust는 GC가 없는 언어입니다. 하지만 지난 글에서 살펴보았듯이 Rust에서도 GC가 필요한 경우가 있습니다. 그래서 이번 글에서는 Rust에서 GC를 직접 구현해보려고 합니다. GC 구조 설계 Rust는 ownership 시스템으로 인해 GC를 구현하는 것이 까다롭습니다. C/C++ 등의 언어에서는 단순히 포인터를 사용하면 되지만 Rust에서는 포인터를 사용할 때마다 ownership을 고려해야 합니다. 물론 unsafe를 사용하면 ownership을 고려하지 않고도 포인터를 사용할 수 있지만, 이번 글에서는 unsafe를 최대한 사용하지 않고 GC를 구현해보려고 합니다. Rust에서 GC를 구현하기 위해서는 다음과 같은 구조가 필요합니다. 그럼...
-
buttercrab's profile image
buttercrab
May 20, 2023
Rust Crossbeam의 Epoch 기반 메모리 관리
서론 프로그래밍 언어는 다양한 방법을 통해 메모리를 관리합니다. 이러한 메모리 관리 방법은 크게 두 가지 방법으로 나눌 수 있습니다: GC(Garbage Collection)와 직접 메모리를 관리하는 방법입니다. GC는 메모리를 관리하는 방법 중 가장 편리한 방법이지만, GC가 동작하는 동안에는 프로그램이 멈추는 단점이 있습니다. 반면 직접 메모리를 관리하는 방법은 GC가 동작하지 않기 때문에 프로그램이 멈추지 않습니다. 하지만 직접 메모리를 관리하는 방법은 GC보다 훨씬 어렵습니다. Rust는 직접 메모리를 관리하는 방법을 사용합니다. Rust에서의 메모리 관리 방법은 예전 글인 Rust의 Borrow Checker을...
-
buttercrab's profile image
buttercrab
April 23, 2023
Piece Table
서론 텍스트 에디터는 하나의 문자열을 조작하는 것을 매우 빠르게 하는 자료구조가 필요합니다. 길이가 $n$인 문자열 $s$에 대해서 다음과 같은 기능들이 있어야 합니다: $s = s[0..i] + s[j..n], 0 \le i < j \le n$, 즉, $i$ ~ $j$까지의 문자들을 지운다 $s = s[0..i] + t + s[i..n]$, 즉, $i$ 위치에 문자열 t를 넣는다 $s[i..j]$, 즉, $i$부터 $j$까지의 문자열을 빠르게 구한다 텍스트 에디터에는 문자열 찾기, 줄 번호 등 여러 기능이 있어야 하지만 우선 가장 중요한 기능은...
-
buttercrab's profile image
buttercrab
March 15, 2023
Rust의 async/await
서론 지난 글에서 다양한 언어에서의 async/await에 대해 알아보았습니다. 이번 글에서는 Rust의 async/await에 대해 더 자세히 알아보겠습니다. std::future Rust의 async/await는 std::future::Future를 기반으로 합니다. std::future::Future trait은 std::future에 정의되어 있습니다. pub trait Future { type Output; fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>; } Future trait은 poll 함수를 정의하고 있습니다. poll 함수는 Future가 준비되었는지를 확인합니다. Future가 준비되었다면 Poll::Ready를 반환하고, 아니라면 Poll::Pending을 반환합니다. 자세히 살펴보면 poll 함수는 self를 Pin<&mut Self>로 받고 있습니다. Pin의 정의를 볼까요? std::pin::Pin pub...
-
buttercrab's profile image
buttercrab
February 17, 2023
다양한 언어에서의 async/await
동시성과 병렬성, 멀티쓰레드와 멀티프로세스 무어의 법칙이란 반도체 성능이 24개월마다 2배씩 증가하게 된다는 법칙입니다. 이 법칙은 최근까지 잘 맞아떨어지지만 이제는 한계에 가까워졌다고 합니다. 그래서 최근에는 CPU의 코어 수를 늘리는 추세입니다. 즉, 프로그래머는 CPU의 많은 코어를 모두 활용해야 프로그램이 돌아가는데 많은 이점을 볼 수 있습니다. 그래서 최근에 많은 프로그래밍 언어에서 동시성과 병렬 프로그래밍을 지원하고 있습니다. 병렬 프로그래밍에는 다양한 방법이 있는데, 그 중 오늘은 Async IO, 비동기적 IO에 대해 설명하겠습니다. Async IO란? Async IO의 정의 그럼 Async IO란...
-
buttercrab's profile image
buttercrab
November 22, 2022
Rust의 Borrow Checker
Rust의 소유권 시스템 대부분의 프로그래밍 언어는 두 가지 중 하나의 방법으로 메모리 관리를 했습니다. 첫 번째 방법은 개발자에게 메모리 관리에 대한 모든 권한을 주고 알아서 관리하라고 하는 겁니다. C, assembly 등의 언어에서 사용되고 있습니다. 또 다른 방법은 GC(Garbage Collector)를 이용하는 것입니다. 여기서는 GC의 작동원리에 대해서는 다루지 않지만, 메모리를 관리하는 방법이라고 알아두시면 좋을 것 같습니다. 각 방법에는 장점들과 단점들이 있습니다. 먼저 첫 번째 방법은 개발자가 작성한 프로그램의 성능을 개발자가 예측할 수 있고 개발자가 작성한 코드만 실행이...
-
buttercrab's profile image
buttercrab
August 21, 2022
Vision Transformer (1)
들어가며 Transformer을 다룬 지난 포스트에서 self-attention이 등장하게 된 배경과 그 알고리즘에 대해 알아보았다. 놀라운 것은 self-attention이 machine translation과 같은 자연어처리 문제들뿐만 아니라 컴퓨터 비전 분야에서도 높은 성능을 보이고 있다는 것이다. 그 시작은 Transformer의 발표 직후인 2018년으로 거슬러 올라간다. Transformer의 성공을 지켜본 컴퓨터 비전 연구자들은 먼저 CNN 구조에 self-attention을 더하거나 이미지의 각 픽셀을 문장의 각 단어로 간주해 self-attention을 적용하려 했다. 하지만 이 방법에는 두 가지 단점이 있었다. 이미지 사이즈에 비례해서 문장의 길이가 길어진다. 비전 분야에서는 low-resolution에...
-
buttercrab's profile image
buttercrab
May 14, 2022
Haskell fix 함수
서론 하스켈에는 다음과 같은 함수가 있습니다. fix :: (a -> a) -> a fix f = let x = f x in x Data.Function 에 위치한 fix 함수는 자세하게 들여다 보면 신기한 특성을 가지고 있습니다. 함수를 조금씩 풀어봅시다. fix f -> let x = f x in x -> let x = f x in f x -> let x = f x in f (f x) -> let x = f x in f...
-
buttercrab's profile image
buttercrab
April 9, 2022
Vision Transformer (1)
들어가며 현재 컴퓨터 비전에서 가장 뜨거운 주제 중 하나는 vision transformer (ViT) 이다. 2017년에 발표되었지만 벌써 4만 번 가까이 인용된 [](https://arxiv.org/pdf/2010.11929.pdf) 논문 이후 본래 자연어처리를 위해 고안된 transfomer를 컴퓨터 비전에 사용하기 위한 연구가 이루어졌고, 2021년 ICLR에서 Google Brain 팀이 [<An Image Is Worth 16X16 Words: Transformers for Image Recognition at Scale>](https://arxiv.org/abs/2010.11929)라는 제목으로 ViT를 발표하면서 ViT를 image recognition, object detection, image restoration 등 수많은 컴퓨터 비전의 태스크에 적용한 연구가 쏟아져 나왔다. ViT를 소개하기 앞서 오늘은 transformer가...
-
buttercrab's profile image
buttercrab
January 3, 2022
구글의 야심작 QUIC
목차 목차 서론 배경지식 TCP TCP의 구조 TCP의 특징 UDP UDP의 구조 UDP의 특징 OSI 7계층 SSL/TLS HTTP의 역사 HTTP/1.1 HTTP/2 HTTP/2 with push 구글의 야심작 QUIC 기존 프로토콜의 단점 QUIC이란 QUIC의 단점 추가적인 내용 정리 서론 최근 구글이 새로운 프로토콜을 만들었습니다 그리고 구글은 이를 적극적으로 활용하고 있습니다. 사진을 보면 구글을 들어갔을 때 빨간색으로 표시한 것처럼 프로토콜이 h3라고 표시되어 있습니다. 이는 HTTP/3의 약자이며 HTTP/3라고 불리는 QUIC을 한 번 알아봅시다. 배경지식 TCP 우리가 사용하는 인터넷은 전송할...