Przejdź do treści

KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ

Od grafu do wykonania KretS

INTERMEDIATE30 min
Postęp nauki 0 / 3
Zaloguj się na konto użytkownika, aby zachować postęp.

Czego się nauczysz

  • Prześledź źródła i wyjaśnij opisany kontrakt.
  • Prześledź FlowExecutedAsKretS i wskaż dowód wygenerowania oraz dowód wykonania.
Wymagania wstępne
  • Ukończ Podstawy i wcześniejszy poziom tej ścieżki.

Wyjaśnienie krok po kroku

Po poprawnej walidacji grafu kompilacja i wykonanie stosują limity tej samej maszyny KretS. Wygenerowana funkcja nie uzyskuje szerszego dostępu niż ręcznie napisany kod. Rozdziel poprawność IR, generację źródła i wynik uruchomienia.

Praca z kodem źródłowym

Wykonanie przepływu w pluginie (Flow → KretS)

Oficjalna ścieżka wykonania KretFlow: kod KretS wygenerowany z grafu (`kret flow to-krets`) jest modułem `Restock` pluginu, a `Main.Start` go wywołuje. Wykonanie odbywa się w izolowanym procesie pluginu, z tymi samymi uprawnieniami i limitami co każdy kod KretS. Dodatkowo `kret flow run … --module` wykonuje graf w procesie narzędzia (host pozwala tylko na dziennik).

{
  "format": "kretflow-ir/2",
  "name": "Restock",
  "variables": [
    { "name": "stock", "type": "Int64", "initial": "2" },
    { "name": "ordered", "type": "Int64", "initial": "0" },
    { "name": "cost", "type": "Int64", "initial": "0" },
    { "name": "note", "type": "String", "initial": "\"\"" }
  ],
  "nodes": [
    { "id": "start", "kind": "trigger", "event": "stock.low", "position": { "x": 40, "y": 40 } },
    { "id": "enough", "kind": "loop", "expression": "stock < 10", "position": { "x": 200, "y": 40 } },
    { "id": "order", "kind": "assign", "variable": "ordered", "expression": "ordered + 4", "position": { "x": 360, "y": 0 } },
    { "id": "deliver", "kind": "assign", "variable": "stock", "expression": "stock + 4", "position": { "x": 520, "y": 0 } },
    { "id": "price", "kind": "action", "variable": "cost", "call": "Orders.price", "arguments": ["ordered"], "position": { "x": 360, "y": 120 } },
    { "id": "large", "kind": "condition", "expression": "cost > 100", "position": { "x": 520, "y": 120 } },
    { "id": "big", "kind": "assign", "variable": "note", "expression": "\"duże zamówienie\"", "position": { "x": 680, "y": 80 } },
    { "id": "small", "kind": "assign", "variable": "note", "expression": "\"zwykłe zamówienie\"", "position": { "x": 680, "y": 160 } },
    { "id": "say", "kind": "action", "call": "log.info", "arguments": ["note + \": \" + toString(ordered) + \" szt.\""], "position": { "x": 840, "y": 120 } },
    { "id": "done", "kind": "end", "expression": "note + \", sztuk: \" + toString(ordered) + \", koszt: \" + toString(cost)", "position": { "x": 1000, "y": 120 } }
  ],
  "edges": [
    { "from": "start", "port": "next", "to": "enough" },
    { "from": "enough", "port": "body", "to": "order" },
    { "from": "order", "port": "next", "to": "deliver" },
    { "from": "deliver", "port": "next", "to": "enough" },
    { "from": "enough", "port": "done", "to": "price" },
    { "from": "price", "port": "next", "to": "large" },
    { "from": "large", "port": "true", "to": "big" },
    { "from": "large", "port": "false", "to": "small" },
    { "from": "big", "port": "next", "to": "say" },
    { "from": "small", "port": "next", "to": "say" },
    { "from": "say", "port": "next", "to": "done" }
  ]
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. "format": "kretflow-ir/2",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  3. "name": "Restock",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  4. "variables": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  5. { "name": "stock", "type": "Int64", "initial": "2" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. { "name": "ordered", "type": "Int64", "initial": "0" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. { "name": "cost", "type": "Int64", "initial": "0" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. { "name": "note", "type": "String", "initial": "\"\"" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  9. ],Zamknięcie struktury otwartej we wcześniejszych liniach.
  10. "nodes": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  11. { "id": "start", "kind": "trigger", "event": "stock.low", "position": { "x": 40, "y": 40 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  12. { "id": "enough", "kind": "loop", "expression": "stock < 10", "position": { "x": 200, "y": 40 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  13. { "id": "order", "kind": "assign", "variable": "ordered", "expression": "ordered + 4", "position": { "x": 360, "y": 0 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  14. { "id": "deliver", "kind": "assign", "variable": "stock", "expression": "stock + 4", "position": { "x": 520, "y": 0 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  15. { "id": "price", "kind": "action", "variable": "cost", "call": "Orders.price", "arguments": ["ordered"], "position": { "x": 360, "y": 120 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  16. { "id": "large", "kind": "condition", "expression": "cost > 100", "position": { "x": 520, "y": 120 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  17. { "id": "big", "kind": "assign", "variable": "note", "expression": "\"duże zamówienie\"", "position": { "x": 680, "y": 80 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  18. { "id": "small", "kind": "assign", "variable": "note", "expression": "\"zwykłe zamówienie\"", "position": { "x": 680, "y": 160 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  19. { "id": "say", "kind": "action", "call": "log.info", "arguments": ["note + \": \" + toString(ordered) + \" szt.\""], "position": { "x": 840, "y": 120 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  20. { "id": "done", "kind": "end", "expression": "note + \", sztuk: \" + toString(ordered) + \", koszt: \" + toString(cost)", "position": { "x": 1000, "y": 120 } }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  21. ],Zamknięcie struktury otwartej we wcześniejszych liniach.
  22. "edges": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  23. { "from": "start", "port": "next", "to": "enough" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  24. { "from": "enough", "port": "body", "to": "order" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  25. { "from": "order", "port": "next", "to": "deliver" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  26. { "from": "deliver", "port": "next", "to": "enough" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  27. { "from": "enough", "port": "done", "to": "price" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  28. { "from": "price", "port": "next", "to": "large" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  29. { "from": "large", "port": "true", "to": "big" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  30. { "from": "large", "port": "false", "to": "small" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  31. { "from": "big", "port": "next", "to": "say" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  32. { "from": "small", "port": "next", "to": "say" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  33. { "from": "say", "port": "next", "to": "done" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  34. ]Zamknięcie struktury otwartej we wcześniejszych liniach.
  35. }Zamknięcie struktury otwartej we wcześniejszych liniach.

Oczekiwany wynik: „duże zamówienie, sztuk: 8, koszt: 120” w obu ścieżkach; `flow run` zwraca też status `Completed` i listę odwiedzonych bloków.

Typowy błąd: `kret flow run` bez `--module`: funkcje KretS projektu nie są dowiązane (`KCS-FLW-0013`, znane ograniczenie SDK-D01).

Instrukcja, wersje i zapisane wyniki →

Materiały źródłowe do tego tematu

Przeczytaj powiązane rozdziały. Kod i kontrakty zachowano z importu; historia źródeł jest dostępna przy każdym rozdziale.

KretFlow — API / CLI

KretFlow — API / CLI

Polski

API / polecenieOpis
kret flow to-krets <plik.kflow>graf → KretS (każdy wiersz // @flow id)
kret flow from-krets <plik.krs> --previous <plik.kflow> -o <wynik> [--force]KretS → graf z zachowaniem położeń
kret flow run <plik.kflow> --module <Script/X.krs>wykonanie w narzędziu (host tylko z dziennikiem); bez --module → KCS-FLW-0013 (SDK-D01)
kret flow blockskatalog bloków kretflow-blocks/1 (EXPERIMENTAL)
FlowCompiler / FlowRuntime / FlowHost / FlowDebugSession (C#)kompilacja, wykonanie (stany Completed Failed Cancelled LimitExceeded NoCheckpoint), rejestr, debugowanie bloków
Otwórz cały rozdział ze źródłem →
KretFlow — specyfikacja (zakres kontraktu 1.0)

KretFlow — specyfikacja (zakres kontraktu 1.0)

Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: kretflow-ir/2. Status języka nie nadaje uprawnień KCS ani prawa do działania w Production.

Źródła normatywne (kopie w Sources/, kolejność pierwszeństwa: decyzje właściciela → zamrożony kontrakt → kod SDK → testy):

  • LANGUAGE_FREEZE_1_0/06_KRETFLOW_SPECIFICATION.md
  • SDK 04_Languages/KretFlow/SPEC.md

Elementy języka

ElementStan w KretFlow
Struktura plikuJSON: format, name, variables[], nodes[], edges[] (from, port, to).
Rozszerzenie.kflow.
Komentarzebrak (JSON).
Typy zmiennychBool Int64 Float64 String; wartość początkowa = wyrażenie KretS.
Warunki / pętlebloki condition (true/false) i loop (body/done).
Funkcjeblok action wywołuje funkcję KretS (call, arguments, variable).
Limity1000 bloków, 4000 krawędzi, 256 zmiennych, 16 KiB tekstu w polu, 32 argumenty; wykonanie: 10 000 odwiedzonych bloków.

Zakres poza kontraktem / ograniczenia

  • przepływy równoległe i podprzepływy (nie istnieją)
  • wyzwalacze czasowe w dokumencie (harmonogram po stronie hosta)
  • zmienne typu lista/rekord
  • oczekiwanie osobnego FlowRuntime w Core
  • kretflow-ir/2 FROZEN_SUPPORTED_SUBSET; zmiana łamiąca → kretflow-ir/3.
  • Nowy blok = zmiana MINOR (polityka języka).
  • sdk-info: syntax: PROVISIONAL — rozbieżność z freeze.

Pełna referencja konstrukcji: SYNTAX_REFERENCE.md.

Otwórz cały rozdział ze źródłem →
KretFlow — samouczek INTERMEDIATE

KretFlow — samouczek INTERMEDIATE

Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: kretflow-ir/2. Status języka nie nadaje uprawnień KCS ani prawa do działania w Production.

Cel: moduły, łączenie funkcji, dane, konfiguracja, komunikacja, obsługa błędów, interfejsy SDK.

Narzędzia: kret = <SDK>\Compiler\kret.exe (SDK 1.0.0-rc.3+kret.local.3), kretui-host = <SDK>\UiHost\kretui-host.exe. {DATA}/{OUT} = nowe, puste katalogi.

1. Wykonanie przepływu w pluginie (Flow → KretS) (KRETFLOW-I01-FlowExecutedAsKretS)

Projekt: ../../Examples/INTERMEDIATE_FlowExecutedAsKretS/ · klasyfikacja RUNNABLE_LOCAL · Playground LOCAL_EXECUTE

Kroki (katalog roboczy: katalog przykładu):

  1. kret check . --json — w wyniku: "succeeded": true
  2. kret run . --policy host-policy.json --data {DATA} — w wyniku: koszt: 120
  3. kret flow run Flow/Restock.kflow --module Script/Orders.krs — w wyniku: Completed

Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.

Otwórz cały rozdział ze źródłem →

Ćwiczenie i sprawdzenie wiedzy

Prześledź FlowExecutedAsKretS i wskaż dowód wygenerowania oraz dowód wykonania.

Szkic nie jest wysyłany na serwer i znika po opuszczeniu lekcji. Przed wyjściem możesz go skopiować.
Podpowiedzi
  • KretFlow zapisuje logikę jako graf bloków (JSON, `kretflow-ir/2`). **Nie ma osobnego silnika przepływów**: graf jest obniżany do automatu stanów w KretS, kompilowany zwykłym kompilatorem i wykonywany przez tę samą maszynę, z tymi samymi uprawnieniami i limitami. Nazwa „KretFollow” nie występuje w żadnym źródle — to literówka, nie nazwa historyczna.
  • Odczytaj ograniczenia i oczekiwane błędy z dostarczonego samouczka; check i run są oddzielnymi krokami.
Omówienie rozwiązania

Odpowiedź oprzyj na pokazanym kodzie i rozdziale źródłowym. Po poprawnej walidacji grafu kompilacja i wykonanie stosują limity tej samej maszyny KretS. Wygenerowana funkcja nie uzyskuje szerszego dostępu niż ręcznie napisany kod. Rozdziel poprawność IR, generację źródła i wynik uruchomienia.

Które podsumowanie jest zgodne z lekcją?

To quiz o opisanym kontrakcie. Nie kompiluje kodu, nie potwierdza wykonania programu i nie przyznaje nagród.

Podsumowanie i następny krok

Po poprawnej walidacji grafu kompilacja i wykonanie stosują limity tej samej maszyny KretS. Wygenerowana funkcja nie uzyskuje szerszego dostępu niż ręcznie napisany kod. Rozdziel poprawność IR, generację źródła i wynik uruchomienia.

Zaloguj się na konto użytkownika, aby zapisywać postęp i zakładki. Konta obsługi mogą czytać bez zapisu postępu. Logowanie →

Wybierz, co możemy zapamiętać w tej przeglądarce. Możesz zmienić decyzję w każdej chwili.

Polityka prywatności