---
title: "코드를 2차원으로 쓰면 뭐가 달라질까"
published: 2026-07-22T14:03:21.000Z
canonical: https://jeff.news/article/5039
---
# 코드를 2차원으로 쓰면 뭐가 달라질까

이 글은 프로그래밍 언어가 꼭 왼쪽에서 오른쪽으로만 흘러야 하냐는 질문에서 출발해, 2차원 공간을 쓰는 식 표현과 연산자 정의를 실험한다. 닭장 자동문 예시, 양자컴퓨팅의 보조 비트 초기화, 3비트 덧셈기까지 이어지면서 공간적 문법이 사고방식을 어떻게 바꿀 수 있는지 보여준다.

- 이 글의 출발점은 단순함. 왜 코드는 꼭 한 줄에서 왼쪽에서 오른쪽으로만 읽어야 하냐는 질문임
  - `a < b` 같은 비교식을 세로로 써도 되지 않냐는 장난스러운 아이디어에서 시작함
  - 물론 IDE와 파서가 2차원 배치를 이해해야 하니 현실 구현은 빡세지만, 글은 그 제약을 잠깐 내려놓고 생각 실험을 밀어붙임

- 첫 번째 동기는 3항 연산을 infix로 예쁘게 쓰기 어렵다는 문제임
  - 파이썬의 `x and y and z`는 사실 2항 연산을 이어 붙인 형태에 가까움
  - 글쓴이는 `andFlip`이라는 연산자를 소개함. 두 입력이 모두 참이면 대상 값을 뒤집는 연산임
  - 선형 문법으로 쓰면 어색한데, 2차원 배치를 허용하면 '대상'과 '조건'을 공간적으로 분리할 수 있음

- 닭장 자동문 예시가 꽤 좋음. 그냥 `x and y and z`가 아니라 토글이 필요하기 때문임
  - x는 조도계가 황혼이나 새벽 임계값을 넘었는지 여부
  - y는 그 값이 5분 동안 안정적으로 유지됐는지 여부
  - z는 문이 최근에 토글되지 않았는지 여부
  - 구름이 지나가며 x만 잠깐 켜져도 y를 통과하지 못하니 문은 그대로 있음

> [!NOTE]
> 여기서 핵심은 조건을 만족하는 동안 문 상태를 계속 따라가게 하는 게 아니라, 조건이 맞는 순간 한 번만 토글하고 유지하는 것임. 그래서 단순한 `and`보다 `andFlip` 모델이 더 잘 맞음.

- 글은 여기서 양자컴퓨팅 쪽으로 방향을 튼다. 임시 변수 t1을 다시 0으로 되돌리는 문제가 나오기 때문임
  - t1을 중간 계산에 쓰면 표현식은 더 이상 순수 함수처럼 보이지 않음
  - 같은 토글 연산을 다시 적용하면 t1을 원래대로 돌릴 수 있다는 점을 이용해, 계산과 정리를 한 2차원 표현식에 넣음
  - 이 구조가 CCCX 게이트와 닮았다고 설명함. 중간값을 만들고 다시 지우는 'uncompute'가 중요하기 때문임

- 더 어려운 퍼즐은 t1의 초기값을 모를 때임
  - t1이 0이라고 가정하면 같은 연산을 반복해서 지울 수 있음
  - 하지만 t1이 n이라는 알 수 없는 불리언이면 단순 반복으로는 원하는 결과가 깨질 수 있음
  - 글은 같은 계산 블록을 위아래로 배치해 t1을 원래 n으로 되돌리면서 t2에는 올바른 결과를 남기는 식을 제시함

- 이 부분은 borrowed ancilla 개념과 연결됨
  - borrowed ancilla는 빌려 쓰는 더러운 임시값 같은 것임. 계산에는 쓰지만 끝나면 원래 상태로 돌려줘야 함
  - 글쓴이는 같은 회로를 Qiskit 코드와 회로 다이어그램으로도 보여주며, 2차원 문법이 둘의 중간 지점처럼 읽힌다고 주장함

- 이어서 `maj`와 `uma`라는 연산자를 공간적으로 정의함
  - `maj`는 세 입력의 majority를 계산하는 게이트로, 양자 ripple-carry adder에서 다음 carry를 만드는 데 쓰임
  - `uma`는 UnMajority and Add의 줄임말로, `maj`가 남긴 더러운 중간 상태를 되돌리면서 합을 더하는 역할을 함
  - 결국 3비트 덧셈기를 한 덩어리의 2차원 표현식으로 만들고, b 와이어에는 `a + b`, c3에는 carry-out을 남기며, c0와 a 와이어는 원래대로 복구한다고 설명함

- 글 후반은 공간 언어 미니 투어임
  - Befunge는 1993년에 나온 2차원 언어로, 명령 포인터가 격자를 돌아다니며 실행됨
  - Orca는 각 문자가 주변 값을 읽고 아래에 결과를 쓰는 라이브코딩 시퀀서임
  - Racket의 `#2dcond`는 실제 동작하는 2차원 조건문 확장임
  - Hexagony는 육각형 격자 위에서 실행되고, 래더 로직은 공장 PLC에서 쓰이는 회로식 표현임
  - 스프레드시트도 가장 성공한 공간 언어로 언급됨. 모든 수식이 2차원 좌표에 살고 주변 셀을 읽기 때문임

- 결론은 언어가 사고를 만든다는 쪽에 가까움
  - 터미널은 명령을 왼쪽에서 오른쪽으로 쓰게 만들었고, 키보드는 ASCII 중심 기호를 자연스럽게 만들었음
  - 그래서 우리가 코드를 수평 텍스트로 생각하는 건 기술 환경의 산물일 수 있다는 주장임

---
## 기술 맥락

- 이 글에서 실제로 선택한 기술적 방향은 '문법을 1차원 토큰 스트림으로만 보지 말자'예요. 일반적인 파서는 텍스트 순서가 곧 의미의 순서인데, 글쓴이는 y축까지 의미 공간으로 쓰면 3항 연산이나 회로식 계산을 더 직접적으로 표현할 수 있다고 봐요.

- 왜 양자 회로 예시가 계속 나오냐면, 양자 계산에서는 중간값을 만들고 다시 되돌리는 구조가 중요하기 때문이에요. 선형 코드로는 변수 추적이 앞뒤로 튀지만, 회로 다이어그램은 원래 와이어와 게이트의 공간 배치로 이걸 보여주거든요.

- `maj`와 `uma`는 단순히 이상한 연산자 놀이가 아니에요. ripple-carry adder에서 carry를 전파하고 다시 정리하는 역할이 있어서, 계산과 uncompute가 붙어 있는 구조를 보여주기 좋은 예시예요.

- 현실 언어로 만들려면 파서, 에디터, 커서 이동, diff, 포매터가 전부 달라져야 해요. 그래서 당장 범용 언어가 되긴 어렵지만, 스프레드시트나 래더 로직처럼 특정 도메인에서는 이미 2차원 사고가 훨씬 자연스럽다는 게 글의 포인트예요.

## 핵심 포인트

- 2차원 문법을 쓰면 3항 연산이나 체이닝을 선형 코드보다 직관적으로 표현할 수 있다는 실험이다
- andFlip, maj, uma 같은 연산자를 통해 양자 회로의 계산과 되돌리기 구조를 한 표현식 안에 담는다
- Befunge, Orca, Racket #2d, Hexagony, 래더 로직, 스프레드시트까지 공간 언어의 계보를 훑는다

## 인사이트

실무 언어 제안이라기보다는 '언어의 모양이 생각의 모양을 바꾼다'는 글에 가깝다. 그래도 양자 회로나 스프레드시트처럼 이미 공간적으로 생각하는 영역을 보면, 코드가 1차원이어야 한다는 믿음이 꽤 터미널 중심 편견일 수도 있다.
