Enkonduko
Saluton kara leganto,
La celo de ĉi tiu libro estas instrui programadon kaj la programlingvon “Zig”. Ĝi enhavos tri partojn kun malsamaj celo, publiko, kaj uzo.
La unua parto lecionaro estas orda vico de lecionoj por lerni programadon. Vi ne bezonas iun ajn sperton por legi ĝin. Vi nur bezonas komputilon kun interreto, klavaro, muso (nedeva), kaj vian cerbon. Ĉi tiu parto plej taŭgas por senspertaj programontoj. Ĝi enhavas detalojn pri multaj bazaĵoj kiel kodredaktilo, kodtradukilo, komandlinio, rulado, ktp, kies klarigo estus malnecesa por spertaj programantoj.
La dua parto artikolaro estas senorda kolekto da artikoloj pri specifaj temoj ĉirkaŭ Zig kaj programado. Ili necesas sperton je almenaŭ unu programlingvo. Ili ne klarigas la sintakson de Zig kaj ĝeneralajn programajn konojn, krom kiam ili specife temas pri tio. Senspertulo legu lecionaron antaŭ artikolaron.
La tria parto vortaro estas… Vortaro. Ĝi enhavas mallongajn difinojn de teknikaj vortoj, ilian anglan tradukon, kelkajn ekzemplojn, ktp. Mi esperas ke ĉi tiu vortaro utilu se vi verkas pri programado esperante. Mi volonte aldonu al ĝi laŭ peto, ne hezitu fari peton ĉe GitHub.
Pri Zig
Zig estas ĝeneraluza programlingvo kaj ilĉeno por ellabori kaj daŭrigi fortikajn, optimumajn 1 programaĵojn. Ĝi estas publikigita en 2015, kaj daŭre malferme kodata de senprofita korporacio ZSF.
Mi elektis ĝin kiel lerna programlingvo pro la jenaj kialoj:
-
La fundamenta principo “kune ni servu la uzantojn”, la malfermeco kaj senprofiteco, igas Zig “esperanteca”.
-
La fasono de Zig estas ideala kompromiso por lerni. Ĝi donas plenan kontrolon al la programanto, kiel C aŭ C++, samtempe devigas malsekuraĵojn esti malimplica[^implica], kiel Rust, samtempe resti simpla, kiel C aŭ Go aŭ Python. Tia fasono lernigas programanton pri malsimplaĵoj kutime kaŝitaj, plej sekure kaj simple kiel eble.
-
Mi plej ŝatas programi per Zig. Mi ĉiam scias kaj komprenas tion, kio okazas. Zig juste gratulas miajn sukcesojn, kaj malgratulas miajn malsukcesojn.
Mi ankaŭ elektis ĝin malgraŭ la jenaj punktoj:
-
Pro ĝia noveco, ekzistas malmulte da lernorimedoj. Ĉi tiu lernolibro estu plena.
-
Zig estas daŭre ellaborata kaj daŭre ŝanĝas. La libro estu ĝisdatigata.
Pri Mi
Saluton! Mi estas Dok8tavo (Dok Oktavo)! Mi ne estas programisto (ŝokita vizaĝo). Programado estas por mi simpla sed kara ŝatokupo. Mi ja pensas, ke mi havas sufiĉan sperton por paroli pri kelkajn programajn subjektojn —ĉefe tiujn pri kiuj mi artikolumos— sed mi verŝajne malpravos, fuŝos, misos, dum la verkado. Se vi trovas eraron, bonvole diru al mi, plejŝatate per GitHub.
Mia celoj verkante Lernu Zig ĉefe estas:
- diskonigi kaj instrui programadon,
- diskonigi kaj instrui Zig,
- riĉigi la esperantan verkaron,
- praktiki Esperanton,
Mia pronomo estas “li” aŭ “ĝi”. Mi uzas ĝiismon2 kaj iĉismon3 tra la tuta libro. Mi deziras al vi bonan legon, kaj ĝojan vojaĝon dum la lernado de programado.
Pri AI
Ĉi tiu sekcio flanktemas pri Artefaritaj Inteligentoj (AI), kaj pli specife Larĝaj Lingvaj Modeloj (LLM) kiel ChatGPT, Claude, Llama aŭ Copilot, kiuj nove famiĝis kaj koniĝis de la publiko, pro subita kaj spektinda pliboniĝo. Iliaj uzkazoj multobligis kaj la programkomunumo naskis ideon antaŭe nekredeblan: anstataŭi homajn programistojn per LLMaj programiloj.
Mi tute ne estas kontraŭ-LLMa. Mi pensas ke ili estas mirindaj iloj, kapablaj de grandaj ŝanĝoj al programado, al homaro. Mi ankaŭ opinias ke la plejparto de entuziasmaj ideoj pri anstataŭi programistojn, forigi fontkodon —eĉ parte—4 ktp, estas misciaj kaj danĝeraj.
Mi ne klarigu plene kial mi pensas tion. Mi nur volas diri, ke Lernu Zig estas nek pri, nek por, nek per5 LLMoj. Ĝi estas verko de homo, kies celpubliko estas homoj, kies temo estas programado sen LLMaj iloj. Mi ne planas nek kontraŭas la ideon de artikolo pri LLMoj kiel programiloj, iliaj uzkazoj, kaj danĝeroj.
-
Optimuma: plej bonkvalita, laŭ difinaj kriterioj, en difinaj limoj kaj cirkonstancoj. ↩
-
Tio signifas, ke kiam mi ne konas ies pronomo, mi uzas “ĝi”. Tio ne signifas, ke mi traktas tiun personon aŭ pensas pri tiu persono kiel objekto. Kaj mi kompreneble ne uzas “ĝi” por personoj kiuj sciigis min iamaniere, ke ili malŝatas tion. ↩
-
Tio signifas, ke mi esprimas masklecon per sufiksado de “-iĉ”, anstaŭ prefiksado de “vir-” aŭ per defaŭlta formo. Kiam mi uzas defaŭltan formon, tiam mi esprimas ajnan genron. Kiam mi prefiksas “ge-”, tiam mi esprimas almenaŭ maslkan kaj femalan genrojn. ↩
-
Se vi kredas, ke longstrikoj kiel “—” indikas, ke mi uzis LLMon por skribi aŭ verki la libron, vi malpravas. Jen kiel ili aspektas por mi en la fontkodo de la libro:
---😉 6. ↩ -
Mi ja uzas LLMon verkante la libron, ekzemple por sugesti subjekton de artikolo aŭ paragrafo. Mi ankaŭ uzas ĝin kiel korektilo: ĝi trovu mistajpojn, akuzativforgesojn, ktp. Sed ĉiu teksta kaj koda linio estas homverkita. ↩
-
Se vi kredas, ke miensimboloj kiel “😉” indikas, ke mi uzis LLMon por skribi aŭ verki la libron, vi malpravas. Jen kiel ili aspektas por mi en la fontkodo de la libro:
:wink:👅. ↩
Fundamento - The Zen of Zig
Ĉi tiu artikolo esploras la kernajn principojn de Zig nomatajn “Zen of Zig”. Ili ĉefe gvidas la
ellaboron de Zig mem, kaj povas agi kiel “fundamento” por ziguzantoj. Vi povas vidi ilin per la
komando zig zen:
$ zig zen
* Communicate intent precisely.
* Edge cases matter.
* Favor reading code over writing code.
* Only one obvious way to do things.
* Runtime crashes are better than bugs.
* Compile errors are better than runtime crashes.
* Incremental improvements.
* Avoid local maximums.
* Reduce the amount one must remember.
* Focus on code rather than style.
* Resource allocation may fail; resource deallocation must succeed.
* Memory is a resource.
* Together we serve the users.
Esperante:
* Precize komuniku la intencon.
* Randkazoj gravas.
* Zorgu pri kodlegado pli ol kodskribado.
* Estu nur unu evidenta maniero por fari ion.
* Rultempa halto pli bonas ol cimo.
* Traduktempa halto pli bonas ol rultempa halto.
* Iom-post-iomaj plibonigoj.
* Evitu lokalajn maksimumojn.
* Reduktu kiom oni memoru.
* Kodkvalito gravas pli ol kodstilo.
* Akiro povu erari; malakiro sukcesu.
* Memoro estas provizo.
* Kune ni servu la uzantojn.
Ĉiu principo havas dediĉan sekcion, kiu klarigas ĝin, donas ekzemplojn de kiel Zig aplikas ĝin aŭ kiel ziguzantoj povas fasoni iliajn programojn laŭ ĝi, kaj komparas ĝin al principoj de aliaj programlingvoj.
Precize Komuniku Intencon
Ĉi tiu principo signifas, ke gravas ne nur la funkcio de kodo sed ankaŭ ĝia intenco estu klare komunikata. Estas multaj ekzempletoj en la fasono de Zig.
Tipoj de funkcio
La tipoj de funkcio en Zig estas bonaj ekzemploj de klareco kaj formala komunikado de intenco. Ili sole klarigas:
- ĉu la funkcio povas erari (ĉu ĝi donas erarunuiĝon),
// ĉi tia funkcio sukcesu
fn function1(parameter: Parameter) Result {
// ...
}
// ĉi tia funkcio povas erari
fn function2(parameter: Parameter) Error!Success {
// ...
}
- ĉu la funkcio uzas paŭzajn operaciojn (ĉu ĝi bezonas
std.Ioparametron),
// ĉi tia funkcio verŝajne ne uzas paŭzajn operaciojn
fn function1(parameter: Parameter) Result {
// ...
}
// ĉi tia funkcio povas uzi paŭzajn operaciojn
fn function2(pameter: Parameter, io: std.Io) Result {
// ....
}
- ĉu la funkcio asignas memoron (ĉu ĝi bezonas
std.mem.Allocatorparametron),
// ĉi tia funkcio verŝajne ne asignas memoron
fn function1(parameter: Parameter) Result {
// ...
}
// ĉi tia funkcio povas asigni memoron
fn function2(parameter: Parameter, allocator: std.mem.Allocator) Result {
// ...
}
Nestruktura Tipado
Zig uzas nestruktura tipadon por enum, opaque, struct kaj union tipoj. Tio signifas, ke eĉ
kiam ili havas tute similan difinon, du tiaj tipoj ne estas la samaj. Ekzemple:
const Enum1 = enum(u8) {
variant_1,
variant_2,
};
const Enum2 = enum(u8) {
variant_1,
variant_2,
};
comptime {
@import("std").debug.assert(Enum1 != Enum2);
}
Tio devigas la programanton uzi malsamajn tipojn por malsamaj uzoj, eĉ kiam ili hazarde similas.
Dokumentaro
Zig permesas al komentoj esti “dokumentaj”. Dokumentaj komentoj aperas en aŭtoproduktita
dokumentaro. La dokumentaro de la standarda libraro estas bona ekzemplo, de kiel aperas
aŭtoproduktita dokumentaro. Vi ankaŭ povas vidi ĝin lokale per la komando zig std.
Por aŭtoprodukti dokumentaron, iru al la build.zig de via projekto, en la build(b: *std.Build)
funkcio. Elektu kies std.Build.Step.Compile dokumentaron vi volas produkti, kaj skribu tion:
...
const doc = b.addInstallDirectory(.{
.install_dir = .prefix,
.install_subdir = "doc",
.source_dir = my_compile.getEmittedDocs(),
});
const doc_step = b.step("doc", "The step to emit the documentation about `my_compile`");
doc_step.dependsOn(&doc.step);
...
Tiam vi povas uzi zig build doc por produkti la dokumentaron en zig-out/doc/. La dokumentaro
ankoraŭ ne estas facila por legi. Mi uzas python -m http.server -d zig-out/doc por tio.
FAROTA: pli bona klarigo pri kiel uzi aŭtoprodukton de dokumentaro.
Randkazoj Gravas
Randkazo estas aparta kazo, kiam iu valoro estas ekstrema aŭ valorkombino igas la programkonduton speciala.
Plej programlingvoj
Zorgu pri Kodlegado pli ol Kodskribado
FAROTA
Estu nur Unu Evidenta Maniero por Fari Ion
FAROTA
Rultempa Halto pli Bonas ol Cimo
FAROTA
Traduktempa Halto pli Bonas ol Rultempa Halto
FAROTA
Iom-post-iomaj plibonigoj
FAROTA
Evitu lokalajn maksimumojn
FAROTA
Reduktu kiom Oni Memoru
FAROTA
Kodkvalito Gravas pli ol Kodstilo
FAROTA
Akiro Povu Erari; Malakiro Sukcesu
FAROTA
Memoro Estas Provizo
FAROTA
Kune Ni Servu la Uzantojn
FAROTA
Vortaro
apo, aplikaĵo
app, application
Programo kiu interagas kun homa uzanto. Ankaŭ nomata “aplika programo”.
Ekz: Firefox, Gmail, Minecraft, ktp.
bajto
byte
Plej eta bitaro, kiu havas adreson je la maŝino.
Ekz:
bito
bit
Ero de informo, ofte riprezenta de aŭ 0 aŭ 1.
Ekz:
fontkodo
source code
Teksto kodita en programlingvo, fonto de programo.
Ekz:
instrukcio
instruction
Nedividebla simpla tasko farebla de maŝino.
Ekz: adiciu, iru al alia instrukcio, ŝanĝu memorlokon, ktp.
interpreto
interpretation
Rulado de programo rekte de ĝia fontkodo en programlingvo.
Ekz: Ekzemploj.
kodredaktilo
code editor
Apo kiu provizas al programanto iloj por redakti fontkodon de programo.
Ekz: Emacs, vim, VSCode, ktp.
kodtradukilo
compiler
Apo kiu tradukas fontkodon el programlingvo al ruleblaĵo.
Ekz: Zig, clang, gcc, rustc, ktp.
nedifinkonduto, ndk
undefined behavior, ub
Konduto de programo, kiun la programlingvo specifo ne difinas. Tio signifas, ke la kodtradukilo rajtas supozi, ke tia situacio neniam okazas, kaj surbaze de tiu supozo, fari ajnajn ŝanĝojn por ekzemple efikigo.
Se la programo fakte atingas tian situacion la rezulto estas tute nedetermina:
- ĝi povas halti,
- ĝi povas daŭrigi pli-malpli “ĝuste”,
- ĝi povas produkti arbitrajn rezultojn,
- ĝi povas agi malsame laŭ la maŝino aŭ kodtradukilo,
- ktp.
Ekz: divido per nulo, atingo de unreachable, ktp.
programlingvo
programming language
Formala homlegebla lingvo kiu pli-malpli formale priskribas programojn.
Ekz: C, Java, Python, Zig, ktp.
programo
program
Vico de instrukcioj kune plenumanta pli-malpli malsimplan taskon.
Ekz: mkdir, ZLS, Zig, Vindozo, ktp.
rulado
execution
Plenumo de programo.
Ekz: