프로그래밍 언어

There are only two kinds of languages: the ones people complain about and the ones nobody uses.

— C++의 창시자 비야네 스트롭스트룹 (Bjarne Stroustrup)이 남긴 우주적 명언.

컴퓨터와 대화하는 수단인 줄 알았으나, 실상은 동료 개발자와 내 코드가 더 우월하다며 멱살잡이를 하기 위해 쓰이는 무기. 내가 쓰는 언어는 우아한 예술이고, 네가 쓰는 언어는 레거시 쓰레기다.

1. 개요

프로그래밍 언어는 컴퓨터 시스템이 특정 작업을 수행하도록 지시하기 위해 사용하는 규격화된 약속이자 도구이다. 기계가 직접 이해할 수 있는 0과 1의 기계어부터, 인간이 읽고 쓰기 편하게 만들어진 고수준 언어(Python, Java, JavaScript)에 이르기까지 매우 다양한 형태로 존재한다.

근본적으로는 컴퓨터 하드웨어를 제어하고 비즈니스 논리를 코드로 녹여내기 위한 수단이지만, 현실의 개발 생태계에서는 어떤 언어가 가장 완벽하고 우월한지를 두고 피 비린내 나는 키보드 워리어 전쟁을 벌이는 종교적 신념의 영역으로 취급되기도 한다.(...)

2. 주요 분류 및 패러다임

2.1. 저수준 vs 고수준 언어 (Low-Level vs High-Level)

하드웨어에 얼마나 밀착되어 있는가에 따라 분류된다.

  • 저수준 언어(Low-Level Language): 기계어나 어셈블리어처럼 컴퓨터 하드웨어에 직접 명령을 내리는 언어. 극상의 실행 속도를 자랑하지만 코딩하는 인간의 수명도 함께 깎여나간다.
  • 고수준 언어(High-Level Language): C언어, Python, Java 등 인간의 언어와 유사한 추상화 수준을 제공하는 언어. 개발 생산성이 폭발적으로 증가하는 대신 하드웨어와 소통하기 위한 번역 과정이 추가되어 상대적으로 느리다. 그래도 현대 컴퓨터 성능 앞에서는 대부분 오십보백보다.

2.2. 컴파일러 vs 인터프리터 (Compiled vs Interpreted)

작성된 소스코드를 컴퓨터에게 전달하는 방식의 차이이다.

  • 컴파일 언어(Compiled Language): 소스코드 전체를 실행 전에 기계어로 번역(C언어, C++, Rust)하는 방식. 실행 속도가 매우 빠르지만 빌드 시간이 걸린다. 빌드가 길어지면 개발자들은 텀블러를 들고 커피머신 앞으로 가 칼퇴근의 꿈을 다지곤 한다.
  • 인터프리터 언어(Interpreted Language): 코드를 한 줄씩 읽어가며 즉석에서 실행(Python, JavaScript)하는 방식. 빌드 과정이 없어 즉각 수정이 가능하나 실행 속도는 컴파일 언어에 비해 처참하게 떨어진다.1

2.3. 타입 시스템: 정적 타이핑 vs 동적 타이핑

  • 정적 타이핑(Static Typing): 컴파일 시점에 변수의 타입을 결정(Java, TypeScript, Rust)하는 방식. 버그를 컴파일러가 잡아주어 대형 프로젝트에 적합하지만, 자질구레한 타입 선언을 모두 적어줘야 해서 손가락이 피로하다.
  • 동적 타이핑(Dynamic Typing): 런타임에 실행하면서 변수의 타입을 결정(Python, JavaScript)하는 방식. 빠르게 코드를 뽑아낼 수 있으나, 규모가 커지면 자기가 짠 코드에서 무슨 데이터가 돌아다니는지 알 수 없어 사정없이 런타임 에러가 터진다.

3. 패러다임의 충돌

3.1. 객체지향 프로그래밍 (OOP)

현대 개발 씬의 가장 거대한 주류 패러다임. 데이터를 '객체'라는 단위로 묶고 이들의 상속, 다형성, 캡슐화를 통해 대규모 시스템을 설계한다. JavaC++이 대표 주자다. 그러나 객체지향에 너무 심취한 나머지 실체도 없는 인터페이스와 추상 클래스를 수십 개씩 만들다 보면, 사소한 기능 하나를 구현하는 데도 클래스 폭탄이 터져 뇌가 절여지는 부작용을 겪게 된다.(...)

3.2. 함수형 프로그래밍 (Functional Programming)

부작용(Side Effect)이 없는 순수 함수와 선언형 프로그래밍을 지향하는 패러다임. 객체지향에 지친 개발자들이 탈출구로 삼아 최근 인기를 끌고 있다. 수학적 아름다움과 정합성을 자랑하지만, 함수형에 절여진 하드코어 팬들이 작성한 모나드(Monad)나 커링(Currying) 코드를 보면 일반 개발자들은 외계어를 마주한 듯 머리가 하얘진다.

4. 프로그래밍 언어별 한 줄 요약 밈

4.1. 인터넷 유행어 및 언어별 자조 드립

개발자 커뮤니티에서 가장 흔히 노출되는 언어별 자조적 고정관념이다.

  • C언어: 너에게 총과 탄약을 주고 완전히 자유를 주지만, 실수로 니 발가락을 쏘는 것을 막지 않으며, 심지어 발가락이 날아간 줄도 모르고 계속 걷게 만든다.
  • C++: C언어의 모든 것을 상속받아 더 멋진 총을 만들어 주지만, 안전장치를 다루는 매뉴얼만 백과사전 3권 분량이라 읽다가 늙어 죽는다.
  • Java: 총을 쏘려면 GunFactory를 만들고, BulletFactory를 주입한 뒤, SafetyManager의 결재를 맡아야 겨우 한 발 나간다.
  • Python: 총을 쏘고 싶다고 말하면 이미 누군가 만들어둔 자동 조준 저격소총 라이브러리를 임포트해서 1초 만에 쏜다. 단, 총알이 발사되는 속도는 기어가는 달팽이 급이다.
  • Rust: 총을 만지려고 하면 컴파일러(Borrow Checker)가 달려와서 "네 손이 총보다 깨끗한가?", "총을 안전하게 소유할 권리가 있는가?"를 100번 검문하여 결국 총을 쏘기도 전에 사기가 저하된다.
  • JavaScript: 총을 쐈더니 물이 나오고, 물총을 쐈더니 불이 나가는 기적의 연산 물리법칙을 보여준다.

5. 여담

  • 에이다 러브레이스: 세계 최초의 프로그래머로 꼽히는 에이다 러브레이스는 시인 바이런의 딸이다. 그녀는 찰스 배비지의 해석기관을 보고 세계 최초의 컴퓨터 알고리즘(베르누이 수를 구하는 법)을 작성했다. 시인의 감성과 수학자의 논리가 합쳐져 프로그래밍이라는 괴물이 태어난 셈이다.
  • Hello World의 기원: 모든 프로그래밍 입문 시 가장 먼저 출력하는 문구인 'Hello, World!'는 브라이언 커니핸이 1978년 출간한 C언어 자습서에서 최초로 사용하면서 전 세계 개발자들의 공통 의식으로 자리 잡았다.
  • 인간 언어로 코딩하려는 욕망: 자연어로 코딩하겠다는 욕망은 1950년대 COBOL 시절부터 꾸준히 제기되었으나, 컴퓨터는 늘 인간의 모호한 말귀를 알아먹지 못해 실패했다. 최근 인공지능(LLM)과 프롬프트 엔지니어링의 등장으로 드디어 인간 언어 코딩이 실현되는 듯하지만, 실상은 영어로 코딩하면서도 여전히 버그와 사투를 벌이는 중이다.

6. 관련 문서

각주

  1. 실제로 파이썬 코드를 순수 계산용으로 돌리면 C언어에 비해 수십 배에서 수백 배까지 느리지만, 현대 개발자들은 '내 인건비가 컴퓨터 하드웨어 업그레이드 비용보다 비싸다'는 기적의 논리로 파이썬을 아주 유용하게 쓴다.