Digital Garden by Rycont | 뉴스레터 구독하기

2025년을 비췄던 달빛과 약속

달빛약속과 함께 새해를 맞는게 3년째입니다. 이렇게 한 오픈소스 프로그램을 오랫동안 키워나가고 있다는게 자랑스럽습니다. 이번 글에서는 1년동안 달빛약속에 어떤 변화가 있었는지 자랑좀 하려고 합니다.

달빛약속이 뭔데
제가 물주면서 키우고 있는 한글 프로그래밍 언어입니다.
https://dalbit-yaksok.postica.app/


숫자로 말해요

(이 바로 다음 블럭은 클로드가 썼습니다)

📆 요일별 커밋 분포
월요일 ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  14   😴
화요일 █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  43
수요일 ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  63
목요일 ████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  71
금요일 ███████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  93
토요일 ████████████████████████████████████████ 167   🔥
일요일 ███████████████████████████████░░░░░░░░░ 129

🎁 보너스: 재미있는 사실들
| 🎲 | 사실 |
|:--:|:-----|
| 🦉 | 23시에 가장 많은 커밋 (63개) - 진정한 야행성! |
| 📅 | 토요일에 167개 커밋 - 주말이 본업? |
| 😴 | 월요일 커밋 14개 - 월요병 확인 |
| 📝 | 가장 긴 커밋 메시지 288자 (한글) |
| ⚡ | 1월 11일 하루 28개 커밋 - 최고 기록 |
| 🔄 | deno.json 494번 수정 - 버전 범프의 흔적 |
| 🤖 | AI가 75개 커밋 기여 (13%) |
| 💤 | 2월, 8월 휴식 - 재충전의 시간 |

(여기부터는 다시 제가 씁니다)

이름이 바뀌었어요. yaksok.tsdalbit-yaksok

원래 이 프로그램의 이름은 yaksok.ts였습니다. 그 이유인것이, Puzzlet Chung, Ipkn 선생님께서 태초에 yaksok 프로그래밍 언어를 고안하셨고, 그 구현체는 파이썬이였습니다. 저는 약속 프로그래밍 언어의 사상과 문법이 마음에 들었습니다. 그러나 파이썬은 싫어했습니다.. 그래서 내가 가장 좋아하는 프로그래밍 언어타입스크립트로 재작성하였습니다. 이 프로그램의 시초였고, 그것이 2023년 12월 02일이였네요.

저는 욕심이 많습니다. 약속 프로그래밍 언어는 좋지만, 더 제 마음에 들게 뜯어고치고 싶었습니다. 이름이 마음에 걸리더라고요. 약속.ts인데 약속과 호환이 안되는 기능이 있으면 안된다고 생각했습니다. 그래서 얼굴에 점 하나 찍고, "달빛약속"이 되었습니다. 이것이 2024년 12월 22일입니다.
...
아 이게 2025년인줄 알고 있었는데 당황스럽네요. 아무튼 이렇게 시작하겠습니다.


1월: Monaco Editor 지원

프로그래밍 언어만 있으면 조금 아쉽습니다. 프로그래밍 언어를 더 잘 활용할 수 있기 위해서는 훌륭한 에디터가 필요했습니다. 저는 Monaco Editor를 골랐습니다. 코드를 입력하면 예쁘게 보여주는 기능이 구현되어 있습니다. 근데 이제 와서 생각해보면 Monaco가 생각보다 별로에요. 일단 멀티인스턴스 지원이 아주 안좋고, 무엇보다 가장 중요한 한글 입력 처리가 제대로 안됩니다. 그래서 앞으로는 CodeMirror로 갈아타야 하나 고민중입니다..

그 외에도..


2월

군대에서 애인이랑 전화하느라 바빴습니다.,


3월: 1.0 릴리즈, 조금 쓸만해짐

문법의 현대화

약속은.. 독자문법이 몇개 있었습니다. 예시로,

코드멍

Throttled Stepping(디버깅용으로 코드 실행 속도를 낮추는 기능)과, Running Code Inspection(현재 실행중인 코드 구문을 강조) 기능이 추가하였습니다. 이제 코드 실행 속도를 느리게 해서 어떤 부분이 어떻게 실행되는지 지켜볼 수 있습니다. 코드멍이 가능해졌습니다.


4월: 1.3.1, 어느정도 쓸만해짐

이제 오류가 떠요

..이때까지는 오류가 잘 안떴었습니다. 정확히는, 소스코드 전체를 실행해보지 않는 한 오류를 확인할 수 없었습니다. 그렇기에 코드를 실행하기 전에 문제를 미리 파악할 수 있도록 validation 기능을 구현하였습니다. 정의되지 않은 값 사용, 잘못된 함수 호출 등을 검증할 수 있습니다.

BaseContext

교육용 프로그램을 만들 때는 한 스코프나 환경을 여러번 재사용해야 할 때가 있습니다. 그럴 때 사용하기 참 좋은 기능을 추가하였습니다. 예를 들어 교육용 코딩게임에서 사전 제공 함수를 추가해야 한다면(캐릭터 이동 등), BaseContext로 함수를 담은 소스코드를 미리 만들어두고, 사전 제공 환경으로 여러번 재사용할 수 있습니다.


5월: 큰거 없음. 이 때 전역했어요!


6월: 규격화의 달

실행 인터페이스 규격화

기존에 중구난방이던 코드 실행 함수들을 완전히 재작성하였습니다. 이제 YaksokSession이라는 하나의 클래스가 모든 함수 실행을 관리합니다.

const session = new YaksokSession()
session.addModule('main', '"안녕!" 보여주기')
await session.runModule('main')

Extension API: 확장 프로그램 규격화

FFI를 더 쉽게 작성할 수 있도록 확장을 규격화 하였습니다. 이 때 당시에는 약속-자바스크립트 연결 확장(QuickJS를 활용하여 구현함)만 있었지만, 추후 Extension API를 활용하여 약속-파이썬 연결 확장, 약속-데이터 분석 확장도 개발하였습니다.


7월: 잡기능의 달

Dictionary가 돼요!!

자기소개 = {
	이름: "홍길동"
	나이: 14
}

자기소개['나이'] 보여주기

복합대입연산자가 돼요!!

나이 = 10
나이 += 10
나이 -= 10
나이 *= 10
나이 /= 10

의 값 종류(Typeof) 연산자도 생겼어요!!

나이 = 10
나이 의 값 종류 보여주기

실행제어 API 추가


8월

여기도 비어있습니다. 왜 안했을까요..


9월: 파이썬

const session = new YaksokSession()
session.extend(new Pyodide(['numpy']))

이렇게 확장을 설정해주면

from numpy import array
배열 = array([1, 2, 3, 4, 5, 6])
변형된_배열 = 배열.reshape(2, 3)
변형된_배열 보여주기

이렇게 그냥 쓸 수 있습니다
솔직히저는이게개쩌는거라고생각하는데


10월: 우리 AI 영양간식

사실 요즘 프로그래밍을 하는건 인간이 아니라 AI죠.

Machine Readable Errors

사실 인간이 보는 오류를 그대로 AI에게 먹이면, 토큰 낭비가 엄청납니다. 엄청나요 그냥. 그래서 뺄거 다 빼고, 정말 필요한 내용만을 JSON 포맷으로 직렬화해서 보여주기로 했습니다.

사람이 보는 오류가 이런 모양이라면:


🚨  문제가 발생했어요 (main 파일) 🚨
> "과 먹 기"라는 변수나 약속을 찾을 수 없어요.

┌─────
│  8  
│  9  5번 반복
│  10      먹을_음식을 먹일_사람과 먹 기
│  11  
└─────

기계는 이런 오류를 봅니다:

interface MachineReadableError {
    message: string
    position?: ${number}:
    fileName?: string
    child?: MachineReadableError
}

첫째아들을 위한 MCP

AI가 약속을 실행하고 문법을 공부할 수 있도록 MCP를 개발하였습니다.
https://mcp.dalbit-yaksok.postica.app/mcp
Cloudflare Worker로 개발하였습니다.

그 외에도..


11월: 한국어스럽게

함수 호출 조사 자동 분리

올해 업데이트중 가장 마음에 드는 기능입니다

약속, (받을사람)에게 전화하기
	...
	
내_친구 = "수미"
내_친구에게 전화하기

이게 이렇게 내_친구에게를 띄어쓰지 않아도 잘 실행됩니다.
정말 저는 이 기능이 너무나도 마음에 듭니다. 이제 인터프리터는 한글이 아니라 비로소 한국어를 제대로 할 수 있게 되었다고 생각합니다.

그 외에는...


12월: 이벤트 시스템

약속 밖에서 안으로 이벤트를 찔러넣을 수 있습니다.

# 이벤트 선언
이벤트(TEST_EVENT), 테스트 이벤트

# 이벤트 구독
테스트 이벤트
    "이벤트 실행됨" 보여주기
session.eventCreation.sub('TEST_EVENT', (args, callback, terminate) => {
    callback()    // 이벤트 핸들러 실행
    callback()    // 여러 번 호출 가능
    callback()
    terminate()   // 리스너 종료
})

앞으로는?

이제 언어 코어에서 구현할 기능들은 많이들 구현 해둔것 같아서, 앞으로는 데이터 분석 / GUI 프로그래밍 / 웹개발 등등의 라이브러리 개발에 집중할것 같습니다. 관심 있으시다면 언제든 연락 기다리고 있겠습니다. 읽어주셔서 감사합니다.


연결된 페이지 (Inlinks)

연결된 페이지가 없습니다.


댓글 쓰기, GitHub에서 보기