Introduction: Paul Graham's Essay, "The Hundred-Year Language"
'미래 프로그래밍 언어가 무엇일까'에 대한 고민은 현재 프로그래밍 언어의 기초를 이해하려는 열망에서 비롯되었다. 또한 최근 Elixir에 대한 관심이 생기면서 1년 전에 읽었던 '해커의 화가'라는 책을 다시 들추게 되었다. "The Hundred-Year Language"는 해커의 화가 책 11장에 기고된 글이자 Paul Graham이 2003년에 작성한 에세이로, 프로그래밍 언어의 미래와 현재 언어의 한계를 탐구한다. 해당 에세이에서는 언어 발전이 더디게 진행되는 이유를 분석하고, 프로그래머의 생산성과 효율성을 높이기 위해 미래의 프로그래밍 언어가 갖추어야 할 혁신적인 기능에 대해 논의한다. 2003년 이후 100년의 1/5의 지점인 2023년에는 프로그래밍 언어의 모습이 어떠한 진화를 하고 있을지에 대해 탐구해보았다.
Evolution of Programming Languages
프로그래밍 언어도 종의 진화처럼 진화의 나무를 형성하며, 이전의 언어들에서 새로운 언어들이 분기된다. 그러나 종의 진화와 달리 프로그래밍 언어의 진화는 다양한 분파가 다시 한 번 수렴(convergence)할 수 있는 잠재력을 가지고 있다. 진화 나무의 중심 줄기에 가까이 머무르는 것은 지금과 미래에 좋은 프로그래밍 언어를 찾는데 유용한 휴리스틱이다. 언어 설계자는 장기적인 진화의 방향을 고려하고 다른 언어의 아이디어를 통합하여 자신의 창작물이 관련성을 유지할 수 있도록 해야 한다.
프로그래밍 언어는 기본 연산자(공리) 집합과 이러한 연산자의 관점에서 작성할 수 있는 나머지 언어의 두 부분으로 나눌 수 있다. 기본 연산자(공리)는 언어의 장기적인 성공에 중요한 역할을 한다. 어떤 언어의 중심을 깊게 들여다보면서 좋은 공리가 있는지 살펴보는 것도 좋은 학습이 된다. 가장 작고 깔끔한 중심을 가진 언어는 더 우아하고 표현력이 풍부한 언어로 이어질 것이고 그러한 언어들이 가장 진화 나무 중심 줄기를 관통할 확률이 높다.
Paul Graham, 『Hackers and Painters』 (O'REILLY, 한빛 미디어), 252
Constant Advancements in the Computer World - Efficiency and Convenience
무어의 법칙은 계속해서 적용될 수는 없지만, 컴퓨터의 발전 속도가 더 빨라질 것이라는 사실은 거의 확실하다. 이러한 발전 속도는 프로그래밍 언어에서도 중요한 역할을 할 것이다. 다른 애플리케이션인 하드웨어가 제공하는 모든 CPU 사이클을 소모하기 때문에 일부 애플리케이션이 비효율적일 수 밖에 없다면, 더 빠른 컴퓨터라는 것은 결국 여러 수준의 효율성을 아우르는 프로그래밍 언어를 의미하게 될 것이다. 따라서, 프로그래밍 언어의 효율성과 편의성 사이에서 균형을 유지하는 것은 중요한 요소로 자리잡을 것이다.
예를 들어, 오늘날의 많은 언어는 문자열과 리스트에 대한 별도의 데이터 구조가 있다. 대부분의 데이터 구조는 속도 때문에 존재한다. 의미론적으로 보았을 때 문자열이란 내부 항목이 문자인 리스트에 불과하다. 그런데 왜 두 개의 독자적인 데이터 구조가 필요할까? 사실 두 개의 데이터 구조가 필요하지 않다. 언어에 문자열이 존재하는 것은 단순히 효율성을 위한 것이다. 프로그램을 더 빠르게 실행하기 위해 언어의 의미론적 특성을 교란시키는 것은 비합리적이다. 따라서 효율성을 추구하는 일반적인 방법은 언어의 의미적 특징을 특정 구현에서 분리하는 것이다. 이를 통해 적절한 효율성을 보장하고 프로그래머에게 보다 편리한 프로그래밍 환경을 제공할 수 있다.
새로운 언어를 설계할 때는 효율성을 과감히 희생하고 사소한 편의성을 개선하는 것이 중요한 관점이다. 예를 들어, 문자열과 리스트에 별도의 데이터 구조를 두는 대신 문자열은 내부 항목이 문자인 리스트라는 것을 의미론적으로 인식하고 새로운 언어에서 문자열과 리스트를 통합하는 것이 좋은 방향일 수 있다. 이러한 방식으로 효율성을 희생하면 언어 설계가 더 단순해지고 프로그래머에게 이점을 제공할 수 있다. 더 빠른 하드웨어에서 얻을 수 있는 컴퓨팅 리소스를 좋은 낭비를 만들어내는 것이 바람직한 전략이다.
궁극적으로 프로그래밍 언어에서 효율성과 편의성 사이의 균형을 찾는 것이 향후 프로그래밍 언어의 발전에 중요한 역할을 할 것이다. 우리는 이러한 변화를 받아들이고 새로운 세대의 프로그래머들이 보다 효율적이고 생산적인 환경에서 작업할 수 있도록 지원해야 한다. 이를 통해 기술 발전을 최대한 활용하고 더 나은 소프트웨어 개발 생태계를 만들 수 있다.
Paul Graham, 『Hackers and Painters』 (O'REILLY, 한빛 미디어), 254,255
The paradox of abstraction and efficiency
기술이 발전함에 따라 프로그래밍 언어와 소프트웨어의 추상화 수준이 높아져 개발 환경이 더욱 편리해졌다. 그렇다면 편의를 위해 프로그래밍 언어의 추상화 수준을 어디까지 높일 수 있을까라는 질문이 생긴다. 많은 새로운 프로그래밍 언어는 바이너리 코드(C, C++)가 아닌 바이트코드(Java)로 컴파일되도록 설계되었다. 이러한 접근 방식은 소프트웨어의 추상화 수준을 높여 애플리케이션과 하드웨어 사이에 여러 계층의 소프트웨어가 존재하게 함으로써 유연성을 위해 효율성을 희생하는 방식이다. 성능 손실은 피할 수 없지만 이러한 희생은 새로운 가능성을 제공해준다.
추상화는 애플리케이션 자체에도 강력한 영향을 미친다. 상향식 프로그래밍은 프로그램을 여러 계층으로 나누고 하위 계층은 상위 계층을 위한 언어 역할을 한다. 이러한 프로그램은 더 작고, 더 유연하며, 더 재사용할 수 있다. 재사용성이라는 개념은 오랫동안 객체 지향 프로그래밍과 연관되어 왔다. 그러나 재사용 가능한 소프트웨어를 만드는 것은 객체 지향 프로그래밍이 아닌 상향식 접근 방식의 결과이다. 라이브러리가 그 예시로, 객체 지향 스타일로 작성되었는지 여부와 관계없이 하나의 언어로 존재하기 때문에 재사용이 가능하다.
하지만 추상화 수준을 높여 효율성을 희생하는 것이 항상 좋은 선택은 아니라는 것을 알아야 한다. 예를 들어, Java는 JVM으로 바이트코드를 실행하여 인터프리터나 JIT 컴파일러를 사용해야 하기 때문에 다른 언어(C, C++)에 비해 속도가 느리다는 비판을 받곤 한다. 이 프로세스는 복잡하고 실행 속도를 저하시키는 요인이 될 수 있다. 또한 Java는 메모리 관리를 자동으로 처리하므로 프로그래머가 직접 메모리를 할당하고 할당 해제할 필요가 없다. 그러나 이는 불필요한 가비지 컬렉션 비용과 같은 단점이 있다.
따라서 추상화와 효율성 사이의 균형을 찾는 것이 중요하다. 프로그래머는 코드가 어떻게 컴파일되고 실행되는지 이해해야 하며, 언어 설계자는 추상화 수준을 높이면서 효율적인 코드를 작성하는 방법을 고려해야 한다. 예를 들어 C언어에서는 프로그래머가 직접 메모리 할당과 할당을 처리해야 하지만, 이렇게 하면 코드 효율성이 크게 향상된다. 따라서 추상화 수준을 높이는 것이 바람직한 경우도 있지만 항상 그런 것은 아니다.
이러한 이유로 미래 프로그래밍 언어는 효율성과 추상화 사이의 균형을 계속 추구할 것이다. 이미 많은 언어가 이러한 방향으로 진화하고 있으며 이러한 추세는 계속될 것으로 예상된다. 바이너리 코드로 컴파일되는 언어의 가지는 C, C++에서 Go, Rust로 나아갔고 바이트코드로 컴파일되는 언어 Java, Ruby는 Kotlin, Elixir으로 진화했다. 프로그래머는 이러한 변화에 적응하기 위해 자신의 기술을 계속 업그레이드하고 새로운 언어와 기술을 배워야 한다. 또한 효율적인 코드를 작성하기 위해서는 언어 설계 및 구현에 대한 이해도가 높아져야 한다.
병렬 처리는 앞으로 어떻게 발전하게 될까? 앱 개발자에게 영향을 줄 정도로 추상화의 사다리를 오를 수 있을까? 아니면 컴파일러 개발자들의 고민으로 머물게 될까? 병렬 처리에 대한 한 가지 예측은, 그로 인해 발생하는 대부분의 기회가 낭비될 것이라는 점이다. 병렬 처리는 엄청난 속도를 제공하는 하드웨어와 마찬가지로 꼭 필요한 경우에는 사용되겠지만, 평상시에는 사용되지 않을 가능성이 높다. 실제로 100년 후 병렬 처리는 특수한 애플리케이션을 제외한 대부분의 범용 프로그램과 거의 관련이 없을 것으로 보인다. 일반 프로그램에서 병렬 처리를 사용하는 것은 시기상조로 여겨질 수 있다.
Paul Graham, 『Hackers and Painters』 (O'REILLY, 한빛 미디어), 256,257,258
Reflections on Programming Language Evolution
폴 그레이엄은 미래의 프로그래밍 언어가 더 높은 수준의 추상화와 더 강력한 코드 재사용 기능을 제공할 것이라고 주장한다. 또한 언어가 지원하는 기능이 프로그래머의 생산성에 큰 영향을 미치며, 미래의 언어는 이러한 기능을 최적화할 것이라고 생각한다. 이러한 언어가 취할 정확한 형태를 예측하기는 어렵지만 현재 프로그래밍 생태계와 에세이를 바탕으로 미래 프로그래밍 언어가 가져야 할 특징들에 대해 정리해볼 수 있다.
프로그래밍 언어 평가를 위한 가중 합산 모델을 만들어보기 위해 GPT-4 모델을 활용하여 위에서 말한 미래 언어의 9가지 특징들에 대해 가중치(weight)를 측정해보았다. 또한 이는 현재 기술이 아닌 미래 기술의 발전의 환경을 고려하여 측정되었다.
1. Abstraction
더 높은 수준의 추상화와 표현력이 풍부한 구문을 통해 개발자는 더 효율적이고 유지 관리가 쉬운 코드를 작성할 수 있다. 여기에는 보다 직관적이고 표현적인 구문, 함수형 프로그래밍 개념에 대한 보다 나은 지원 또는 컴파일 타임에 오류를 포착하는 고급 타이핑 시스템이 포함될 수 있다.
weight: 0.15
근거: 폴 그레이엄은 프로그래밍 언어에서 추상화의 중요성을 강조한다. 높은 수준의 추상화는 복잡성을 줄이고 개발자가 문제 해결에 효율적으로 집중할 수 있도록 하는 데 매우 중요하다.
2. Code Reuse and Modularity
미래의 언어는 프로그래머가 다른 사람의 작업을 기반으로 더 효과적으로 빌드할 수 있도록 코드 모듈성과 재사용을 더 잘 지원해야 한다. 여기에는 패키지 관리, 더 강력한 라이브러리 및 프레임워크, 코드 공유 및 협업을 위한 개선된 메커니즘에 대한 더 나은 지원이 포함될 수 있다.
weight: 0.1
근거: 에세이에서 명시적으로 논의되지는 않았지만, 코드 재사용과 모듈성은 이전 작업을 기반으로 하고 중복되는 노력을 줄이는 데 필수적이다. 이러한 특성은 소프트웨어 시스템의 규모와 복잡성이 커짐에 따라 더욱 중요해질 것이다.
3. Optimized language features
프로그래밍 언어가 제공하는 기능은 프로그래머의 생산성에 상당한 영향을 미칠 수 있다. 미래의 언어는 이러한 기능을 최적화하여 개발자가 깔끔하고 유지 관리가 가능하며 효율적인 코드를 더 쉽게 작성할 수 있도록 한다. 여기에는 동시성 및 병렬성에 대한 더 나은 지원, 향상된 오류 처리 또는 디버깅 및 프로파일링을 위한 고급 도구가 포함된다.
weight: 0.1
근거: 이 에세이에서는 보다 효율적인 개발과 성능 향상을 지원하기 위해 시간이 지남에 따라 계속 발전하고 최적화될 강력하고 표현력이 풍부한 언어 기능의 중요성에 대해 언급하고 있다.
4. Programmer Productivity
프로그래밍 언어가 발전함에 따라 점점 더 프로그래머의 생산성과 효율성을 우선시하게 될 것이다. 여기에는 코드 완성에 대한 더 나은 지원, 더 강력한 통합 개발 환경(IDE) 또는 리팩토링이나 코드 서식 지정과 같은 반복 작업을 자동화하는 더 스마트한 도구가 포함될 수 있다.
weight: 0.15
근거: 폴 그레이엄은 미래의 프로그래밍 언어는 프로그래머가 더 적은 코드로 더 많은 것을 성취할 수 있게 해줄 것이라고 제안한다. 이는 프로그래머의 생산성 향상과 직결되므로 매우 중요한 특징이다.
5. Adaptability
미래의 프로그래밍 언어는 양자 컴퓨팅이나 neuromorphic 컴퓨팅과 같은 새로운 컴퓨팅 패러다임에 적응할 수 있어야 하며 AI, 머신러닝, 블록체인과 같은 새로운 기술과 원활하게 통합될 수 있어야 한다.
weight: 0.1
근거: 이 에세이에서는 새로운 기술과 패러다임에 대한 적응성에 대해 간략하게 설명한다. 미래의 언어는 급변하는 기술 환경에 대응할 수 있도록 유연하고 다재다능해야 한다.
6. Interoperability and Platform Independence
기기와 플랫폼의 환경이 점점 더 다양해짐에 따라 프로그래밍 언어는 서로 다른 시스템 간의 원활한 상호 운용성을 지원하고 플랫폼에 구애받지 않는 개발을 지원해야 한다.
weight: 0.1
근거: 상호 운용성과 플랫폼 독립성은 에세이에 명시적으로 언급되어 있지는 않지만, 플랫폼과 디바이스의 수가 증가함에 따라 최신 프로그래밍 언어에 필수적인 요소이다.
7. Scalability and Performance
애플리케이션이 점점 더 복잡해지고 데이터 집약적으로 변함에 따라 미래의 언어는 분산 컴퓨팅과 효율적인 메모리 관리를 기본으로 지원하여 확장 가능한 고성능 시스템 개발을 용이하게 해야 한다.
weight: 0.1
근거: 폴 그레이엄은 이 에세이에서 성능에 대해 언급하고 있으며, 소프트웨어 시스템이 점점 더 복잡해짐에 따라 확장성과 성능은 미래 프로그래밍 언어의 중요한 특성이 될 것이다.
8. Security and Reliability
사이버 보안의 중요성과 신뢰할 수 있는 소프트웨어의 필요성이 커짐에 따라 프로그래밍 언어는 보안 기능을 우선시하고 오류 처리 및 내결함성을 위한 기본 메커니즘을 제공해야 한다.
weight: 0.1
근거: 보안과 신뢰성은 에세이에서 직접적으로 논의되지는 않았지만 현대 소프트웨어 개발에서 매우 중요하며 시간이 지남에 따라 그 중요성은 더욱 커질 것이다.
9. Ease of Learning and Collaboration
프로그래밍 커뮤니티가 더욱 다양해짐에 따라 미래의 언어는 버전 관리 및 지속적인 통합을 포함한 협업 개발을 위한 강력한 도구와 지원을 통해 접근성이 뛰어나고 배우기 쉬워야 한다.
weight: 0.1
근거: 에세이에 명시적으로 언급되지는 않았지만, 프로그래밍 커뮤니티가 다양해지고 소프트웨어 시스템이 점점 더 복잡해짐에 따라 학습 및 협업의 용이성은 필수적이다.
미래 프로그래밍 언어의 정확한 형태를 예측할 수는 없지만 이러한 주제와 아이디어는 언어가 발전할 수 있는 방향을 엿볼 수 있게 해준다. 기존 언어의 지속적인 개발과 개선, 그리고 새로운 언어와 패러다임의 출현은 틀림없이 미래의 프로그래밍 언어에 대한 그레이엄의 비전을 실현하는 데 더 가까워질 것이다.
Popular backend languages in 2023 vs. Paul Graham's vision for the programming languages of the future
Stack Overflow 개발자 설문조사 2022는 가장 많이 사용되는 프로그래밍 언어에 대한 귀중한 인사이트를 제공한다. 해당 설문조사를 통해 선출된 인기 있는 언어 중 백엔드 언어만 다음과 같이 추려보았다. [JavaScript, Java, Kotlin, Python, Ruby, Go 및 Rust] 또한, GPT가 이야기한 미래 언어에 부합하는 함수형 프로그래밍 언어[Lisp, Haskell, Rust, Julia, Elixir]를 놓고 Graham의 아이디어와 어떻게 일치하는지 논의할 것이다.
해당 언어들을 모아보면 Graham이 예측한 미래의 언어와 몇 가지 공통점을 가지고 있다. 이러한 언어들은 높은 수준의 추상화, 강력한 코드 재사용 기능, 생산성과 효율성에 중점을 둔다는 점 등 그레이엄의 예측과 몇 가지 공통된 특징을 공유한다. 물론 언어마다 강조하는 부분과 특성이 다를 수 있다.
현재 프로그래밍 언어 평가를 위한 가중 합산 모델을 만들어보았다. (이 점수는 2021년 9월 지식에 근거한 것으로 완벽하지 않을 수 있다는 점에 유의하자. 또한, 미래 기술 발전에 대한 평가는 추측에 근거한 것이며 현재 언어의 상태를 기반으로 하였다. ex. Ruby 3.2.0 WASM 지원과 같은 요소는 포함되지 않았다.)
Language | Abstraction | Code Reuse | Opt. Features | Prog. Productivity | Adaptability | Interoperability | Scalability | Security | Ease of Learning | Total Score |
JavaScript | 6 | 7 | 6 | 8 | 6 | 7 | 6 | 6 | 8 | 6.65 |
Java | 6 | 7 | 7 | 6 | 7 | 8 | 8 | 7 | 6 | 6.85 |
Kotlin | 7 | 7 | 7 | 7 | 7 | 8 | 8 | 7 | 7 | 7.15 |
Python | 8 | 8 | 7 | 9 | 7 | 6 | 6 | 6 | 9 | 7.25 |
Ruby | 8 | 8 | 6 | 8 | 6 | 6 | 6 | 6 | 8 | 6.95 |
Go | 7 | 7 | 8 | 7 | 7 | 7 | 8 | 8 | 7 | 7.30 |
Rust | 7 | 8 | 9 | 6 | 8 | 7 | 9 | 9 | 6 | 7.50 |
Lisp | 9 | 6 | 7 | 7 | 8 | 5 | 6 | 6 | 6 | 6.75 |
Haskell | 9 | 8 | 8 | 6 | 8 | 5 | 7 | 8 | 5 | 7.00 |
Julia | 8 | 7 | 8 | 7 | 8 | 6 | 8 | 6 | 7 | 7.15 |
Elixir | 8 | 8 | 7 | 7 | 8 | 6 | 7 | 6 | 7 | 7.00 |
가중합산 모델 표에 따르면 Rust(7.50점), Go(7.30점), Python(7.25점)의 총점이 가장 높은 것을 볼 수 있는데, 이는 이들 언어가 폴 그레이엄의 에세이에서 설명한 미래 프로그래밍 언어의 특성에 가장 부합하는 언어임을 시사한다. 이 언어들은 추상화, 적응성, 보안 등 여러 영역에서 강점을 보여 미래형 언어의 유력한 후보로 꼽혔다. 그러나 Python 같은 경우는 글로벌 인터프리터 잠금(GIL)와 같은 문제로 지금은 높은 위치에 선점되었지만 계속 유지할 수 있을지는 지켜봐야 한다.
그 뒤를 이어 Kotlin(7.15점)과 Julia(7.15점)가 9개 특성 전반에서 균형 잡힌 성능을 보여주었다. 특정 영역에서 가장 높은 점수를 얻지는 못했지만 전반적인 성능은 향후 기술 발전에 적응할 수 있는 잠재력을 나타낸다.
Haskell(7.00점)과 Elixir(7.00점)도 총점은 높은 편은 아니었지만 추상화와 적응성에서 미래 언어로서의 잠재력을 보여주었다. Elixir는 RubyOnRails와 비슷한 웹 프레임워크 Phoenix를 보유하고 있다. 함수형 프로그래밍의 특성과 코드 순수성에 중점을 두어 동시 및 분산 시스템의 과제를 처리하는 데 적합하다.
Java(6.85점), Ruby(6.95점), Lisp(6.75점)와 같은 언어는 평가에서 상대적으로 낮은 점수를 받았지만 여전히 간과해서는 안 되는 강점을 가지고 있다. 예를 들어 Java는 플랫폼 독립성과 강력한 에코시스템으로, Ruby는 프로그래머 생산성으로, Lisp는 강력한 추상화 기능으로 잘 알려져 있다.
JavaScript(6.65점)는 총점이 가장 낮았지만 웹 개발에서 널리 사용되고 지속적으로 진화하는 에코시스템으로 인해 여전히 중요한 언어이다.
1. Rust
Rust는 안전, 성능 및 함수형 프로그래밍 기능에 중점을 두어 시스템 프로그래밍 및 WebAssembly와 같은 미래 기술을 위한 유망한 후보이다. Rust는 강력한 타입 시스템과 함수형 프로그래밍 기능을 통해 강력한 추상화를 제공한다. 가파른 학습 곡선이 광범위한 채택에 영향을 미칠 수 있지만, Rust는 안전과 성능에 중점을 두어 언어 기능 최적화에 대한 Graham의 비전에 잘 부합한다.
2. Go
Go 또는 Golang은 단순성과 효율성을 위해 설계된 정적으로 유형이 지정되고 컴파일된 언어이다. 고루틴과 채널을 통해 동시 프로그래밍을 강력하게 지원한다. Go는 함수형 프로그래밍이나 메타 프로그래밍에 중점을 두지 않지만 단순성, 성능 및 동시성에 대한 강조는 미래 언어를 형성하는 데 중요한 역할을 할 수 있다. 그러나 고급 추상화 및 함수형 프로그래밍 기능이 부족하여 Graham의 비전과 완전히 일치하지 않을 수 있다.
3. Python
Python은 간단하고 읽기 쉬운 구문을 가진 고수준 범용 언어이다. 다용도성, 광범위한 라이브러리 지원, 사용 편의성 덕분에 미래 핵심 기술인 머신 러닝과 데이터 과학에 널리 사용되고 있다. Lisp나 Haskell만큼 강력하거나 유연하지는 않지만, 널리 채택되고 배우기 쉽기 때문에 미래 언어에 영향을 미칠 수 있는 좋은 후보이다. 하지만 글로벌 인터프리터 잠금(GIL)과 네이티브 동시성 지원 부족으로 인해 Graham의 비전을 완전히 충족하는 데는 한계가 있을 수 있다.
4. Kotlin
Kotlin은 JVM(Java Virtual Machine)에서 실행되고 Android 개발에 주로 사용되는 정적 타입의 범용 언어이다. Kotlin은 함수형 프로그래밍 개념을 더 잘 통합하고 null 안전 및 간결한 구문을 제공한다. Haskell이나 Lisp만큼 함수 지향적이지는 않지만 Kotlin의 함수형 프로그래밍과 객체 지향 프로그래밍의 혼합은 향후 언어 개발에 기여할 수 있다. Java보다 더 높은 수준의 추상화와 향상된 코드 재사용을 지원하므로 Graham의 비전에 더 부합하다.
5. Julia
Julia는 기술 컴퓨팅을 위한 고수준 고성능 언어이다. Python과 같은 언어의 사용 편의성과 C와 같은 저수준 언어의 성능이 결합되어 있으며, 과학 컴퓨팅과 수치 분석에 중점을 두어 해당 분야의 미래 언어의 뿌리에 영향을 미칠 수 있다. Julia는 높은 수준의 추상화와 고성능 실행을 결합하여 과학적 컴퓨팅과 머신 러닝과 같은 새로운 기술을 위한 강력한 플랫폼을 제공한다. 특정 생산성 기능에 대한 광범위한 지원은 부족할 수 있지만, 이는 Graham의 비전에 잘 부합한다. 그러나 상대적으로 젊은 에코시스템과 과학 분야 외에는 채택이 제한적이라는 점이 Graham의 비전과의 전반적인 일치성에 영향을 미칠 수 있다.
6. Haskell
Haskell은 강력한 정적 타입 시스템, lazy evaluation, 고차 함수(high-order functions)를 지원하는 순수 함수형 프로그래밍 언어이다. Haskell은 불변성과 표현형 타입을 강조하기 때문에 그레이엄의 비전에 따라 미래 언어 진화를 위한 흥미로운 후보가 될 수 있다. 그러나 틈새 시장에서의 채택과 다른 언어 또는 에코시스템과의 통합에 있어 잠재적인 어려움으로 인해 Graham의 비전과의 전반적인 호환성이 제한될 수 있다.
7. Elixir
Elixir는 Erlang 가상 머신에서 실행되는 기능적 프로그래밍 언어이다. 함수형 프로그래밍, 메타프로그래밍에 중점을 두고 동시성과 병렬성을 효율적으로 처리하면서 높은 수준의 추상화와 강력한 코드 재사용 기능을 제공한다. 분산 시스템 및 실시간 애플리케이션과 같은 미래 기술에 적합하다. 그러나 틈새 영역에 속하고 다른 영역에서 제한적으로 채택되고 있어 Graham의 비전과 완전히 일치하지는 않을 수 있다. 그래도 주류가 아니라는 점만 제외하면 이는 Paul Graham의 미래 언어에 부합하는 강력한 후보로 꼽힌다.
8. Java
Java는 이식성(portability)과 광범위한 라이브러리 지원으로 잘 알려진 널리 사용되는 정적 타입의 객체 지향 언어이다. Java는 Graham이 강조한 함수형 프로그래밍 또는 메타 프로그래밍 기능을 나타내지 않지만 프로그래밍 세계와 지속적인 발전에 미치는 영향은 미래의 언어 뿌리 어딘가에는 영향을 미칠 수 있다. 하지만 장황하고 함수형 프로그래밍 기능의 채택이 상대적으로 느리다는 점이 어쩌면 Graham이 상상하는 수준의 확장성을 제공하지 못할 수도 있다.
9. Ruby
Ruby는 단순성과 생산성에 중점을 둔 동적 객체 지향 프로그래밍 언어이다. 특히 Ruby on Rails라는 인기있는 프레임워크와 함께 웹 개발에 널리 사용된다. Ruby는 Graham의 비전에 있는 미래 언어만큼 함수 지향적이지는 않지만 우아한 구문, 메타 프로그래밍 기능 및 개발자 만족도에 대해서는 높이 평가된다. Python과 마찬가지로 글로벌 인터프리터 잠금(GIL)과 동시성 지원 부족으로 인해 Graham이 상상하는 수준의 확장성 및 적응성을 제공하지 못할 수도 있다.
10. Lisp
가장 오래된 프로그래밍 언어 중 하나인 Lisp는 유연성과 확장성이 뛰어나 새로운 패러다임에 적응할 수 있다. 코드를 데이터로 취급하거나 그 반대로 취급할 수 있는 Lisp의 고유한 homoiconic 특성은 Graham이 미래 언어와 흡사하다. 그러나 틈새 시장에서의 지위와 주류 채택의 부족으로 인해 Graham의 비전의 일부 측면과 일치함에도 불구하고 미래 기술에 대한 영향력이 제한될 수 있다.
11. JavaScript
JavaScript는 주로 클라이언트 측 웹 개발에 사용되지만 Node.js를 사용한 서버 측 개발에도 널리 사용되는 다목적 다중 패러다임 언어이다. 수많은 라이브러리와 프레임워크를 포함한 광범위한 에코시스템은 코드 재사용과 생산성을 촉진한다. 또한 웹 개발에서 JavaScript의 보편성과 새로운 패러다임(예: promise을 사용한 비동기 프로그래밍 및 async/wait)에 적응할 수 있는 능력은 큰 장점이지만 동적 타이핑과 고급 타입 시스템의 부족(타입 추론, generic, ...)은 Graham의 비전과 완전히 일치하지 않을 수 있다.
2023년에 바라본 미래에 가장 부합한 언어
폴 그레이엄이 구상한 미래 프로그래밍 언어에 가장 부합하는 언어를 하나만 선택하기에는 굉장히 어렵다. 하지만 굳이 하나를 선택해야 한다면 Rust를 뽑고싶다. 다음은 Rust가 가장 적합한 후보가 될 수 있는 몇 가지 이유이다:
🏡 고수준 추상화: Rust는 표현형 타입 시스템과 함수형 프로그래밍 개념 지원 덕분에 성능 저하 없이 고수준 추상화가 가능하다.
🔄 강력한 코드 재사용: Rust의 모듈 시스템과 패키지 관리자(Cargo)는 효과적인 코드 구성, 배포 및 재사용을 가능하게 한다. 또한 제네릭과 특성(trait)을 지원하므로 개발자는 재사용 가능하고 컴포저블한 코드를 만들 수 있다.
📈 최적화된 언어 기능: 특히 동시 및 병렬 프로그래밍에서 안전성을 강조하는 Rust는 개발자가 보다 안정적이고 효율적인 코드를 작성하는 데 도움이 된다. 최신 소프트웨어 개발에서 점점 더 중요해지고 있는 메모리 안전 및 데이터 경합 방지를 기본으로 지원한다.
💻 프로그래머 생산성: Rust는 유용한 커뮤니티와 광범위한 문서를 통해 성장하는 에코시스템을 갖추고 있다. 또한 문제 해결을 위한 명확한 지침을 제공하는 내장 포매터, 린터, 오류 메시지와 같은 고급 도구도 제공한다.
⏫ 적응성 및 확장성: Rust는 다른 언어 및 플랫폼과 호환되도록 설계되어 웹 개발부터 시스템 프로그래밍에 이르기까지 다양한 애플리케이션에 적합하다. 또한 웹어셈블리 및 기타 새로운 영역에서의 사용 증가에서 알 수 있듯이 새로운 기술을 통합하기 위해 진화하고 있다.
Rust는 폴 그레이엄이 구상한 미래의 프로그래밍 언어와 일치하는 많은 특성을 가지고 있지만, 하나의 언어가 모든 상황에 완벽하게 맞을 수는 없다는 점을 기억하는 것이 중요하다. 컨텍스트와 특정 요구 사항에 따라 Haskell, Kotlin, Julia, Elixir 같은 다른 언어가 더 적합할 수도 있다. 그럼에도 불구하고 Rust는 안전성, 성능, 표현력을 모두 갖추고 있어 미래 지향적인 프로그래밍 언어의 강력한 경쟁자라고 본다.
해당 블로그 글은 ChatGPT-4의 도움과 함께 작성되었습니다. 대화 내용은 여기를 통해 확인하세요.
Refs
Paul Graham, 『Hackers and Painters』 (O'REILLY, 한빛 미디어)
http://www.paulgraham.com/hundred.html
'Dot . > 끄적끄적' 카테고리의 다른 글
본질에 대한 끝없는 탐색: 지식과 인지의 장벽을 넘어서 (0) | 2024.04.03 |
---|---|
[TED Talk] AI를 공부해야 하는 이유 (How AI Could Empower Any Business, Andrew Ng) (0) | 2023.01.23 |
Paul Graham의 유명 에세이인 ‘스타트업 해야하는 이유’ 번역 요약본 (Why to Not Not Start a Startup) (0) | 2022.09.28 |
아버지는 말하셨지 인생을 즐겨라 (0) | 2022.09.17 |
좋은 디자인은 대칭을 이용한다 - 재귀와 반복 (2) | 2022.05.27 |