Ridgun
The language itself: a compiler that compiles itself, the stable project tool, the specification and the book
| 1 | # 02. kapitulua: Zure bi lagunik onenak: `ridgunc` eta `stable` (Zero YAML fitxategi, hitza emanda) |
| 2 | |
| 3 | 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... |
| 4 | |
| 5 | Ridgunen 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 | |
| 9 | Ikus dezagun nola erabiltzen diren. |
| 10 | |
| 11 | --- |
| 12 | |
| 13 | ## 2.1. `ridgunc`: Fitxategi solteetarako frankotiratzailea |
| 14 | |
| 15 | 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. |
| 16 | |
| 17 | Benetan gogoratu behar dituzun 4 komando baino ez ditu: |
| 18 | |
| 19 | ```bash |
| 20 | # 1. "Honek konpilatzen du ala hanka sartu dut motaren batekin?" |
| 21 | ridgunc check esperimentua.rg |
| 22 | |
| 23 | # 2. "Exekutatu oraintxe!" (Konpilatu eta exekutatu kolpe batean) |
| 24 | ridgunc run esperimentua.rg |
| 25 | |
| 26 | # 3. "Egidazu eramateko prest dagoen ELF bitar natibo bat" |
| 27 | ridgunc build esperimentua.rg -o nire_programa |
| 28 | |
| 29 | # 4. "Atera iezadazu tarteko bytecode artefaktua (.rgc)" |
| 30 | ridgunc 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: |
| 40 | 1. 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*). |
| 41 | 2. Isats-errekurtsiboak diren funtzio guztiak bilatzen ditu eta **0 pila-byte** kontsumitzen dituzten `loop` begizta natibo bihurtzen ditu. |
| 42 | 3. 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 | |
| 48 | 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. |
| 49 | |
| 50 | Ridgun proiektu baten karpeta-egiturak ez du misteriorik: |
| 51 | |
| 52 | ```text |
| 53 | nire-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 | |
| 71 | Zergatik uko egiten diogu YAML edo TOML erabiltzeari Ridgun proiektu bat konfiguratzeko? |
| 72 | 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: |
| 73 | |
| 74 | ```ridgun |
| 75 | type ProjectInfo = |
| 76 | name: String |
| 77 | version: String |
| 78 | edition: String |
| 79 | |
| 80 | project => ProjectInfo |
| 81 | project = ProjectInfo "nire-super-tresna" "0.1.0" "2026" |
| 82 | |
| 83 | source dir => String |
| 84 | source dir = "src/main/ridgun" |
| 85 | |
| 86 | test dir => String |
| 87 | test dir = "src/test/ridgun" |
| 88 | |
| 89 | target dir => String |
| 90 | target dir = "target" |
| 91 | |
| 92 | -- Aukerakoa: aktibatu sinadura eta izenen modu zorrotza (lehenespenez desaktibatuta) |
| 93 | strict mode => Bool |
| 94 | strict mode = True |
| 95 | ``` |
| 96 | |
| 97 | Eremu bat idaztean huts egiten baduzu, konpiladoreak berak abisatzen dizu. Ezustekorik gabe. |
| 98 | |
| 99 | ### Modu zorrotza (`--strict` / `strict mode = True`) |
| 100 | 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: |
| 101 | 1. **`fn ::` eta `op ::` izenak zuriune naturalekin, `_` gabe**: deklarazioek zuriuneak erabili behar dituzte (`fn :: kalkulatu zerga`, inoiz ez `fn :: kalkulatu_zerga`). |
| 102 | 2. **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 | |
| 108 | Zure proiektuaren barruan lanean ari zarenean, zure egunerokoa lau komandotara murrizten da: |
| 109 | |
| 110 | ### 1. `stable format` — Taldeko estilo-eztabaiden amaiera |
| 111 | ```bash |
| 112 | stable format |
| 113 | ``` |
| 114 | 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. |
| 115 | |
| 116 | ### 2. `stable check` — Berehalako radarra |
| 117 | ```bash |
| 118 | stable 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 |
| 124 | stable 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 |
| 130 | import test |
| 131 | |
| 132 | bikoitza Int => Int |
| 133 | bikoitza x = x * 2 |
| 134 | |
| 135 | main => () |
| 136 | main = |
| 137 | assert equals (bikoitza 21) 42 |
| 138 | assert true ((bikoitza 5) > 0) |
| 139 | ``` |
| 140 | |
| 141 | ### 4. `stable built` (eta `stable clean`) — Ekoizpenera |
| 142 | ```bash |
| 143 | stable built |
| 144 | ``` |
| 145 | Helburu 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 |
| 154 | import kateak |
| 155 | ``` |
| 156 | |
| 157 | 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**. |
| 158 | |
| 159 | Orain tresna-kutxa kontrolpean duzula, pasa gaitezen **03. kapitulura** funtzioak, motak, blokeak eta testu-kateekin egiteko trikimailuak menderatzeko. |