Skip to content

KingSejong 언어 기능 명세서 ​

KingSejong Programming Language Feature Specification 파일 확장자: .ksj

버전: v0.5.0 (Phase 8 완료) 최종 수정: 2025-11-21 저장소: https://github.com/kingsejong-lang/kingsejong-lang상태 기호: ✅ 구현 완료 | 🚧 구현 중 | 📝 계획됨


목차 ​

  1. 핵심 차별화 기능
  2. 기본 언어 기능
  3. 표준 라이브러리
  4. 개발 도구
  5. 교육 기능

1. 핵심 차별화 기능 (✅ 모두 구현 완료) ​

F-CORE-001: 조사 기반 메서드 체인 ✅ ​

우선순위: CRITICAL 상태: ✅ 구현 완료 설명: 한글의 교착어 특성을 활용한 자연스러운 메서드 체인

문법 ​

ksj
객체를 메서드한다
객체의 속성
객체로 변환한다
객체에서 필터한다

예제 ​

ksj
# 기본 사용
배열을 정렬한다
문자열을 대문자로_바꾼다
숫자들에서 짝수만_걸러낸다

# 체인
사용자의 이름을 대문자로_바꾸고 공백으로_나눈다
배열을 정렬하고 역순으로_뒤집는다

# 실제 구현
학생들 = [
    {이름: "철수", 점수: 85},
    {이름: "영희", 점수: 92}
]

우수학생 = 학생들에서 (학생 -> 학생.점수 >= 90) 필터하고
                     (학생 -> 학생.이름) 추출한다

구현 방법 ​

  • Lexer에 조사 토큰 추가 (JOSA_EUL, JOSA_RO, JOSA_UI)
  • Parser에 조사 체인 파싱 로직
  • Evaluator에 조사별 의미 해석

지원 조사 ​

조사의미예시
을/를목적어배열을 정렬한다
의소유격사용자의 이름
로수단/방법문자열로 변환한다
에서출처/선택배열에서 걸러낸다
에위치/대상리스트에 추가한다

F-CORE-002: 자연스러운 범위 표현 ✅ ​

우선순위: CRITICAL 상태: ✅ 구현 완료 설명: 수학적 표기와 일치하는 직관적 범위 (RangeExpression AST 노드 구현)

문법 ​

ksj
시작부터 끝까지    # 끝 포함
시작부터 끝미만    # 끝 미포함
시작초과 끝이하    # 시작 미포함, 끝 포함

예제 ​

ksj
# 기본 범위
1부터 10까지      # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1부터 10미만      # [1, 2, 3, 4, 5, 6, 7, 8, 9]
1초과 10이하      # [2, 3, 4, 5, 6, 7, 8, 9, 10]
1초과 10미만      # [2, 3, 4, 5, 6, 7, 8, 9]

# 반복문
반복 (i가 1부터 10까지) {
    출력(i)  # 1부터 10까지 정확히 10번
}

# 배열 슬라이싱
숫자들 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
일부 = 숫자들[0부터 5까지]     # [0, 1, 2, 3, 4, 5]
일부 = 숫자들[첫번째부터 다섯번째까지]

# 역방향
10부터 1까지 역순으로 {
    출력(i)  # 10, 9, 8, ..., 1
}

비교 (Python) ​

SejongPython결과
1부터 10까지range(1, 11)1~10
1부터 10미만range(1, 10)1~9
list[0부터 5까지]list[0:6]6개 요소

교육적 가치: 초보자 혼란 완전 제거


F-CORE-003: Async/Await 비동기 처리 ✅ ​

우선순위: HIGH 상태: ✅ 구현 완료 설명: AsyncFunctionLiteral, AwaitExpression AST 노드로 구현된 비동기 처리

문법 ​

ksj
동작을 한다          # 동기 실행
동작을 할것이다      # 비동기 실행 (Promise)
동작할때까지_기다린다 # await

예제 ​

ksj
# 동기 함수
함수 파일읽기(경로) {
    반환 파일시스템.읽기(경로)
}

# 비동기 함수 (자동으로 Promise)
함수 파일읽기_비동기(경로) {
    데이터 = 파일시스템.읽기를_할것이다(경로)
    반환 데이터
}

# await 사용
함수 사용자정보_가져오기(아이디) {
    사용자 = API호출("/사용자/" + 아이디)를_할때까지_기다린다
    게시물 = API호출("/게시물/" + 사용자.id)를_할때까지_기다린다
    반환 {사용자, 게시물}
}

# 간결한 형태
함수 데이터처리() {
    응답 = 서버에서_데이터를_받을때까지_기다린다
    결과 = 응답을_가공할때까지_기다린다
    반환 결과
}

비교 (JavaScript) ​

javascript
// JavaScript
async function getUserData(id) {
    const user = await fetch(`/users/${id}`);
    const posts = await fetch(`/posts/${user.id}`);
    return { user, posts };
}

F-CORE-004: 명확한 타입 시스템 ✅ ​

우선순위: CRITICAL 상태: ✅ 구현 완료 설명: 자연어 기반 타입 선언 (정수, 실수, 문자열, 참거짓, 없음)

문법 ​

ksj
타입 변수명 = 값
변수명: 타입 = 값

기본 타입 ​

ksj
정수 나이 = 15
실수 키 = 175.5
문자열 이름 = "철수"
참거짓 성인여부 = false
없음 값 = 없음

복합 타입 ​

ksj
# 배열
정수배열 점수들 = [85, 90, 78, 92]
문자열배열 이름들 = ["철수", "영희", "민수"]

# 객체
학생 = {
    이름: "철수",
    나이: 15,
    점수: 85
}

# Optional 타입
함수 찾기(이름: 문자열) -> 사용자 또는 없음 {
    # ...
}

타입 검사 및 변환 ​

ksj
나이 = 15
이름 = "철수"

# 타입 검사
타입(나이)    # "정수"
타입(이름)    # "문자열"

# 타입 변환
나이문자 = 나이를_문자열로()
나이실수 = 나이를_실수로()

# 에러 (타입 불일치)
합 = 나이 + 이름  # 에러: 정수와 문자열은 더할 수 없습니다
합 = 나이를_문자열로() + 이름  # OK: "15철수"

F-CORE-005: 단일 "없음" 개념 ✅ ​

우선순위: HIGH 상태: ✅ 구현 완료 설명: null/undefined/None 혼란 제거 (단일 없음 키워드)

문법 ​

ksj
값 = 없음

만약 (값이 없으면) { ... }
만약 (값이 있으면) { ... }

결과 = 값 또는 기본값

예제 ​

ksj
# 기본 사용
결과 = 없음

만약 (결과가 없으면) {
    출력("결과 없음")
}

# 기본값 제공
사용자명 = 입력값 또는 "익명"
점수 = 사용자.점수 또는 0

# 함수에서 없음 반환
함수 검색(이름) -> 사용자 또는 없음 {
    # 찾으면 사용자 반환
    # 못 찾으면 없음 반환
}

# 사용
사용자 = 검색("철수")
만약 (사용자가 있으면) {
    출력(사용자.이름)
} 아니면 {
    출력("사용자를 찾을 수 없습니다")
}

F-CORE-006: 직관적 반복문 ✅ ​

우선순위: HIGH 상태: ✅ 구현 완료 설명: 자연어 수준의 반복 표현 (10번 반복, i가 1부터 10까지, 각각에 대해)

문법 ​

ksj
횟수번 반복한다 { }
변수가 시작부터 끝까지 반복한다 { }
컬렉션 각각에 대해 변수로 { }
계속 (조건) { }

예제 ​

ksj
# 1. 횟수 반복
10번 반복한다 {
    출력("안녕")
}

# 2. 범위 반복
i가 1부터 10까지 반복한다 {
    출력(i)
}

# 3. 컬렉션 반복
이름들 = ["철수", "영희", "민수"]
이름들 각각에 대해 이름으로 {
    출력(이름)
}

# 4. 조건 반복
계속 (입력 != "종료") {
    입력 = 입력받기("명령: ")
    처리하기(입력)
}

# 5. 무한 반복
계속 {
    # 작업
    만약 (종료조건) {
        중단
    }
}

반복 제어 ​

ksj
i가 1부터 100까지 반복한다 {
    만약 (i == 50) {
        중단  # break
    }

    만약 (i % 2 == 0) {
        계속  # continue
    }

    출력(i)
}

2. 기본 언어 기능 ​

F-LANG-001: 변수 선언 및 할당 ​

우선순위: CRITICAL 상태: ✅ 구현 완료

ksj
# 타입 추론
이름 = "철수"
나이 = 15

# 명시적 타입
정수 점수 = 85
문자열 주소 = "서울"

F-LANG-002: 산술 연산 ​

우선순위: CRITICAL 상태: ✅ 구현 완료

ksj
합 = 5 + 3
차 = 10 - 4
곱 = 6 * 7
몫 = 20 / 4
나머지 = 17 % 5
제곱 = 2 ^ 8  # 또는 2 ** 8

F-LANG-003: 비교 연산 ​

우선순위: CRITICAL 상태: ✅ 구현 완료

ksj
# 기호 사용
만약 (나이 >= 18) { }
만약 (점수 == 100) { }

# 자연어 사용 (추가)
만약 (나이가 18이상) { }
만약 (점수가 100과_같음) { }
만약 (값이 10초과) { }
만약 (값이 5이하) { }

F-LANG-004: 논리 연산 ​

우선순위: HIGH 상태: ✅ 구현 완료

ksj
# 기호
만약 (나이 >= 18 && 학생 == true) { }
만약 (비번 == "1234" || 지문인증 == true) { }
만약 (!(로그인됨)) { }

# 한글 (추가)
만약 (나이 >= 18 그리고 학생) { }
만약 (비번 == "1234" 또는 지문인증) { }
만약 (로그인안됨) { }

F-LANG-005: 조건문 ​

우선순위: CRITICAL 상태: ✅ 구현 완료

ksj
만약 (조건) {
    # 실행
} 아니면_만약 (다른조건) {
    # 실행
} 아니면 {
    # 실행
}

# 짧은 형태
결과 = 만약 (조건) 참값 아니면 거짓값

F-LANG-006: 함수 ​

우선순위: CRITICAL 상태: ✅ 구현 완료

ksj
# 기본 함수
함수 인사하기(이름) {
    출력("안녕, " + 이름)
}

# 반환값
함수 더하기(a, b) {
    반환 a + b
}

# 타입 지정
함수 곱하기(a: 정수, b: 정수) -> 정수 {
    반환 a * b
}

# 기본 매개변수
함수 인사(이름 = "손님") {
    출력("안녕, " + 이름)
}

# 가변 인자
함수 합계(...숫자들) {
    총합 = 0
    숫자들 각각에 대해 숫자로 {
        총합 = 총합 + 숫자
    }
    반환 총합
}

F-LANG-007: 배열 ​

우선순위: HIGH 상태: ✅ 구현 완료

ksj
# 생성
숫자들 = [1, 2, 3, 4, 5]
이름들 = ["철수", "영희", "민수"]

# 인덱싱
첫번째 = 숫자들[0]
마지막 = 숫자들[-1]

# 슬라이싱
일부 = 숫자들[0부터 3까지]
일부 = 숫자들[첫번째부터 세번째까지]

# 메서드 (조사 활용)
숫자들에 10을_추가한다
숫자들을 정렬한다
숫자들을 역순으로_뒤집는다

F-LANG-008: 객체/딕셔너리 ​

우선순위: MEDIUM 상태: ✅ 구현 완료

ksj
학생 = {
    이름: "철수",
    나이: 15,
    점수: {
        수학: 90,
        영어: 85
    }
}

# 접근
출력(학생.이름)
출력(학생.점수.수학)

# 조사 활용
학생의 이름
학생의 점수의 수학

F-LANG-009: 에러 처리 ​

우선순위: HIGH 상태: ✅ 구현 완료

ksj
# 기본 에러 처리
시도 {
    결과 = 위험한_작업()
} 에러나면 {
    출력("에러 발생")
} 마지막에 {
    정리작업()
}

# 짧은 형태
결과 = 작업() 또는_에러시 기본값

# 명시적 에러
만약 (나이 < 0) {
    에러: "나이는 음수일 수 없습니다"
}

3. 표준 라이브러리 ​

F-STD-001: 입출력 ​

ksj
# 출력
출력("안녕하세요")
출력(변수1, 변수2, 변수3)

# 입력
이름 = 입력("이름을 입력하세요: ")
나이 = 정수(입력("나이: "))

F-STD-002: 수학 함수 ​

ksj
절대값(-5)        # 5
제곱근(16)        # 4
거듭제곱(2, 10)   # 1024
올림(3.2)         # 4
내림(3.8)         # 3
반올림(3.5)       # 4
최댓값(1, 5, 3)   # 5
최솟값(1, 5, 3)   # 1

F-STD-003: 문자열 함수 ​

ksj
# 길이
길이("안녕하세요")  # 5

# 변환
대문자("hello")     # "HELLO"
소문자("HELLO")     # "hello"

# 분리/합치기
분리("a,b,c", ",")  # ["a", "b", "c"]
합치기(["a", "b"], ",")  # "a,b"

# 검색
포함("안녕하세요", "하세")  # true
찾기("안녕하세요", "하세")  # 2
바꾸기("안녕하세요", "하세", "녕")  # "안녕녕요"

F-STD-004: 배열 함수 ​

ksj
배열 = [3, 1, 4, 1, 5, 9]

# 기본
길이(배열)         # 6
추가(배열, 2)      # [3, 1, 4, 1, 5, 9, 2]
제거(배열, 2)      # [3, 1, 1, 5, 9]
정렬(배열)         # [1, 1, 3, 4, 5, 9]
역순(배열)         # [9, 5, 1, 4, 1, 3]

# 고급 (조사 활용)
배열에서 (x -> x > 3) 필터
배열을 (x -> x * 2) 변환
배열의 (x -> x + 0) 합계

4. 개발 도구 ​

F-TOOL-001: REPL ​

bash
$ sejong

Sejong 1.0.0 - 세종 프로그래밍 언어
>>> 이름 = "철수"
>>> 출력(이름)
철수

>>> :변수목록
변수:
  이름 = "철수" (문자열)

>>> :도움말
[도움말 표시]

>>> :종료

F-TOOL-002: 파일 실행 ​

bash
sejong hello.sj
sejong run calculator.sj
sejong build app.sj -o app

F-TOOL-003: 에러 메시지 ​

ksj
# 코드
나이 = 15
이름 = "철수"
합 = 나이 + 이름

# 에러 메시지
오류: 정수와 문자열은 더할 수 없습니다.

위치: program.sj (3번째 줄)
   2 | 이름 = "철수"
   3 | 합 = 나이 + 이름
            ^^^   ^^^^
            정수  문자열

제안:
  1. 나이를 문자열로 변환: 나이를_문자열로() + 이름
  2. 이름을 정수로 변환: 나이 + 이름을_정수로()

도움말: https://sejong-lang.org/docs/type-error

5. 교육 기능 ​

F-EDU-001: 단계별 실행 ​

ksj
실행과정_보기 {
    합 = 0
    i가 1부터 5까지 반복한다 {
        합 = 합 + i
    }
}

# 출력:
# [1단계] 합 = 0
# [2단계] i = 1, 합 = 0 + 1 = 1
# [3단계] i = 2, 합 = 1 + 2 = 3
# [4단계] i = 3, 합 = 3 + 3 = 6
# [5단계] i = 4, 합 = 6 + 4 = 10
# [6단계] i = 5, 합 = 10 + 5 = 15

F-EDU-002: 대화형 학습 ​

ksj
# 튜토리얼 모드
sejong --tutorial

# 단계별 안내
# 예제 코드 실행
# 즉시 피드백

구현 상태 요약 ​

✅ Phase 1: 핵심 차별화 (완료!) ​

  1. ✅ 조사 기반 메서드 체인
  2. ✅ 자연스러운 범위 (1부터 10까지)
  3. ✅ 명확한 타입 (정수 나이)
  4. ✅ 직관적 반복문
  5. ✅ 기본 타입 및 연산
  6. ✅ 조건문/함수
  7. ✅ 표준 입출력

✅ Phase 2-7: 고급 기능 (완료!) ​

  1. ✅ 배열/객체
  2. ✅ Async/Await 비동기
  3. ✅ 에러 처리 (Try/Catch/Finally)
  4. ✅ 파일 I/O (stdlib/io.ksj)
  5. ✅ 명확한 에러 메시지
  6. ✅ 모듈 시스템
  7. ✅ 클래스 및 상속
  8. ✅ 패턴 매칭
  9. ✅ Bytecode VM (--vm, 평가기와 동치)
  10. ✅ 세대별 GC
  11. ✅ LSP, 디버거, VS Code 확장
  12. ksjpm 패키지 관리자 (2026-10 제거: 저장소·다운로드 없는 뼈대)
  13. ✅ Linter & Formatter

✅ Phase 8: 코드 품질 및 문서화 (완료!) ​

  1. ✅ Doxygen 설정
  2. ✅ USER_GUIDE.md
  3. ✅ regression_test.py
  4. ✅ 1,503개 테스트 (100% 통과)

📝 Phase 9 이후: 계획 중 ​

  1. [ ] 긴 함수 리팩토링
  2. [ ] Incremental GC
  3. [ ] 메모리 풀링 전략
  4. [ ] stdlib 완성 (http, db 추가 함수)
  5. [ ] 온라인 플레이그라운드 (WebAssembly)

현재 상태: v0.5.0, Phase 8 완료 저장소: https://github.com/kingsejong-lang/kingsejong-lang다음 단계: IMPLEMENTATION.md에서 Phase 9 계획 확인

MIT License