ACE 언어 소개: 함수 호출을 효과로 다루는 새로운 실험적 프로그래밍 언어
# 서론 – “프로그래밍 언어가 너무 복잡해?”
코딩을 시작한 지 얼마 안 된 초보자부터 수십 년 차 베테랑까지, 모두 한 번쯤은 “왜 이렇게 복잡해?” 라는 생각을 해본 적이 있을 것입니다. 특히 함수 호출이 어떻게 동작하는지, 그 흐름이 어디까지 이어지는지 파악하기가 어려울 때가 많죠.
2023년 크리스마스, 저는 혼자 집에 앉아 AI와 대화를 나누며 ‘함수 호출을 효과(effect)로 다루면 어떨까?’ 라는 아이디어를 구체화했습니다. 그 결과 탄생한 것이 ACE (Algebraic Call Effects) 라는 아주 작은 실험적 언어입니다.
이번 글에서는 ACE 언어가 무엇인지, 왜 함수 호출을 효과라는 관점으로 바라보는 것이 의미가 있는지, 그리고 실제 코드를 통해 어떻게 동작하는지를 초보자도 이해하기 쉬운 방식으로 풀어보겠습니다.
SEO 키워드: ACE 언어, 함수 호출 효과, 실험적 프로그래밍 언어
# 1. ACE란 무엇인가? – 가장 작은 실험적 언어의 탄생 배경
# 1-1. 목표와 철학
ACE는 “함수 호출을 부수 효과(effect)와 동일시한다”는 핵심 아이디어에 기반합니다. 전통적인 언어에서는 함수가 값을 반환하고, 부수 효과(예: 파일 쓰기, 콘솔 출력)는 별도로 관리됩니다. ACE는 이 두 가지를 동일한 구조로 표현함으로써:
코드 흐름을 명확히
컴파일러 최적화를 위한 새로운 가능성 탐색
함수형 프로그래밍과 명령형 프로그래밍 사이의 경계를 허무는 실험
이라는 목표를 갖습니다.
# 1-2. 왜 “tiny”인가?
ACE는 핵심 개념만을 최소한의 문법으로 구현합니다. 전체 구현 파일은 200줄 이하이며, 인터프리터도 500줄 정도면 충분합니다. 이렇게 작게 만든 이유는:
학습 곡선을 낮추기 – 복잡한 문법을 배울 필요 없이 핵심 아이디어에 집중.
빠른 프로토타이핑 – 새로운 아이디어를 실험할 때, 큰 언어를 수정하는 대신 ACE를 변형해 바로 테스트 가능.
커뮤니티 공유 – 작은 코드베이스는 GitHub에 올리기 쉽고, 다른 개발자와 협업하기 편리.
# 2. 함수 호출을 효과로 보는 새로운 시각
# 2-1. 전통적인 함수와 부수 효과의 차이
| 구분 | 전통 언어 (예: JavaScript) | ACE에서의 접근 |
|------|----------------------------|----------------|
| 반환값 | return 문으로 명시 | 값 자체도 효과 |
| 부수 효과 | console.log, 파일 입출력 등 별도 처리 | 함수 호출 자체가 효과 |
| 흐름 제어 | await, then 등 비동기 제어문 필요 | 연쇄된 효과로 자연스러운 흐름 |
전통 언어에서는 값과 부수 효과를 구분해 관리합니다. 이는 코드 가독성을 높이는 장점이 있지만, 동시에 두 흐름을 따로 추적해야 하는 번거로움을 만들죠.
# 2-2. ACE에서 “효과”는 어떻게 정의되는가?
ACE에서는 모든 함수 호출을 ‘Effect’ 객체로 반환합니다. 이 객체는 두 가지 정보를 담고 있습니다.
값(value) – 함수가 계산한 결과.
부수 효과(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분 안에 끝내기)
- GitHub 저장소 복제
bash
git clone https://github.com/yourname/ace-lang.git
cd ace-lang
- 인터프리터 실행
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를 성장시키는 여정에 동참해 주세요.