Skip to main content

Command Palette

Search for a command to run...

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

Published
•6 min read•View as Markdown

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

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

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
  1. 인터프리터 실행
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를 성장시키는 여정에 동참해 주세요.

More from this blog

개발자 vs AI: 연말에 되돌아보는 내가 되고 싶은 개발자 유형은 무엇일까?

# 서론 – 연말, 개발자의 일상이 왜 달라지는가 12월이 되면 많은 개발자들은 데드라인이 느려지고, 팀 채팅은 조용해지며, 풀 리퀘스트(PR)는 한가해지는 것을 경험합니다. “올해는 정말 바빴다”는 감회와 함께, 동시에 “다음 해에는 어떤 개발자가 되고 싶을까?” 하는 고민이 자연스럽게 떠오릅니다. 특히 최근 AI 기술이 급격히 발전하면서, “AI가 내 일을 빼앗을까?” 라는 불안감과 “AI와 협업하면 내 역량을 어떻게 강화할 수 있을까?” ...

Dec 29, 20255 min read

인사이트 부채(Insight Debt)란? 초보 개발자를 위한 쉬운 이해와 해결 방법

# 서론 – 왜 우리는 “인사이트 부채”에 주목해야 할까? 소프트웨어 개발 현장에서 인사이트 부채(Insight Debt) 라는 용어를 들어본 적이 있나요? 프로젝트를 진행하면서 “이 부분은 나중에 다시 살펴볼게” 라는 생각을 자주 하게 됩니다. 하지만 이런 미뤄진 고민이 쌓이면 결국 코드 품질 저하, 버그 증가, 팀 커뮤니케이션 비용 등 다양한 문제를 야기합니다. 이번 포스트에서는 인사이트 부채가 정확히 무엇인지, 왜 발생하는지, 그리고 초보...

Dec 29, 20253 min read

블록체인 활용: 일상 속 5가지 실생활 적용 사례와 시작 가이드

# 서론 – “블록체인, 우리 생활에 뭐가 바뀔까?” 최근 뉴스와 SNS에서 블록체인이라는 단어를 자주 보지만, 실제로 우리 주변에 어떻게 적용되고 있는지는 잘 모르는 경우가 많습니다. “복잡하고 비싸다”는 인식이 남아 있지만, 최근는 블록체인 활용이 점점 쉬워지고 비용도 낮아져 일반인도 직접 체험할 수 있는 시대가 왔습니다. 이번 글에서는 블록체인 적용 사례 5가지를 중심으로, 초보자도 바로 이해하고 시작할 수 있는 방법을 알려드립니다. #...

Dec 29, 20254 min read

스크래핑 온 더 엣지: SvelteKit으로 만든 초고속 만화 뷰어 만들기 (50자)

# 서론 – “만화 읽기가 이렇게 불편할 수 있을까?” 우리 모두가 한 번쯤 겪어본 일입니다. 만화를 읽고 싶을 땐 원하는 사이트가 로딩이 오래 걸리거나, 페이지를 넘길 때마다 광고가 끊임없이 뜨고, 이미지가 깨져서 눈이 피로해지는 경우가 있죠. 이런 불편함을 그냥 견뎌야 할까요? 개발자라면 “코드로 해결할 수 있지 않을까?” 하는 생각이 떠오릅니다. 이번 포스트에서는 SvelteKit과 웹 스크래핑을 활용해, 초고속 만화 뷰어를 직접 만드는 ...

Dec 29, 20254 min read

Tim van der Lippe가 Mockito 유지보수자를 떠나다 – Java 테스트 생태계에 미치는 영향은?

SEO 키워드: Mockito, Java 단위 테스트, 테스트 자동화 # 서론 – “왜 이 소식이 중요한가?” 최근 Reddit의 r/programming 커뮤니티에 올라온 글에서 Tim van der Lippe가 오랜 기간 담당해 온 Mockito 프로젝트의 유지보수자를 물러난다는 소식이 전해졌습니다. Mockito는 Java 개발자 사이에서 가장 널리 쓰이는 테스트 자동화 라이브러리 중 하나이며, 수많은 오픈소스 프로젝트와 기업 서비스의 ...

Dec 29, 20253 min read2
H

HA JIN-YOUNG's blog

967 posts