JSON, ki razmišlja: programski jezik znotraj JSON-a
Esej

JSON, ki razmišlja: programski jezik znotraj JSON-a

Osama Alghanmi · 19. februar 2026

Kaj če JSON ne bi bil le zapis podatkov?

Kaj če bi bil programski jezik?

Zgradili smo turingovo poln jezik, ki je strogo podmnožica JSON-a. Brez nove sintakse. Brez lastnega razčlenjevalnika. Vsak program je veljaven JSON.

To je Almadar.


Osnovna zamisel

Leta 1958 je John McCarthy v jeziku Lisp predstavil S-expressions (simbolne izraze):

lisp
1 2 (+ 1 2) (if (> x 10) "big" "small")

S-expression je gnezden seznam, v katerem je prvi element operator.

Tabele v JSON-u so gnezdeni seznami.

json
1 2 ["+", 1, 2] ["if", [">", "x", 10], "big", "small"]

To je vse.

S-expressions se že popolnoma prilegajo v tabele JSON. Namesto da bi izumljali novo sintakso, razlagamo tisto, kar JSON že izraža.


Kako izgleda program Almadar

Program Almadar je sestavljen iz Orbitalov, osnovnih gradnikov sistema.

Vsak Orbital zajema tri osrednje elemente:

  • Entity — podatkovni model
  • Trait — vedenje
  • Page — uporabniški vmesnik

Entity — podatkovni model

Entity določa strukturo podatkov. Deklarira polja, tipe in omejitve.

Je:

  • shema
  • pomnilnik
  • vsebnik stanja

Hrani podatke, nad katerimi deluje sistem.


Trait — vedenje

Trait določa vedenje.

Tehnično je Trait ponovno uporabljiv avtomat stanj, povezan z Entity.

Vsebuje:

  • stanja
  • prehode
  • straže Guards (pogoji, zapisani kot S-expressions)
  • učinke (dejanja, kot sta set in emit, ter druga)

Traits zajemajo logiko in jih je mogoče ponovno uporabiti v več orbitalih. So računsko jedro sistema.


Page — uporabniški vmesnik

Page določa uporabniški vmesnik.

Opisuje:

  • postavitev
  • komponente
  • vezave na polja Entity
  • sprožilce dogodkov

Pages se odzivajo na stanje Entity in pošiljajo dogodke, ki poganjajo Traits.


Primer

json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 { "name": "ApprovalWorkflow", "orbitals": [{ "entity": { "name": "Request", "fields": [ { "name": "amount", "type": "number" }, { "name": "status", "type": "enum", "values": ["pending", "approved", "rejected"] } ] }, "traits": [{ "name": "ApprovalTrait", "linkedEntity": "Request", "stateMachine": { "states": [ { "name": "Pending", "isInitial": true }, { "name": "Approved" }, { "name": "Rejected" } ], "transitions": [{ "from": "Pending", "to": "Approved", "event": "APPROVE", "guard": ["and", [">=", "@user.roleLevel", 3], ["<", "@entity.amount", 10000] ], "effects": [ ["set", "@entity.status", "approved"], ["emit", "REQUEST_APPROVED"] ] }] } }] }] }

Struktura je JSON. Logika so tabele JSON. Izvajanje je determinirano in rekurzivno.


Kaj je Guard?

Guard je pogojni izraz, ki določa, ali se prehod med stanji sme izvesti.

Prehod se sproži samo, če je vrednost njegovega guarda true. Če je vrednost false, je prehod blokiran.

Guards so čisti izrazi, brez stranskih učinkov.


Primer Guarda

json
1 2 3 4 5 6 7 8 9 10 11 12 { "from": "Pending", "to": "Approved", "event": "APPROVE", "guard": ["and", [">=", "@user.roleLevel", 3], ["<", "@entity.amount", 10000] ], "effects": [ ["set", "@entity.status", "approved"] ] }

Ta prehod se izvede samo, če:

  • je stopnja vloge uporabnika vsaj 3
  • je znesek zahtevka manjši od 10.000

Če kateri koli pogoj ni izpolnjen, prehod ne naredi ničesar.


Vrednotenje Guarda

Guards se vrednotijo rekurzivno:

json
1 2 3 4 ["and", [">=", "@user.roleLevel", 3], ["<", "@entity.amount", 10000] ]

Koraki vrednotenja:

  1. razrešitev vezav (@user.roleLevel, @entity.amount)
  2. vrednotenje notranjih izrazov
  3. vrednotenje zunanjega operatorja

Rezultat mora biti logična vrednost (boolean).

Guards lahko uporabljajo:

  • logične operatorje: and, or, not
  • primerjave: =, !=, <, >, <=, >=
  • aritmetiko
  • gnezdene izraze
  • sklice na @entity, @user ali @payload

Pojmovno je guard enakovreden pogoju if za prehod.


Zakaj je to programski jezik

Almadar je turingovo poln, ker ponuja:

  • spremenljivo stanje (polja Entity)
  • determinirane avtomate stanj
  • pogojno logiko
  • učinke (set, emit)
  • samoprehode (zanke)
  • komunikacijo, ki jo poganjajo dogodki

Samoprehod z guardom in posodobitvami stanja je enakovreden zanki while:

json
1 2 3 4 5 6 7 8 9 10 { "from": "Computing", "to": "Computing", "event": "TICK", "guard": [">", "@entity.counter", 0], "effects": [ ["set", "@entity.counter", ["-", "@entity.counter", 1]], ["emit", "TICK"] ] }

Stanje = pomnilnik. Prehodi = potek upravljanja. Izrazi = računanje.

To je popoln računski model.


Predlog

Almadar predlaga preprost premik:

  • Obdržimo JSON.
  • Tabele razlagajmo kot S-expressions.
  • Združimo jih z avtomati stanj za potek upravljanja.
  • Strukturirane podatke in izvedljivo logiko obravnavajmo kot en sistem.

Brez nove slovnice. Brez novih sintaktičnih pravil. Samo strukturirano računanje znotraj najbolj univerzalnega zapisa podatkov na svetu.

JSON je že zmagal.

Zdaj lahko tudi misli.

Prvič objavljeno na Dev.to.

Osama Alghanmi

Znanje je svoboda. Sistemi morajo biti odprti ljudem, ki jim vladajo.

© 2026 Osama Alghanmi. Ljubljana, Slovenija.