Crystal 언어의 특징과 탄생 배경
- Ruby에서 영감: Crystal은 Ruby와 유사한 문법을 가지며, Ruby의 표준 라이브러리를 거의 그대로 복사하여 개발자들에게 친숙함을 제공합니다.
- 정적 타입 추론: Ruby의 동적 타이핑 감성을 컴파일 언어에서 구현하기 위해 컴파일러가 변수의 타입을 자동으로 추론하는 기능을 제공하며,
nil
값으로 인한 ‘100만 달러짜리 실수’를 방지하고자 합니다. - Go 스타일 동시성: Go 언어에서 영감을 받은 CSP(Communicating Sequential Processes) 기반의 코루틴 및 그린 스레드를 통한 견고한 동시성 모델을 내장하고 있습니다.
- C 언어 라이브러리 연동: C 라이브러리와의 쉬운 바인딩을 지원하여 기존 코드 재사용 및 성능 최적화를 가능하게 합니다.
- 탄생 배경: 2011년 아르헨티나의 Manas에서 Ruby on Rails 개발 중 성능 문제에 직면하자, ‘컴파일되는 Ruby’를 목표로 실험적으로 개발을 시작했습니다. 초기에는 단순한 장난감 프로젝트였으나, Hacker News에서 큰 반향을 얻으며 본격적인 개발로 이어졌습니다.
정체성 위기와 변화
- 초기 목표와 모토: “Fast as C, Sleek as Ruby”라는 모토 아래, Ruby와 유사한 문법, 변수/메서드 인수의 타입 명시 불필요, C 라이브러리 호출 용이성, 컴파일 타임 코드 생성 등을 목표로 했습니다. 그러나 초기부터 빈 컬렉션의 타입 명시는 필요하여 ‘타입 명시 불필요’ 원칙에서 벗어나는 부분이 있었습니다.
- 컴파일 속도 문제: 전역 타입 추론으로 인해 대규모 Crystal 프로그램의 컴파일 시간이 매우 길어지는 문제가 발생했습니다. 이는 컴파일러가 모든 파일 간의 의존성을 메모리에 유지하며 타입을 추론해야 했기 때문입니다.
- 논쟁적 변화: 이 문제를 해결하기 위해 개발팀은 인스턴스 변수에 대한 타입 명시를 요구하는 변경을 제안했습니다. 이는 ‘타입 명시 불필요’라는 Crystal의 핵심 정체성과 충돌하며 커뮤니티 내에서 큰 반발을 불러일으켰습니다.
- 정체성 재정의: 개발팀은 Crystal의 존재 이유와 이 변화 없이는 프로젝트가 생존할 수 없다는 판단하에 변경을 강행했습니다. 이 과정에서 “Ruby 호환성은 목표가 아니다”라는 점을 명확히 하고, 모토를 “A language for humans and computers”로 변경하여 타 언어와의 비교보다는 Crystal 자체의 지향점을 강조했습니다.