Skip to content
Ridgun
English

Ridgun

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

00-zergatik-behar-dut-ridgun.md133 lines · 8.4 KBRaw
1# 00. kapitulua: Zergatik behar dut Ridgun? Bai, ala? Ez nekien ba... Kontaidazu gehiago!
2
3Izan gaitezen zintzoak: norbaitek *"programazio-lengoaia berri bat sortu dugu"* esaten dizunean, zure lehen erreakzio naturala —eta oso osasuntsua— bekaina altxatzea eta honako hau pentsatzea da:
4
5> *"Beste bat? Baina dagoeneko badut Python azkar ibiltzeko, Rust edo C abiadura behar dudanerako, eta Bash terminalean gauzak lotzeko. Zertarako arraio behar dut nik Ridgun ikasi?"*
6
7Galdera bikaina da. Eta erantzun laburra hauxe da: **eguneroko hiru min jasatera ohitu zarelako, saihestezinak zirela pentsatuz**.
8
9Jar diezaiegun izena.
10
11---
12
13## 1. mina: "Bi munduen sindromea" (Batean prototipatu, bestean berridatzi)
14
15Ziur film hau bizi izan duzula:
16
171. Tresna bat edo kalkulu-motor bat **Python**, **JavaScript** edo **Ruby** lengoaian hasten duzu, arazoan pentsatu nahi duzulako, ez erakusleetan edo konpiladorean.
182. Kodea laburra eta polita geratzen da... baina 500 MB-ko fitxategi bat pasatzen diozunean edo zure makinaren 16 nukleoak erabiltzen saiatzen zarenean, herrestan dabil. Eta zure programa zerbitzari garbi batera banatu nahi baduzu, ingurune birtual, interpretatzaile eta liburutegi dinamikoz osatutako gigabyte erdi bat paketatu behar duzu.
193. Etsita, **C**, **C++** edo **Rust** lengoaian berridaztea erabakitzen duzu. Orain hegan egiten du eta ehunka kilobyte gutxi batzuk baino ez ditu hartzen, baina zure 40 lerroko kodea `unwrap()`, `&mut`, `'a`, `Arc<Mutex<...>>`, giltza `{}` eta puntu eta komaz `;` betetako 300 lerro bihurtu da.
20
21**Zer aldatzen da Ridgunekin?**
22Ridgunen **Pythonen baino kode laburragoa eta garbiagoa** idazten duzu, baina `ridgunc build` exekutatzen duzunean, **~350 KB-ko ELF bitar natibo bakar bat** lortzen duzu, interpretatzailerik gabe, kanpoko makina birtualik gabe eta zabor-biltzailerik gabe. Ez dago *"gero lengoaia azkarrean berridatziko dugu"* faserik: arazoa pentsatzen duzun kode garbia **bada dagoeneko** ekoizpeneko bitar natiboa.
23
24---
25
26## 2. mina: "Inoren kodea (edo duela 6 hilabeteko zurea) irakurtzea detektibe izatera jolastea da"
27
28Begira nola idazten dugun baldintzazko logika ia lengoaia nagusi guztietan:
29
30```text
31if (egoera == AKTIBO && (rola == ADMIN || (rola == EDITOREA && baimenaDu))) {
32 if (kuota > 0) {
33 return prozesatu(erabiltzailea);
34 } else {
35 return ukatu("Kuotarik gabe");
36 }
37} else {
38 return ukatu("Baimenik gabe");
39}
40```
41
42Gure begiek ez zuten eboluzionatu habiaratutako giltzak parekatzeko, ezta mailakatutako `if / else` zuhaitzak askatzeko ere. Ingeniariek, matematikariek edo fisikariek arau konplexuak hutsegiterik gabe ulertu nahi dituztenean, ez dituzte `if / else` paragrafoak idazten: **taula bat marrazten dute**.
43
44Ridgunen, **kodea taula hori bera da**:
45
46```ridgun
47baimendu String String Bool Int => String
48baimendu "aktibo" "admin" _ kuota =
49 | kuota > 0 = "Eskaera prozesatzen"
50 | otherwise = "Ukatua: kuotarik gabe"
51baimendu "aktibo" "editorea" True kuota =
52 | kuota > 0 = "Eskaera prozesatzen"
53 | otherwise = "Ukatua: kuotarik gabe"
54baimendu _ _ _ _ = "Ukatua: baimenik gabe"
55```
56
57Begira zutabeei:
58- 1. zutabea: egoera (`"aktibo"` edo `_`).
59- 2. zutabea: rola (`"admin"`, `"editorea"` edo `_`).
60- 3. zutabea: baimena duen (`True` edo `_`).
61- 4. zutabea: `kuota`.
62
63Ez duzu programa buruz lerroz lerro exekutatu behar `False` baimena duen `"editorea"` bat sartzen denean zer gertatzen den jakiteko: zureek begiek bertikalki egiten dute behera taulan eta segundo erdian ikusten dute.
64
65---
66
67## 3. mina: "Nire ordenagailuak 16 nukleo ditu, baina nire programak 1 baino ez du erabiltzen (hariak ukitzeak izua ematen didalako)"
68
69Gaur egun telefonorik xumeenak ere 8 nukleo ditu, eta edozein zerbitzarik edo laneko eramangarrik 12 eta 32 artean. Hala ere, eguneroko programen % 95ek hari sekuentzial bakarrean exekutatzen jarraitzen dute.
70
71Zergatik? Lengoaia inperatiboetan paralelizatu nahi izateak Pandoraren kutxa irekitzea esan nahi duelako:
72- Eta bi harik hiztegi bera aldi berean aldatzen badute? (*Data race*).
73- Eta hari batean A `Mutex`-a eta gero B blokeatzen baditut, eta beste batean B eta gero A? (*Deadlock*).
74- Eta nire kode-oinarri osoa goitik behera `async` eta `await`-ez kutsatzen badut?
75
76Ridgunen, **funtzio oro purua da eta datu oro aldaezina lehenespenez**. Horrek ondorio magiko bat du: **elkarren menpe ez dauden bi adierazpenek ezin dute inoiz elkar oztopatu**.
77
78Horregatik, Ridgunen ez duzu haririk kudeatu behar zure PUZa aprobetxatzeko. **Zer zeren menpe dagoen** baino ez duzu adierazten `||` barra paraleloekin eta `->` geziekin:
79
80```ridgun
81hileko txostena Datuak => Txostena
82hileko txostena d = konbinatu sare_metrikak disko_metrikak puz_metrikak
83 || aztertu sarea d -> sare_metrikak
84 || aztertu diskoa d -> disko_metrikak
85 || aztertu puza d -> puz_metrikak
86```
87
88Zuk hiru lerro garbi baino ez dituzu idatzi, datu bakoitza nondik ateratzen den adieraziz. Konpiladoreak ikusten du hiru adarrak independenteak direla eta badaki paraleloan abiarazi ditzakeela *data race* edo *deadlock* bat gertatzeko aukerarik txikiena ere egon gabe.
89
90Eta postontzia eta egoera isolatua duten agente iraunkorrak behar badituzu (adibidez, milaka bezero-saio, bigarren planoko langileak edo sare-konexioak mantentzeko)? Ridgunen ez duzu `Actor` klaserik definitu edo `Mutex`-ik erabili behar: **edozein funtzio arrunt agente autonomo bihurtzen da lerro bakar batean `agent`-ekin**:
91
92```ridgun
93kontagailua = agent (gehitu bisita) 0
94send 1 to kontagailua
95send 5 to kontagailua
96guztira = receive from kontagailua
97stop kontagailua
98```
99
100Gainera, konpiladoreak **aukeraketa adimenduna egiten du konpilazio-garaian**: `||`, `||map`, `||filter` eta `agent` barruko funtzio bakoitzaren sakonera eta kostua estatikoki aztertzen ditu, funtzio arinak zero gainkargako *green-thread* urrats gisa exekutatuz eta kalkulu astun edo errekurtsiboak nukleo anitzeko kerneleko benetako harietara (`SYS_clone`) automatikoki bidaliz.
101
102---
103
104## 4. mina: "Zabor-biltzaileak mundua gelditzea erabakitzen du unerik txarrenean"
105
106Lengoaia funtzional klasikoak (Haskell, OCaml, Erlang, Clojure) zoragarriak dira kodeari buruz arrazoitzeko, baina ia guztiak exekuzio-garaiko **Zabor-Biltzaile (*Garbage Collector*)** baten menpe daude. Horrek baztertu egiten ditu honako hauek behar dituzunean:
107- Mikrosegundora aurreikus daitezkeen latentziak.
108- Eragiketa batek zenbat RAM memoria kontsumitu dezakeen zehatz-mehatz kontrolatzea, garbi abortatu aurretik.
109- Sistema eragilearen tresnak (`ls`, `find`, `sh`, `doas`, `make`) idaztea edo hardware-erregistroak (`MMIO`) ukitzea.
110
111Ridgunek **mundu funtzional puruaren dotorezia guztia ematen dizu, baina Ridgunen Memoria Kudeaketarekin (`RMM`: `RMM1` estatikoa eta `RMM2` esleipen-kontaketa kaskadakoarekin) gehi kuota zehatzeko eskualde lexikoekin (`with region`)**:
112
113```ridgun
114analizatu paketea String => Result
115analizatu paketea gordina =
116 with region 16_KB do
117 deskodetu bilbea gordina
118```
119
120Aldi baterako egitura bakoitza modu deterministan askatzen du konpiladoreak (`RMM1` / `RMM2`) erabiltzeari uzten zaion une berean, eta erasotzaile batek memoria lehertzeko diseinatutako pakete gaizto bat bidaltzen badizu, 16.384. bytea gainditzean eskualdea berehala mozten da, bere arena $O(1)$-ean askatzen du eta `Err OutOfMemory` itzultzen dizu. Prozesua erori gabe, GC geldialdirik gabe eta memoria-ihesik gabe.
121
122---
123
124## Laburbilduz: Noiz egiten du distira Ridgunek?
125
126Ridgun zuretzat egina dago inoiz honako hau nahi izan baduzu:
127
1281. **Sistemetako tresnak, konpiladoreak, analizatzaileak edo CLI utilitateak idaztea**, mikrosegundotan abiarazten direnak, ehunka KB gutxi batzuk pisatzen dituztenak eta erakusle nuluek edo ezkutuko albo-ondorioek hautsi ezin dituztenak.
1292. **Agenteen Eredu Natiboan (`agent`, `send ... to`, `receive from`, `stop`) oinarritutako sistema konkurrenteak eta zerbitzariak eraikitzea**, non edozein funtzio puru egoera isolatudun edo egoerarik gabeko agente bihurtzen den eta konpiladoreak modu adimendunean aukeratzen duen *green-thread* exekuzio ultraarinaren eta nukleo anitzeko hari natiboen artean.
1303. **Algoritmoak, datu-hodiak edo tentsore-aljebra programatzea**, non konpiladoreak matrizeen dimentsioak ere (`Tensor[M, K] * Tensor[K, N] => Tensor[M, N]`) zure ordez egiaztatzen dituen ezer exekutatu aurretik.
1314. **Zure kode propioa irakurtzen gozatzea**: `.rg` fitxategi bakoitzak ondo maketatutako liburu baten orrialdea dirudiela, formateatzaile taularatu automatikoari esker (`stable format`).
132
133Jakin-mina piztu zaizu? Pasa zaitez **01. kapitulura** eta idatz dezagun gure lehen programa bi minutu baino gutxiagoan.