Cén fáth go bhfuil Dearadh Go dona do Ríomhchláraitheoirí Cliste

Le míonna anuas tá mé ag baint úsáide as Go for implementations. Cruthúnas Coincheapa (thart.: cód chun feidhmiúlacht smaoineamh a thástáil) ina chuid ama saor, go páirteach chun staidéar a dhéanamh ar an teanga ríomhchlárúcháin féin. Tá na cláir féin an-simplí agus ní hé cuspóir an ailt seo iad, ach tá cúpla focal tuillte ag an taithí ar Go féin a úsáid. Geallann Téigh go mbeidh (thart.: alt scríofa i 2015) teanga coitianta le haghaidh cód Inscálaithe tromchúiseach. Chruthaigh Google an teanga, áit a n-úsáidtear go gníomhach í. Bunlíne, is dóigh liom go hionraic go bhfuil dearadh na teanga Go dona do ríomhchláraitheoirí cliste.

Deartha do ríomhchláraitheoirí lag?

Tá Go an-éasca le foghlaim, chomh héasca sin gur thóg an réamhrá tráthnóna amháin mé, agus ina dhiaidh sin d’fhéadfainn códú go torthúil cheana féin. Tugtar an leabhar a d’úsáid mé chun Go a fhoghlaim Réamhrá ar Ríomhchlárú in Go (aistriúchán), tá sé ar fáil ar líne. Tá an leabhar, cosúil leis an gcód foinse Go féin, éasca le léamh, tá samplaí cód maith ann, agus tá thart ar 150 leathanach ann is féidir a léamh in aon suí amháin. Is íontach an tsimplíocht seo ar dtús, go háirithe i ndomhan cláir atá lán de theicneolaíocht ró-chasta. Ach sa deireadh, luath nó mall tagann an smaoineamh: “An amhlaidh i ndáiríre?”

Maíonn Google gurb é simplíocht Go an pointe díola atá aige agus tá an teanga deartha le haghaidh táirgiúlacht uasta i bhfoirne móra, ach tá amhras orm faoi. Tá gnéithe ann atá in easnamh nó ró-mhionsonraithe. Agus go léir mar gheall ar easpa muiníne i forbróirí, leis an toimhde nach bhfuil siad in ann aon rud a dhéanamh ceart. Ba chinneadh comhfhiosach ó dhearthóirí na teanga an fonn seo ar shimplíocht, agus chun a thuiscint go hiomlán cén fáth go raibh gá leis, ní mór dúinn spreagadh na bhforbróirí a thuiscint agus cad a bhí siad ag iarraidh a bhaint amach i Go.

Mar sin, cén fáth go ndearnadh é chomh simplí sin? Seo cúpla Sleachta Rob Pike (thart.: duine de chomhchruthaitheoirí na teanga Go):

Is é an príomhphointe anseo ná go bhfuil ár ríomhchláraitheoirí (thart.: Googlers) nach taighdeoirí iad. Tá siad, mar riail, sách óg, teacht chugainn tar éis staidéar a dhéanamh, b'fhéidir staidéar siad Java, nó C/C++, nó Python. Ní féidir leo teanga iontach a thuiscint, ach ag an am céanna ba mhaith linn iad a chruthú bogearraí maith. Sin é an fáth gur chóir go mbeadh a dteanga éasca dóibh a thuiscint agus a fhoghlaim.
 
Ba chóir go mbeadh sé eolach, go garbh cosúil le C. Cuireann ríomhchláraitheoirí atá ag obair le Google tús lena ngairmeacha beatha go luath agus is mó a bhíonn eolach ar theangacha nós imeachta, go háirithe ar an teaghlach C. Ciallaíonn an gá atá le táirgiúlacht tapa i dteanga nua ríomhchlárúcháin nár cheart don teanga a bheith ró-radacach.

Cad? Mar sin tá Rob Pike ag rá go bunúsach nach bhfuil na forbróirí ag Google chomh maith sin, sin an fáth a chruthaigh siad teanga le haghaidh idiots (thart.: balbh síos) ionas go mbeidh siad in ann rud éigin a dhéanamh. Cén cineál breathnú sotalach ar do chomhghleacaithe féin? Chreid mé i gcónaí go bhfuil forbróirí Google roghnaithe de láimh ó na cinn is gile agus is fearr ar domhan. Cinnte is féidir leo rud éigin níos deacra a láimhseáil?

Déantáin de simplíocht iomarcach

Is sprioc fiúntach é bheith simplí in aon dearadh, agus tá sé deacair rud éigin simplí a dhéanamh. Mar sin féin, nuair a bhíonn tú ag iarraidh fadhbanna casta a réiteach (nó fiú a chur in iúl), is gá uirlis chasta uaireanta. Ní gnéithe is fearr de theanga ríomhchlárúcháin iad castacht agus castacht, ach tá talamh láir ann inar féidir leis an teanga astarraingtí galánta a chruthú atá éasca le tuiscint agus le húsáid.

Gan an-léiritheach

Mar gheall ar a thiomantas don tsimplíocht, tá easpa struchtúir ag Go a fheictear mar rud nádúrtha i dteangacha eile. Seans gur smaoineamh maith é seo ar dtús, ach go praiticiúil bíonn cód briathartha mar thoradh air. Ba cheart go mbeadh an chúis leis seo soiléir - ní mór go mbeadh sé éasca d'fhorbróirí cód daoine eile a léamh, ach i ndáiríre ní dhéanann na simplithe seo ach dochar don inléiteacht. Níl aon ghiorrúcháin in Go: mórán nó faic.

Mar shampla, bheadh ​​cuma mar seo ar áirgiúlacht consól a léann stdin nó comhad ó argóintí na n-orduithe:

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)
}

Cé go ndéanann an cód seo iarracht freisin a bheith chomh ginearálta agus is féidir, cuireann briathra éigean Go ar an mbealach, agus mar thoradh air sin, mar thoradh ar fhadhb shimplí a réiteach tá cuid mhór cód.

Anseo, mar shampla, tá réiteach ar an bhfadhb chéanna i 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);
    }
}

Agus cé atá níos inléite anois? Tabharfaidh mé mo vóta do D. Tá a chód i bhfad níos inléite mar go ndéanann sé cur síos níos soiléire ar na gníomhartha. Úsáideann D coincheapa i bhfad níos casta (thart.: glao ar fheidhm eile и teimpléid) ná sa sampla Go, ach i ndáiríre níl aon rud casta faoi iad a thuiscint.

Ifreann a chóipeáil

Moladh coitianta chun Go a fheabhsú ná an ghinearáltacht. Cabhróidh sé seo ar a laghad le cóipeáil chód gan ghá a sheachaint chun tacú le gach cineál sonraí. Mar shampla, ní féidir feidhm chun liosta slánuimhreacha a achoimriú a chur i bhfeidhm ar aon bhealach eile seachas trí chóip-ghreamú a dhéanamh ar a bunfheidhm do gach cineál slánuimhir;

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))
}

Agus ní oibríonn an sampla seo fiú do chineálacha sínithe. Sáraíonn an cur chuige seo go hiomlán an prionsabal gan tú féin a athrá (TIRIM), ar cheann de na prionsabail is cáiliúla agus is soiléire, gan aird a thabhairt ar foinse na n-earráidí go leor. Cén fáth a ndéanann Téigh é seo? Is gné uafásach den teanga é seo.

Sampla céanna ar D:

import std.stdio;
import std.algorithm;

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

Simplí, galánta agus díreach go dtí an pointe. Is é an fheidhm a úsáidtear anseo reduce le haghaidh cineál teimpléid agus tuar. Sea, tá sé seo níos casta arís ná an leagan Go, ach níl sé chomh deacair sin do ríomhchláraitheoirí cliste a thuiscint. Cén sampla is fusa le coinneáil agus is fusa le léamh?

Seachbhóthar córas cineál simplí

Samhlaím go mbeidh ríomhchláraitheoirí Go á léamh seo cúr ag béal agus screadaíl, “Tá tú ag déanamh mícheart!” Bhuel, tá bealach eile ann chun feidhm chineálach agus cineálacha a dhéanamh, ach briseann sé go hiomlán an córas cineál!

Breathnaigh ar an sampla seo de cheartú teanga dúr chun an fhadhb a réiteach:

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)
}

Cur i bhfeidhm seo Reduce a fuarthas ar iasacht ón alt Generics Idiomatic in Go (thart.: Ní raibh mé in ann teacht ar an aistriúchán, beidh áthas orm má chuidíonn tú leis seo). Bhuel, má tá sé idiomatic, ba fuath liom sampla neamhghnáthach a fheiceáil. Úsáid interface{} - farce, agus sa teanga tá sé ag teastáil ach a sheachbhóthar clóscríobh. Is comhéadan folamh é seo agus cuireann gach cineál é i bhfeidhm, rud a ligeann saoirse iomlán do gach duine. Tá an stíl ríomhchláraithe seo gránna mar ifreann, agus ní hé sin go léir. Teastaíonn úsáid machnaimh ama rite le héachtaí acrobatic mar seo. Ní thaitníonn fiú Rob Pike le daoine a bhaineann mí-úsáid as seo, mar a luaigh sé i gceann dá thuarascálacha.

Is uirlis chumhachtach é seo ar chóir a úsáid go cúramach. Ba cheart é a sheachaint mura bhfuil géarghá leis.

Ba mhaith liom a ghlacadh D teimpléid in ionad an nonsense. Conas is féidir le duine ar bith é sin a rá interface{} níos inléite nó fiú clóscríobh sábháilte?

Na Míbhuntáistí a bhaineann le Bainistíocht Spleáchais

Tá córas spleáchais ionsuite ag Go atá bunaithe ar na soláthraithe óstála a bhfuil tóir orthu Vcs. Tá eolas ag na huirlisí a thagann le Go faoi na seirbhísí seo agus is féidir leo cód a íoslódáil, a thógáil agus a shuiteáil uathu in aon titim amháin. Cé go bhfuil sé seo iontach, tá locht mór ar an leagan! Sea, is fíor gur féidir leat an cód foinse a fháil ó sheirbhísí cosúil le github nó bitbucket ag baint úsáide as uirlisí Go, ach ní féidir leat an leagan a shonrú. Agus arís simplíocht ar chostas úsáideach. Níl mé in ann an loighic a bhaineann le cinneadh den sórt sin a thuiscint.

Tar éis ceisteanna a chur faoi réiteach ar an bhfadhb seo, chruthaigh an fhoireann forbartha Go snáithe fóram, a leag amach conas a bhí siad chun dul timpeall ar an gceist seo. Ba é an moladh a bhí acu ná an stór iomlán a chóipeáil isteach i do thionscadal lá amháin agus é a fhágáil “mar atá.” Cad é an ifreann atá siad ag smaoineamh? Tá córais rialaithe leagan iontach againn le clibeáil iontach agus tacaíocht leagan a ndéanann cruthaitheoirí Go neamhaird orthu agus gan ach an cód foinse a chóipeáil.

Bagáiste cultúrtha ó Xi

Is é mo thuairim gur daoine a d'úsáid C ar feadh a saoil agus iad siúd nach raibh ag iarraidh rud éigin nua a thriail a d'fhorbair Go. Is féidir cur síos a dhéanamh ar an teanga mar C le rothaí breise (orig.: rothaí traenála). Níl aon smaointe nua ann, ach amháin tacaíocht do chomhthreomhaireacht (atá, dála an scéil, iontach) agus is mór an náire é seo. Tá comhthreomhaireacht den scoth agat i dteanga bhacach ar éigean inúsáidte.

Fadhb eile atá ag sméideadh ná gur teanga nós imeachta í Go (cosúil le uafás ciúin C). Ar deireadh scríobhann tú cód i stíl nós imeachta a bhraitheann seandálaíochta agus as dáta. Tá a fhios agam nach piléar airgid é ríomhchlárú atá dírithe ar oibiachtaí, ach bheadh ​​sé iontach a bheith in ann na sonraí a achomaireacht ina gcineálacha agus imchochlú a sholáthar.

Simplíocht chun do leasa féin

Ceapadh Go le bheith simplí agus éiríonn leis ag an sprioc sin. Scríobhadh é do ríomhchláraitheoirí lag, ag baint úsáide as seantheanga mar theimpléad. Tagann sé iomlán le huirlisí simplí chun rudaí simplí a dhéanamh. Tá sé éasca le léamh agus éasca le húsáid.

Tá sé thar a bheith focal, unimpressive, agus olc do ríomhchláraitheoirí cliste.

Go raibh maith agat mersinvald le haghaidh eagarthóireachta

Foinse: will.com

Add a comment