Zpět na domů

Návrh knihoven Go: termíny a zdroje

Článek rozebírá návrh knihoven v Go: definice repozitářů, balíčků, modulů. Popsány typy knihoven se zdroji — kód, ovladače CUDA, statické texty. Zdůrazněny kvality: izolace, dekompozice, kompozice.

Knihovny Go: od kódu k ovladačům GPU a textům
Advertisement 728x90

Principy návrhu knihoven v Go: od repozitářů k prostředkům

Programování zahrnuje tvorbu aplikací a knihoven pro jejich podporu. Knihovna je soubor prostředků pro sdílení, převážně zdrojového kódu. Rozlišení pojmů pomáhá navrhovat odolné komponenty.

Repozitář obsahuje soubory s kódem ve struktuře souborového systému. Balíček v Go je skupina .go-souborů, které plní jednu úlohu, s povinným deklarováním package na začátku každého souboru. Modul sdružuje balíčky, závislosti jsou fixovány v go.mod.

Knihovna zajišťuje oddělení kódu bez duplikace. Příklad: funkce MaxInt se kopíruje do různých balíčků foo a baz, ale bez jednotného zdroje pravdy je to neefektivní. Balíčky řeší problém kompilace a importu.

Google AdInline article slot
package foo

func MaxInt(a, b int) int {
    if a > b {
        return a
    }
    return b
}

Izolace komponent zabraňuje znalostem o cizím kódu, dekompozice zjednodušuje interakci s kompilátorem.

Prostředky v knihovnách

Knihovny zahrnují nejen kód, ale i externí prostředky: dynamické a statické.

Dynamické prostředky závisí na runtime. Příklad — přístup k GPU přes CUDA v balíčku cu z Gorgonia:

Google AdInline article slot
d := cu.CurrentDevice()
ctx := cu.NewContext(d, cu.SchedAuto|cu.MapHost)
mem, err := ctx.MemAlloc(1024)

Zde ctx je deskriptor GPU pro úlohy GPGPU. Stav není znám ve fázi kompilace.

Statické prostředky jsou známé kompilátoru. Příklad — texty Shakespeara v balíčku willshakes:

package willshakes

const AllsWellThatEndsWell = `Akt 1 Scéna 1

KOMTESSA.
    Když dávám svého syna ode mě, pohřbívám druhého manžela.
...`

const MacBeth = `Akt 1 Scéna 1

PRVNÍ ČARODĚJNICE.
    Kdy se zase my tři sejdeme
...`

Přístup: willshakes.MacBeth. Podobně fonty nebo datové sady jako MNIST.

Google AdInline article slot

Klasifikace knihoven

Knihovny se dělí do tříd podle prostředků:

  • Kódové knihovny: sdílený zdrojový kód v balíčcích/modulech.
  • Ovladačové knihovny: obálky nad ovladači (cu pro CUDA, go-gl pro OpenGL).
  • Prostředkové knihovny: statická data (willshakes) nebo zavaděče (mnist v Go).

| Typ | Příklad | Charakteristika |

|-----|--------|----------------|

| Kódová | Balíček s utilitami | Statický kód |

| Ovladačová | cu | Dynamický přístup |

| Prostředková | willshakes | Vložené konstanty |

Ovladače přidávají abstrakce pro mezijazykovou interakci.

Vlastnosti dobré knihovny

Dobrá knihovna usnadňuje dva dialogy: se strojem (kompilátor/runtime) a vývojářem.

Kritéria:

  • Izolace: komponenty neznají externí knihovny.
  • Dekompozice: jasné hranice funkcionality.
  • Kompozice: snadná integrace do aplikací.
  • Předvídatelnost: chování odpovídá dokumentaci.
  • Výkonnost: minimální režie bez kompromisů.

Vyhýbejte se package main v knihovnách — zaměřte se na utility. Testujte hraniční případy, zajišťujte thread-safety.

Co je důležité

  • Knihovna je sdílený prostředek, ne jen repozitář nebo balíček.
  • Oddělujte statické (konstanty) a dynamické (ovladače) prostředky.
  • Zajistěte izolaci pro soustředění vývojáře na jednu úlohu.
  • Používejte balíčky Go pro kompilaci a moduly pro závislosti.
  • Navrhujte pro kompozici: jednoduchost importu a použití.

— Editorial Team

Advertisement 728x90

Číst dál