ハクソク

世界を動かす技術を、日本語で。

Show HN: Han – Rustで書かれた韓国のプログラミング言語

概要

Hanは、すべてのキーワードが韓国語(Hangul)で書かれた静的型付きコンパイル言語
Rust製コンパイラでLLVM IRを生成し、即時実行用インタプリタも搭載。
REPLLSPサーバーなど、現代的な開発体験をサポート。
韓国語学習者やK-カルチャー愛好者に最適なプログラミング体験
多彩なサンプルコードと豊富な標準ライブラリを提供。


Han: 韓国語キーワードで書く汎用コンパイル言語

  • Hanは、すべてのキーワード・識別子を韓国語(Hangul)で記述する静的型付き・コンパイル型プログラミング言語
  • Rustで実装されたコンパイラツールチェーンを持ち、LLVM IR経由でネイティブバイナリを生成。
  • インタプリタモードも搭載し、即時実行やREPLによる対話的開発が可能。
  • LSPサーバーを同梱し、エディタでの補完・ドキュメント参照をサポート。
  • Hanの誕生背景には「プログラミング言語の見た目は国ごとに異なってもよい」という思想がある。

Hangul(ハングル)とプログラミング

  • Hangulは、科学的に設計された韓国語の表記体系
  • Hanでは、함수, 만약, 반복, 변수など、すべてのキーワードが韓国語の本来の意味を持つ。
  • 変数名・関数名も韓国語で付与可能、構造体やメソッド名も同様。
  • 韓国語学習者や韓国文化に興味がある開発者にとって、実践的な読み書き練習の場となる。

主な機能一覧

  • 韓国語キーワード:함수(関数)、만약(if)、반복(for)、변수(変数)など
  • 韓国語識別子:変数・関数・構造体名も韓国語で命名
  • コンパイル型:LLVM IR → clang経由でネイティブバイナリ生成
  • インタプリタモード:clang不要で即時実行
  • REPL・LSPサーバー:対話型実行、エディタ補完・ドキュメント
  • 静的型付け:5つのプリミティブ型(정수, 실수, 문자열, 불, 없음)
  • 配列・構造体・クロージャ・パターンマッチ:現代的な構文サポート
  • エラーハンドリング:시도/실패(try/catch風)
  • ファイルI/O・JSON・HTTP・正規表現・日付/時刻:豊富な標準API
  • モジュールインポート・ジェネリクス・ハッシュマップ:拡張性・柔軟性
  • 型検査・型推論:コンパイル時型チェック

クイックスタート

  • サンプルファイル作成:hello.hgl
    • 출력("안녕하세요, 세계!")
      
  • 実行方法
    • インタプリタ実行:hgl interpret hello.hgl
    • REPL起動:hgl repl
  • 出力例
    • 안녕하세요, 세계!
      

実用サンプル

  • ワードカウンター

    • 文字列内の単語出現回数をカウントするサンプル
    • 配列操作、ループ、条件分岐の実践例
  • 文字列計算機

    • "10 + 20"形式の文字列を計算
    • パターンマッチ、型変換、エラー処理例
  • ToDoリスト(構造体利用)

    • 할일構造体でToDoを管理
    • 配列/構造体/メソッド/状態変更の実践
  • ファイル行数カウント

    • ファイル読み込み・行数カウント・エラーハンドリング例

インストール手順

  • 前提条件

    • Rust(1.70+)
    • clang(hgl build/hgl run時に必要)
  • インストール方法

    • git clone https://github.com/xodn348/han.git
      cd han
      cargo install --path .
      
    • これでhglコマンドがグローバル利用可能
  • VS Code拡張

    • editors/vscodeディレクトリでnpm install && npm run compile
    • VS CodeでF5実行でシンタックスハイライト+LSP対応

CLIコマンド一覧

  • hgl interpret <file.hgl>:インタプリタ実行
  • hgl build <file.hgl>:ネイティブバイナリ生成
  • hgl run <file.hgl>:即時コンパイル&実行
  • hgl repl:対話型REPL
  • hgl lsp:LSPサーバー起動

言語仕様と特徴

  • データ型
    • 정수(i64), 실수(f64), 문자열(UTF-8), 불(bool), 없음(void)
    • 配列、負インデックス、構造体、タプル、列挙型(Enum)
  • 制御構文
    • 만약/아니면만약/아니면(if/else if/else)
    • 반복(for)、동안(while)、멈춰(break)、계속(continue)
    • 맞춰(パターンマッチ)、範囲演算子(0..10)
  • 関数
    • 型注釈付きの関数定義と再帰、クロージャ、引数としての関数
  • 文字列・配列メソッド
    • .분리, .포함, .바꾸기, .길이, .추가, .삭제, .역순, .정렬, .합치기など
  • 構造体・メソッド
    • 구조 人 { 이름: 문자열, 나이: 정수 }
    • 구현 블록でメソッド定義
  • エラーハンドリング
    • 시도/실패ブロックでtry/catch風の例外処理
  • ファイルI/O
    • 파일읽기, 파일쓰기, 파일추가, 파일존재
  • 標準API
    • 数学(제곱근, 절댓값, 정수변환, 실수변환, 길이)
    • 文字列フォーマット(형식("이름: {0}", 이름))
    • モジュール(가져오기 "파일.hgl")
    • ジェネリクス(함수 최대값<T>(a: T, b: T) -> T)
    • ハッシュマップ(사전("키", 값))
    • JSON(제이슨_파싱, 제이슨_생성, 제이슨_예쁘게)
    • HTTP(HTTP_가져오기, HTTP_보내기)
    • 正規表現(정규식_찾기, 정규식_일치, 정규식_바꾸기)
    • 日付・時刻(현재시간, 현재날짜, 타임스탬프)
    • システム(실행, 환경변수, 명령인자, 잠자기)

Hanの意義と魅力

  • ハングルの美しさ
    • 1443年、世宗大王により設計された科学的な文字体系
    • 発音器官や宇宙の象徴が形に込められている
    • Hanで함수 피보나치(n: 정수) → 意味も美しさも両立
  • 韓国語学習との親和性
    • すべてのキーワード・識別子が実際の韓国語単語
    • プログラミングしながら韓国語の文脈理解が深まる
    • 韓国語学習者・Kカルチャー愛好者にとって新しい学習体験
  • グローバルな韓国語人気
    • K-popや韓国映画・グルメで世界的な韓国ブーム
    • 1,600万人以上が韓国語学習中
    • Hanは技術と文化の橋渡しとなる

Hanコードで学ぶ韓国語

  • 主なキーワードと意味
    • 함수(ham-su):function定義
    • 만약(man-yak):if条件分岐
    • 반환(ban-hwan):return
    • 변수(byeon-su):mutable variable
    • 반복(ban-bok):forループ
    • 동안(dong-an):whileループ
    • 출력(chul-ryeok):print
    • 참(cham):true
    • 거짓(geo-jit):false
    • 구조(gu-jo):struct定義
    • 시도(si-do):try
    • 실패(sil-pae):catch

言語ガイド抜粋

  • 変数・定数
    • 변수 이름 = 42
    • 상수 파이 = 3.14
    • 변수 나이: 정수 = 25
  • 関数定義
    • 함수 더하기(가: 정수, 나: 정수) -> 정수 { 반환 가 + 나 }
  • 条件分岐
    • 만약 점수 >= 90 { ... } 아니면 { ... }
  • ループ
    • 반복 변수 i = 0; i < 10; i += 1 { ... }
    • 동안 n < 5 { ... }
  • 制御文
    • 멈춰(break)、계속(continue)

キーワードリファレンス

| キーワード | 意味 | 英語相当 | |:---:|:---:|:---:| | 함수 | 関数定義 | function/fn | | 반환 | 戻り値 | return | | 변수 | 可変変数 | let mut/var | | 상수 | 定数 | const | | 만약 | 条件分岐 | if | | 아니면 | else分岐 | else | | 반복 | forループ | for | | 동안 | whileループ | while | | 멈춰 | ループ脱出 | break | | 계속 | ループ継続 | continue | | 참 | 真 | true | | 거짓 | 偽 | false | | 출력 | 標準出力 | print | | 입력 | 標準入力 | input |


型システムと演算子

  • 型一覧
    • 정수:64bit整数(i64)
    • 실수:64bit浮動小数点(f64)
    • 문자열:UTF-8文字列
    • 불:論理値(bool)
    • 없음:void
  • 演算子
    • 算術:+, -, *, /, %
    • 比較:==, !=, <, >, <=, >=
    • 論理:&&, ||, !
    • 代入・複合代入:=, +=, -=, *=, /=

Hanの制限事項・今後の課題

  • 未実装機能
    • Null安全(Option型)、async/並行処理
    • ガベージコレクションは参照カウントのみ(循環参照時リーク)
    • TCO(末尾再帰最適化)なし
  • 一部機能はインタプリタのみ
    • クロージャ・メソッドのバイナリ出力は未対応
    • 配列・文字列メソッドのバイナリ出力は今後対応予定

まとめ・開発の動機

  • AIとRustによる新しい言語開発の試み
    • AIを活用し、ゼロからRust製コンパイラ+インタプリタを開発
    • 韓国語キーワードに特化した唯一無二のプログラミング体験
  • サイドプロジェクトとしての位置付け
    • Python等の置き換えを狙うものではなく**実験的・教育的

Hackerたちの意見

すごい!なんてクールなアイデアなんだ。興味がある人は、午後のうちにハングルを全部学べるよ。すごく論理的にデザインされてて、便利な記憶法もあるんだよね。
これは韓国人でも知らないような深い知識だね。このサイトをGitHubの参考に追加するよ。君がサポーターでいてくれて嬉しい!
そのリンクをREADMEに追加したよ — 「ハングルの美しさ」セクションにぴったりだね。
これ、めっちゃクールだね!今書いてる韓国語ガイドにもこれらの記憶術のバージョンを追加するつもりだよ:https://tolearnkorean.com/ 韓国語のアルファベット(ハングル)は結構早く覚えられるし、英語のアルファベットと同じくらいの「文字」数なんだ!でも、単語を覚えるのはちょっと難しいかも、特に似た言語を知らないと。Ankiと自分のアプリを使ってるよ:https://game.tolearnkorean.com/
キーワードの簡単な翻訳は一見簡単そうだけど、なんで標準じゃないんだろう。# def two_sum(arr: list[int], target: int) -> list[int]: 펀크 투섬(아래이: 목록[정수], 타개트: 정수) -> 목록[정수]: # n = len(arr) ㄴ = 길이(아래이) # start, end = 0, n - 1 시작, 끝 = 0, ㄴ - 1 # while start コードはもっとコンパクトになるし、もっと説明的なキーワードも使えるようになるよね。例えば、AbstractVerifiedIdentityAccountFactory vs 실명인증계정생성みたいに。ただ、いい感じの大文字・小文字の区別は失われちゃうけど。情報処理速度は言語によってほぼ同じって聞いたことがあるから、処理速度に関してはあまり違いが出ないかもね。
コンパクトさについてのいい指摘だね — 실명인증계정생성 vs AbstractVerifiedIdentityAccountFactoryは、韓国語の強みが出てる実例だよ。ただ一つ違いがあるのは、ハングルは実際の韓国語の単語を使ってるってこと。함수は韓国語で「関数」を意味するし、만약は「もし」を意味する。韓国語を話す人ならみんな知ってる本物の単語だよ。君の例は、펀크や아래이みたいな音訳を使ってるけど、韓国の読者にはちょっと変に見えるかも。それが可読性に影響するんだ。
面白い例だね。
2000年代初頭に中国語のPythonが試みられたことがあるよ:http://reganmian.net/blog/2008/11/21/chinese-python-translat... でも、あんまり普及しなかったね。多分、コンピュータが他の状況でもラテン文字を読んだり打ったりすることをユーザーに求めてるからだと思うし、いくつかのキーワードの意味を学ぶのはそんなに難しくないから、みんなが使ってる英語のキーワードを使った方がいいってことなんじゃないかな。
Scratchは韓国語をサポートしてるけど、Scratchはプログラムをシリアライズするのにバイトやコードポイントの代わりにJSONを使うから、ユーザーが表示言語を変更できるんだ(ハードタブでインデントサイズを設定できるのと似てる)。英語以外のプログラマーが英語のキーワードを使い続ける理由は、言語やツールのサポートだけじゃないと思う。新しいキーワードを学ぶのはプログラミング言語を学ぶ一部だし、言語やライブラリのドキュメントやリソースはほとんど英語だけだし。ASCIIのみの文字列は、URLやユーザー名みたいにソフトウェアの中でまだまだ一般的だし、国際チームでは英語が共通語になってる。これがLLMで変わるかな?もしかしたら、でもトレーニングデータのほとんどが英語だから、LLMは英語で一番効果的に働くと思う。
韓国語はあまり分からないけど、日本語について考えると、普及しない理由の一つは、入力モードを頻繁に切り替えるのが面倒で非効率だからだと思う。日本語の入力モードは文章を書くために設計されていて、プログラミングでよく使う記号を効率よく入力するのには向いてないんだよね。スペースすらも。余計なキー入力がたくさん必要になる。
大学でコンピュータサイエンスを勉強してた時、プログラミング言語が英語の名詞や動詞を使ってるのは英語を話す私たちにとってラッキーだなって言ったことがあるよ。クラスメートの多くは学生ビザで来てて、英語が母国語じゃなかった。英語でプログラミングするのは学習曲線で有利だと思ってたし、プログラミングが「外国語」の単位にカウントされるべきだって言う人がいると、いつもバカみたいだなって思ってた。とにかく、非英語のプログラミング言語を見るのはいつも面白いね。
共感してくれてありがとう。英語は世界中で最も頻繁に使われる言語の一つだから、多くのコーディングプロジェクトで英語を使うのは理にかなってるよね。
それ、ほんとにそうだね。英語があるからこそ、インドが西洋のITバックオフィスになってる大きな理由だと思う。私も、地域の言語で学校を卒業したクラスメートたちが、大学の授業が全部英語だったために苦労しているのを見てきた。中には州のランキングに入るような人たちもいたのに、成績を維持するために倍の努力をしなきゃいけないのは辛いよね。こういう苦労のせいで、インドでは多くの可能性が無駄になってると思う。多くの賢い人たちが多言語に対する適性がないだけで足を引っ張られてるんだ。
ハイヴマインドに逆らうリスクがあるけど、私は違うと思う。私は早い段階で独学でプログラミングを学んだし、英語が得意になる前だった。母国語で本を読んだり、プログラミングフォーラムで話したりしてた。結局、プログラミング言語の「英語」はほんの少しのキーワードだけで、"int"が"integer"の略だって知らなくても全然問題なかったよ。もちろん、最初は「bool es_primo(int numero)」みたいなコードを書いてたけど、Cでは識別子が英語でなきゃいけないなんて決まりはないし、ただの慣習だよね。今の標準ライブラリやパッケージは問題かもしれないけど、当時の標準ライブラリは薄かったし、「strcpy」なんて名前もわかりにくかったし。実際に難しかったのは、プログラミングや設計を正しく学ぶことだった。もっと高度なトピックについては、英語だけのドキュメントや学習資料がESLにとっては大きな問題だよね。だって、実際に読んで理解しなきゃいけないから。でも、これはプログラミング言語が助けられることじゃないと思う。
いや、英語を話さない友達が言うには、キーワードはプログラマーの仕事の複雑さの1%にも満たないから、あんまり関係ないみたい。ほとんどの言語では、変数やクラス、メンバーをUnicodeの文字で名前付けできるし。だから、"if/for/while" のキーワードと標準ライブラリのクラスだけが英語のまま残るんだよね。これを翻訳する意味はあんまりないと思う。
それは彼らの問題の中で最も小さいことだよ。最高のコンピュータサイエンスの教科書はまず英語で出版されて、翻訳は後回しになることが多い。研究論文も英語で書かれていて、あまり翻訳されないし。商業用やFOSSのプログラミングツールのマニュアルも翻訳されないことが多い。キーワードのいくつかを覚えるのは、せいぜい30分の暗記作業だよ。
いや、むしろキーワードを特別なシジルとして扱う方が助けになると思うよ。それに、すべての自然言語がプログラミング言語に適しているわけじゃないからね。屈折が多い言語だと、文法的に間違った形になっちゃうことが多いし、ぎこちない表現になっちゃうこともある。
これ、めっちゃ好き!いい仕事してるね!コードサンプルを見るのが楽しいけど、全然意味がわからなくて、英語を話さないプログラマーたちが私たちの英語のプログラミング言語を見たときの気持ちを考えちゃう。リスプだけは別だけどね。あれはcondやcons、car、cadrとか、たくさんの括弧みたいな意味不明な記号だし! :-)
本当の壁は言語のキーワードだけじゃなくて、英語のドキュメントやディスカッションがたくさんあることだよね。これに対する解決策があるかはわからないな。
ハハ、英語を使うのは何十年も前から合理的だったよ。コメントありがとう!
いい仕事だね :) 韓国のプログラミング言語に興味があるなら、'Nuri'っていう関数型の言語があるよ: https://github.com/suhdonghwi/nuri/ キーワードを翻訳するだけじゃなくて、実際に韓国語の文法を使ってコードが書けるんだ。例えば、「10을 5로 나누고 출력하다」(直訳すると「10を5で割って出力する」)は「2」を出力するよ。知ってるかもしれないけど、'Yaksok'っていう韓国のプログラミング言語もあるよ。これが韓国語だけで書かれた2048ね: https://github.com/yaksok/yaksok/blob/master/code_examples/2...
それは妥当な意見だね。合理的でよく設計された言語については知ってるけど、まずは英語話者向けにRustに翻訳することにもっと集中したかったんだ。この言語のユーザーを増やすためにね。フィードバックありがとう!
韓国語の語彙はほとんど知らないし、ハングルも読めないし、タイプする準備もできてないんだけど、「yaksok」って、日本語の「約束」と関係あるのかな?
こんにちは、面白いプロジェクトだね。私は韓国語のネイティブスピーカーだから、韓国の視点を少し共有したいと思ったんだ。名詞は比較的自然に翻訳できるけど、英語の動詞コマンドはもっと注意が必要だよ。英語では「find」みたいな動詞が単独で使えるけど、韓国語では動詞には通常語尾が必要で、文脈によっては異なる語尾がかなり違ったり不自然に聞こえたりするんだ。例えば、「find」は 찾다、찾기、または 찾음になるけど、これらは置き換えられないよ。複数形も難しい。英語は単数と複数をはっきり区別するけど、韓国語は通常そうじゃない。明示的な複数形「단어들」は、各アイテムの個性が重要でない限り、不自然に聞こえることが多いし、「단어목록」も同じ感じだね。全体的に、これは本当に面白いプロジェクトで、実際の可能性があると思う。英語と韓国語の構造的な違いを考慮すれば、単なるキーワードの置き換えとして扱うよりも、さらに強化されると思うよ。
それはバカなアイデアだと思う。歴史的に見ても、プログラミング言語はみんな同じものを使っているから学びやすかったのに、今みんなが自分のプログラミング言語を作り始めたら、すべてがバラバラになっちゃう。例えば、ある会社に行ったら、面接で韓国語を知っていることが求められるかもしれないし、契約社員を雇えなくなる。別のプログラミング言語の素晴らしい機能についての記事を見ても、移植できなくなる。だから、みんなと話し合うのは、世界に一つの言語があればいいなと思ってるからなんだ。それがあれば、戦争や誤解が減って、みんながもっと近くなれると思う。でももちろん、反対の意見もあって、文化が減るっていうのも分かるけど、イギリスとアメリカ、スペイン語みたいに、同じ言語でもバリエーションがあって、みんなが理解し合えるようになると思う。もしPythonやJSがエゴのせいでX個の異なる言語に分かれていたら、今の状況にはなっていなかったと思うし、AIも存在しなかったかもしれない。だって、そんなにたくさんのプログラミング言語を理解し合うために戦っていたら、協力なんてできなかっただろうから。
創造したり、遊んだり、実験するのはバカじゃないよ。著者はアートを作って、ここにシェアして職人技について話しに来たのに、君はそれに対して侮辱的な返事をして、まるでビジネスの決定をグローバルな政治に絡めてレビューしたみたいだね。ポイントを見逃して、しかもその過程で意地悪になってるよ。
じゃあ、君がやろうとしているのはエスペラントで新しいプログラミング言語を作ることなんだね。
韓国語は知らないけど、君がここで始めた言語学についての興味深い議論には感謝してる。いくつかの好きなコメントを紹介するね:ハングルの音韻的な象徴デザイン: https://news.ycombinator.com/item?id=47382219 韓国語の複数形: https://news.ycombinator.com/item?id=47386312 LLMトークナイザーがトレーニングデータの一般的な入力を短縮することについての君のコメント;韓国語は視覚的にコンパクトだけど、トークン圧縮が悪い: https://news.ycombinator.com/item?id=47381843 ハングルのキーボードレイアウト - 子音と母音の手を分けて、タイピング中にリズミカルなハーモニーを生むのがすごくクール: https://news.ycombinator.com/item?id=47382081
美しい韓国語を、ひどい言語のラストで台無しにするのはやめてほしいな。
これはかなり興味深いプロジェクトに見えるね。JSのライブコンパイラがあって、ブラウザで即実行できたらもっと魅力的になると思う。