Piton
Piton - інтерпретована мова програмування з українським синтаксисом у трансліті. Вона написана на Go і орієнтована на навчання, швидкі експерименти та демонстрацію того, як влаштовані інтерпретатори.
Коротко про мову:
- змінні оголошуються простим
= - блоки керуються відступами
- умови пишуться через
yaksho/inackshe - цикл у мові зараз один:
poky - функції створюються через
functia - колекції:
spysok([]) іslovnyk({}) - є вбудовані функції на кшталт
dovzhyna(),dodaty(),delete(),vypadkovo() - через CLI можна не лише запускати код, а й будувати SVG-блок-схеми
Бінарники можна або зібрати локально з вихідного коду, або просто скачати з Releases для актуальних платформ Linux, macOS і Windows.
Minimalnyi pryklad
profil = {"imya": "Mavka", "mista": ["Lviv", "Kyiv"]}
profil["rol"] = "moderator"
delete(profil, "rol")
drukuvaty profil["imya"]
drukuvaty profil
Shcho chytaty dаly
Якщо ти тільки починаєш:
Якщо тобі потрібен інструментальний бік проєкту:
Yak vyhlyadaye kod u vizualizatori
Нижче - реальна SVG-схема, згенерована з examples/session-tracker.piton.
Shvydkyi Start
Найкоротший шлях до першого запуску:
- Скачати бінарник з Releases
- Запустити REPL:
./piton
Або запустити відразу готовий приклад:
./piton examples/slovnyk-demo.piton
Якщо хочеш саме зібрати інтерпретатор самостійно з вихідного коду, дивись Vstanovlennya ta CLI.
Naiprostisha programa
drukuvaty "Pryvit, svite!"
Запуск:
./piton hello.piton
Shcho vazhlyvo z pershykh khvylyn
- відступи мають значення
- змінні створюються при першому присвоєнні
- числа всередині мови працюють як числа з плаваючою крапкою
- для списків і словників є індексація через
[] - якщо запустити
./pitonбез файла, відкриється REPL
Pryklad zi zminnymy, umovoyu i tsyklom
values = [1, 2, 3]
i = 0
poky i < dovzhyna(values):
yaksho values[i] > 1:
drukuvaty "bilshe za odyn"
inackshe:
drukuvaty "odyn abo menshe"
i = i + 1
Hotovi skrypty v repozytorii
examples/session-tracker.pitonexamples/spysok-demo.pitonexamples/slovnyk-demo.pitonexamples/vykorystaty-demo.pitonexamples/chas-demo.piton
Найкращий наступний крок - Tur po Movi.
Tur po Movi
Цей розділ проходить по головних можливостях Piton на одному компактному прикладі.
sessions = [35, 40, 28]
target = 40
functia classify(value):
yaksho value > target:
vernuty "bilshe za plan"
inackshe:
vernuty "v mezhakh planu"
i = 0
poky i < dovzhyna(sessions):
current = sessions[i]
drukuvaty current
drukuvaty classify(current)
i = i + 1
Shcho tut vidbuvayetsya
sessions- це список чисел.target- звичайна змінна.functia classify(value):оголошує функцію з одним параметром.yaksho ... inacksheпрацює якif/else.pokyвиконує тіло циклу, поки умова істинна.dovzhyna(sessions)повертає кількість елементів у списку.sessions[i]читає елемент за індексом.
Mentalna model movy
Piton варто сприймати як невелику динамічну мову з такими правилами:
- усе крутиться навколо виразів, присвоєнь і викликів функцій
- колекції мутабельні: елементи списків і словників можна змінювати
- типи перевіряються під час виконання, а не на етапі парсингу
- помилки не кидають винятки у стилі Python, а друкуються повідомленням інтерпретатора
Після цього розділу переходь до Bazovyi Syntaksys або одразу до Operatory ta Porivnyannya.
Vstanovlennya ta CLI
Hotovi binarnyky z Releases
Найпростіший варіант - скачати готовий бінарник з Releases репозиторію.
У релізах публікуються збірки для:
LinuxmacOSWindows- архітектур
amd64таarm64
Після завантаження достатньо розпакувати файл і запускати piton напряму.
Zbirka z vykhidnoho kodu
git clone https://github.com/OlexiyOdarchuk/piton.git
cd piton
go build -o piton ./cmd/piton
Zapusk skrypta
./piton script.piton
Osnovni rezhymy CLI
./piton file.piton- виконання програми./piton -draw file.piton- блок-схема для одного файла./piton -all file.piton- блок-схема для проєкту з імпортами./piton -draw -split file.piton- окремий SVG для кожної функції./piton -draw -target=myFunc file.piton- схема лише для однієї функції
Korysni detali pro REPL
- вхід у REPL:
./piton - вихід з REPL:
exit - багаторядкові блоки після рядка з
:підтримуються
Zapusk prykladiv
./piton examples/slovnyk-demo.piton
./piton examples/spysok-demo.piton
./piton examples/vypadkovo-demo.piton
CLI зараз орієнтований на дві задачі:
- виконання
.pitonфайлів - генерація SVG-блок-схем
REPL
Piton має інтерактивний режим. Якщо запустити програму без аргументів, відкриється REPL:
./piton
Це зручно для швидких перевірок:
drukuvaty 2 + 3
drukuvaty korin 9
drukuvaty {"a": 1, "b": 2}
REPL корисний для:
- перевірки синтаксису
- пробування вбудованих функцій
- дрібних експериментів із
spysokіslovnyk - тестування багаторядкових блоків
yaksho,poky,functia
Щоб вийти з REPL, введи:
exit
Для більших сценаріїв краще переходити у .piton файл і запускати його через CLI.
Bazovyi Syntaksys
Zminni
Окремого ключового слова для оголошення немає. Перше присвоєння одразу створює змінну:
x = 10
name = "Piton"
ready = true
Булеві значення в мові - це true і false.
Komentari
Однорядковий коментар починається з #:
# tse komentar
drukuvaty "ok"
Vidstupy i bloky
Блоки в Piton задаються відступами, як у Python:
yaksho true:
drukuvaty "inside"
drukuvaty "outside"
Без правильних відступів програма не розбереться коректно.
Vyrazy
Підтримуються:
+,-,*,/stupin>,<,>=,<=,==,!=ta,abo,ne
drukuvaty 2 + 3
drukuvaty 2 stupin 3
drukuvaty ne false
drukuvaty (2 < 3) ta true
Ryadky
Рядки задаються в подвійних лапках:
msg = "Pryvit"
drukuvaty msg + "!"
+ також уміє конкатенувати рядки з числами та булевими значеннями.
Оператор * теж має спеціальну поведінку: рядок можна повторити числом.
drukuvaty "ha" * 3
Vstup i vyvid
drukuvaty "Vvedy chislo"
vvid x
drukuvaty x
Поточна реалізація vvid читає число. Для рядкового введення окремого режиму поки немає.
Operatory ta Porivnyannya
Aryfmetychni operatory
+-*/stupin
drukuvaty 1 + 2
drukuvaty 10 - 3
drukuvaty 4 * 5
drukuvaty 8 / 2
drukuvaty 2 stupin 3
Для рядків:
+виконує конкатенацію*у паріstring * numberабоnumber * stringповторює рядок
drukuvaty "hello" + "!"
drukuvaty "ha" * 3
drukuvaty 2 * "go"
Porivnyannya
><>=<===!=
drukuvaty 5 > 3
drukuvaty 5 == 5
drukuvaty 3 != 4
Поточна реалізація операторів порівняння орієнтована на числові значення.
Logika
taabone
drukuvaty true ta false
drukuvaty true abo false
drukuvaty ne true
ta і abo очікують булеві значення з обох боків.
Prefixni matematychni operatory
Деякі математичні дії виглядають як префіксні оператори:
korinloh10absarksynkosynus
drukuvaty korin 9
drukuvaty abs -5
drukuvaty loh10 100
Keruvannya Potokom
Yaksho / Inackshe
score = 75
yaksho score >= 90:
drukuvaty "vidminno"
inackshe yaksho score >= 60:
drukuvaty "zarakhovano"
inackshe:
drukuvaty "nezarakhovano"
Для else if використовується форма inackshe yaksho:
yaksho x > 10:
drukuvaty "big"
inackshe yaksho x > 5:
drukuvaty "medium"
inackshe:
drukuvaty "small"
Poky
i = 0
poky i < 3:
drukuvaty i
i = i + 1
Умови очікують булеві вирази. Для складніших умов комбінуй ta, abo і ne.
Typovyi pattern dlya spyskiv
У мові зараз немає for, тому обхід списку робиться через poky:
i = 0
poky i < dovzhyna(items):
drukuvaty items[i]
i = i + 1
Funktsii
Функція оголошується через functia, повернення значення робиться через vernuty.
functia add(a, b):
vernuty a + b
drukuvaty add(2, 3)
Parametry i vyklyk
functia repeat(label, count):
i = 0
poky i < count:
drukuvaty label
i = i + 1
repeat("go", 3)
Povernennya znachennya
functia square(x):
vernuty x * x
Obsyah vydymosti
Параметри функції обчислюються в місці виклику і передаються в нове локальне оточення. Функція має власний scope, але бачить глобальні значення через зовнішнє оточення.
outer = 10
functia show():
drukuvaty outer
show()
Funktsii z moduliv
Після vykorystaty "hello" можна викликати функцію через селектор:
hello.Hello("svit")
Rekursiya
Функції можуть викликати самі себе, тобто рекурсія підтримується.
functia fact(n):
yaksho n <= 1:
vernuty 1
inackshe:
vernuty n * fact(n - 1)
drukuvaty fact(5)
Це працює для задач на кшталт обходу, факторіала або рекурсивної обробки вкладених структур.
Typy Danykh
Piton - динамічно типізована мова. Основні типи значень:
float64для чиселstringbool[]для списків{}для словників
Chysla
a = 10
b = 2.5
drukuvaty a / b
Boolean
enabled = true
drukuvaty ne enabled
Доступні обидва значення:
drukuvaty true
drukuvaty false
Ryadky
name = "Piton"
drukuvaty "Hello " + name
Kolektsii
s = [1, "two", true]
m = {"name": "Piton", "year": 2026}
Списки та словники можна вкладати один в одного.
Shcho potribno pamyataty
- окремих декларацій типів немає
- одна й та сама змінна може містити різні типи в різний момент часу
- словники очікують рядкові ключі
Spysok
Список задається через [] і може містити значення різних типів.
s = [1, 2, "tri", true]
drukuvaty s
Dostup za indeksom
s = [10, 20, 30]
drukuvaty s[0]
Індекс має бути цілим числом у межах списку.
Zmina elementa
s = [10, 20, 30]
s[1] = 99
drukuvaty s
Zrizy
Підтримуються:
s[start:end]s[:end]s[start:]s[:]
s = [1, 2, 3, 4]
drukuvaty s[1:3]
drukuvaty s[:2]
drukuvaty s[2:]
Dodavannya
dodaty(list, x) додає один елемент або зливає два списки.
a = [1, 2]
b = [3, 4]
drukuvaty dodaty(a, b)
drukuvaty dodaty(a, 5)
Vydalennya elementa
Окремого delete для списків зараз немає. Типовий спосіб - склеїти два зрізи:
s = [1, 2, 3, 4]
trimmed = dodaty(s[:2], s[3:])
drukuvaty trimmed
Slovnyk
Словник задається літералом через {}. Ключі мають бути рядками.
profil = {"imya": "Mavka", "vik": 128}
drukuvaty profil
Chytannya
drukuvaty profil["imya"]
Якщо ключа немає, інтерпретатор надрукує помилку.
Onovlennya i dodavannya
profil["vik"] = 129
profil["rol"] = "moderator"
Vydalennya
Для видалення ключа використовується delete(slovnyk, "key").
profil = {"imya": "Mavka", "vik": 128, "rol": "moderator"}
delete(profil, "rol")
drukuvaty profil
Dovzhyna
drukuvaty dovzhyna(profil)
Typovyi pryklad
profil = {"imya": "Mavka", "vik": 128, "mista": ["Lviv", "Kyiv"]}
profil["rol"] = "moderator"
profil["mista"][0] = "Odesa"
delete(profil, "vik")
drukuvaty profil
Vkladenist
profil = {
"imya": "Mavka",
"mista": ["Lviv", "Kyiv"],
"nalashtuvannya": {"tema": "temna"}
}
drukuvaty profil["nalashtuvannya"]["tema"]
Vbudovani Funktsii
Цей розділ описує все, що вже реалізовано в інтерпретаторі як builtin або спеціальний оператор.
Matematyka
korin xloh10 xabs xarksyn xkosynus xzaokruhlennya(x, precision)stupinяк інфіксний оператор
drukuvaty korin 9
drukuvaty loh10 100
drukuvaty 2 stupin 3
drukuvaty zaokruhlennya(123.4567, 2)
korin, loh10, abs, arksyn, kosynus поводяться як префіксні оператори. zaokruhlennya() викликається як звичайна функція.
Kolektsii
dovzhyna(x)для списків і словниківdodaty(list, itemOrList)для списківdelete(slovnyk, key)для словників
s = [1, 2]
s = dodaty(s, 3)
drukuvaty dovzhyna(s)
m = {"a": 1, "b": 2}
delete(m, "a")
drukuvaty m
Chas i vypadkovist
vypadkovo(max)повертає випадкове число з проміжку[0, max)vypadkovo(min, max)повертає число з проміжку[min, max)vypadkovo(list)повертає випадковий елемент спискуchas()zatrymka(seconds)
drukuvaty chas()
drukuvaty vypadkovo(10)
drukuvaty vypadkovo(5, 10)
drukuvaty vypadkovo([10, 20, 30])
chas() повертає час у секундах як число. zatrymka(x) призупиняє виконання.
Kolory
kolor(name, value) повертає ANSI-рядок для кольорового друку.
drukuvaty kolor("red", "uvaha")
drukuvaty kolor("bright_cyan", 123)
Назва кольору має бути рядком. Якщо термінал не підтримує ANSI або NO_COLOR увімкнений, колір може не відобразитися.
Доступні назви кольорів:
black,red,green,yellow,blue,magenta,cyan,whitebright_black,bright_red,bright_green,bright_yellowbright_blue,bright_magenta,bright_cyan,bright_white
Importy
Імпорт у Piton робиться через vykorystaty.
Import za ryadkom
vykorystaty "hello"
hello.Hello("svit")
Import za identyfikatorom
vykorystaty hello
hello.Hello("svit")
Інтерпретатор доповнює шлях суфіксом .piton, виконує файл і створює модульне оточення.
Yak tse pratsyuye
Після імпорту:
- модуль доступний під своїм ім’ям, наприклад
hello.Hello(...) - функції з модуля також можуть потрапити в глобальний простір, якщо там ще немає такого імені
Pryklad iz repozytoriyu
Файл examples/vykorystaty-demo.piton імпортує локальний файл hello.piton із тієї ж директорії і звертається до функцій через модуль:
vykorystaty hello
functia Hi():
drukuvaty "this is MY HI FUNCTIA"
hello.Hello("world")
hello.Hi("world!")
Hi()
Obmezhennya
- шлях імпорту доповнюється
.piton - модульний механізм простий: це не пакетний менеджер і не ізольована система namespace-ів
- якщо файл не читається, інтерпретатор надрукує помилку читання
Vizualizator
Piton уміє не тільки виконувати код, а й будувати SVG-блок-схеми.
Komandy
./piton -draw ./main.piton
./piton -all ./main.piton
./piton -draw -split ./main.piton
./piton -draw -target=myFunc ./main.piton
Shcho robyt
- збирає AST програми
- може підтягувати імпортовані модулі
- будує окремі схеми для функцій або загальну схему програми
Це корисно для навчання, рев’ю логіки та демонстрації алгоритмів.
Pryklad: povna skhema prohramy
Нижче - згенерована схема для examples/session-tracker.piton.
Pryklad: skhema proyektu z importamy
Нижче - згенерована схема для examples/vykorystaty-demo.piton, побудована через -all, тобто разом з імпортованим модулем.
Pryklad: okrema funktsiya u split-rezhymi
-split корисний, коли повна схема завелика. Ось окрема функція average із session-tracker:
І ще одна окрема функція deviation:
Koly shcho vykorystovuvaty
-draw- коли працюєш з одним файлом-all- коли хочеш бачити програму разом з імпортами-split- коли функцій багато і потрібні окремі діаграми-target=name- коли треба проаналізувати тільки одну функцію
SVG, які бачиш у цій книжці, згенеровані реальним piton з прикладів репозиторію, а не намальовані вручну.
Piton z Go
Piton можна використовувати як Go-бібліотеку.
Vykonannya kodu
package main
import (
"fmt"
"os"
"github.com/OlexiyOdarchuk/piton/pkg/interpreter"
)
func main() {
code := `
x = 10
y = 20
drukuvaty x + y
`
if err := interpreter.Run(code, os.Stdout); err != nil {
fmt.Println("Pomylka vikonannya:", err)
}
}
Generatsiya SVG z Go
package main
import (
"fmt"
"os"
"github.com/OlexiyOdarchuk/piton/pkg/visualizer"
)
func main() {
code := `
functia main():
drukuvaty "hello"
main()
`
images, err := visualizer.Visualize(code, "", false)
if err != nil {
panic(err)
}
for name, svg := range images {
_ = os.WriteFile(name, svg, 0644)
fmt.Println("saved:", name)
}
}
Це зручно для:
- IDE-утиліт
- навчальних платформ
- генерації схем у CI
- вбудовування Piton як DSL у Go-проєкт
Cookbook
Нижче - короткі рецепти, які часто потрібні при роботі з мовою.
Proitysya po spysku
i = 0
poky i < dovzhyna(items):
drukuvaty items[i]
i = i + 1
Vydalyty element zi spysku
s = [1, 2, 3, 4]
idx = 1
s = dodaty(s[:idx], s[idx + 1:])
drukuvaty s
Dodaty pole do slovnyka
user = {"name": "Piton"}
user["role"] = "admin"
Vydalyty klyuch zi slovnyka
user = {"name": "Piton", "role": "admin"}
delete(user, "role")
Vypadkovyi element zi spysku
options = ["red", "green", "blue"]
drukuvaty vypadkovo(options)
Okruglyty rezultat
pi = 22 / 7
drukuvaty zaokruhlennya(pi, 3)
Rekursyvnyi factorial
functia fact(n):
yaksho n <= 1:
vernuty 1
inackshe:
vernuty n * fact(n - 1)
drukuvaty fact(5)
Onovyty vkladene znachennya
profile = {"settings": {"theme": "light"}}
profile["settings"]["theme"] = "dark"
Pomylky ta Obmezhennya
Piton навмисно повертає нестандартні, “характерні” повідомлення про помилки. Це частина стилю мови.
Типові причини помилок:
- невідоме ім’я змінної
- неправильний тип для оператора
- індекс поза межами списку
- неіснуючий ключ словника
- неправильна кількість аргументів функції
Pryklady sytuatsii
m["missing"]для відсутнього ключа в словникуs[100]для списку з трьох елементівdelete([1, 2], "a")dodaty({"a": 1}, 2)true ta 1
Potochni obmezhennya
- числа всередині інтерпретатора працюють як
float64 - ключі
slovnykмають бути рядками - логічні оператори
ta/aboочікуютьbool dodaty()працює тільки зі спискамиdelete()працює тільки зі словникамиvvidзараз читає число- повноцінного
for-циклу поки немає drukuvaty nilокремого літерала не має, аnilможе з’являтися як внутрішнє значення результату деяких операцій
Якщо документація і реалізація розійшлися, джерелом істини вважається код та тести репозиторію.
Pryklady
У репозиторії вже є готові сценарії, які зручно використовувати як живу документацію:
examples/hello.piton- мінімальний стартexamples/session-tracker.piton- базовий потік програмиexamples/spysok-demo.piton- робота зі спискамиexamples/dodaty-demo.piton- злиття списків і зрізиexamples/slovnyk-demo.piton- словники, вкладені значення,delete()examples/vypadkovo-demo.piton- випадкові значенняexamples/vykorystaty-demo.piton- модулі та імпортиexamples/chas-demo.piton-chas(),zatrymka(), округлення
Rekomendovanyi maršrut
examples/hello.pitonexamples/spysok-demo.pitonexamples/slovnyk-demo.pitonexamples/vykorystaty-demo.pitonexamples/session-tracker.piton
Koryst ne tilky yak demo
Ці файли зручні ще й як тестовий набір для ручної перевірки:
- запуск виконання
- генерація SVG
- перевірка імпортів
- перевірка колекцій та builtins
- швидка звірка документації з реальною поведінкою мови
Для швидкої перевірки будь-якого прикладу:
./piton examples/slovnyk-demo.piton