# ACE 언어 소개: 함수 호출을 효과로 다루는 새로운 실험적 프로그래밍 언어

---

# # 서론 – “프로그래밍 언어가 너무 복잡해?”

코딩을 시작한 지 얼마 안 된 초보자부터 수십 년 차 베테랑까지, 모두 한 번쯤은 **“왜 이렇게 복잡해?”** 라는 생각을 해본 적이 있을 것입니다. 특히 함수 호출이 어떻게 동작하는지, 그 흐름이 어디까지 이어지는지 파악하기가 어려울 때가 많죠.

2023년 크리스마스, 저는 혼자 집에 앉아 AI와 대화를 나누며 **‘함수 호출을 효과(effect)로 다루면 어떨까?’** 라는 아이디어를 구체화했습니다. 그 결과 탄생한 것이 **ACE (Algebraic Call Effects)** 라는 아주 작은 실험적 언어입니다.

이번 글에서는 **ACE 언어**가 무엇인지, 왜 **함수 호출을 효과**라는 관점으로 바라보는 것이 의미가 있는지, 그리고 실제 코드를 통해 어떻게 동작하는지를 초보자도 이해하기 쉬운 방식으로 풀어보겠습니다.

> **SEO 키워드**: *ACE 언어*, *함수 호출 효과*, *실험적 프로그래밍 언어*

---

# # 1. ACE란 무엇인가? – 가장 작은 실험적 언어의 탄생 배경

## # 1-1. 목표와 철학

ACE는 **“함수 호출을 부수 효과(effect)와 동일시한다”**는 핵심 아이디어에 기반합니다. 전통적인 언어에서는 함수가 값을 반환하고, 부수 효과(예: 파일 쓰기, 콘솔 출력)는 별도로 관리됩니다. ACE는 이 두 가지를 **동일한 구조**로 표현함으로써:

- **코드 흐름을 명확히**

- **컴파일러 최적화**를 위한 새로운 가능성 탐색

- **함수형 프로그래밍**과 **명령형 프로그래밍** 사이의 경계를 허무는 실험

이라는 목표를 갖습니다.

## # 1-2. 왜 “tiny”인가?

ACE는 **핵심 개념만을 최소한의 문법으로 구현**합니다. 전체 구현 파일은 200줄 이하이며, 인터프리터도 500줄 정도면 충분합니다. 이렇게 작게 만든 이유는:

1. **학습 곡선을 낮추기** – 복잡한 문법을 배울 필요 없이 핵심 아이디어에 집중.

2. **빠른 프로토타이핑** – 새로운 아이디어를 실험할 때, 큰 언어를 수정하는 대신 ACE를 변형해 바로 테스트 가능.

3. **커뮤니티 공유** – 작은 코드베이스는 GitHub에 올리기 쉽고, 다른 개발자와 협업하기 편리.

---

# # 2. 함수 호출을 효과로 보는 새로운 시각

## # 2-1. 전통적인 함수와 부수 효과의 차이

| 구분 | 전통 언어 (예: JavaScript) | ACE에서의 접근 |

|------|----------------------------|----------------|

| 반환값 | `return` 문으로 명시 | **값 자체도 효과** |

| 부수 효과 | `console.log`, 파일 입출력 등 별도 처리 | **함수 호출 자체가 효과** |

| 흐름 제어 | `await`, `then` 등 비동기 제어문 필요 | **연쇄된 효과로 자연스러운 흐름** |

전통 언어에서는 **값**과 **부수 효과**를 구분해 관리합니다. 이는 코드 가독성을 높이는 장점이 있지만, 동시에 두 흐름을 따로 추적해야 하는 번거로움을 만들죠.

## # 2-2. ACE에서 “효과”는 어떻게 정의되는가?

ACE에서는 **모든 함수 호출을 ‘Effect’ 객체**로 반환합니다. 이 객체는 두 가지 정보를 담고 있습니다.

1. **값(value)** – 함수가 계산한 결과.

2. **부수 효과(log, state change 등)** – 실행 과정에서 발생한 부수 효과.

예시:

```
ace

effect add(a, b) = {

  let result = a + b

  log('add 실행: ' + a + ' + ' + b + ' = ' + result)

  return result

}

```

위 `add` 함수는 `result`와 함께 `log` 효과를 포함합니다. 호출 시 반환되는 `Effect`는 **값**과 **부수 효과**를 동시에 전달합니다.

## # 2-3. 효과 체이닝 (Effect Chaining)

ACE는 **효과를 순차적으로 연결**하는 연산자를 제공합니다. `>>=` 연산자를 사용하면 이전 효과의 값을 다음 함수에 전달하면서 부수 효과도 자동으로 이어집니다.

```
ace

let computation = add(2, 3) >>= multiplyByTwo

```

- `add(2,3)` → `Effect(value=5, log='add 실행...')`

- `>>=` 연산자는 `value`를 `multiplyByTwo`에 넘기고, 두 로그를 **합쳐** 새로운 `Effect`를 반환합니다.

이러한 체이닝은 **비동기 흐름**이나 **에러 전파**를 자연스럽게 다루는 데 큰 장점을 제공합니다.

---

# # 3. ACE 문법 기본 – 초보자를 위한 빠른 입문

## # 3-1. 프로그램 구조

ACE 파일은 크게 **선언부**와 **실행부**로 나뉩니다.

```
ace

// 선언부

effect add(a, b) = { … }

effect multiplyByTwo(x) = { … }

// 실행부

main = {

  let result = add(10, 5) >>= multiplyByTwo

  print(result.value)   // 최종값 출력

  printAllLogs(result)  // 누적된 로그 출력

}

```

- `effect` 키워드: 효과를 반환하는 함수 정의.

- `main` 블록: 프로그램 진입점.

## # 3-2. 기본 타입과 연산

| 타입 | 설명 |

|------|------|

| `int` | 정수 |

| `float` | 실수 |

| `string` | 문자열 |

| `bool` | 불리언 |

| `Effect` | 값 + 부수 효과를 담은 특수 타입 |

연산자는 대부분 **표준 연산자**(`+`, `-`, `*`, `/`)를 그대로 사용합니다.

## # 3-3. 부수 효과 함수

ACE는 몇 가지 기본 부수 효과 함수를 제공합니다.

| 함수 | 역할 |

|------|------|

| `log(msg)` | 콘솔에 문자열 출력, 효과에 기록 |

| `setState(key, value)` | 전역 상태 변경, 효과에 기록 |

| `getState(key)` | 전역 상태 조회, 값 반환 (부수 효과 없음) |

| `print(value)` | 최종 출력, 효과에 포함되지 않음 |

## # 3-4. 에러 처리

`tryEffect`와 `catchEffect`를 사용해 **효과 내부에서 발생한 에러**를 잡을 수 있습니다.

```
ace

let safeDiv = tryEffect(divide(a, b))

               catchEffect(e => log('Error: ' + e))

```

`tryEffect`는 성공 시 원래 효과를, 실패 시 `catchEffect`에 정의된 함수를 실행합니다.

---

# # 4. 실험적 언어가 주는 인사이트 – ACE가 보여준 새로운 가능성

## # 4-1. 함수형과 명령형의 융합

전통적인 함수형 언어는 **부수 효과를 금지**하거나 `Monad` 같은 구조로 감싸지만, ACE는 **효과 자체를 첫 번째 시민**으로 다룹니다. 이는:

- **코드 가독성**: 한 눈에 값과 부수 효과를 파악.

- **디버깅 편의성**: 효과 체인에 누적된 로그를 한 번에 확인.

## # 4-2. 최적화와 컴파일러 설계

효과가 명시적으로 존재하면 **컴파일러가 부수 효과를 정확히 추적**할 수 있습니다. 예를 들어, 순수 함수와 순수 효과만을 모아 **재사용 가능한 캐시**를 자동 생성하거나, **불필요한 로그**를 제거하는 최적화가 가능해집니다.

## # 4-3. 교육용 도구로서의 활용

ACE는 **프로그래밍 교육**에 유용합니다. 초보자는 “함수 호출이 왜 부수 효과를 만들 수 있는가?” 라는 질문에 직접 코드를 써보며 답을 찾을 수 있습니다. 또한, 함수형 사고와 명령형 사고를 동시에 연습할 수 있는 좋은 실험 플랫폼이 됩니다.

---

# # 5. ACE를 직접 체험해보기 – 간단한 예제 프로젝트

## # 5-1. 환경 설정 (5분 안에 끝내기)

1. **GitHub 저장소 복제**

```
bash

git clone https://github.com/yourname/ace-lang.git

cd ace-lang

```

2. **인터프리터 실행**

```
bash

python3 ace_interpreter.py examples/hello.ace

```

> `ace_interpreter.py`는 Python 3.10 이상에서 동작합니다.

## # 5-2. “계산기” 예제 만들기

`calc.ace` 파일을 새로 만들고 아래 코드를 붙여넣으세요.

```
ace

effect add(a, b) = {

  let r = a + b

  log('add: ' + a + ' + ' + b + ' = ' + r)

  return r

}

effect sub(a, b) = {

  let r = a - b

  log('sub: ' + a + ' - ' + b + ' = ' + r)

  return r

}

main = {

  let result = add(7, 3) >>= sub(?, 2)   // ?는 이전 결과 자동 대입

  print('최종 결과: ' + result.value)

  printAllLogs(result)

}

```

**실행 결과**

```

add: 7 + 3 = 10

sub: 10 - 2 = 8

최종 결과: 8

[log] add: 7 + 3 = 10

[log] sub: 10 - 2 = 8

```

## # 5-3. 확장 아이디어

- **상태 관리**: `setState`와 `getState`를 활용해 게임 점수판 만들기.

- **비동기 효과**: `awaitEffect`를 도입해 네트워크 요청 시뮬레이션.

- **에러 시뮬레이션**: `tryEffect`/`catchEffect`로 입력 검증 로직 구현.

---

# # 결론 – ACE와 함께 프로그래밍 패러다임을 확장해보세요

ACE는 **“함수 호출을 효과로 다루는”** 새로운 관점을 제공함으로써, 코드 흐름을 한층 투명하게 만들고, 함수형·명령형 사고를 동시에 연습할 수 있는 실험적 플랫폼입니다.

- **초보자**: 효과와 로그를 직접 눈으로 확인하면서 함수 호출의 의미를 체득.

- **중급·고급 개발자**: 새로운 최적화 아이디어와 언어 설계 실험의 장으로 활용.

- **교육자**: 함수형과 명령형 개념을 동시에 가르칠 수 있는 교재로 활용.

지금 바로 **ACE 인터프리터를 설치하고, 간단한 예제부터 직접 실행**해 보세요. 여러분의 작은 실험이 다음 세대 프로그래밍 언어의 큰 변화를 이끌 수도 있습니다.

> **행동 유도**: 아래 댓글에 여러분이 만든 ACE 코드 조각을 공유하거나, GitHub 이슈에 개선 아이디어를 남겨 주세요! 함께 ACE를 성장시키는 여정에 동참해 주세요.
