Lisp, 관용적인 코드로 C 언어 성능을 뛰어넘다!
Lisp 프로그래머들은 문제 해결을 위해 언어 자체를 확장(Language Extension)하는 경향이 있음
nbody 벤치마크를 통해 Lisp의 성능을 C 언어와 비교, 관용적 코드(Idiomatic Code)의 중요성을 강조함
Lisp의 메타 프로그래밍(Metaprogramming)을 활용한 DSL(Domain Specific Language) 구현으로 C 언어 수준의 성능 달성
커뮤니티에서는 '관용적 코드'의 정의에 대한 다양한 의견이 제시되었으며, Rust 언어의 영향력에 대한 언급도 있음
관용적 코드(Idiomatic Code)의 재정의
본문에서는 '관용적 코드(Idiomatic Code)'의 개념을 재조명하며, 언어의 특성을 잘 반영하고, 해당 언어의 숙련된 프로그래머를 대표하는 코드를 의미한다고 설명한다. 특히 Lisp의 경우, 메타 프로그래밍(Metaprogramming)과 다중 패러다임(Multi-paradigm) 기능을 활용하여 문제를 효율적으로 해결하는 코드가 'Lispy'하다고 정의한다. 이는 단순한 루프(Loop)나 객체 지향(Object-oriented) 스타일을 넘어선, Lisp만의 독특한 특징을 강조한다.
Lisp DSL(Domain Specific Language)을 활용한 성능 개선
저자는 nbody 벤치마크를 통해 Lisp의 성능을 개선하기 위해 DSL(Domain Specific Language)을 구축했다. 이 DSL은 커널(Kernel) 연산을 정의하고, SIMD(Single Instruction, Multiple Data) 자동 벡터화(Auto-vectorization)를 지원하여 C 언어와 유사한 성능을 달성했다. 특히, 700줄 미만의 Lisp 코드와 700줄의 라이브러리 코드를 통해 C 언어와 대등한 성능을 구현한 점은 주목할 만하다.
Lisp vs C: 성능 비교 및 트레이드오프
벤치마크 결과에 따르면, Lisp(DSL 기반)는 C 언어와 거의 동일한 성능을 보였다. 이는 Lisp의 메타 프로그래밍(Metaprogramming) 능력을 활용하여 C 언어의 성능을 따라잡았음을 의미한다. 하지만, Lisp의 DSL 구현에는 추가적인 라이브러리 코드와 개발 시간이 소요된다는 점을 고려해야 한다. C 언어는 컴파일러 최적화에 많은 노력이 투입되었지만, Lisp은 SBCL(Steel Bank Common Lisp)과 같은 컴파일러의 발전이 필요하다.
커뮤니티의 '관용적 코드'에 대한 시각
댓글에서는 '관용적 코드(Idiomatic Code)'라는 용어에 대한 다양한 해석이 제시되었다. 한 사용자는 '관용적 코드'가 단순히 유행하는 스타일을 의미하며, Rust 언어의 영향으로 인해 이 용어가 과도하게 사용되고 있다고 지적했다. 다른 사용자는 '관용적 코드'가 언어의 특성을 잘 반영하는 코드를 의미한다고 강조하며, Lisp의 경우 메타 프로그래밍(Metaprogramming)을 활용하는 것이 중요하다고 주장했다.