02. kapitulua: Zure bi lagunik onenak: ridgunc eta stable (Zero YAML fitxategi, hitza emanda)
Badira konpiladore zoragarria duten lengoaiak, baina haien proiektu-sistema zure etsai amorratuenak diseinatua dirudiena: tabuladore ikusezinak dituen 400 lerroko Makefile bat dela, pom.xml amaigabe bat dela, finko begiratzen badiozu funtzionatzeari uzten dion webpack.config.js bat dela...
Ridgunen promesa oso sinple bat egin genion geure buruari lehen egunetik:
"Bi exekutagarri baino ez dira egongo ekosistema osoan (
ridguncetastable), biak Ridgunen bertan idatzita egongo dira, eta proiektuaren konfigurazio-fitxategia (build.rg) Ridgun kode arrunta izango da. Ez JSON, ez YAML, ez TOML, ez asmakizun arrarorik."
Ikus dezagun nola erabiltzen diren.
2.1. ridgunc: Fitxategi solteetarako frankotiratzailea
Esku artean .rg fitxategi bakar bat duzunean eta ideia azkar bat probatu, bere motak aztertu edo exekutagarri bat konpilatu nahi duzunean, zuzenean ridgunc-ekin hitz egiten duzu.
Benetan gogoratu behar dituzun 4 komando baino ez ditu:
# 1. "Honek konpilatzen du ala hanka sartu dut motaren batekin?"
ridgunc check esperimentua.rg
# 2. "Exekutatu oraintxe!" (Konpilatu eta exekutatu kolpe batean)
ridgunc run esperimentua.rg
# 3. "Egidazu eramateko prest dagoen ELF bitar natibo bat"
ridgunc build esperimentua.rg -o nire_programa
# 4. "Atera iezadazu tarteko bytecode artefaktua (.rgc)"
ridgunc compile esperimentua.rg -o esperimentua.rgc
ridgunc check-en superbotere ezkutua
ridgunc check abiarazten duzunean, ez dizu "0 errore" bakarrik esaten. Analizatzaile estatikoak zure funtzio bakoitzerako zein estrategia aukeratu duen ere xuxurlatzen dizu:
InlineSequential: "Funtzio hau txikia eta zuzena da; lerroan exekutatuko dut planifikazio-gainkosturik sartu gabe".LazyStealableTask: "Hemen errekurtsioa edo||grafo paralelo bat dago; prestatu egingo dut beste PUZ nukleo batzuek lana lapurtu ahal izan dezaten behar izanez gero".
ridgunc build-en bisturia (Zergatik zure bitarrek ez duten 20 MB pisatzen)
ridgunc build exekutatzen duzunean, konpiladorea ez da mugatzen inportatu dituzun liburutegietako kode guztia botatzera:
- Zure
mainfuntzioan hasten da eta dei-grafoa zeharkatzen du zein funtzio erabiltzen dituzun benetan ikusteko. 80 funtzioko liburutegi erraldoi bat inportatu baduzu baina 2ri baino ez badiezu deitzen, beste 78ak baztertu egiten dira mihiztatzailea ukitu aurretik ere (Tree-Shaking). - Isats-errekurtsiboak diren funtzio guztiak bilatzen ditu eta 0 pila-byte kontsumitzen dituzten
loopbegizta natibo bihurtzen ditu. - Azken esteka optimizazio globalarekin (fat LTO) pasatzen du eta DWARF arazketa-zaborra garbitzen du, bitar trinko eta zorrotz bat (~350 KB) uzteko.
2.2. stable: Zure proiektua hazten denean eta ordena nahi duzunean
Fitxategi solte bat bikaina da script baterako, baina hainbat modulu, liburutegi partekatu eta test dituzun bezain laster, orkestra-zuzendari bat behar duzu. Hori stable da.
Ridgun proiektu baten karpeta-egiturak ez du misteriorik:
nire-super-tresna/
├── build.rg # Proiektuaren manifestua (Ridgun kodea da!)
├── src/
│ ├── main/
│ │ └── ridgun/
│ │ ├── lib/ # Zure modulu berrerabilgarriak (`import tresnak`)
│ │ └── app/
│ │ └── main.rg # Sarrera-puntua (`main => ()`)
│ └── test/
│ └── ridgun/ # Zure test-bateriak (`test *.rg`)
│ └── test dena.rg
└── target/ # Konpilatutako bitarrak agertzen diren lekua
2.3. build.rg: Inoiz gezurrik esango ez dizun konfigurazio-fitxategia
Zergatik uko egiten diogu YAML edo TOML erabiltzeari Ridgun proiektu bat konfiguratzeko?
YAMLen koskako bi zuriunetan huts egiten duzulako eta ez zarelako konturatzen hedapenak huts egiten duen arte. Aldiz, build.rg Ridgun fitxategi bat denez, mota estatikoak ditu, stable check-etik pasatzen da eta bakarrik lerrokatzen da stable format-ekin:
type ProjectInfo =
name: String
version: String
edition: String
project => ProjectInfo
project = ProjectInfo "nire-super-tresna" "0.1.0" "2026"
source dir => String
source dir = "src/main/ridgun"
test dir => String
test dir = "src/test/ridgun"
target dir => String
target dir = "target"
-- Aukerakoa: aktibatu sinadura eta izenen modu zorrotza (lehenespenez desaktibatuta)
strict mode => Bool
strict mode = True
Eremu bat idaztean huts egiten baduzu, konpiladoreak berak abisatzen dizu. Ezustekorik gabe.
Modu zorrotza (--strict / strict mode = True)
Lehenespenez, bai ridgunc-ek bai stable new edo stable init-ekin sortutako proiektu berriek modu zorrotza desaktibatuta dute askatasun osoz prototipatu ahal izan dezazun. Proiektu baten estilo kanonikoa blindatu nahi duzunean (Ridgunen konpiladorean bertan egiten dugun bezala), --strict pasa diezaiokezu ridgunc-i edo strict mode = True gehitu zure build.rg fitxategian. Modu zorrotzak bi dotorezia-arau eskatzen ditu:
fn ::etaop ::izenak zuriune naturalekin,_gabe: deklarazioek zuriuneak erabili behar dituzte (fn :: kalkulatu zerga, inoiz ezfn :: kalkulatu_zerga).- Balio anitzeko itzulerak zuriunez bereizita
=>ondoren: funtzio edo eragile batek hainbat balio itzultzen dituenean, bere irteera-sinadura=> Int Intedo=> Egoera Intidazten da (inoiz ez=> (Int, Int)parentesiekin edo komekin).
2.4. Zure eguneroko errutina stable-rekin (4 fantastikoak)
Zure proiektuaren barruan lanean ari zarenean, zure egunerokoa lau komandotara murrizten da:
1. stable format — Taldeko estilo-eztabaiden amaiera
stable format
Zure lankideak => aurretik hiru zuriune jartzen dituela eta zuk bat? Berdin dio. stable format exekutatzen duzu eta segundo bat baino gutxiagoan biltegiko .rg fitxategi guztiak Suitzako taula bat bezala lerrokatuta uzten ditu.
2. stable check — Berehalako radarra
stable check
src/main/ridgun/ barruko modulu guztiak zeharkatzen ditu, motak, eraikitzaileak, aritateak eta tentsore-dimentsioak egiaztatzen ditu, eta epaia ematen dizu moduluz modulu.
3. stable test — Gauez lasai lo egitea
stable test
src/test/ridgun/test *.rg suite guztiak bilatzen ditu, exekutatzen ditu eta assert equals zein assert true bakoitza egiaztatzen du.
-- src/test/ridgun/test matematika.rg adibidea
import test
bikoitza Int => Int
bikoitza x = x * 2
main => ()
main =
assert equals (bikoitza 21) 42
assert true ((bikoitza 5) > 0)
4. stable built (eta stable clean) — Ekoizpenera
stable built
Helburu natibo guztiak target/ karpetan konpilatzen ditu. Eta egunen batean target/ ezabatu eta garbi hasi nahi baduzu: stable clean.
2.5. Nola inportatzen dut fitxategi bat beste batetik? (import)
../../../lib/gauzak.rg moduko bide erlatibo infernuzkorik gabe. src/main/ridgun/lib/kateak.rg fitxategi bat baduzu, beste edozein fitxategitan goi-goian hau idazten duzu:
import kateak
Eta kitto: kateak.rg-ko funtzio eta mota guztiak eskuragarri daude zure fitxategian bertan baleude bezala. Eta zer gertatzen da A moduluak import kateak egiten badu, B moduluak ere import kateak egiten badu, eta zure main.rg-k A eta B inportatzen baditu? Lasai: Ridgunen kargatzaileak gogoratzen du zein fitxategi kanoniko irakurri dituen dagoeneko eta behin bakarrik sartzen du.
Orain tresna-kutxa kontrolpean duzula, pasa gaitezen 03. kapitulura funtzioak, motak, blokeak eta testu-kateekin egiteko trikimailuak menderatzeko.