Jak działa Junexis
Junexis to eksperymentalny język i zestaw narzędzi do opisywania systemów, których części działają w różnych miejscach: na urządzeniu, serwerze i w interfejsie użytkownika. W jednym projekcie autor określa zadania, dane, połączenia i miejsca wykonania. Narzędzia sprawdzają ten opis i w obsługiwanym zakresie tworzą kod dla wybranych środowisk.
Jaki problem rozwiązujemy
Wyobraź sobie magazyn z czujnikiem temperatury. Urządzenie wysyła pomiary, serwer sprawdza próg alarmowy, a panel pokazuje człowiekowi stan magazynu. Te trzy części mogą być napisane w różnych językach i uruchamiane osobno. Mimo to muszą tak samo rozumieć pomiar, alarm i brak połączenia.
Gdy opis każdej części znajduje się gdzie indziej, trudniej odpowiedzieć:
- kto wytwarza dane i kto ich potrzebuje,
- czy obie strony połączenia rozumieją ten sam typ danych,
- gdzie podejmowana jest decyzja,
- co trzeba zbudować dla urządzenia, serwera i panelu,
- jak sprawdzić, co wydarzyło się podczas działania systemu.
Junexis pozwala zapisać zadania i ich połączenia we wspólnym modelu projektu. Dzięki temu kompilator może sprawdzić obsługiwane kontrakty przed uruchomieniem, a narzędzia mogą korzystać z tego samego obrazu systemu.
Jeden przykład: temperatura w magazynie
flowchart LR
SENSOR["Urządzenie<br/>odczytaj temperaturę"] -->|"pomiar"| RULE["Serwer<br/>sprawdź próg alarmowy"]
RULE -->|"stan i alarm"| PANEL["Interfejs<br/>pokaż stan magazynu"]
W projekcie opisujesz znaczenie pomiaru, odpowiedzialność każdego zadania i przepływ informacji. Wskazujesz również, które zadanie ma działać na urządzeniu, które na serwerze, a które w interfejsie.
Wynikiem budowania są pliki przeznaczone dla tych środowisk — nazywane dalej artefaktami. W obsługiwanych ścieżkach Junexis generuje C++ dla urządzenia, Go dla serwera i TypeScript dla interfejsu. Zbudowanie artefaktów oraz ich uruchomienie wymagają odpowiednich narzędzi i konfiguracji środowiska.
Wspólny model pomaga zachować zgodność części systemu. Nie usuwa opóźnień sieci, awarii urządzeń ani potrzeby sprawdzania działania całości.
Kiedy warto przyjrzeć się Junexis
Punktem wyjścia są systemy, w których kilka niezależnych części wymienia dane i wspólnie realizuje cel: monitoring, telemetria, inteligentny dom albo panel nadzorujący urządzenia. Junexis pomaga opisać ich odpowiedzialności oraz powiązania przed przejściem do szczegółów poszczególnych środowisk.
Obecny zakres
Junexis jest projektem eksperymentalnym. Istnieją wykonywalne scenariusze generowania, pakowania i lokalnego uruchamiania, ale obsługa konstrukcji języka i integracji zależy od środowiska docelowego. Opis możliwości platformy nie oznacza, że każde połączenie urządzenia, serwera i interfejsu jest już obsługiwane ani gotowe do użycia produkcyjnego.
Przykład podziału odpowiedzialności
Junexis nie narzuca jednej architektury ani jednego modelu mentalnego. Model dobieramy do rzeczywistych zadań i relacji w systemie. Nie każdy system potrzebuje centralnego serwera decyzyjnego lub interfejsu dla człowieka.
Przykład magazynu można zrozumieć przez model Producer–Controller–Presenter:
flowchart LR
P["Producer<br/>dane"] --> C["Controller<br/>decyzje i stan"]
C --> V["Presenter<br/>obraz dla człowieka"]
V -.->|"intencja"| C
W tym przykładzie mapowanie to @embedded → @server → @report. Jest to
ilustracja odpowiedzialności, nie wymagany układ ani obowiązkowy etap
projektowania. Obsługę konkretnej topologii trzeba sprawdzić w możliwościach
wybranych środowisk wykonania.
Droga programu
flowchart LR
A["Kod .jnx"] --> B["Parser i semantyka"]
B --> C["Model systemu"]
C --> D["Generowanie artefaktów"]
D --> E["Urządzenie / serwer / interfejs"]
E --> F["Dowody wykonania"]
1. Opis
Pliki .jnx definiują typy danych, zadania i potoki wykonania. Adnotacje takie jak
@embedded, @server i @report wskazują środowisko wykonania.
2. Sprawdzenie
Kompilator buduje strukturę programu, sprawdza typy i wykrywa niepoprawne
połączenia. junexis check kończy pracę na tym etapie.
3. Model systemu
Analiza zachowuje symbole, relacje i topologię programu w maszynowo czytelnej postaci. Dzięki temu Studio i inne narzędzia widzą ten sam system co kompilator.
4. Artefakty
junexis build wybiera generator odpowiedni dla środowiska docelowego. Obecny zestaw narzędzi
generuje ograniczone, ale wykonywalne ścieżki C++, Go i TypeScript. Zakres
zależy od konstrukcji użytych w programie.
5. Wykonanie i wyjaśnienie
Środowisko wykonawcze uruchamia wygenerowany kod. Narrative zbiera ślady potrzebne do odpowiedzi na pytanie „dlaczego system znalazł się w tym stanie?”, a Observability porządkuje sygnały techniczne i operacyjne.
Od źródła do paczki
flowchart TB
SRC["src/main.jnx"] --> AST["Struktura programu"]
AST --> IR["Model pośredni"]
IR --> TOP["Topologia zadań i połączeń"]
TOP --> GEN{"Generator środowiska docelowego"}
GEN --> CPP["urządzenie / C++"]
GEN --> GO["serwer / Go"]
GEN --> TS["interfejs / TypeScript"]
CPP --> MAN["Manifest artefaktów"]
GO --> MAN
TS --> MAN
MAN --> PKG["Pakiet systemu"]
Elementy platformy
| Element | Rola |
|---|---|
| Język i kompilator | opis, sprawdzenie i generowanie systemu |
| Środowisko wykonawcze | wykonanie i kontrakty komunikacyjne |
| Studio | edycja, budowanie, uruchamianie i debugowanie |
| Mentor | analiza struktury projektu i wskazówki |
| Narrative | rekonstrukcja przyczyn i przebiegu wykonania |
| Obserwacja systemu | logi, audyt, stan gotowości i korelacja zdarzeń |
| Narzędzia | praca w VS Code, LSP i integracja usług |
| Instalator | przygotowanie i aktualizacja środowiska |
flowchart TB
DEV["Autor systemu"] --> STUDIO["Studio lub VS Code"]
STUDIO --> COMP["Język i kompilator"]
COMP --> RUN["Wykonanie i środowiska docelowe"]
COMP --> MENTOR["Mentor<br/>analiza projektu"]
RUN --> OBS["Obserwacja systemu<br/>log · audyt · gotowość"]
RUN --> NAR["Narrative<br/>historia przyczynowa"]
OBS --> STUDIO
NAR --> STUDIO
MENTOR --> STUDIO
Pętla diagnozy
sequenceDiagram
participant R as Wykonanie
participant O as Observability
participant N as Narrative
participant S as Studio
R->>O: sygnały techniczne i stan
R->>N: zdarzenia z kontekstem wykonania
S->>O: pokaż stan gotowości i logi
O-->>S: bieżący obraz systemu
S->>N: dlaczego to się wydarzyło?
N-->>S: uporządkowana historia przyczyn
Nie trzeba poznawać wszystkich elementów naraz. Pierwszy projekt wymaga tylko kompilatora i Go.
Pełniejszy obraz odpowiedzialności znajduje się w architekturze platformy.