현재 우리는 웹 어플리케이션을 작성할 때 주로 Javascript로 작성한다. 하지만, 점차 사람들이 게임이나 AI와 같은 복잡한 프로그램을 웹으로 작성하기 시작하면서, type interfernce나 garbage collection과 같은 기능들이 Javascript로 작성된 코드를 매우 느리게 만들었다.(내 생각에도 JS는 애초에 철저한 계산으로 성능을 위해 엄밀히 만들어진 언어는 아니다.)
type interfernce
명시적 타입 표기가 없을 떄 프로그램이 알아서 타입을 추론하는 것
garbage collection
동적으로 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법
그리하여 이런 문제를 해결하기 위하여 Goggle, Apple, Microsoft, Mozilla가 함께 웹용 프로그래밍 언어를 새로 만들었고 그것이 Wasm, WebAssembly이다.
웹어셈블리는 저수준 바이트코드 언어로 JS가 아닌 다른 언어로 웹 어플리케이션을 작성할 수 있도록 한다.
bytecode 언어
high-level 언어로 작성된 코드를 가상머신이 이해할 수 있도록 바꿔주는 언어
이 웹어셈블리를 통해 Rust로 Web3 상의 블록체인 어플리케이션을 작성하는 게 가능해지고, 결국 Rust는 블록체인 클라이언트, 서버, 인터페이스까지 모두 작성이 가능힌 풀스택 언어가 된다.
원래 나는 Go나 Solidity가 블록체인에 가장 많이 쓰이는 언어라 생각하고, 이를 나중에 배워보려 계획하고 있었다. 그러던 중 아예 내가 모르던 Rust라는 언어가 블록체인 풀스택 언어가 될 수 있다는 글을 보게되니 혹하게 되었고, Rust에 대해 더 찾아보게 되었다.
Rust는 안전성, 속도, 동시성에 초점을 둔 statically-typed, multi-paradigm 언어이다.
statically-typed
코드의 상수, 변수, 함수 등에 대한 타입을 컴파일 타입에 확인하는 언어
multi-paradigm
여러 프로그래밍 패러다임을 지원하는 프로그래밍 언어
프로그래밍 패러다임
프로그램을 작성할 때의 관점
Rust Book에 따르면, Rust는 low-level 언어의 성능과 제어능력에 high-level 언어의 추상적 능력을 가지고 있다고 한다. 그리하여 더 안전한 C나 성능이 더 뛰어난 Python을 대체하기에 적합하다고 한다.
메모리 안전성
메모리 안전성이란 Buffer Overflow나 Dangling Pointer와 같은 메모리에 접근할 때 생길 수 있는 문제들에 대해 얼마나 보호받냐를 의미한다. rust는 컴파일 시에 메모리 안전성을 확인하므로 컴파일이 된 이후에는 이런 문제를 걱정하지 않아도 된다.
Buffer Overflow
프로그램에 할당된 메모리 버퍼의 한계보다 데이터가 넘치게 되면 해당 정보를 덮어쓰고 많은 오류를 발생시킨다.
Dangling Pointer
포인터가 해제된 메모리 영역을 가르켜 더 이상 메모리가 유효하지 않게 된다.
안전한 Concurrent programming(동시성 프로그래밍)
Concurrent programming이란 여러개의 process가 겹치는 기간 동안 교차되어 실행되는 것을 말한다. Data-race는 두개의 쓰레드가 동시에 메모리에 접근하게 되는 문제로 concurrent programming에서 자주 등장한다. Rust는 borrow checker라는 것을 이용해서 컴파일 중에 이것을 방지한다.
Zero-cost Abstraction
다음의 문장이 Zero-cost abstraction을 가장 잘 설명한 문장으로 뽑힌다.
What you don’t use, you don’t pay for. And further: what you do use, you couldn’t hand code any better.
한마디로 요약하자면 추상적으로 적은 코드와 해당 코드를 low-level하게 쓴 경우랑 속도가 같다는 것이다.
여러 단점들도 존재한다.
범용성
하는 사람도 적고 필요로 하는 곳도 많지 않다..
학습 난이도
Rust만의 개념들은 배우는데 오래걸리고, Rust 특징 상 아예 컴파일하기도 쉽지가 않으므로 많은 공부를 요한다.
커뮤니티와 라이브러리의 부족
아직 신생언어로써 많은 라이브러리들은 아직 성숙하지 못하고, 커뮤니티의 수와 크기도 상대적으로 적다.
Polkadot, Solana, Elrond와 같은 블록체인 프로토콜은 Rust를 주로 사용하거나 Rust로 프로그래밍이 가능하다.
Why Work in Blockchain? - Journey from C++ to Rust Developer
에 따르면 위에서 언급된 Rust 언어의 장점들이 속도와 안전성이 중요한 블록체인과 잘 맞다고 한다.
Why Discord is switching from Go to Rust 에 따르면 기본적인 Rust 코드가 굉장히 튜닝된 GO보다 더 성능이 뛰어났다고 하는 것을 봤을 떄 Rust의 성능은 탁월한 것 같다.
GO는 프로그래머들이 아이디어를 빠르게 테스트하고 또 적용하는데 이점이 있지만, Rust는 컴파일도 오래걸리며 빠른 코딩에는 적합하지 않다.
Go보다 쉽게 배울 수 있는 언어는 없다.
위에 나열된 Rust의 특징만 봐도 Rust가 세부적인 제어에 특화되었다는 것을 알 수 있다.
Go는 빠르게 배워서 빠르게 실행해보고 적용해볼 수 있는데 초점을 뒀고, Rust는 안전하고 문제 없이 뛰어난 성능에 초점을 뒀다.
위에 나열된 정보를 제외하고 또 주목할만한 점은 6년 연속 Stack Overflow에서 프로그래머들이 가장 사랑하는 언어에 뽑혔다는 점인데, 이 사실만 봐도, Rust가 신생 언어로써 차별화된 기능을 앞세워 많은 프로그래머들을 Rust의 길로 인도했다는 것을 알 수 있다. 나 역시 그 중 한명이 될 것 같은 예감이 들지만, 현재는 지금 하고 있는 Javascript를 더 마스터해야할 때인 것 같다. 현재 Rust를 배우는 것은 나의 실력에 시기상조라는 생각이 들고, JS를 통해 프로그래밍에 어느정도 지식을 쌓은 뒤 꼭 공부해보고 싶다.