Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Enkonduko

Saluton kara leganto,

La celo de ĉi tiu libro estas instrui programadon kaj la programlingvonZig”. Ĝ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, LlamaCopilot, 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.


  1. Optimuma: plej bonkvalita, laŭ difinaj kriterioj, en difinaj limoj kaj cirkonstancoj.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.Io parametron),
// ĉ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.Allocator parametron),
// ĉ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: