Herdr UI
Herdr의 TUI가 뛰어나며, 창을 통해 추가되는 기능
웹어셈블 기반 브라우저 실행 파이썬 스타일 의사코드 언어. 인터프리터와 C++ 트랜스파일러를 동시에 제공
A pseudocode-style programming language with a dual backend (interpreter + C++ transpiler). Runs entirely in your browser via WebAssembly — no install needed.
개발 도구C++ · JavaScriptGitHub @Vpdrla온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
▶ Try it in your browser — no install needed
Executable pseudocode. Venos is written the way algorithms are written on a whiteboard or in a
textbook — if x >= 90 then, for i = 1 to 10, while x > 0 do — except you can actually run it.README 전문 보기 ↗English | 한국어
▶ Try it in your browser — no install needed
Executable pseudocode. Venos is written the way algorithms are written on a whiteboard or in a
textbook — if x >= 90 then, for i = 1 to 10, while x > 0 do — except you can actually run it.
It is a bridge, not a destination. Beginners get stuck crossing from block coding (Scratch, Entry) to
a real text language: unfamiliar syntax, English-only names, error messages they cannot read. Venos
removes those three obstacles without hiding how programming actually works — and then hands you
over: venos topython rewrites any Venos program as readable Python.
Implemented in a single C++ file (~5,500 lines) with three backends: a tree-walking interpreter, a C++ transpiler that produces standalone native executables, and a Python emitter.
func fib(n) {
if n <= 2 then { return 1 }
return fib(n - 1) + fib(n - 2)
}
for i = 1 to 10 {
print "fib({i}) = {fib(i)}" # string interpolation
}
try {
let n = num(input "Enter a number: ")
print "10 /", n, "=", 10 / n
} catch err {
print "Something went wrong:", err
}
Identifiers can be written in any language (full UTF-8 support), so classes, functions, and variables work naturally in Korean, English, or anything else:
class 사람 {
func init(이름) { self.이름 = 이름 }
func 인사() { print "안녕, 나는 " + self.이름 }
}
사람("미르").인사()
if x > 5 then { }, for i = 1 to 10, while x > 0 do { }; optional filler keywords (then, do) make code read like pseudocode.my → C++ → native executable via g++), and a Python emitter (.my → .py). All three are differential-tested to produce identical output for the same programvenos topython writes your program as idiomatic Python, so nothing you learn here is thrown awayself), lists and dictionaries (reference semantics, deep equality with ==, + to join lists, copy() for deep copies), string interpolation ("name: {x}"), UTF-8-aware string handling, try/catch, import, file I/O, and 30-odd built-in functions정의되지 않은 변수: 이릅 (혹시 '이름'?)), an unclosed { points at where it was opened rather than at the end of the file, and an error inside a function shows in one line how execution got there. Habits carried in from another language are named rather than rejected — elif, !, **, // comments, ;, : blocks, xs[1:3], "abc".upper(), True — each with what to write instead. Undefined variables, wrong argument counts and unknown methods are caught at build timeNote: error messages and shell UI are currently in Korean.
Venos does not want to be your last language. venos topython writes the same program as Python you
can read, keeping your variable and function names — Python 3 accepts Korean identifiers, so they
survive the trip:
func 최댓값(점수들) { │ def 최댓값(점수들):
let 최대 = 점수들[1] │ 최대 = 점수들[0]
for 점수 in 점수들 { │ for 점수 in 점수들:
if 점수 > 최대 then { 최대 = 점수 } │ if 점수 > 최대:
} │ 최대 = 점수
return 최대 │ return 최대
} │
│
let 우리반 = [88, 94, 71] │ 우리반 = [88, 94, 71]
print "가장 높은 점수: {최댓값(우리반)}" │ print(f"가장 높은 점수: {최댓값(우리반)}")
Both print 가장 높은 점수: 94. String interpolation becomes an f-string; then and the braces
disappear; 1-based indexing is shifted to 0-based and the generated file says so in a header comment,
because that difference is worth learning rather than hiding.
In the playground the same thing is one click: 🐍 Python.
The web playground runs the full interpreter in your browser via WebAssembly —
including classes, try/catch, and even the example RPG (input asks on a line below the output; import is desktop-only,
and file I/O writes to in-memory storage that resets on page reload).
It is built to be usable in a classroom where nothing can be installed:
#lesson=lists)TUTORIAL.md — 13 lessons from print to a small guessing game and out the other side into Python, each one runnable in the
playground with a single click. Korean version: TUTORIAL.ko.md.
Grab a binary from the latest release — it is statically linked, so there is nothing else to install.
| Your machine | File |
|---|---|
| Windows | venos-windows-x64.exe |
| macOS (Intel or Apple Silicon) | venos-macos-universal |
| Linux | venos-linux-x64 |
On macOS and Linux, make it executable first: chmod +x venos-linux-x64.
g++ -std=c++17 -O2 -o venos venos.cpp # Linux / macOS / WSL
g++ -std=c++17 -O2 -o venos.exe venos.cpp # Windows (MinGW)
No dependencies. Requires C++17 (C++20 compatible), and builds clean with GCC, Clang and MinGW.
./venos # interactive shell (create / code / run / build ...)
./venos program.my # run a file directly (interpreter)
./venos build program.my # compile to a native executable (needs g++ installed)
./venos build program.my run # compile and run immediately
./venos topython program.my # write the same program as Python (program.py)
./venos trace program.my # run it and print every value as it changes (a trace table)
The interpreter is self-contained; only build shells out to g++.
Inside the shell, repl starts a line-by-line REPL (type an expression to see its value).
trace prints the trace table a textbook asks students to fill in by hand — one line per value
that changes, with -> on a call and <- on a return, indented by depth. The playground has the
same thing behind 🔍 Trace. Trace lines go to stderr, so the program's own output stays separable.
5| -> 팩토리얼(4)
3| -> 팩토리얼(3)
3| <- 팩토리얼 = 6
5| <- 팩토리얼 = 24
5| 답 = 24
The full language reference: VENOS_SPEC.en.md (English) / VENOS_SPEC.md (한국어). The spec is written so you can hand it to an AI assistant and have it write valid Venos code (designed with AI-assisted "vibe coding" in mind).
vscode-venos/ contains a VS Code extension with syntax highlighting for .my files —
copy the folder into ~/.vscode/extensions/ (see its README).
examples/algorithms/ — nineteen textbook algorithms (selection
sort, binary search, Euclid's algorithm, the sieve, Hanoi, a Caesar cipher…), each written
line-for-line against the pseudocode a textbook prints, with that pseudocode in a comment
at the top. Every one of them is run three ways by the test suite — interpreter, compiled
binary, and the Python topython emits — and all three must agree.
venos examples/algorithms/binary-search.my
venos topython examples/algorithms/binary-search.my # the same program in Python
A text RPG exercising classes, dictionaries, string interpolation, and save/load via file I/O — in two flavors:
examples/rpg.en.my (English identifiers, the one in the demo above) and examples/rpg.my (the same game written entirely with Korean identifiers):
venos examples/rpg.en.my
venos examples/rpg.my
source → lexer (tokens) → recursive-descent parser (AST) ─┬→ tree-walking interpreter
├→ C++ code generation → g++ → native executable
└→ Python emission (`topython`)
Everything — lexer, parser, AST, interpreter, transpiler, runtime library, and the CLI shell — lives in the single file venos.cpp.
Where Venos belongs, and what it refuses to become: STRATEGY.md (한국어) — what other teaching languages got right and wrong, and the gap this one is aimed at.
DEVLOG.md (한국어) — the bugs this took, and the instrument
that found each one. A windows.h macro from 1985, a return that threw a C++ exception
on every call, a parser with no depth limit, and an import that had never been tested.
I built this from scratch to understand how programming languages actually work.
It started as v0.1 (an interpreter that could only do variables and print) and grew to v0.6
by writing real programs in it, finding what was missing, and adding it — the text RPG in
examples/ was the validation project that drove features like exists(), try/catch, and import.
Every language feature is verified by differential testing: each program in tests/cases/ — and
every example in examples/algorithms/ — runs on all three backends (the interpreter, the transpiled
native binary, and the Python emitted by topython) and the outputs must match. This is what has
caught most of the code-generation bugs.
Seven more phases run alongside it:
tests/diag/*.my are wrong on purpose and their output must match .expected
character for character. What a beginner reads when something breaks is a feature, so it is tested
like one.create / code / :d / :q is how someone without VS Code writes a
program. The check drives a session and looks at the file it saved, not at the screen.tests/nopython/*.my are the places Python would answer differently from Venos, and
topython must refuse them with a line number. Emitting wrong Python is worse than refusing,
because the student has no way to know it is wrong.repl to check that a value prints on its own, that an
error does not end the session, and that :q gets out.tools/check-builtins.js pulls the builtin list out of all five places it
lives (three backends, the typo-suggestion table, and the VS Code grammar) plus the keywords, and
fails if they disagree. Every way of forgetting one of them is silent.tools/check-lessons.js runs every lesson's code in both languages, checks that
names the prose points at exist in the code, and that the generated tutorials are up to date.Separately, tools/genfuzz.py writes random but valid Venos programs and checks that all three
backends print the same thing — a hand-written case only covers combinations someone thought of, and
this is what found a loop that terminates in Venos and never ends in the Python it emitted. It runs
in CI with a fresh seed each time.
tools/sanitize.sh builds with ASan and UBSan and sweeps the whole corpus through both
the interpreter and the generated C++ — the emitted runtime is a second implementation, so it gets
compiled with sanitizers and run too — then fuzzes mutated programs looking for crashes and hangs.
That is what found the parser's missing depth limit.
CI runs all of it on every push, on Linux and on Windows, in a real browser for the playground, and
separately verifies that the playground WASM committed in docs/ was built from the current
venos.cpp:
tests/run_tests.sh