Skip to content
Ridgun
English

Ridgun

The language itself: a compiler that compiles itself, the stable project tool, the specification and the book

02-lehen-urratsak-eta-tresnak.md159 lines · 7.6 KBRaw
1# 02. kapitulua: Zure bi lagunik onenak: `ridgunc` eta `stable` (Zero YAML fitxategi, hitza emanda)
2
3Badira 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...
4
5Ridgunen promesa oso sinple bat egin genion geure buruari lehen egunetik:
6
7> *"Bi exekutagarri baino ez dira egongo ekosistema osoan (`ridgunc` eta `stable`), 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."*
8
9Ikus dezagun nola erabiltzen diren.
10
11---
12
13## 2.1. `ridgunc`: Fitxategi solteetarako frankotiratzailea
14
15Esku 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.
16
17Benetan gogoratu behar dituzun 4 komando baino ez ditu:
18
19```bash
20# 1. "Honek konpilatzen du ala hanka sartu dut motaren batekin?"
21ridgunc check esperimentua.rg
22
23# 2. "Exekutatu oraintxe!" (Konpilatu eta exekutatu kolpe batean)
24ridgunc run esperimentua.rg
25
26# 3. "Egidazu eramateko prest dagoen ELF bitar natibo bat"
27ridgunc build esperimentua.rg -o nire_programa
28
29# 4. "Atera iezadazu tarteko bytecode artefaktua (.rgc)"
30ridgunc compile esperimentua.rg -o esperimentua.rgc
31```
32
33### `ridgunc check`-en superbotere ezkutua
34`ridgunc check` abiarazten duzunean, ez dizu *"0 errore"* bakarrik esaten. Analizatzaile estatikoak zure funtzio bakoitzerako zein estrategia aukeratu duen ere xuxurlatzen dizu:
35- **`InlineSequential`**: *"Funtzio hau txikia eta zuzena da; lerroan exekutatuko dut planifikazio-gainkosturik sartu gabe"*.
36- **`LazyStealableTask`**: *"Hemen errekurtsioa edo `||` grafo paralelo bat dago; prestatu egingo dut beste PUZ nukleo batzuek lana lapurtu ahal izan dezaten behar izanez gero"*.
37
38### `ridgunc build`-en bisturia (Zergatik zure bitarrek ez duten 20 MB pisatzen)
39`ridgunc build` exekutatzen duzunean, konpiladorea ez da mugatzen inportatu dituzun liburutegietako kode guztia botatzera:
401. Zure `main` funtzioan 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*).
412. Isats-errekurtsiboak diren funtzio guztiak bilatzen ditu eta **0 pila-byte** kontsumitzen dituzten `loop` begizta natibo bihurtzen ditu.
423. Azken esteka optimizazio globalarekin (*fat LTO*) pasatzen du eta DWARF arazketa-zaborra garbitzen du, bitar trinko eta zorrotz bat (~350 KB) uzteko.
43
44---
45
46## 2.2. `stable`: Zure proiektua hazten denean eta ordena nahi duzunean
47
48Fitxategi solte bat bikaina da script baterako, baina hainbat modulu, liburutegi partekatu eta test dituzun bezain laster, orkestra-zuzendari bat behar duzu. Hori **`stable`** da.
49
50Ridgun proiektu baten karpeta-egiturak ez du misteriorik:
51
52```text
53nire-super-tresna/
54├── build.rg # Proiektuaren manifestua (Ridgun kodea da!)
55├── src/
56│ ├── main/
57│ │ └── ridgun/
58│ │ ├── lib/ # Zure modulu berrerabilgarriak (`import tresnak`)
59│ │ └── app/
60│ │ └── main.rg # Sarrera-puntua (`main => ()`)
61│ └── test/
62│ └── ridgun/ # Zure test-bateriak (`test *.rg`)
63│ └── test dena.rg
64└── target/ # Konpilatutako bitarrak agertzen diren lekua
65```
66
67---
68
69## 2.3. `build.rg`: Inoiz gezurrik esango ez dizun konfigurazio-fitxategia
70
71Zergatik uko egiten diogu YAML edo TOML erabiltzeari Ridgun proiektu bat konfiguratzeko?
72YAMLen 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:
73
74```ridgun
75type ProjectInfo =
76 name: String
77 version: String
78 edition: String
79
80project => ProjectInfo
81project = ProjectInfo "nire-super-tresna" "0.1.0" "2026"
82
83source dir => String
84source dir = "src/main/ridgun"
85
86test dir => String
87test dir = "src/test/ridgun"
88
89target dir => String
90target dir = "target"
91
92-- Aukerakoa: aktibatu sinadura eta izenen modu zorrotza (lehenespenez desaktibatuta)
93strict mode => Bool
94strict mode = True
95```
96
97Eremu bat idaztean huts egiten baduzu, konpiladoreak berak abisatzen dizu. Ezustekorik gabe.
98
99### Modu zorrotza (`--strict` / `strict mode = True`)
100Lehenespenez, 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:
1011. **`fn ::` eta `op ::` izenak zuriune naturalekin, `_` gabe**: deklarazioek zuriuneak erabili behar dituzte (`fn :: kalkulatu zerga`, inoiz ez `fn :: kalkulatu_zerga`).
1022. **Balio anitzeko itzulerak zuriunez bereizita `=>` ondoren**: funtzio edo eragile batek hainbat balio itzultzen dituenean, bere irteera-sinadura `=> Int Int` edo `=> Egoera Int` idazten da (inoiz ez `=> (Int, Int)` parentesiekin edo komekin).
103
104---
105
106## 2.4. Zure eguneroko errutina `stable`-rekin (4 fantastikoak)
107
108Zure proiektuaren barruan lanean ari zarenean, zure egunerokoa lau komandotara murrizten da:
109
110### 1. `stable format` — Taldeko estilo-eztabaiden amaiera
111```bash
112stable format
113```
114Zure 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.
115
116### 2. `stable check` — Berehalako radarra
117```bash
118stable check
119```
120`src/main/ridgun/` barruko modulu guztiak zeharkatzen ditu, motak, eraikitzaileak, aritateak eta tentsore-dimentsioak egiaztatzen ditu, eta epaia ematen dizu moduluz modulu.
121
122### 3. `stable test` — Gauez lasai lo egitea
123```bash
124stable test
125```
126`src/test/ridgun/test *.rg` suite guztiak bilatzen ditu, exekutatzen ditu eta `assert equals` zein `assert true` bakoitza egiaztatzen du.
127
128```ridgun
129-- src/test/ridgun/test matematika.rg adibidea
130import test
131
132bikoitza Int => Int
133bikoitza x = x * 2
134
135main => ()
136main =
137 assert equals (bikoitza 21) 42
138 assert true ((bikoitza 5) > 0)
139```
140
141### 4. `stable built` (eta `stable clean`) — Ekoizpenera
142```bash
143stable built
144```
145Helburu natibo guztiak `target/` karpetan konpilatzen ditu. Eta egunen batean `target/` ezabatu eta garbi hasi nahi baduzu: `stable clean`.
146
147---
148
149## 2.5. Nola inportatzen dut fitxategi bat beste batetik? (`import`)
150
151`../../../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:
152
153```ridgun
154import kateak
155```
156
157Eta 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**.
158
159Orain tresna-kutxa kontrolpean duzula, pasa gaitezen **03. kapitulura** funtzioak, motak, blokeak eta testu-kateekin egiteko trikimailuak menderatzeko.