Chifukwa Chake Go Design Ndi Yoyipa Kwa Opanga Mapulogalamu Anzeru

M'miyezi yapitayi ndakhala ndikugwiritsa ntchito Go pakukhazikitsa. Umboni wa Chikhulupiriro (pafupifupi.: code kuyesa kugwira ntchito kwa lingaliro) mu nthawi yake yaulere, pang'ono kuphunzira chinenero cha pulogalamu yokha. Mapulogalamu omwewo ndi ophweka kwambiri ndipo si cholinga cha nkhaniyi, koma chidziwitso chogwiritsira ntchito Go palokha chiyenera kukhala ndi mawu ochepa ponena za izo. Pitani akulonjeza kukhala (pafupifupi.: nkhani yolembedwa mu 2015) chilankhulo chodziwika bwino pamakhodi owopsa. Chilankhulocho chinapangidwa ndi Google, kumene chimagwiritsidwa ntchito mwakhama. Pansi pake, ndikuganiza moona mtima kuti mapangidwe a chilankhulo cha Go ndi oyipa kwa opanga mapulogalamu anzeru.

Zopangidwira opanga mapulogalamu ofooka?

Kupita ndikosavuta kuphunzira, kosavuta kotero kuti mawu oyamba adanditenga madzulo ena, pambuyo pake ndidatha kale kulemba bwino. Buku limene ndinkaphunzira kale limatchedwa Go Chiyambi cha Programming mu Go (kumasulira), imapezeka pa intaneti. Bukuli, monga Go source code palokha, ndi losavuta kuwerenga, lili ndi zitsanzo zabwino, ndipo lili ndi masamba pafupifupi 150 omwe amatha kuwerengedwa nthawi imodzi. Kuphweka kumeneku kumatsitsimula poyamba, makamaka m'dziko lopanga mapulogalamu lodzaza ndi umisiri wovuta kwambiri. Koma pamapeto pake, m'kupita kwa nthawi funso limabwera: "Kodi izi ndi zoona?"

Google imati kuphweka kwa Go ndiye malo ake ogulitsa ndipo chilankhulocho chidapangidwa kuti chizipanga bwino m'magulu akulu, koma ndikukayika. Pali zinthu zina zomwe zikusoweka kapena zatsatanetsatane. Ndipo zonse chifukwa cha kusowa chikhulupiriro kwa omanga, ndi lingaliro lakuti sangathe kuchita chirichonse choyenera. Chikhumbo chosavuta ichi chinali chisankho chodziwika ndi okonza chinenerocho, ndipo kuti timvetse bwino chifukwa chake kunali kofunikira, tiyenera kumvetsetsa zolimbikitsa za opanga ndi zomwe akuyesera kukwaniritsa mu Go.

Nanga n’cifukwa ciani linapangidwa kukhala losavuta? Nawa ndemanga zingapo Rob Pike (pafupifupi.: m'modzi mwa omwe adapanga nawo chilankhulo cha Go):

Mfundo yofunika apa ndikuti opanga mapulogalamu athu (pafupifupi.: Ogwiritsa ntchito Google) si ofufuza. Iwo ali, monga lamulo, aang'ono kwambiri, amabwera kwa ife ataphunzira, mwinamwake anaphunzira Java, kapena C / C ++, kapena Python. Sangamvetse chinenero chachikulu, koma nthawi yomweyo tikufuna kuti apange mapulogalamu abwino. N’chifukwa chake chinenero chawo chiyenera kukhala chosavuta kumva ndi kuphunzira.
 
Ayenera kukhala wodziwika bwino, wofanana ndi C. Okonza mapulogalamu omwe amagwira ntchito ku Google amayamba ntchito zawo msanga ndipo nthawi zambiri amadziwa zilankhulo zamachitidwe, makamaka banja la C. Kufunika kopanga zinthu mwachangu m'chinenero chatsopano cha mapulogalamu kumatanthauza kuti chinenerocho chisakhale champhamvu kwambiri.

Chani? Chifukwa chake Rob Pike akunena kuti opanga ku Google siabwino, ndichifukwa chake adapanga chilankhulo cha zitsiru (pafupifupi.: dumbed down) kuti athe kuchita zinazake. Ndi mtundu wanji wodzikuza kuyang'ana anzako? Ndakhala ndikukhulupirira kuti opanga Google amasankhidwa kuchokera ku zowala komanso zabwino kwambiri padziko lapansi. Zoonadi angathe kuthana ndi vuto linalake?

Zopanga za kuphweka mopambanitsa

Kukhala wophweka ndi cholinga choyenera pakupanga kulikonse, ndipo kuyesa kupanga chinthu chophweka ndi kovuta. Komabe, poyesera kuthetsa (kapena kufotokoza) zovuta zovuta, nthawi zina chida chovuta chimafunika. Zovuta komanso zovuta sizinthu zabwino kwambiri za chilankhulo chokonzekera, koma pali malo apakati omwe chilankhulocho chimatha kupanga ziganizo zokongola zomwe ndizosavuta kumva ndikugwiritsa ntchito.

Osafotokoza kwambiri

Chifukwa chodzipereka ku kuphweka, Go ilibe zomangira zomwe zimawoneka ngati zachilengedwe m'zinenero zina. Izi zingawoneke ngati lingaliro labwino poyamba, koma pochita zimabweretsa verbose code. Chifukwa chake chikuyenera kukhala chodziwikiratu - ziyenera kukhala zosavuta kuti omanga awerenge ma code a anthu ena, koma kwenikweni izi zophweka zimangovulaza kuwerenga. Palibe zidule mu Go: zambiri kapena ayi.

Mwachitsanzo, chida chothandizira chomwe chimawerenga stdin kapena fayilo kuchokera pamakangano a mzere wamalamulo chimawoneka chonchi:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "log"
    "os"
)

func main() {

    flag.Parse()
    flags := flag.Args()

    var text string
    var scanner *bufio.Scanner
    var err error

    if len(flags) > 0 {

        file, err := os.Open(flags[0])

        if err != nil {
            log.Fatal(err)
        }

        scanner = bufio.NewScanner(file)

    } else {
        scanner = bufio.NewScanner(os.Stdin)
    }

    for scanner.Scan() {
        text += scanner.Text()
    }

    err = scanner.Err()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(text)
}

Ngakhale kachidindo kameneka kamayesanso kukhala wamba momwe kungathekere, Go's mokakamizika verbosity amafika panjira, ndipo chifukwa chake, kuthetsa vuto losavuta kumabweretsa kuchuluka kwa code.

Apa, mwachitsanzo, ndi njira yothetsera vuto lomwelo mu D:

import std.stdio, std.array, std.conv;

void main(string[] args)
{
    try
    {
        auto source = args.length > 1 ? File(args[1], "r") : stdin;
        auto text   = source.byLine.join.to!(string);

        writeln(text);
    }
    catch (Exception ex)
    {
        writeln(ex.msg);
    }
}

Ndipo ndani amene ali wowerengeka kwambiri tsopano? Ndipereka voti yanga kwa D. Khodi yake imawerengedwa momveka bwino chifukwa amafotokoza zomwe zikuchitika momveka bwino. D amagwiritsa ntchito malingaliro ovuta kwambiri (pafupifupi.: ntchito ina kuyitana ΠΈ mawonekedwe) kuposa chitsanzo cha Go, koma palibe chovuta kuwamvetsetsa.

Gahena kukopera

Lingaliro lodziwika bwino lowongolera Go ndi lokhazikika. Izi zithandizira kupewa kukopera kosafunikira kwa ma code kuti athandizire mitundu yonse ya data. Mwachitsanzo, ntchito yofotokozera mwachidule mndandanda wa manambala ang'onoang'ono ingagwiritsidwe ntchito mwanjira ina iliyonse koma kukopera-kumata ntchito yake yoyambira pamtundu uliwonse; palibe njira ina:

package main

import "fmt"

func int64Sum(list []int64) (uint64) {
    var result int64 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int32Sum(list []int32) (uint64) {
    var result int32 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int16Sum(list []int16) (uint64) {
    var result int16 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int8Sum(list []int8) (uint64) {
    var result int8 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func main() {

    list8  := []int8 {1, 2, 3, 4, 5}
    list16 := []int16{1, 2, 3, 4, 5}
    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(int8Sum(list8))
    fmt.Println(int16Sum(list16))
    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

Ndipo chitsanzo ichi sichigwira ntchito ngakhale kwa mitundu yosainidwa. Njira iyi imaphwanya kwathunthu mfundo yosabwerezabwereza (youma), imodzi mwa mfundo zodziwika bwino komanso zoonekeratu, kunyalanyaza zomwe zili magwero a zolakwika zambiri. Chifukwa chiyani Go akuchita izi? Ichi ndi gawo loyipa lachilankhulo.

Chitsanzo chomwecho pa D:

import std.stdio;
import std.algorithm;

void main(string[] args)
{
    [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}

Zosavuta, zokongola komanso zolunjika pamfundo. Ntchito yomwe imagwiritsidwa ntchito pano ndi reduce kwa mtundu wa template ndi predicate. Inde, izi ndizovuta kwambiri kuposa mtundu wa Go, koma sizovuta kuti okonza mapulogalamu amvetsetse. Ndi chitsanzo chiti chomwe chili chosavuta kuchisunga komanso chosavuta kuwerenga?

Njira yosavuta yolambalala

Ndikuganiza opanga mapulogalamu a Go akuwerenga izi achita thovu pakamwa ndikukuwa, "Mukuchita zolakwika!" Chabwino, pali njira ina yopangira generic ntchito ndi mitundu, koma imaphwanya kwathunthu dongosolo lamtundu!

Yang'anani chitsanzo ichi cha kukonza chinenero chopusa kuti athetse vutoli:

package main

import "fmt"
import "reflect"

func Reduce(in interface{}, memo interface{}, fn func(interface{}, interface{}) interface{}) interface{} {
    val := reflect.ValueOf(in)

    for i := 0; i < val.Len(); i++ {
        memo = fn(val.Index(i).Interface(), memo)
    }

    return memo
}

func main() {

    list := []int{1, 2, 3, 4, 5}

    result := Reduce(list, 0, func(val interface{}, memo interface{}) interface{} {
        return memo.(int) + val.(int)
    })

    fmt.Println(result)
}

Kukhazikitsa uku Reduce anabwerekedwa ku nkhaniyo Idiomatic generics mu Go (pafupifupi.: Sindinapeze kumasulira, ndidzakhala wokondwa ngati mutathandizira izi). Chabwino, ngati zili zongopeka, sindikanatha kuwona chitsanzo chopanda chilankhulo. Kugwiritsa ntchito interface{} - farce, ndipo m'chinenerocho chimafunika kungolambalala kulemba. Awa ndi mawonekedwe opanda kanthu ndipo mitundu yonse imagwiritsa ntchito, kulola ufulu wathunthu kwa aliyense. Mapologalamu awa ndi oyipa kwambiri, ndipo si zokhazo. Zochita zamaseΕ΅era ngati izi zimafuna kugwiritsa ntchito kusinkhasinkha kwa nthawi yothamanga. Ngakhale Rob Pike sakonda anthu omwe amachitira nkhanza izi, monga adanenera m'modzi mwa malipoti ake.

Ichi ndi chida champhamvu chomwe chiyenera kugwiritsidwa ntchito mosamala. Iyenera kupeΕ΅edwa pokhapokha ngati pakufunika kutero.

Ndimatenga ma template a D m'malo mwachabechabe ichi. Aliyense anganene bwanji zimenezo interface{} zowerengeka kapena kulemba zotetezeka?

Mavuto a Dependency Management

Go ili ndi dongosolo lokhazikika lokhazikika lomwe limamangidwa pamwamba paothandizira ochititsa chidwi VCS. Zida zomwe zimabwera ndi Go zimadziwa za mautumikiwa ndipo zimatha kutsitsa, kupanga, ndikuyika ma code kuchokera kwa iwo nthawi imodzi. Ngakhale izi ndizabwino, pali cholakwika chachikulu pakumasulira! Inde, ndizowona kuti mutha kupeza kachidindo kuchokera kuzinthu monga github kapena bitbucket pogwiritsa ntchito zida za Go, koma simungathe kufotokozera mtunduwo. Ndipo kachiwiri kuphweka pa ndalama zothandiza. Sindikutha kumvetsetsa tanthauzo lachisankho choterocho.

Atafunsa mafunso okhudza yankho la vutoli, gulu lachitukuko la Go linapanga ulusi wa forum, yomwe inafotokoza mmene akanachitira ndi nkhaniyi. Malingaliro awo anali kungotengera chosungira chonse mu polojekiti yanu tsiku lina ndikusiya "monga momwe ziliri." Akuganiza chiyani? Tili ndi machitidwe odabwitsa owongolera omwe ali ndi ma tagi abwino komanso chithandizo chamitundu yomwe opanga a Go amanyalanyaza ndikungotengera khodi yoyambira.

Katundu wachikhalidwe kuchokera ku Xi

M'malingaliro anga, Go idapangidwa ndi anthu omwe adagwiritsa ntchito C moyo wawo wonse komanso ndi omwe sanafune kuyesa china chatsopano. Chilankhulochi chikhoza kufotokozedwa ngati C ndi mawilo owonjezera (chiyambi.: mawilo ophunzitsira). Palibe malingaliro atsopano mmenemo, kupatula kuthandizira kufanana (zomwe, mwa njira, ndizodabwitsa) ndipo izi ndizochititsa manyazi. Muli ndi kufanana kwabwino kwambiri m'chinenero chopunduka, chosagwiritsidwa ntchito.

Vuto lina lochititsa chidwi ndiloti Go ndi chinenero chotsatira (monga chowopsya cha C). Mukamaliza kulemba kachidindo kachitidwe kamene kamamva kuti ndi kakale komanso kachikale. Ndikudziwa kuti mapulogalamu opangidwa ndi chinthu si chipolopolo chasiliva, koma zingakhale bwino kuti mutha kufotokozera mwatsatanetsatane mitundu ndikupereka ma encapsulation.

Kuphweka kuti mupindule nokha

Go idapangidwa kuti ikhale yosavuta ndipo imakwaniritsa cholinga chimenecho. Linalembedwa kwa olemba mapulogalamu ofooka, pogwiritsa ntchito chinenero chakale monga template. Zimabwera kwathunthu ndi zida zosavuta kuchita zinthu zosavuta. Ndiosavuta kuwerenga komanso yosavuta kugwiritsa ntchito.

Ndizomveka kwambiri, ndizosasangalatsa, komanso zoyipa kwa opanga mapulogalamu anzeru.

Бпасибо mersinvald za zosintha

Source: www.habr.com

Kuwonjezera ndemanga