KingSejong 언어 기능 명세서
KingSejong Programming Language Feature Specification 파일 확장자:
.ksj
버전: v0.5.0 (Phase 8 완료) 최종 수정: 2025-11-21 저장소: https://github.com/kingsejong-lang/kingsejong-lang상태 기호: ✅ 구현 완료 | 🚧 구현 중 | 📝 계획됨
목차
1. 핵심 차별화 기능 (✅ 모두 구현 완료)
F-CORE-001: 조사 기반 메서드 체인 ✅
우선순위: CRITICAL 상태: ✅ 구현 완료 설명: 한글의 교착어 특성을 활용한 자연스러운 메서드 체인
문법
객체를 메서드한다
객체의 속성
객체로 변환한다
객체에서 필터한다예제
# 기본 사용
배열을 정렬한다
문자열을 대문자로_바꾼다
숫자들에서 짝수만_걸러낸다
# 체인
사용자의 이름을 대문자로_바꾸고 공백으로_나눈다
배열을 정렬하고 역순으로_뒤집는다
# 실제 구현
학생들 = [
{이름: "철수", 점수: 85},
{이름: "영희", 점수: 92}
]
우수학생 = 학생들에서 (학생 -> 학생.점수 >= 90) 필터하고
(학생 -> 학생.이름) 추출한다구현 방법
- Lexer에 조사 토큰 추가 (
JOSA_EUL,JOSA_RO,JOSA_UI) - Parser에 조사 체인 파싱 로직
- Evaluator에 조사별 의미 해석
지원 조사
| 조사 | 의미 | 예시 |
|---|---|---|
을/를 | 목적어 | 배열을 정렬한다 |
의 | 소유격 | 사용자의 이름 |
로 | 수단/방법 | 문자열로 변환한다 |
에서 | 출처/선택 | 배열에서 걸러낸다 |
에 | 위치/대상 | 리스트에 추가한다 |
F-CORE-002: 자연스러운 범위 표현 ✅
우선순위: CRITICAL 상태: ✅ 구현 완료 설명: 수학적 표기와 일치하는 직관적 범위 (RangeExpression AST 노드 구현)
문법
시작부터 끝까지 # 끝 포함
시작부터 끝미만 # 끝 미포함
시작초과 끝이하 # 시작 미포함, 끝 포함예제
# 기본 범위
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)
| Sejong | Python | 결과 |
|---|---|---|
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 노드로 구현된 비동기 처리
문법
동작을 한다 # 동기 실행
동작을 할것이다 # 비동기 실행 (Promise)
동작할때까지_기다린다 # await예제
# 동기 함수
함수 파일읽기(경로) {
반환 파일시스템.읽기(경로)
}
# 비동기 함수 (자동으로 Promise)
함수 파일읽기_비동기(경로) {
데이터 = 파일시스템.읽기를_할것이다(경로)
반환 데이터
}
# await 사용
함수 사용자정보_가져오기(아이디) {
사용자 = API호출("/사용자/" + 아이디)를_할때까지_기다린다
게시물 = API호출("/게시물/" + 사용자.id)를_할때까지_기다린다
반환 {사용자, 게시물}
}
# 간결한 형태
함수 데이터처리() {
응답 = 서버에서_데이터를_받을때까지_기다린다
결과 = 응답을_가공할때까지_기다린다
반환 결과
}비교 (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 상태: ✅ 구현 완료 설명: 자연어 기반 타입 선언 (정수, 실수, 문자열, 참거짓, 없음)
문법
타입 변수명 = 값
변수명: 타입 = 값기본 타입
정수 나이 = 15
실수 키 = 175.5
문자열 이름 = "철수"
참거짓 성인여부 = false
없음 값 = 없음복합 타입
# 배열
정수배열 점수들 = [85, 90, 78, 92]
문자열배열 이름들 = ["철수", "영희", "민수"]
# 객체
학생 = {
이름: "철수",
나이: 15,
점수: 85
}
# Optional 타입
함수 찾기(이름: 문자열) -> 사용자 또는 없음 {
# ...
}타입 검사 및 변환
나이 = 15
이름 = "철수"
# 타입 검사
타입(나이) # "정수"
타입(이름) # "문자열"
# 타입 변환
나이문자 = 나이를_문자열로()
나이실수 = 나이를_실수로()
# 에러 (타입 불일치)
합 = 나이 + 이름 # 에러: 정수와 문자열은 더할 수 없습니다
합 = 나이를_문자열로() + 이름 # OK: "15철수"F-CORE-005: 단일 "없음" 개념 ✅
우선순위: HIGH 상태: ✅ 구현 완료 설명: null/undefined/None 혼란 제거 (단일 없음 키워드)
문법
값 = 없음
만약 (값이 없으면) { ... }
만약 (값이 있으면) { ... }
결과 = 값 또는 기본값예제
# 기본 사용
결과 = 없음
만약 (결과가 없으면) {
출력("결과 없음")
}
# 기본값 제공
사용자명 = 입력값 또는 "익명"
점수 = 사용자.점수 또는 0
# 함수에서 없음 반환
함수 검색(이름) -> 사용자 또는 없음 {
# 찾으면 사용자 반환
# 못 찾으면 없음 반환
}
# 사용
사용자 = 검색("철수")
만약 (사용자가 있으면) {
출력(사용자.이름)
} 아니면 {
출력("사용자를 찾을 수 없습니다")
}F-CORE-006: 직관적 반복문 ✅
우선순위: HIGH 상태: ✅ 구현 완료 설명: 자연어 수준의 반복 표현 (10번 반복, i가 1부터 10까지, 각각에 대해)
문법
횟수번 반복한다 { }
변수가 시작부터 끝까지 반복한다 { }
컬렉션 각각에 대해 변수로 { }
계속 (조건) { }예제
# 1. 횟수 반복
10번 반복한다 {
출력("안녕")
}
# 2. 범위 반복
i가 1부터 10까지 반복한다 {
출력(i)
}
# 3. 컬렉션 반복
이름들 = ["철수", "영희", "민수"]
이름들 각각에 대해 이름으로 {
출력(이름)
}
# 4. 조건 반복
계속 (입력 != "종료") {
입력 = 입력받기("명령: ")
처리하기(입력)
}
# 5. 무한 반복
계속 {
# 작업
만약 (종료조건) {
중단
}
}반복 제어
i가 1부터 100까지 반복한다 {
만약 (i == 50) {
중단 # break
}
만약 (i % 2 == 0) {
계속 # continue
}
출력(i)
}2. 기본 언어 기능
F-LANG-001: 변수 선언 및 할당
우선순위: CRITICAL 상태: ✅ 구현 완료
# 타입 추론
이름 = "철수"
나이 = 15
# 명시적 타입
정수 점수 = 85
문자열 주소 = "서울"F-LANG-002: 산술 연산
우선순위: CRITICAL 상태: ✅ 구현 완료
합 = 5 + 3
차 = 10 - 4
곱 = 6 * 7
몫 = 20 / 4
나머지 = 17 % 5
제곱 = 2 ^ 8 # 또는 2 ** 8F-LANG-003: 비교 연산
우선순위: CRITICAL 상태: ✅ 구현 완료
# 기호 사용
만약 (나이 >= 18) { }
만약 (점수 == 100) { }
# 자연어 사용 (추가)
만약 (나이가 18이상) { }
만약 (점수가 100과_같음) { }
만약 (값이 10초과) { }
만약 (값이 5이하) { }F-LANG-004: 논리 연산
우선순위: HIGH 상태: ✅ 구현 완료
# 기호
만약 (나이 >= 18 && 학생 == true) { }
만약 (비번 == "1234" || 지문인증 == true) { }
만약 (!(로그인됨)) { }
# 한글 (추가)
만약 (나이 >= 18 그리고 학생) { }
만약 (비번 == "1234" 또는 지문인증) { }
만약 (로그인안됨) { }F-LANG-005: 조건문
우선순위: CRITICAL 상태: ✅ 구현 완료
만약 (조건) {
# 실행
} 아니면_만약 (다른조건) {
# 실행
} 아니면 {
# 실행
}
# 짧은 형태
결과 = 만약 (조건) 참값 아니면 거짓값F-LANG-006: 함수
우선순위: CRITICAL 상태: ✅ 구현 완료
# 기본 함수
함수 인사하기(이름) {
출력("안녕, " + 이름)
}
# 반환값
함수 더하기(a, b) {
반환 a + b
}
# 타입 지정
함수 곱하기(a: 정수, b: 정수) -> 정수 {
반환 a * b
}
# 기본 매개변수
함수 인사(이름 = "손님") {
출력("안녕, " + 이름)
}
# 가변 인자
함수 합계(...숫자들) {
총합 = 0
숫자들 각각에 대해 숫자로 {
총합 = 총합 + 숫자
}
반환 총합
}F-LANG-007: 배열
우선순위: HIGH 상태: ✅ 구현 완료
# 생성
숫자들 = [1, 2, 3, 4, 5]
이름들 = ["철수", "영희", "민수"]
# 인덱싱
첫번째 = 숫자들[0]
마지막 = 숫자들[-1]
# 슬라이싱
일부 = 숫자들[0부터 3까지]
일부 = 숫자들[첫번째부터 세번째까지]
# 메서드 (조사 활용)
숫자들에 10을_추가한다
숫자들을 정렬한다
숫자들을 역순으로_뒤집는다F-LANG-008: 객체/딕셔너리
우선순위: MEDIUM 상태: ✅ 구현 완료
학생 = {
이름: "철수",
나이: 15,
점수: {
수학: 90,
영어: 85
}
}
# 접근
출력(학생.이름)
출력(학생.점수.수학)
# 조사 활용
학생의 이름
학생의 점수의 수학F-LANG-009: 에러 처리
우선순위: HIGH 상태: ✅ 구현 완료
# 기본 에러 처리
시도 {
결과 = 위험한_작업()
} 에러나면 {
출력("에러 발생")
} 마지막에 {
정리작업()
}
# 짧은 형태
결과 = 작업() 또는_에러시 기본값
# 명시적 에러
만약 (나이 < 0) {
에러: "나이는 음수일 수 없습니다"
}3. 표준 라이브러리
F-STD-001: 입출력
# 출력
출력("안녕하세요")
출력(변수1, 변수2, 변수3)
# 입력
이름 = 입력("이름을 입력하세요: ")
나이 = 정수(입력("나이: "))F-STD-002: 수학 함수
절대값(-5) # 5
제곱근(16) # 4
거듭제곱(2, 10) # 1024
올림(3.2) # 4
내림(3.8) # 3
반올림(3.5) # 4
최댓값(1, 5, 3) # 5
최솟값(1, 5, 3) # 1F-STD-003: 문자열 함수
# 길이
길이("안녕하세요") # 5
# 변환
대문자("hello") # "HELLO"
소문자("HELLO") # "hello"
# 분리/합치기
분리("a,b,c", ",") # ["a", "b", "c"]
합치기(["a", "b"], ",") # "a,b"
# 검색
포함("안녕하세요", "하세") # true
찾기("안녕하세요", "하세") # 2
바꾸기("안녕하세요", "하세", "녕") # "안녕녕요"F-STD-004: 배열 함수
배열 = [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
$ sejong
Sejong 1.0.0 - 세종 프로그래밍 언어
>>> 이름 = "철수"
>>> 출력(이름)
철수
>>> :변수목록
변수:
이름 = "철수" (문자열)
>>> :도움말
[도움말 표시]
>>> :종료F-TOOL-002: 파일 실행
sejong hello.sj
sejong run calculator.sj
sejong build app.sj -o appF-TOOL-003: 에러 메시지
# 코드
나이 = 15
이름 = "철수"
합 = 나이 + 이름
# 에러 메시지
오류: 정수와 문자열은 더할 수 없습니다.
위치: program.sj (3번째 줄)
2 | 이름 = "철수"
3 | 합 = 나이 + 이름
^^^ ^^^^
정수 문자열
제안:
1. 나이를 문자열로 변환: 나이를_문자열로() + 이름
2. 이름을 정수로 변환: 나이 + 이름을_정수로()
도움말: https://sejong-lang.org/docs/type-error5. 교육 기능
F-EDU-001: 단계별 실행
실행과정_보기 {
합 = 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 = 15F-EDU-002: 대화형 학습
# 튜토리얼 모드
sejong --tutorial
# 단계별 안내
# 예제 코드 실행
# 즉시 피드백구현 상태 요약
✅ Phase 1: 핵심 차별화 (완료!)
- ✅ 조사 기반 메서드 체인
- ✅ 자연스러운 범위 (
1부터 10까지) - ✅ 명확한 타입 (
정수 나이) - ✅ 직관적 반복문
- ✅ 기본 타입 및 연산
- ✅ 조건문/함수
- ✅ 표준 입출력
✅ Phase 2-7: 고급 기능 (완료!)
- ✅ 배열/객체
- ✅ Async/Await 비동기
- ✅ 에러 처리 (Try/Catch/Finally)
- ✅ 파일 I/O (stdlib/io.ksj)
- ✅ 명확한 에러 메시지
- ✅ 모듈 시스템
- ✅ 클래스 및 상속
- ✅ 패턴 매칭
- ✅ Bytecode VM (
--vm, 평가기와 동치) - ✅ 세대별 GC
- ✅ LSP, 디버거, VS Code 확장
ksjpm 패키지 관리자(2026-10 제거: 저장소·다운로드 없는 뼈대)- ✅ Linter & Formatter
✅ Phase 8: 코드 품질 및 문서화 (완료!)
- ✅ Doxygen 설정
- ✅ USER_GUIDE.md
- ✅ regression_test.py
- ✅ 1,503개 테스트 (100% 통과)
📝 Phase 9 이후: 계획 중
- [ ] 긴 함수 리팩토링
- [ ] Incremental GC
- [ ] 메모리 풀링 전략
- [ ] stdlib 완성 (http, db 추가 함수)
- [ ] 온라인 플레이그라운드 (WebAssembly)
현재 상태: v0.5.0, Phase 8 완료 저장소: https://github.com/kingsejong-lang/kingsejong-lang다음 단계: IMPLEMENTATION.md에서 Phase 9 계획 확인