나무모에 미러 (일반/어두운 화면)
최근 수정 시각 : 2025-03-25 15:05:45

난해한 프로그래밍 언어



[[컴퓨터공학|컴퓨터 과학 & 공학
Computer Science & Engineering
]]
[ 펼치기 · 접기 ]
||<tablebgcolor=#fff,#1c1d1f><tablecolor=#373a3c,#ddd><colkeepall><colbgcolor=#0066DC><colcolor=white> 기반 학문 ||수학(해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학(환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학(형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학 ||
하드웨어 구성 SoC · CPU · GPU(그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품
기술 기계어 · 어셈블리어 · 바이오스 · 절차적 프로그래밍 · 객체 지향 프로그래밍 · 함수형 프로그래밍 · 해킹 · ROT13 · 일회용 비밀번호 · 사물인터넷 · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시(SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화 · 하드웨어 가속
연구 및 기타 논리 회로(보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 운영체제(멀티태스킹 · 프로세스 스케줄링 · 데드락 · 식사하는 철학자 문제 · 뮤텍스 · 세마포어 · 인터럽트) · 데이터베이스 · 컴퓨터 언어 · 프로그래밍 언어{컴파일러(어셈블러 · JIT) · 인터프리터 · 유형 이론 · 어휘 분석 · 파싱 · 링커 · 난해한 프로그래밍 언어} · 마크업 언어 · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩(유니코드 · MBCS) · 네트워크(네트워크 포트) · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도(최적화) · 소프트웨어 개발 방법론 · 디자인 패턴 · 정보처리이론 · 재귀 이론 · 자연어 처리(기계 번역 · 음성인식) · 버전 (버전 관리 시스템)

1. 개요2. 전용 위키3. 난해한 프로그래밍 언어의 요소4. 예시
4.1. 난해한 프로그래밍 언어4.2. 난해한 프로그래밍 스타일

1. 개요

난해한 프로그래밍 언어(Esoteric programming language, Esolang)는 의도적으로 다른 프로그래밍 언어에 비해 사용하기 어렵게 만든 언어다.

제작 이유는 대부분 컴퓨터 프로그래밍 언어의 한계를 테스트하기 위해서, 어떤 개념의 증명으로서, 또는 장난하기 위해서로, 절대로 실용적인 프로그래밍에 적용하기 위한 의도는 아니다. 실제 업무에서 쓰는 프로그래밍 언어는 최대한 다양하게 쓸 수 있으면서도 쉽게 작성할 수 있게 만들려고 애를 쓴다.

따라서 실무에 쓰이는 언어 중 쓰기 전용 언어로 악명높은 Perl, 웹 개발자 사이에서 까야 제맛으로 대동단결하는 PHP, Node.js 개발자들에게 애증의 존재인 JavaScript, 태초의 C언어 등도 난해하긴 하지만, Esolang으로 부르지는 않는다.

최초의 난해한 프로그래밍 언어는 제임스 라이언스(James Lyons)와 돈 우즈(Don Woods)가 1972년에 만든 인터칼이라고 한다. 제작 이유는 자신들이 알고 있는 언어들과 완전히 다른 언어를 만들고 싶어서이다.

2. 전용 위키

<colbgcolor=#717522><colcolor=#FFFFFF> Esolang
<nopad> 파일:Esolang_Logo.png
종류위키
회원가입선택
주소https://esolangs.org/wiki/Main_Page
다양한 난해한 프로그래밍 언어를 전문적으로 다루는 위키로, 후술할 언어들 중 대다수를 포함한다.

3. 난해한 프로그래밍 언어의 요소

난해한 프로그래밍 언어들은 다양한 방법으로 프로그래머들을 농락하는데, 대략적으로 아래와 같다.

4. 예시

4.1. 난해한 프로그래밍 언어

4.2. 난해한 프로그래밍 스타일

정상적인 언어를 사용해 난해하게 작성하는 것이다. 스파게티 코드 같이 그냥 실력이 없어서 어려워진건 해당되지 않는다.
[1] 명령어의 간결함과 유명세 때문인지, 많은 난해한 프로그래밍 언어들의 튜링 완전 여부는 브레인퍽으로 번역이 가능함을 보여서 증명되곤 한다. 샌드박스 게임에서 인터프리터가 구현되는 사례가 상당히 많은 것을 보면 그냥 1비트의 상태가 8가지인 기계어라고 봐도 될 수준이다.[2] [math(SKxy)] = [math(Ky(xy))] = [math(y)]에서 [math(SKx=I)]임을 보일 수 있다.[3] 여기서 말하는 구성이란 대수적 구조와는 관계없다. 모든 튜링 완전한(Turing-complete) 언어는 대수적으로 보면 결국 모두 동일한 구조다.[4] 괴델 넘버링을 응용한 것이다. 괴델은 괴델 베타 함수를 이용하여 inductive structure를 갖는 모든 클래스의 원소를 하나의 자연수로 표현하였고, 이를 이용하여 프로그램 뿐 아니라, 수학 증명 자체도 하나의 자연수로 표현하였다. 이러한 자연수로의 인코딩/디코딩을 이용하여 증명한 것이 불완전성 정리이다.[5] 정규표현식과 비슷한 맥락이다.[6] 셰익스피어 프로그래밍 언어도 자연어를 사용하지만, 아스키 한 글자를 출력하는 명령인 Speak your mind가 수없이 반복되는 것을 볼 수 있다.[7] 아래 홈페이지의 예시에 이거 말고도 8개의 Hello World를 출력하는 방법이 더 있다.[8] https://github.com/Shine-Loi-Lee/HRON[9] 예시로 Hello, world!는 이렇게 쓴다. 혀어어어어어어어엉........ 핫. 혀엉..... 흑... 하앗... 흐윽... 형. 하앙. 혀엉.... 하앙... 흐윽... 항. 항. 형... 하앙. 흐으윽... 형... 흡... 혀엉.. 하아아앗. 혀엉.. 흡... 흐읍... 형.. 하앗. 하아앙... 형... 하앙... 흐윽... 혀어어엉.. 하앙. 항. 형... 하앙. 혀엉.... 하앙. 흑... 항. 형... 흡 하앗. 혀엉..... 흑. 흣[10] 사실 코드 시작과 끝에 어떻게, 이 사람이름이냐ㅋㅋ를 쓰기는 한다[11] 슈퍼패미컴 패드의 입력부는 16개이다. 여기에 멀티탭을 통해 패드를 여러 개 연결해 명령수단을 16x(n)로 확장한다.