ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ qumirc
qumirc β ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ·ΡΠΊΠ° Qumir. ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π² ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΊΠΎΠ΄, Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ, LLVM IR ΠΈΠ»ΠΈ WebAssembly.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
qumirc [ΠΎΠΏΡΠΈΠΈ] <Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ_ΡΠ°ΠΉΠ».kum>
ΠΠΏΡΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
| ΠΠΏΡΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
-o FILE |
ΠΠΌΡ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° |
-c |
Π’ΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ (Π±Π΅Π· Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ) |
-S |
ΠΠ΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ |
-O[0|1|2|3] |
Π£ΡΠΎΠ²Π΅Π½Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ |
--ast |
ΠΡΠ²Π΅ΡΡΠΈ AST Π² ΡΠ°ΠΉΠ» .ast |
--ir |
ΠΡΠ²Π΅ΡΡΠΈ IR Π² ΡΠ°ΠΉΠ» .ir |
--llvm |
ΠΡΠ²Π΅ΡΡΠΈ LLVM IR Π² ΡΠ°ΠΉΠ» .ll |
--wasm |
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π² WebAssembly |
-v, --version |
ΠΠΎΠΊΠ°Π·Π°ΡΡ Π²Π΅ΡΡΠΈΡ |
-h, --help |
ΠΠΎΠΊΠ°Π·Π°ΡΡ ΡΠΏΡΠ°Π²ΠΊΡ |
Π Π΅ΠΆΠΈΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ
ΠΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ»
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ:
qumirc ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
./a.out
Π‘ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ:
qumirc ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum -o ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
./ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»
qumirc -c ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
# Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.o
ΠΡΡΠ΅ΠΌΠ±Π»Π΅Ρ
qumirc -S ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
# Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.s
LLVM IR
qumirc --llvm ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
# Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.ll
ΠΠ»ΠΈ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ:
qumirc --llvm -o output.ll ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
WebAssembly
qumirc --wasm ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum -o ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.wasm
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ: ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ wasm-ld (ΡΠ°ΡΡΡ LLVM).
Π£ΡΠΎΠ²Π½ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
| Π£ΡΠΎΠ²Π΅Π½Ρ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
-O0 |
ΠΠ΅Π· ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ) |
-O1 |
ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ |
-O2 |
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ |
-O3 |
ΠΠ³ΡΠ΅ΡΡΠΈΠ²Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ |
ΠΡΠΈΠΌΠ΅Ρ:
qumirc -O3 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum -o ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°_opt
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
# Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΡΠ°ΠΉΠ» hello.kum
cat > hello.kum << 'EOF'
Π°Π»Π³
Π½Π°Ρ
Π²ΡΠ²ΠΎΠ΄ "ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!", Π½Ρ
ΠΊΠΎΠ½
EOF
# ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ
qumirc hello.kum -o hello
# ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ
./hello
ΠΡΠΎΡΠΌΠΎΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ
# AST (Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ)
qumirc --ast ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
cat ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.ast
# IR (Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅)
qumirc --ir ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
cat ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.ir
# LLVM IR
qumirc --llvm ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
cat ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.ll
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π΄Π»Ρ Π²Π΅Π±Π°
qumirc --wasm ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum -o ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.wasm
ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ .wasm ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Ρ JavaScript:
const bytes = await fetch('ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.wasm').then(r => r.arrayBuffer());
const { instance } = await WebAssembly.instantiate(bytes, imports);
instance.exports.main();
ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ±ΠΎΡΠΊΠ°
# ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
qumirc -O3 benchmark.kum -o benchmark
# Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°
qumirc -O0 benchmark.kum -o benchmark_O0
qumirc -O3 benchmark.kum -o benchmark_O3
ls -la benchmark_O0 benchmark_O3
ΠΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
| Π Π΅ΠΆΠΈΠΌ | Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|---|
| ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ | a.out ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ |
ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» |
-c |
.o |
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» |
-S |
.s |
ΠΡΡΠ΅ΠΌΠ±Π»Π΅Ρ |
--llvm |
.ll |
LLVM IR (ΡΠ΅ΠΊΡΡ) |
--ir |
.ir |
ΠΠ½ΡΡΡΠ΅Π½Π½Π΅Π΅ IR |
--ast |
.ast |
AST (Π΄Π΅ΡΠ΅Π²ΠΎ ΡΠ°Π·Π±ΠΎΡΠ°) |
--wasm |
.wasm |
WebAssembly ΠΌΠΎΠ΄ΡΠ»Ρ |
ΠΠΎΠ΄Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°
| ΠΠΎΠ΄ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| 0 | Π£ΡΠΏΠ΅ΡΠ½Π°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ |
| 1 | ΠΡΠΈΠ±ΠΊΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ |
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²
# ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»
qumirc -c ΠΌΠΎΠ΄ΡΠ»Ρ1.kum
qumirc -c ΠΌΠΎΠ΄ΡΠ»Ρ2.kum
# ΠΠΈΠ½ΠΊΠΎΠ²ΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ clang/gcc
clang ΠΌΠΎΠ΄ΡΠ»Ρ1.o ΠΌΠΎΠ΄ΡΠ»Ρ2.o -o ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
ΠΡΠΎΡΠΌΠΎΡΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ°
qumirc -S -O3 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.kum
less ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.s