한선씨 브라우저 실행 v1.0 — 크롬/사파리/웨일 통용
개요
크롬·사파리·웨일 등 모든 일반 브라우저에서 한선씨 코드가 직접 실행되는 시스템 구축 완료.
<script type="text/한선"> 태그 안에 한선씨를 그대로 쓰면 자동으로 JS로 변환되어 실행된다.
검증 결과 (헤드리스 크롬)
=== 한선씨 v1.0 브라우저 실행 시작 ===
런타임 함수: 109개
트랜스파일러: v1.0
=== 산술 데모 ===
피보(0) = 0 … 피보(9) = 34
=== 맵 데모 ===
이름: 크라우니
버전: 5.0
함수: 203개
피보나치/맵/이벤트핸들러/다크모드 모두 정상 동작.
아키텍처
┌─────────────────────────────────────────────┐
│ HTML 파일 │
│ ├ <script src="한선_트랜스파일러.js"> │ ★ 5KB
│ ├ <script src="한선_런타임.js"> │ ★ 19KB
│ ├ <script src="한선_로더.js"> │ ★ 2KB
│ └ <script type="text/한선"> │
│ 변수 x = 10 │
│ 함수 인사() { 출력값("안녕") } │
│ ... │
│ </script> │
└─────────────────────────────────────────────┘
↓ DOMContentLoaded
┌─────────────────────────────────────────────┐
│ 한선_로더.js (MutationObserver 활성) │
│ → text/한선 스크립트 수집 │
│ → 한선_트랜스파일러(소스) 호출 → JS 코드 │
│ → eval(JS) 전역 스코프 실행 │
└─────────────────────────────────────────────┘
↓ JS 실행 (런타임 함수 호출)
┌─────────────────────────────────────────────┐
│ 한선_런타임.js (globalThis에 109개 함수) │
│ ├ 출력값, 입력 │
│ ├ 글자수/부분/포함 (UTF-8 정확) │
│ ├ 맵생성/맵넣어/맵꺼내 │
│ ├ 절댓값/반올림/거듭제곱/루트/사인 │
│ ├ 문서찾기/이벤트듣기/요소만들기 (실DOM) │
│ └ 로컬저장/JSON생성/가져오기HTTP │
└─────────────────────────────────────────────┘
↓ 캐싱
┌─────────────────────────────────────────────┐
│ 한선_sw.js (서비스워커) │
│ → .한선 파일 cache-first │
│ → 두 번째 방문부터 오프라인 동작 │
└─────────────────────────────────────────────┘
트랜스파일러 매핑
| 한선씨 | JavaScript | ||
|---|---|---|---|
| 변수 x = 10 | var x = 10 | ||
| 상수 PI = 3.14 | const PI = 3.14 | ||
| 함수 이름(a,b) { } | function 이름(a,b) { } | ||
| 만약(x>5){} 혹시(x>0){} 아니면{} | if(x>5){} else if(x>0){} else{} | ||
| 동안(조건){} | while(조건){} | ||
| 반복문 i 부터 0 까지 N | for(var i=0;i<N;i++) | ||
| 반복 항목 안에서 배열 | for(var 항목 of 배열) | ||
| 반환 값 | return 값 | ||
| 참 / 거짓 / 모름 | true / false / null | ||
| 그리고 / 또는 / 아님 | && / \ | \ | / ! |
| 탈출 / 계속 | break / continue | ||
| 시도{} 오류 e{} | try{} catch(e){} | ||
| 가져오기 "X.한선" | // (주석 처리, 로더가 별도 fetch) | ||
| ; 한글 주석 | // 한글 주석 |
4질문 답변 + 구현 매핑
Q1. 크롬/사파리가 한선씨 직접 읽을 수 있나?
→ 직접 불가, JS/WASM만 네이티브. 해결: 트랜스파일러 + 로더로 해결. 사용자 측 변경 없음, <script type="text/한선">만 쓰면 끝.
Q2. 첫 화면에서 자동 설치? → 보안상 확장 강제 설치 불가. 해결: HTML 3줄(트랜스파일러+런타임+로더, 총 26KB) 포함 → 서비스워커가 즉시 캐싱 → 두 번째 방문 오프라인 동작.
Q3. 크라우니브라우저 네이티브?
→ 가능. <script type="text/한선"> 네이티브 파서 + crownyc VM 내장하면 트랜스파일 단계 생략. 이 시스템은 그동안의 폴백.
Q4. 웹 제한 요소만 번역? → 정확. 런타임이 이미 분기: 파일I/O → localStorage, TCP → WebSocket, 카메라 → input[type=file]. 한선씨 코드는 동일.
클로드가 한선씨 프론트엔드 작업하기 위한 단계 (이전 답변의 7가지 중 ④ 라이브 프리뷰 부분 달성)
| 항목 | 상태 |
|---|---|
| ① 진짜 브라우저 런타임 | ✅ 완성 (한선_런타임.js + 트랜스파일러) |
| ② API 레퍼런스 | 부분 (런타임 109개는 코드 주석에만) |
| ③ 패턴/템플릿 카탈로그 | 데모 1종 (카운터/폼/다크모드) |
| ④ 라이브 프리뷰 | ✅ 달성 (python3 -m http.server + 새로고침) |
| ⑤ 에러 → 수정 가이드 | 부분 (한선_오류 영역 표시) |
| ⑥ 빌드/배포 | 부분 (단일 HTML이면 즉시 배포 가능) |
| ⑦ 외부 라이브러리 래퍼 | 미착수 |
파일
/Users/ef/CrownyOS/crownyc/web/han-js/한선_트랜스파일러.js(5KB)/Users/ef/CrownyOS/crownyc/web/han-js/한선_런타임.js(19KB, 109함수)/Users/ef/CrownyOS/crownyc/web/han-js/한선_로더.js(2KB)/Users/ef/CrownyOS/crownyc/web/han-js/한선_sw.js(2KB)/Users/ef/CrownyOS/crownyc/web/han-js/index.html(데모, 8KB)
즉시 실행
bashcd /Users/ef/CrownyOS/crownyc/web/han-js
python3 -m http.server 8765
# 브라우저: http://localhost:8765/
다음 단계 권고
- 외부 라이브러리 어댑터 — 차트(Chart.js), 지도(Leaflet) 한선씨 래퍼
- 프론트엔드.한선 v5 로드 —
<script type="text/한선" src="프론트엔드.한선">동작 확인 - VSCode 확장 —
.한선파일 신택스 하이라이팅 + 라이브 미리보기 - WASM 백엔드 —
crowny-wasm을 브라우저에 통합해 트랜스파일 우회 - 호환성 행렬 — 한선씨 함수 중 브라우저에서 안 되는 것 식별 (파일I/O, TCP 등)
잔여 한계
아님postfix (x 아님) 미지원 — 사용자는!x또는x == 거짓쓸 것모르면(Kleene 3진 분기) 미지원시도/오류패턴 일부만 (e.g.,} 오류 e {→} catch (e) {후처리 필요)- 매크로/메타프로그래밍 없음
- 정밀한 디버깅 (line number 매핑) 없음