FORTRAN에서 Rust까지, 언어는 하드웨어 제약, 안전성, 웹, 팀워크 등 당시의 우선순위를 담고 있습니다. 설계 선택이 실제 문제에 어떻게 대응하는지 살펴보세요.

프로그래밍 언어는 단순히 서로보다 “더 낫다/못하다”로 판단할 수 없습니다. 각 언어는 특정 시점의 현실 문제에 대한 설계적 응답입니다.
언어 설계라 할 때 우리는 코드의 문법만을 뜻하는 것이 아닙니다. 언어는 다음과 같은 결정들의 묶음입니다:
이러한 선택은 시대의 제약—제한된 하드웨어, 비싼 연산 비용, 부족한 운영체제 기능 또는(이후) 대규모 팀, 글로벌 네트워크, 보안 위협—주변으로 수렴하는 경향이 있습니다.
언어는 그 시대를 반영합니다. 초기 언어들은 희소한 기계 자원에서 최대 성능을 뽑아내는 것을 우선했죠. 이후엔 여러 시스템에서 동작하는 이식성이 중요해졌고, 프로젝트가 커지자 추상화와 도구화로 대형 코드베이스를 유지하는 쪽으로 기울었습니다. 최근에는 동시성, 클라우드 배포, 보안 요구가 새로운 절충을 불러왔습니다.
이 글은 연대별 완전한 연표가 아니라 대표적인 예에 초점을 맞춥니다. 몇몇 영향력 있는 언어가 어떻게 그 시기의 요구를 구현했는지, 그리고 아이디어가 어떻게 재활용되고 다듬어지는지를 보게 될 것입니다.
언어의 "왜"를 이해하면 강점과 맹점을 예측할 수 있습니다. 이 언어가 촘촘한 성능을 위해 최적화되었는가, 빠른 반복을 위한가, 대규모 팀 유지보수를 위한가, 아니면 안전성을 위한가 같은 질문에 대한 답을 맥락적으로 제공합니다. 학습이나 프로젝트 선택 시, 그런 맥락은 어떤 기능 목록만큼이나 실용적입니다.
초기 프로그래밍 언어는 취향보다 물리 법칙과 비용에 의해 형성되었습니다. 기계는 극히 적은 메모리를 가졌고 저장 공간은 부족했으며 CPU는 현대 기준으로 느렸습니다. 이로 인해 모든 추가 기능, 긴 명령, 추상화 계층은 실질적인 비용을 가져왔습니다.
프로그램과 데이터가 모두 작아야 한다면, 언어와 도구는 프로그램을 작고 예측 가능하게 유지하도록 설계됩니다. 초기 시스템은 단순한 제어 흐름과 최소한의 런타임 지원으로 프로그래머를 밀어넣었습니다. 풍부한 문자열 처리, 동적 메모리 관리, 고수준 데이터 구조 같은 "있으면 좋은" 기능조차도 추가 코드와 부가적인 관리가 필요해 실용적이지 않을 수 있었습니다.
초기 프로그램 상당수는 배치로 실행되었습니다. 작업(종종 천공 카드로 준비)을 제출하고 기다렸죠. 문제가 생기면 작업이 끝난 뒤에야 원인을 알게 되는 경우가 많았습니다.
그 긴 피드백 주기는 무엇이 중요한지를 바꿨습니다:
기계 시간이 소중하고 인터페이스가 제한적이었으므로, 언어는 친절한 진단이나 초보자 지향 명확성에 최적화되지 않았습니다. 오류 메시지는 간결하고 때론 암호 같았으며, 주로 작업 덱이나 인쇄된 출력의 문제 위치를 찾는 데 초점이 있었습니다.
초기 컴퓨팅 수요의 큰 부분은 과학 및 공학 작업에서 왔습니다: 계산, 시뮬레이션, 수치 방법 등. 그래서 초기 언어 기능은 효율적인 산술, 배열, 종종 하드웨어와, 그리고 과학자들이 종이에 쓰던 방식과 잘 맞는 식의 수식 표현에 초점이 맞춰졌습니다.
초기 언어들 중 일부는 범용을 목표로 하지 않았습니다. 특정 문제군을 매우 잘 해결하기 위해 만들어졌습니다—컴퓨터가 비싸고 시간이 부족했으며 "무엇이든 좋다"는 것이 종종 "아무 것도 잘하지 못한다"는 의미였기 때문입니다.
FORTRAN(FORmula TRANslation)은 공학 및 과학 계산을 겨냥했습니다. 핵심 약속은 실용적이었습니다: 과학자가 기계어를 일일이 코딩하지 않고도 수식 중심의 프로그램을 작성하게 하자는 것.
이 목표는 설계에 반영되었습니다. 수치 연산과 배열 스타일 계산에 중점을 두고 성능을 강하게 밀었습니다. 진정한 혁신은 단순한 문법이 아니라 컴파일러가 기계어로 충분히 효율적인 코드를 생성할 수 있다는 믿음이었습니다. 시뮬레이션이나 물리 계산에서 실행 시간을 줄이는 것은 사치가 아니라 결과를 오늘 얻을지 내주일 얻을지의 차이였습니다.
COBOL은 다른 세계를 겨냥했습니다: 정부, 은행, 보험, 급여, 재고 관리 등. 이들은 "레코드와 보고서" 문제로, 구조화된 데이터와 예측 가능한 워크플로우, 광범위한 감사가 필요합니다.
그래서 COBOL은 영어 같은 장황한 스타일을 채택해 대기업에서 프로그램을 검토하고 유지보수하기 쉽게 했습니다. 데이터 정의는 1급 관심사였는데, 비즈니스 소프트웨어는 양식, 계정, 거래를 얼마나 잘 모델링하느냐에 따라 생존합니다.
두 언어는 여전히 중요한 설계 원칙을 보여줍니다: 어휘는 작업을 반영해야 합니다.
FORTRAN은 수학과 계산으로 말하고, COBOL은 레코드와 절차로 말합니다. 이들의 인기에서 드러나는 것은 당시의 우선순위—추상적 실험이 아니라 실제 업무를 효율적으로 처리하는 것—입니다. 그게 수치 계산의 빠른 실행이든, 비즈니스 데이터와 리포트 처리의 명확성이든 말이죠.
1960년대 후반과 1970년대에 컴퓨터는 더 싸고 흔해졌지만, 여전히 서로 매우 달랐습니다. 한 기계용으로 작성된 소프트웨어를 다른 기계로 옮기려면 종종 많은 부분을 다시 작성해야 했습니다.
많은 중요한 소프트웨어가 어셈블리로 작성되었는데, 이는 최대의 성능과 제어를 주었지만 큰 비용이 있었습니다: 각 CPU는 고유한 명령 세트를 가지고 코드 읽기가 어렵고 작은 변경도 며칠의 수정으로 이어질 수 있었습니다. 그 고통은 "금속에 가까우면서도 특정 프로세서에 묶이지 않는" 언어에 대한 수요를 만들었습니다.
C는 실용적 타협으로 등장했습니다. 운영체제와 도구(특히 Unix)를 작성하면서도 하드웨어 간 이식성을 유지하도록 설계되었습니다. C는 프로그래머에게 다음을 제공했습니다:
Unix가 C로 다시 작성된 것은 유명한 증거입니다: 운영체제가 어셈블리 전용 시스템보다 새로운 하드웨어로 이동하기가 훨씬 쉬워졌습니다.
C는 프로그래머가 메모리를 직접 관리하기를 기대했습니다(할당, 해제, 실수 회피). 지금 들으면 위험해 보이지만, 그 시대의 우선순위와 부합했습니다. 기계 자원이 제한되어 있고 운영체제는 예측 가능한 성능이 필요했으며, 프로그래머들은 종종 정확한 메모리 레이아웃을 알고 코딩했습니다.
C는 속도와 제어를 최적화했고 그 가치를 증명했습니다. 대가는 안전성과 용이성이었습니다: 버퍼 오버플로우, 충돌, 미묘한 버그가 흔한 위험이 되었습니다. 그 시대에는 이 리스크가 이식성과 성능에 대한 허용 가능한 대가로 간주되었습니다.
프로그램이 작은 단일 목적 유틸리티에서 기업을 운영하는 제품으로 성장하면서 새로운 문제가 지배적이 되었습니다: "작동하느냐"뿐 아니라 "수년간 유지할 수 있느냐"가 중요해졌습니다. 초기 코드는 종종 패치와 goto로 발전해 스파게티 코드가 되었고, 읽기, 테스트, 안전한 변경이 어렵게 되었습니다.
구조적 프로그래밍은 단순한 아이디어를 제안했습니다: 코드는 명확한 형태를 가져야 한다. 임의의 줄로 점프하는 대신 if/else, while, for, switch 같은 정의된 빌딩 블록을 사용해 제어 흐름을 예측 가능하게 만들었습니다.
그 예측 가능성은 중요했습니다. 디버깅은 본질적으로 "실행이 어떻게 여기까지 왔는가?"에 답하는 일입니다. 흐름이 구조에 보이면 버그가 숨기 어렵습니다.
소프트웨어가 팀 활동이 되자 유지보수는 기술적 문제라기보다 사회적 문제가 되었습니다. 새로운 동료는 자신이 쓰지 않은 코드를 이해해야 했고, 관리자는 변경에 대한 견적이 필요했으며, 비즈니스는 업데이트가 모든 것을 망가뜨리지 않을 것이라는 확신을 원했습니다.
언어는 일관된 함수 경계, 변수 수명 명확화, 코드 조직을 파일과 라이브러리로 분리하는 방식을 장려하면서 확장 가능한 관례를 유도했습니다.
타입은 내장 문서이자 초기 오류 탐지 수단으로 가치가 커졌습니다. 함수가 숫자를 기대하는데 텍스트를 받는다면 강한 타입 시스템이 이를 사용자에게 닿기 전에 잡아낼 수 있습니다.
모듈과 스코프는 변경의 영향 범위를 제한해줍니다. 세부를 비공개로 유지하고 안정적인 인터페이스만 노출하면 내부를 리팩토링해도 전체를 고칠 필요가 줄어듭니다.
일반적인 개선은 다음과 같았습니다:
이 변화들은 함께 코드 리뷰와 안전한 진화를 쉽게 하는 쪽으로 언어를 이동시켰습니다.
객체지향 프로그래밍(OOP)은 "유일한 좋은 아이디어였기 때문"이 아니라 많은 팀이 만들려던 것을 잘 맞췄기 때문에 널리 채택되었습니다: 많은 사람이 유지하는 장수의 비즈니스 소프트웨어입니다.
OOP는 복잡함을 다루는 깔끔한 이야기를 제공합니다: 프로그램을 명확한 책임을 가진 "객체" 집합으로 표현하라.
캡슐화(내부 세부 숨기기)는 우발적 파괴를 막는 실용적 방법으로 들렸습니다. 상속과 다형성은 재사용을 약속했습니다: 일반적 버전을 한 번 작성하고 나중에 특수화하며 같은 인터페이스에 다른 구현을 꽂을 수 있습니다.
데스크탑 소프트웨어와 그래픽 인터페이스의 확산으로 창, 버튼, 문서, 메뉴, 이벤트 같은 많은 상호작용 컴포넌트를 관리할 방법이 필요했습니다. 객체와 메시지 단위로 생각하는 것은 이런 인터랙티브 구성 요소에 잘 맞았습니다.
동시에 엔터프라이즈 시스템은 은행, 보험, 재고, HR 같은 도메인 위에 성장했습니다. 이런 환경은 일관성, 팀 협업, 수년간 진화 가능한 코드베이스를 중시했습니다. OOP는 조직적 필요에 맞았습니다: 작업을 팀별로 분담하고 경계를 강제하며 기능 추가 방식을 표준화합니다.
OOP는 안정적인 경계와 재사용 가능한 구성요소를 만들 때 빛납니다. 하지만 모든 것을 과대 모델링하거나 깊은 클래스 계층, "갓 객체(god objects)", 유행 때문에 패턴을 남용하면 고통이 됩니다. 너무 많은 계층은 간단한 변경을 문서 작업처럼 느끼게 합니다.
순수 OOP가 아니더라도 많은 언어가 클래스 유사 구조, 인터페이스, 접근 제한자, 디자인 패턴을 차용했습니다. 현대 주류 문법의 상당 부분은 대형 팀과 대형 코드베이스를 조직하는 이 시대의 초점에서 비롯됩니다.
Java는 특정 소프트웨어 붐과 함께 부상했습니다: 지저분한 다양한 서버, 운영체제, 벤더 하드웨어에 걸쳐 분산된 크고 장수하는 비즈니스 시스템. 기업은 예측 가능한 배포, 적은 충돌, 계속 성장할 수 있는 팀을 원했습니다.
Java는 특정 기계의 명령어로 바로 컴파일하는 대신 바이트코드로 컴파일되어 Java Virtual Machine(JVM)에서 실행됩니다. JVM은 기업이 신뢰할 수 있는 "표준 계층"이 되었고: 동일한 애플리케이션 아티팩트를 배포하면 Windows, Linux, Unix 상에서 최소한의 변경으로 실행할 수 있었습니다.
이것이 "한 번 작성하면 어디서든 실행"의 핵심입니다: 플랫폼 특이성을 완전히 없애는 보장은 아니지만 많은 환경을 지원하는 비용과 위험을 줄이는 실용적 방법이었습니다.
Java는 안전을 선택적 규율이 아니라 주된 기능으로 만들었습니다.
가비지 컬렉션은 미관리 환경에서 흔하던 메모리 버그(댕글링 포인터, 이중 해제 등) 범주를 줄였습니다. 배열 범위 검사도 메모리 구조 밖을 읽거나 쓰는 것을 방지했습니다. 엄격한 타입 시스템과 결합된 이 선택들은 파국적 실패를 예측 가능한 예외로 바꾸려는 시도였습니다—재현, 로깅, 수정이 쉬운 실패로.
엔터프라이즈는 안정성, 도구, 거버넌스를 중시했습니다: 표준화된 빌드 프로세스, 강력한 IDE 지원, 방대한 라이브러리, 모니터링 가능한 런타임. JVM은 애플리케이션 서버와 프레임워크의 풍부한 생태계를 가능하게 해 대규모 팀 개발을 일관되게 만들었습니다.
Java의 이점은 공짜가 아니었습니다. 관리되는 런타임은 시작 시간과 메모리 오버헤드를 추가하고 가비지 컬렉션은 조정하지 않으면 지연 스파이크를 생성할 수 있습니다. 시간이 지나며 생태계는 프레임워크 계층, 설정, 배포 모델로 복잡해져 전문 지식을 요구하게 되었습니다.
그럼에도 많은 조직에겐 거래가 가치 있었습니다: 저수준의 실패가 줄고 이식성 비용이 떨어지며 비즈니스와 코드베이스 규모에 맞춰 확장 가능한 공유 런타임을 얻었기 때문입니다.
1990년대 후반과 2000년대에는 많은 팀이 운영체제가 아닌 데이터베이스 연결, 웹사이트 구축, 내부 워크플로 자동화를 다루고 있었습니다. 병목은 원시 CPU 효율이 아니라 개발자 시간으로 이동했습니다. 빠른 피드백과 짧은 배포 주기는 "얼마나 빨리 바꿀 수 있나?"를 1순위 요구로 만들었습니다.
웹 앱은 며칠 단위로 진화했습니다. 비즈니스는 전체 컴파일–링크–배포 파이프라인 없이 새 페이지, 리포트, 통합, 빠른 수정이 가능한 것을 원했습니다. 스크립트 언어는 그 리듬에 맞았습니다: 파일을 편집하고 바로 실행해 결과를 확인할 수 있었죠.
이것은 누가 소프트웨어를 만들 수 있는지도 바꿨습니다. 시스템 관리자, 분석가, 소규모 팀이 메모리 관리나 빌드 시스템에 대한 깊은 지식 없이도 유용한 도구를 배포할 수 있었습니다.
Python과 Ruby 같은 언어는 동적 타이핑을 수용했습니다: 더 적은 선언과 의례로 아이디어를 표현할 수 있죠. 강력한 표준 라이브러리와 결합하면 일반 작업이 "한 번 임포트로 해결"되는 느낌을 줍니다:
그 "배터리 포함" 접근은 실험을 보상하고 자동화 스크립트가 자연스럽게 실제 애플리케이션으로 성장하게 했습니다.
Python은 자동화와 범용 프로그래밍의 표준이 되었고, Ruby는 특히 프레임워크를 통해 웹 개발을 가속했고, PHP는 초기 서버 사이드 웹에서 페이지에 직접 임베드하고 어디서든 배포할 수 있어 지배적이었습니다.
스크립트 언어의 생산성 이점은 비용도 동반했습니다:
즉, 스크립트 언어는 "변화에 최적화"되어 있었습니다. 팀들은 도구와 관행으로 신뢰성을 "되사야" 했고—이것이 개발자 속도와 소프트웨어 품질이 모두 기대되는 현대 생태계를 만드는 토대가 되었습니다.
웹 브라우저는 수백만 장치에 배포되는 뜻밖의 "컴퓨터"가 되었습니다. 그러나 그것은 빈 캔버스가 아니었습니다: 샌드박스였고, 예측 불가능한 하드웨어에서 실행되어야 했으며, 화면을 그리면서도 반응성을 유지해야 했습니다. 이런 환경은 JavaScript의 역할을 완벽한 언어 이상으로 규정했습니다.
브라우저 코드는 즉시 전달되어야 하고, 신뢰할 수 없는 콘텐츠 옆에서 안전하게 실행되어야 하며, 페이지를 인터랙티브하게 유지해야 했습니다. 이것은 JavaScript를 빠른 시작, 동적 동작, 페이지에 밀접하게 연결된 API(클릭, 입력, 타이머, 이후 네트워크 요청)로 밀었습니다.
JavaScript가 이긴 주요 이유는 이미 존재했기 때문입니다. 브라우저에서 동작을 원하면 JavaScript가 기본 옵션이었습니다—설치 단계 없음, 권한 없음, 별도의 런타임을 사용자에게 설치하라고 설득할 필요 없음. 경쟁 아이디어는 설계상 더 깔끔해 보일 수 있었지만, "모든 사이트에서 실행된다"는 배포 우위를 따라잡을 수 없었습니다.
브라우저는 근본적으로 반응형입니다: 사용자가 클릭하고 페이지가 스크롤되며 요청이 언제 올지 모릅니다. JavaScript의 이벤트 기반 스타일(콜백, 이벤트, 프로미스)은 그 현실을 반영합니다. 시작부터 끝까지 실행되는 프로그램 대신, 웹 코드는 "무언가를 기다렸다가 반응한다"는 형태에 잘 맞습니다.
성공은 중력 우물처럼 작용합니다. 프레임워크와 라이브러리의 거대한 생태계가 형성되었고, 빌드 파이프라인은 제품 범주가 되었습니다: 트랜스파일러, 번들러, 미니파이어, 패키지 관리자. 동시에 웹의 하위 호환성 약속은 오래된 결정들이 남아 있게 만들었고—현대 JavaScript는 종종 어제의 제약과 공존하기 위해 쌓인 도구들의 층처럼 느껴집니다.
오랫동안 더 빠른 컴퓨터는 보통 프로그램을 한 줄도 바꾸지 않고 더 빠르게 실행해 주었습니다. 하지만 칩이 열과 전력 한계에 부딪혀 클럭 속도 대신 코어를 추가하기 시작하면서 그 거래는 깨졌습니다. 이제 더 많은 성능을 얻으려면 동시에 여러 일을 처리해야 했습니다.
현대 앱은 단일 고립 작업을 수행하지 않습니다. 수많은 요청을 처리하고, 데이터베이스와 통신하고, UI를 렌더링하고, 파일을 처리하고, 네트워크를 기다리며 사용자에게 즉각적인 응답을 제공합니다. 멀티코어 하드웨어는 병렬로 작업을 실행할 수 있게 했지만, 언어나 런타임이 "메인 스레드 하나, 흐름 하나"를 가정하면 고통이 따릅니다.
초기 동시성은 OS 스레드와 락에 의존했습니다. 많은 언어가 이를 직접 노출했는데, 동작은 했지만 복잡성을 개발자에게 떠넘겼습니다.
새로운 설계는 일반 패턴을 쉽게 만들려 합니다:
소프트웨어가 상시 서비스로 이동하면서 "정상적인" 프로그램은 수천 개의 동시 요청을 처리하는 서버가 되었습니다. 언어는 I/O 중심 워크로드, 취소/타임아웃, 부하하의 예측 가능한 성능을 최적화하기 시작했습니다.
동시성 실패는 종종 드물고 재현이 어렵습니다. 언어 설계는 점점 더 다음을 방지하려 합니다:
큰 변화는 동시성이 고급 주제가 아니라 기본 기대가 되었다는 점입니다.
2010년대에 많은 팀은 알고리즘을 표현하는 것보다 보안을 유지하고, 안정적으로 운영하며, 지속적인 배포 압박 속에서 변경하기 쉬운 서비스를 유지하는 데 고심했습니다. 두 가지 문제가 두드러졌습니다: 메모리 오류로 인한 보안 버그, 과도한 스택과 일관성 없는 도구로 인한 엔지니어링 둔화입니다.
고심각도 취약점의 많은 부분이 여전히 메모리 안전 문제(버퍼 오버플로우, use-after-free, 특정 빌드나 기계에서만 나타나는 불명확 동작)에 기인합니다. 현대 언어 설계는 이런 문제들을 단순한 프로그래머 실수로 치부하지 않고 용납할 수 없는 "발사총"으로 간주하는 경향이 강해졌습니다.
Rust는 가장 뚜렷한 응답입니다. 소유권과 빌림 규칙은 거래와 같아서: 엄격한 컴파일 검사에 코드를 맞추면 가비지 컬렉터 없이도 강력한 메모리 안전 보장을 얻습니다. 이 때문에 Rust는 전통적으로 C/C++가 쓰이던 시스템 코드—네트워크 서비스, 임베디드 구성 요소, 성능 민감 라이브러리—에서 안전과 속도를 모두 원하는 경우 매력적입니다.
Go는 거의 반대 접근을 취합니다: 언어 기능을 제한해 코드베이스를 읽기 쉽고 예측 가능하게 유지합니다. Go의 설계는 장기 실행 서비스, API, 클라우드 인프라의 세계를 반영합니다.
Go의 표준 라이브러리와 내장 동시성 원시(goroutine, channel)는 서비스 개발을 직접적으로 지원하고, 빠른 컴파일러와 단순한 의존성 스토리는 일상 개발의 마찰을 줄입니다.
도구화는 "선택적 추가물"에서 언어 약속의 일부로 이동했습니다. Go는 gofmt로 이 사고방식을 일반화했고, Rust는 rustfmt, clippy, 통합된 빌드 도구(cargo)로 따라왔습니다.
오늘날의 "연속 배포" 환경에서 이 도구화 이야기는 컴파일러와 린터를 넘어 더 높은 수준의 워크플로우: 스캐폴딩, 빠른 반복 루프, 계획 지원 등으로 확장됩니다. 예를 들어 Koder.ai 같은 플랫폼은 채팅 기반 인터페이스로 팀이 웹, 백엔드, 모바일 애플리케이션을 빌드하게 하고—그 결과를 소스 코드로 내보내고 배포하며 스냅샷으로 롤백하는 흐름을 제공합니다. 이것도 역사적 패턴의 또 다른 예입니다: 그 시대의 흔한 작업을 더 싸고 오류에 덜 민감하게 만드는 도구가 가장 빨리 퍼집니다.
포매터, 린터, 빌드 시스템이 1급이 되면 팀은 스타일 논쟁이나 환경 불일치로 시간을 덜 쓰고 더 신뢰할 수 있는 소프트웨어를 내는 데 집중합니다.
언어가 "승리"하는 이유는 완벽해서가 아니라 그 시대의 흔한 작업을 더 싸고, 더 안전하게, 더 빠르게 만들어 주기 때문입니다—특히 적절한 라이브러리와 배포 관행과 결합될 때.
오늘날 언어 인기의 큰 동력은 작업이 어디에 있느냐입니다: 데이터 파이프라인, 분석, 머신러닝, 자동화. 그래서 Python은 구문뿐 아니라 생태계 때문에 계속 성장합니다: NumPy/Pandas(데이터), PyTorch/TensorFlow(ML), 노트북(탐색), 그리고 재사용 가능한 빌딩 블록을 만드는 큰 커뮤니티.
SQL은 덜 화려하지만 같은 효과의 조용한 예입니다. 트렌디하진 않아도 선언적 쿼리, 예측 가능한 옵티마이저, 도구와 벤더 전반의 광범위한 호환성 때문에 비즈니스 데이터의 기본 인터페이스로 남아 있습니다. 새로운 언어는 종종 SQL을 대체하기보다 통합합니다.
한편, 성능 집약적 AI는 GPU 지향 도구를 앞으로 밀고 있습니다. 벡터화, 배치 처리, 하드웨어 가속에 대한 1급 관심이 더 늘고 있고—CUDA 생태계, MLIR, 컴파일러 스택, 또는 이러한 런타임에 바인딩하기 쉬운 언어들을 통해서든—그 경향은 계속될 것입니다.
다음 압력들이 "다음 시대"의 언어나 주요 언어 업데이트에 영향을 줄 가능성이 큽니다:
언어를 고를 때는 제약에 맞추세요: 팀의 경험, 채용 가능성, 의존할 라이브러리, 배포 대상, 신뢰성 요구. "좋은" 언어는 자주 하는 작업을 지루하게 만들고—실패를 예방하고 진단하기 쉽게 만드는 언어인 경우가 많습니다.
프레임워크 기반 생태계가 필요하면 생태계를 기준으로, 정확성과 제어가 필요하면 안전과 성능을 기준으로 고르세요. 더 깊은 결정 체크리스트는 /blog/how-to-choose-a-programming-language.