한선씨 HanSeon-C
한글·숫자·띄어쓰기만으로 모든 것을 표현하는 프로그래밍 언어.
자연어 입력에서 4상균형3진 벡터 실행까지 6단계 파이프라인으로 완성됩니다.
핵심 특징
4상균형3진법
T·O·A·U 4상 + 균형3진수. 90+ 연산 트릿 네이티브. 나눗셈=자연반올림.
한글 네이티브
변수·함수·만약·동안 — 한글 키워드 129+개. 번역 없이 실행.
배터리 포함
225 내장함수 · 24 표준 라이브러리. 문자열·수학·네트워크·FPGA까지.
즉시 번역
Python·JS·C·Rust·Verilog·VHDL ↔ 한선씨 양방향.
Hello World
; hello.한선 — 고수준 모드
변수 이름 = "세계"
함수 인사(대상) {
반환 "안녕, " + 대상 + "!"
}
출력값(인사(이름))
3진법 논리 (Kleene)
| 값 | 상(Phase) | 의미 | 한선씨 키워드 |
|---|---|---|---|
+1 | T | 참 / 데이터 | 참 |
0 | O | 모름 / 명령 | 모르면 |
-1 | A | 거짓 / 체이닝 | 거짓 |
— | U | 구분자 / 경계 | — |
나눗셈 규칙: 한선씨의 정수 나눗셈은 자연반올림(|r| ≤ |b|/2)입니다. 버림(truncation)이 아닙니다.
6단계 파이프라인
자연어 입력이 4상균형3진 벡터 실행까지 변환되는 컴파일 파이프라인.
자연어 입력
한국어 텍스트를 형태소 분석 후 의도(Intent)를 추출합니다. 동사·명사·조사를 구분하여 실행 의도를 파악합니다.
KPS 구문
문제(K)→해법(P)→상태(S) 3-tuple로 구조화합니다. 6561 verse 세계관의 의미 단위로 매핑합니다.
한선씨 IR
35가지 노드 타입과 14가지 기본 타입으로 구성된 중간 표현(AST)으로 변환합니다.
한선씨 RPN
역폴란드 표기법(후위). 한글·숫자·띄어쓰기만 허용. ISA729 opcode와 1:1 대응합니다.
크라우니어
한글 1글자 = 6 트릿 인코딩. 초성→섹터, 중성→그룹, 종성→명령으로 ISA729에 매핑됩니다.
벡터4상3진 실행
27 트릿 = 1 큐브 = 기본 실행 단위. TOAU 4상 균형 3진 VM에서 네이티브 실행됩니다.
IR 노드 타입 (35종)
| 분류 | 노드 타입 |
|---|---|
| 리터럴 | INT_LIT FLOAT_LIT STR_LIT BOOL_LIT NULL_LIT |
| 식별자 | VAR_DECL VAR_REF ASSIGN |
| 연산 | BINOP UNOP COMPARE LOGIC |
| 함수 | FUNC_DEF FUNC_CALL RETURN CLOSURE |
| 제어 | IF ELIF ELSE WHILE BREAK CONTINUE |
| 컬렉션 | ARRAY_LIT MAP_LIT INDEX SLICE |
| 구조체 | STRUCT_DEF STRUCT_NEW FIELD_ACCESS |
| 예외 | TRY CATCH THROW |
| 모듈 | IMPORT EXPORT PROGRAM |
| 3진 | TRIT_OP CUBE_OP |
IR 기본 타입 (14종)
정수실수문자열논리모름
배열맵셀함수구조체
트릿큐브버퍼없음
고수준 한선씨 문법
hanseonc_high가 컴파일하는 C-like 구문. 모든 키워드는 한글입니다.
변수 선언
변수 정수값 = 42
변수 실수값 = 3.14
변수 문자열값 = "크라우니"
변수 참거짓 = 참 ; 참=+1, 거짓=-1, 모르면=0
변수 배열값 = [1, 2, 3, 4, 5]
변수 맵값 = 맵생성()
함수
함수 더하기(a, b) {
반환 a + b
}
; 재귀
함수 팩토리얼(n) {
만약 (n <= 1) { 반환 1 }
반환 n * 팩토리얼(n - 1)
}
출력값(문자열변환(더하기(3, 7))) ; 10
출력값(문자열변환(팩토리얼(10))) ; 3628800
조건문
만약 (점수 >= 90) {
출력값("A")
} 혹시 (점수 >= 80) {
출력값("B")
} 혹시 (점수 >= 70) {
출력값("C")
} 아니면 {
출력값("F")
}
반복문
; while
변수 i = 0
동안 (i < 10) {
출력값(문자열변환(i))
i = i + 1
}
; 배열 순회
변수 목록 = ["사과", "배", "포도"]
변수 j = 0
동안 (j < 길이(목록)) {
출력값(목록[j])
j = j + 1
}
배열
변수 arr = [10, 20, 30]
arr = 추가(arr, 40) ; 끝에 추가 (재대입 필수)
arr = 설정(arr, 0, 99) ; 인덱스 0 → 99
arr = 정렬(arr) ; 오름차순
출력값(문자열변환(길이(arr))) ; 4
주의: 추가·설정·맵넣어는 새 값을 반환합니다. 반드시 재대입하세요. arr = 추가(arr, 값)
맵 (해시맵)
변수 m = 맵생성()
m = 맵넣어(m, "이름", "크라우니")
m = 맵넣어(m, "버전", 10)
출력값(맵꺼내(m, "이름")) ; 크라우니
변수 키들 = 맵키목록(m)
예외 처리
시도 {
변수 결과 = 위험한작업()
출력값(결과)
} 잡아 (오류) {
출력값("오류: " + 오류)
}
구조체
구조체 사람 {
이름
나이
직업
}
변수 홍길동 = 사람새("홍길동", 30, "개발자")
출력값(홍길동.이름)
출력값(문자열변환(홍길동.나이))
가져오기 (import)
가져오기 "문자열.한선"
가져오기 "JSON.한선"
가져오기 "네트워크.한선"
가져오기 "셀코어" ; CROWNY_STD 경로 자동 검색
논리 연산자
| 한선씨 | 의미 | 예제 |
|---|---|---|
그리고 | AND (&&) | 참 그리고 참 → 참 |
또는 | OR (||) | 거짓 또는 참 → 참 |
아닌 | NOT (!) | 아닌 참 → 거짓 |
모르면 | 모름=0 | 모르면 → 0 (Kleene 3값) |
RPN 문법 (역폴란드)
한선씨의 저수준 표현. 스택 기반, 후위표기법. 한글·숫자·띄어쓰기만 사용합니다.
RPN = ISA729 1:1 대응. 2026-04-08 확정. C-like 고수준 문법은 편의 레이어이며, 진짜 한선씨의 본질은 이 RPN입니다.
기본 규칙
- 연산자는 피연산자 뒤에 옴 (후위)
- 공백이 토큰 구분자
- 숫자·한글 키워드만 — 특수문자 없음
- 주석:
;뒤 단어 하나만 (다중 단어 주석 = 컴파일 오류)
예제
; 덧셈
3 7 더해 보여줘 끝
; 조건 분기
10 5 크냐 이면 큰수 아니면 작은수 끝
; 반복
0 i 저장해
다시 i 10 작냐 이면 i 보여줘 i 1 더해 i 저장해 돌아가 끝
; 함수 정의
곱하기 함수야 불러서 ;a ;b
가져와 가져와 곱해
끝
주요 RPN 키워드 (129+)
| 분류 | 키워드 |
|---|---|
| 산술 | 더해 빼 곱해 나눠 나머지 거듭제곱해 |
| 비교 | 같냐 다르냐 크냐 작냐 크거나같냐 작거나같냐 |
| 논리 | 그리고해 또는해 부정해 |
| 스택 | 저장해 가져와 복사해 버려 바꿔 |
| 제어 | 이면 아니면 다시 돌아가 끝내 끝 |
| I/O | 보여줘 받아 줄바꿔 |
| 함수 | 함수야 불러서 반환해 |
| 문자열 | 연결해 글자수해 부분가져와 |
| 배열 | 배열만들어 넣어 꺼내 길이가져와 |
| 3진 | 삼진인코딩해 삼진디코딩해 트릿해 |
스택 동작 예시
; 3 + 7 * 2 = 17 (후위: 3 7 2 곱해 더해)
3 7 2 곱해 더해 보여줘 끝
; 스택: [3] → [3,7] → [3,7,2] → [3,14] → [17] → 출력
FPGA 회로방언
Verilog/VHDL을 한글로 기술하는 회로 방언. 가져오기 "하드웨어.한선" 으로 RPi5·GPIO까지 확장.
키워드 대응표
| 한선씨 | Verilog 대응 | 설명 |
|---|---|---|
회로 | module | 회로 블록 시작 |
끝회로 | endmodule | 회로 블록 끝 |
입력 | input | 입력 포트 선언 |
출력 | output | 출력 포트 선언 |
신호 | wire | 와이어 선언 |
레지스터 | reg | 레지스터 선언 |
@상승 | posedge | 클럭 상승 엣지 |
@하강 | negedge | 클럭 하강 엣지 |
@조합 | always @(*) | 조합 논리 블록 |
항상 | always | always 블록 |
초기화 | initial | initial 블록 |
비트폭 | [n:0] | 비트 폭 지정 |
예제 — 4비트 카운터
회로 카운터4비트 (
입력 클럭
입력 초기화신호
출력 레지스터 [비트폭 4] 카운트
)
항상 @상승(클럭 또는 @상승(초기화신호)) {
만약 (초기화신호 == 1) {
카운트 = 0
} 아니면 {
카운트 = 카운트 + 1
}
}
끝회로
예제 — 3진 ALU (27트릿)
회로 삼진ALU (
입력 [비트폭 27] 피연산자가
입력 [비트폭 27] 피연산자나
입력 [비트폭 6] 연산코드
출력 레지스터 [비트폭 27] 결과
출력 레지스터 오버플로우
)
항상 @조합 {
만약 (연산코드 == 0) { 결과 = 피연산자가 + 피연산자나 }
혹시 (연산코드 == 1) { 결과 = 피연산자가 - 피연산자나 }
혹시 (연산코드 == 2) { 결과 = 피연산자가 * 피연산자나 }
아니면 { 결과 = 0 }
}
끝회로
내장함수 225개
가져오기 없이 즉시 사용 가능한 함수들. 분류별 목록.
I/O
문자열
수학
배열
맵 (해시맵)
네트워크 (TCP)
3진 / 트릿
바이트버퍼
셀 (Cell)
시스템 / 보안
주요 함수 레퍼런스
| 함수 | 인자 | 반환 | 예제 |
|---|---|---|---|
글자수(s) | 문자열 | 정수 | 글자수("안녕") → 2 |
부분(s,시작,끝) | 문자열,정수,정수 | 문자열 | 부분("한선씨",0,2) → "한선" |
포함(s,검색) | 문자열,문자열 | +1 또는 -1 | 포함("크라우니","라") → 1 |
거듭제곱(밑,지수) | 숫자,숫자 | 숫자 | 거듭제곱(2,10) → 1024 |
무작위(최소,최대) | 정수,정수 | 정수 | 무작위(1,6) → 1~6 |
삼진인코딩(n) | 정수 | 문자열 | 삼진인코딩(42) → "TTAO" |
표준 라이브러리 24개
가져오기 "이름.한선"으로 불러옵니다. CROWNY_STD 환경변수로 경로 자동 설정.
가져오기 "문자열.한선"
가져오기 "JSON.한선"
가져오기 "네트워크.한선"
가져오기 "셀코어" ; .한선 없이도 동작
| # | 라이브러리 | 용도 | 주요 기능 |
|---|---|---|---|
| 1 | 문자열 | 문자열 처리 고급 | 정규식, 템플릿, 인코딩 |
| 2 | JSON | JSON 파싱/직렬화 | JSON파싱, JSON변환 |
| 3 | YAML | YAML 파싱 | YAML파싱, YAML변환 |
| 4 | 네트워크 | HTTP/TCP 클라이언트 | HTTP요청, GET, POST |
| 5 | 라우터 | URL 라우팅 | 경로등록, 매개변수추출 |
| 6 | 미들웨어 | 요청 처리 체인 | 미들웨어등록, 다음 |
| 7 | 인증 | JWT · 세션 | 토큰생성, 토큰검증 |
| 8 | 로깅 | 로그 관리 | 정보로그, 오류로그, 경고로그 |
| 9 | 검증 | 입력 유효성 | 필수확인, 형식확인, 범위확인 |
| 10 | 템플릿 | HTML 템플릿 | 템플릿렌더, 변수치환 |
| 11 | 설정 | 설정 파일 (YAML/JSON) | 설정읽기, 설정쓰기 |
| 12 | 환경 | 환경변수 | 환경읽기, 환경설정 |
| 13 | 날짜 | 날짜/시간 처리 | 현재날짜, 날짜형식, 차이계산 |
| 14 | 타이머 | 타이머 · 스케줄링 | 지연실행, 반복실행, 취소 |
| 15 | 프로세스 | 프로세스 관리 | 실행, 종료, 환경변수 |
| 16 | 바이트버퍼 | 바이너리 데이터 | 버퍼생성, 읽기, 쓰기 |
| 17 | TLS | 암호화 통신 | TLS연결, 인증서, 암호화 |
| 18 | 큐 | 메시지 큐 | 큐생성, 넣기, 꺼내기 |
| 19 | 셀저장소 | 셀 기반 키-값 DB | 저장, 조회, 삭제, 트랜잭션 |
| 20 | 네이티브 | OS 네이티브 API | 시스템호출, DLL로드 |
| 21 | 뷰 | GUI 뷰 | 창생성, 버튼, 입력창 |
| 22 | 셀DB | 셀 데이터베이스 | 테이블, 쿼리, 인덱스 |
| 23 | 스타일 | UI 스타일링 | 색상, 폰트, 레이아웃 |
| 24 | 하드웨어 | 하드웨어 제어 | GPIO, PWM, I2C, SPI, UART |
셀코어 (규칙기반 에이전트 프레임워크)
셀코어는 15모듈 팔란티어 대응 프레임워크(1414줄). 가져오기 "셀코어"로 어디서든 사용 가능. 규칙저장소: ~/Downloads/CrownyTVM/std/규칙저장소.dat
가져오기 "셀코어"
; 룰 생성
변수 룰 = 룰생성("온도경보", 10)
룰 = 룰조건추가(룰, "온도", ">=", 80)
룰 = 룰변경추가(룰, "상태", "경보")
룰저장(룰저장소, 룰)
; 추론 실행
변수 결과 = 추론실행(룰저장소, 입력데이터)
크라우니어 인코딩
한글 1글자 = 6 트릿. 초성→섹터, 중성→그룹, 종성→명령으로 ISA729 opcode에 매핑됩니다.
인코딩 구조
TOAU 4상 색상 체계
| 상 | 색상 코드 | 트릿 값 | 역할 |
|---|---|---|---|
| T T-상 | #00d4aa |
+1 | 데이터 / 참 / 트릿+1 |
| O O-상 | #0088ff |
0 | 명령 / 모름 / 트릿0 |
| A A-상 | #ff6b35 |
-1 | 체이닝 / 거짓 / 트릿-1 |
| U U-상 | #8b5cf6 |
— | 구분자 / 큐브 경계 |
큐브 구조 (27 트릿 = 3×3×3)
컴파일 변환 예시
; 소스 (고수준)
변수 x = 10
출력값(x)
; Stage 4 — RPN
10 x 저장해 x 가져와 보여줘 끝
; Stage 5 — 크라우니어 (한글 opcode)
저 열 저장 가져 보여줘
; Stage 6 — TOAU 스트림
TOATTOA U TOAT U TOAOTO U ...
ISA729 명령어 세트
729 = 9 × 9 × 9 = 36. 9 섹터 × 9 그룹 × 9 명령. 현재 489개 opcode 구현 완료.
9 섹터 구조
| 섹터 | opcode 범위 | 용도 | 구현 |
|---|---|---|---|
섹터 0 |
0 – 80 | 시스템 / 제어 / 분기 | 72 |
섹터 1 |
81 – 161 | 산술 / 논리 / 비교 | 81 |
섹터 2 |
162 – 242 | 메모리 / 스택 / 변수 | 75 |
섹터 3 |
243 – 323 | 문자열 / 배열 / 맵 | 72 |
섹터 4 |
324 – 404 | I/O / 파일 / 출력 | 63 |
섹터 5 |
405 – 485 | 네트워크 / 소켓 / TCP | 54 |
섹터 6 |
486 – 566 | 3진 / 셀 / 트릿 연산 | 45 |
섹터 7 |
567 – 647 | 확장 / FPGA / 하드웨어 | 27 |
섹터 8 |
648 – 728 | 예약 (미래 확장) | 0 |
주요 opcode 테이블
| opcode | RPN 키워드 | 고수준 | 설명 |
|---|---|---|---|
0 | 끝 | — | 프로그램 종료 |
1 | 이면 | 만약 | 조건 분기 |
2 | 아니면 | 아니면 | else 분기 |
10 | 함수야 | 함수 | 함수 정의 |
81 | 더해 | + | 정수 덧셈 (자연반올림) |
82 | 빼 | - | 정수 뺄셈 |
83 | 곱해 | * | 정수 곱셈 |
84 | 나눠 | / | 정수 나눗셈 (자연반올림) |
85 | 나머지 | % | 나머지 연산 |
90 | 같냐 | == | 동등 비교 |
91 | 다르냐 | != | 불일치 비교 |
92 | 크냐 | > | 크기 비교 |
162 | 저장해 | 변수 = | 변수 저장 |
163 | 가져와 | 변수 참조 | 변수 로드 |
307 | 보여줘 | 출력값 | 값 출력 |
486 | 삼진인코딩해 | 삼진인코딩 | 균형 3진 인코딩 |
인코딩 공식
; opcode 계산
opcode = 섹터 × 81 + 그룹 × 9 + 명령
; 역산
섹터 = opcode ÷ 81 (몫)
그룹 = (opcode % 81) ÷ 9 (몫)
명령 = opcode % 9 (나머지)
다국어 코드 변환
Python·JS·C·Rust·Verilog·VHDL ↔ 한선씨 즉시 변환. 번역 도구 바로가기
Python → 한선씨
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(10))
함수 팩토리얼(n) {
만약 (n <= 1) { 반환 1 }
반환 n * 팩토리얼(n - 1)
}
출력값(문자열변환(팩토리얼(10)))
JavaScript → 한선씨
const nums = [3, 1, 4, 1, 5, 9];
const sorted = [...nums].sort(
(a, b) => a - b
);
console.log(sorted.join(', '));
변수 숫자들 = [3, 1, 4, 1, 5, 9]
변수 정렬됨 = 정렬(숫자들)
출력값(합치기(정렬됨, ", "))
C → 한선씨
int fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n-1)
+ fibonacci(n-2);
}
함수 피보나치(n) {
만약 (n <= 1) { 반환 n }
반환 피보나치(n - 1)
+ 피보나치(n - 2)
}
Verilog → 한선씨 FPGA
module adder(
input [7:0] a, b,
output [7:0] sum
);
assign sum = a + b;
endmodule
회로 더하기회로 (
입력 [비트폭 8] 가
입력 [비트폭 8] 나
출력 [비트폭 8] 합
)
신호 합 = 가 + 나
끝회로
빌드 & 실행
macOS · Linux · RPi5 · Windows 멀티플랫폼 지원.
컴파일러 빌드
cd /Users/ef/CrownyOS/crownyc
# VM
cc -O2 -o crownyc crownyc.c
# 고수준 컴파일러
cc -O2 -o hanseonc_high hanseonc_high.c
고수준 실행 (기본 — 추천)
# 컴파일 + 실행
./hanseonc_high program.한선 > program.toau
./crownyc run program.toau
RPN 실행 (저수준)
echo '3 7 더해 보여줘 끝' | \
./crownyc run hanseonc_std.toau > /tmp/t.toau
./crownyc run /tmp/t.toau
WASM (브라우저)
./hanseonc_high gui.한선 > /tmp/gui.toau
./crowny-wasm /tmp/gui.toau crowny.wasm
서버 7종 실행
# 웹서버
./hanseonc_high 웹서버v2.한선 > /tmp/ws.toau
./crownyc run /tmp/ws.toau
# 블록체인 노드
./hanseonc_high 블록체인.한선 > /tmp/bc.toau
./crownyc run /tmp/bc.toau
플랫폼별 빌드 플래그
| 플랫폼 | 빌드 플래그 |
|---|---|
| macOS (Cocoa GUI) | -DCROWNY_WINDOW -framework Cocoa -lpthread |
| Linux (X11) | -DCROWNY_X11 -lX11 -lpthread |
| RPi5 | -DCROWNY_RPI5 -march=armv8-a+crc |
| Windows (Win32) | -DCROWNY_WIN32 -luser32 -lgdi32 |
| WASM | emcc -o crowny.wasm crownyc.c |
환경변수
| 변수 | 설명 | 기본값 |
|---|---|---|
CROWNY_STD | 표준 라이브러리 경로 | ~/Downloads/CrownyTVM/std/ |
CROWNY_DEBUG | 디버그 출력 활성화 | 0 |
CROWNY_TRACE | 실행 추적 | 0 |
API 레퍼런스
hansunc.crowny.org (포트 9763) 서버 API — Express 기반.
{ "code": "출력값(\"안녕\")", "mode": "high" }mode:
high (기본, hanseonc_high) · rpn (저수준 RPN)Response:
{ "success": true, "output": "안녕", "toau": "TOATTOA U..." }
{ "code": "...", "stage": 3 } — stage: 1~6Response: 해당 stage의 중간 표현 JSON
{ "text": "1부터 10까지 더해서 출력해줘" }Response:
{ "hanseon": "변수 합 = 0\n...", "intent": "반복합산" }
{ "code": "회로 ... 끝회로", "target": "verilog" }target:
verilog · vhdl
{ "code": "...", "from": "python", "to": "hanseon" }from/to:
hanseon · python · javascript · c · rust · verilog · vhdl
{ "ok": true, "port": 9763 }에러 응답 형식
{
"success": false,
"error": "컴파일 오류: 14번 줄 — 미정의 변수 'x'",
"line": 14,
"stage": 3
}