πŸ“– ДокумСнтация Qumir

← Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² Playground

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ 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

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅