본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Computer Science

프로그래밍 언어의 계보와 선택

추가
목차6개 항목
출처와 참고

ByteByteGo의 System Design 101 가이드 「A Brief History of Programming Languages」, 「Top 8 C++ Use Cases」, 「What Are the Greenest Programming Languages?」를 바탕으로 재구성한 노트다. 에너지 효율 연구의 원 자료는 Pereira 외 「Energy Efficiency across Programming Languages」(SLE 2017)다. 「어셈블러와 컴파일러가 바꾼 것」 절은 CrashCourse의 「Crash Course Computer Science」 강의를 바탕으로 보강했다.

언어의 세대

세대형태특징
1세대기계어(천공 카드에 직접 기록)CPU가 바로 실행. 사람이 읽기 어렵다
2세대어셈블리어기계어 명령에 이름을 붙였다. 여전히 기계 중심이다
3세대고급 언어(1957년 Fortran 이후)사람 중심. 컴파일러·인터프리터가 기계어로 바꾼다(프로그램이 실행되기까지)

어셈블러와 컴파일러가 바꾼 것

초기에는 프로그램을 먼저 종이에 의사 코드(pseudo-code)로 쓰고, 옵코드 표를 보며 손으로 이진 기계어로 옮겼다. 각 단계는 사람이 하던 번역을 번역 프로그램에 넘기며 생겼다.

단계번역 프로그램이 대신한 일남은 부담
어셈블러(assembler, 1940년대 말~1950년대)옵코드에 붙인 이름(니모닉, mnemonic)과 피연산자를 이진 명령으로 바꾼다(LOAD_A 14 → 0010 1110). 레이블을 달면 점프 주소를 자동으로 계산해 준다. 코드 앞부분에 명령을 끼워 넣어 주소가 밀려도 고칠 필요가 없다명령 하나가 기계어 하나에 1:1로 대응해 CPU에 묶인다. 어떤 레지스터·메모리 주소를 쓸지 여전히 프로그래머가 정한다
컴파일러(compiler, 1952년 그레이스 호퍼의 A-0)고급 언어 한 줄을 기계어 수십 개로 펼친다. 레지스터와 메모리 위치를 컴파일러가 배정하고, 프로그래머는 이름 붙인 변수만 다룬다당시에는 「컴퓨터는 산술만 할 수 있다」며 회의적인 반응이 많았다
Fortran(1957, IBM)같은 프로그램이 손으로 짠 어셈블리보다 평균 약 20배 짧았다. 실행 속도가 조금 느려도 기계 시간보다 비싼 프로그래머 시간을 크게 줄여 경제적으로 이겼다처음에는 IBM 컴퓨터에서만 컴파일됐다. 1950년대 언어는 대개 한 기종 전용이라 컴퓨터를 바꾸면 코드를 다시 써야 했다
COBOL(1959, 업계·학계·정부 위원회 CODASYL)기종마다 자기 컴파일러를 두되 같은 소스 코드를 받게 했다. 어떤 기계에서든 같은 코드를 돌리는 이식성이 고급 언어의 기본 성질이 되었다

고급 언어의 가장 큰 효과는 진입 장벽을 낮춘 것이다. 과학자·엔지니어·의사·경제학자가 전업 프로그래머 없이도 계산을 업무에 쓸 수 있게 되었고, 전문 프로그래머는 어셈블리로는 수천만 줄이 필요했을 규모의 프로그램을 만들 수 있게 되었다. 그 전에 프로그램을 기계에 넣던 수단(플러그보드, 천공 카드, 패널 스위치)은 컴퓨터의 역사에 있다.

시대별 흐름

시기사건남긴 것
1950년대Fortran, LISP, COBOL재귀, 가비지 컬렉션 같은 개념이 이때 나와 지금 언어에도 남아 있다. 예외 처리는 1960년대 LISP 1.5(1961)의 ERRORSET, PL/I(1964 무렵)의 ON 조건으로 이어졌다. COBOL은 기종을 넘는 공통 언어를 목표로 했다
1972년C와 SmalltalkC는 유닉스를 쓰려고 만들어져 시스템 프로그래밍의 기반이 됐다(C의 역사와 표준). Smalltalk는 객체 지향과 이후 스크립트·클라이언트 언어에 영향을 줬다
1980년대C++, Objective-C그래픽 사용자 인터페이스를 짜기 좋아 객체 지향이 퍼졌다
1990년대Python(1991), Java·JavaScript·PHP·Ruby(1995)PC가 싸지며 안전성과 단순함을 강조했다. 가상 머신과 웹이 등장했다
2000년대C#.NET과 함께 나와 현대적 기능을 빠르게 흡수했다
2010년대Rust, Zig, Go, Kotlin, Swift, Dart, TypeScript기존 언어의 약점을 고치는 언어들이 나왔다

2010년대 이후의 언어는 대개 기존 언어 하나를 개선하려는 계보로 읽힌다.

개선 대상후계 언어고치려는 것
C/C++Rust, Zig, D, Carbon(실험)메모리 안전성, 빌드·도구 체계
JavaKotlin, Go장황한 문법, 무거운 런타임, 동시성
Objective-CSwift안전성과 현대적 문법
JavaScriptTypeScript정적 타입. JavaScript와 완전히 호환된다

Dart는 Flutter와 함께 널리 쓰이게 됐다(Dart 핵심 문법).

C++가 여전히 쓰이는 곳

C++의 강점은 하드웨어와 메모리를 세밀하게 제어하면서도 추상화를 쓸 수 있다는 점이다. 성능과 자원 통제가 핵심인 분야에 남아 있다.

분야이유
임베디드 시스템작은 메모리와 하드웨어 직접 제어
게임 엔진프레임마다 지켜야 하는 성능
운영체제·시스템 유틸리티자원과 메모리에 대한 완전한 통제
데이터베이스 엔진메모리 관리와 빠른 쿼리 실행
금융(고빈도 거래)마이크로초 단위의 지연
웹 브라우저렌더링 엔진, JavaScript 엔진
네트워크 장비·시뮬레이터패킷 처리 성능
과학 계산수치 연산 성능과 정밀한 자원 제어

이 분야들 중 새 프로젝트에서 Rust가 C++의 자리를 일부 나눠 갖고 있다. Rust 공식 입문서 『The Rust Programming Language』는 한국어 번역판이 있다. C++ 문법은 C++ 기초에 있다.

언어와 에너지 효율

같은 벤치마크 문제 10개를 27개 언어로 풀어 실행 시간·메모리·에너지를 잰 연구가 있다. 결론은 다음과 같다.

관찰내용
상위권C, Rust, C++ 같은 네이티브 컴파일 언어가 에너지를 가장 적게 쓴다. Java 같은 VM 언어가 그 뒤를 잇는다
하위권Python, Perl, Ruby 같은 인터프리터 언어가 가장 많이 쓴다
속도와 에너지대체로 빠른 언어가 에너지도 적게 쓰지만, 항상 그렇지는 않다
메모리메모리 사용량이 에너지에 영향을 주지만, 실행 시간만큼 크지 않다

벤치마크는 순수 계산 위주라 I/O가 대부분인 웹 서비스에 그대로 옮길 수 없다.

정리

  • 언어는 기계어 → 어셈블리 → 고급 언어로 추상화 수준을 높여 왔다.
  • 재귀·GC는 1950년대에, 예외 처리는 1960년대 초에 나왔고, 이후 언어는 그것을 다듬고 조합했다.
  • Rust·Go·Kotlin 같은 새 언어는 대부분 기존 언어의 약점(메모리 안전성, 장황함, 타입 부재)을 고치는 후계자다.
  • C++는 성능과 자원 통제가 핵심인 분야에 남아 있다. 에너지 효율도 대체로 네이티브 언어가 앞선다.

관련 노트: 컴퓨터의 역사, 프로그램이 실행되기까지, 프로그래밍 패러다임, C의 역사와 표준, C++ 기초

원본 기록6

댓글

GitHub 계정으로 댓글을 남길 수 있어요.