Carson a tha Dealbhadh Go dona dha luchd-prògramaidh snasail

Thairis air na mìosan a dh’ fhalbh tha mi air a bhith a’ cleachdadh Go airson buileachadh. Dearbhadh air Bun-bheachd (mu thuairmeas.: còd gus gnìomhachd beachd a dhearbhadh) anns an ùine shaor aige, gu ìre airson sgrùdadh a dhèanamh air a’ chànan prògramaidh fhèin. Tha na prògraman fhèin gu math sìmplidh agus chan e adhbhar an artaigil seo, ach tha an eòlas air cleachdadh Go fhèin airidh air beagan fhaclan mu dheidhinn. Tha falbh a' gealltainn a bhith (mu thuairmeas.: artaigil sgrìobhte ann an 2015) cànan mòr-chòrdte airson fìor chòd scalable. Chaidh an cànan a chruthachadh le Google, far a bheilear ga chleachdadh gu gnìomhach. Gu h-ìosal, tha mi gu h-onarach a’ smaoineachadh gu bheil dealbhadh cànan Go dona dha prògramadairean snasail.

Dealbhaichte airson luchd-prògramaidh lag?

Tha Go gu math furasta ionnsachadh, cho furasta ‘s gun tug an ro-ràdh mi aon fheasgar, às deidh sin b’ urrainn dhomh còdadh gu cinneasach mu thràth. Canar an leabhar a b’ àbhaist dhomh a bhith ag ionnsachadh Go Ro-ràdh do Phrògramadh ann an Go (eadar-theangachadh), tha e ri fhaighinn air-loidhne. Tha an leabhar, mar an còd stòr Go fhèin, furasta a leughadh, tha eisimpleirean còd math ann, agus tha timcheall air 150 duilleag ann a ghabhas leughadh ann an aon turas. Tha an sìmplidheachd seo ùrachail an toiseach, gu sònraichte ann an saoghal prògramadh làn de theicneòlas a tha ro iom-fhillte. Ach aig a’ cheann thall, luath no mall tha an smuain ag èirigh: “A bheil seo fìor dha-rìribh?”

Tha Google ag agairt gur e sìmplidheachd Go an àite reic aige agus tha an cànan air a dhealbhadh airson a’ chinneasachd as motha ann an sgiobaidhean mòra, ach tha mi teagmhach. Tha feartan ann a tha a dhìth no ro mhionaideach. Agus a h-uile càil air sgàth dìth earbsa ann an luchd-leasachaidh, leis a 'bharail nach urrainn dhaibh dad a dhèanamh ceart. Bha am miann seo airson sìmplidheachd na cho-dhùnadh mothachail le luchd-dealbhaidh a’ chànain, agus gus làn thuigse fhaighinn air carson a bha feum air, feumaidh sinn tuigse fhaighinn air brosnachadh an luchd-leasachaidh agus na bha iad a’ feuchainn ri choileanadh ann an Go.

Mar sin carson a chaidh a dhèanamh cho sìmplidh? Seo cuòt no dhà Rob Pike (mu thuairmeas.: fear de cho-chruthaichean na cànain Go):

Is e am prìomh phuing an seo gu bheil ar luchd-prògramaidh (mu thuairmeas.: Googlers) nach eil nan luchd-rannsachaidh. Tha iad, mar riaghailt, gu math òg, a’ tighinn thugainn às deidh dhaibh ionnsachadh, is dòcha gun do rinn iad sgrùdadh air Java, no C / C ++, no Python. Chan urrainn dhaibh cànan math a thuigsinn, ach aig an aon àm tha sinn airson gun cruthaich iad bathar-bog math. Sin as coireach gum bu chòir an cànan aca a bhith furasta dhaibh a thuigsinn agus ionnsachadh.
 
Bu chòir dha a bhith eòlach, gu ìre mhòr coltach ri C. Bidh prògramadairean a tha ag obair aig Google a’ tòiseachadh air an dreuchdan tràth agus mar as trice bidh iad eòlach air cànanan modhan-obrach, gu sònraichte an teaghlach C. Tha an riatanas airson cinneasachd luath ann an cànan prògramadh ùr a’ ciallachadh nach bu chòir don chànan a bhith ro radaigeach.

Dè? Mar sin tha Rob Pike gu bunaiteach ag ràdh nach eil an luchd-leasachaidh aig Google cho math sin, is e sin as coireach gun do chruthaich iad cànan airson amadan (mu thuairmeas.: balbh sìos) gus am bi iad comasach air rudeigin a dhèanamh. Dè an seòrsa sealladh àrdanach air do cho-obraichean fhèin? Bha mi a-riamh a’ creidsinn gu bheil luchd-leasachaidh Google air an taghadh le làimh bhon fheadhainn as soilleire agus as fheàrr air an Talamh. Gu cinnteach is urrainn dhaibh rudeigin nas duilghe a làimhseachadh?

Artifacts cus sìmplidheachd

Tha a bhith sìmplidh na amas airidh ann an dealbhadh sam bith, agus tha e duilich feuchainn ri rudeigin sìmplidh a dhèanamh. Ach, nuair a thathar a’ feuchainn ri duilgheadasan iom-fhillte fhuasgladh (no eadhon a’ cur an cèill), uaireannan tha feum air inneal iom-fhillte. Chan e iom-fhillteachd agus iom-fhillteachd na feartan as fheàrr ann an cànan prògramadh, ach tha talamh meadhanach ann far an urrainn don chànan tarraingean eireachdail a chruthachadh a tha furasta an tuigsinn agus an cleachdadh.

Chan eil e gu math brosnachail

Air sgàth a dhealas a thaobh sìmplidheachd, chan eil structaran aig Go a tha air am faicinn mar rud nàdarra ann an cànanan eile. Is dòcha gur e deagh bheachd a tha seo an toiseach, ach ann an cleachdadh bidh e a’ leantainn gu còd gnìomhair. Bu chòir an adhbhar airson seo a bhith follaiseach - feumaidh e a bhith furasta do luchd-leasachaidh còd dhaoine eile a leughadh, ach gu dearbh chan eil na sìmpleachaidhean sin a’ dèanamh cron air leughadh. Chan eil giorrachaidhean ann an Go: an dàrna cuid tòrr no dad.

Mar eisimpleir, bhiodh goireas tòcan a leughas stdin no faidhle bho argamaidean loidhne-àithne a’ coimhead mar seo:

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

Ged a tha an còd seo cuideachd a 'feuchainn ri bhith cho coitcheann' sa ghabhas, bidh briathrachas èignichte Go a 'faighinn a-steach, agus mar thoradh air an sin, bidh fuasgladh air duilgheadas sìmplidh a' leantainn gu àireamh mhòr de chòd.

Seo, mar eisimpleir, fuasgladh air an aon duilgheadas ann an 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ò a tha nas so-leughaidh a-nis? Bheir mi mo bhòt do D. Tha an còd aige tòrr nas so-leughaidh oir tha e a’ toirt cunntas nas soilleire air na gnìomhan. Bidh D a’ cleachdadh bun-bheachdan tòrr nas iom-fhillte (mu thuairmeas.: gairm gnìomh eile и teamplaidean) na tha san eisimpleir Go, ach chan eil dad gu math toinnte mu bhith gan tuigsinn.

Ifrinn de chopaigeadh

Tha coitcheannachd na mholadh mòr-chòrdte airson Go a leasachadh. Cuidichidh seo co-dhiù gus lethbhreac neo-riatanach de chòd a sheachnadh gus taic a thoirt do gach seòrsa dàta. Mar eisimpleir, chan urrainnear gnìomh airson geàrr-chunntas a dhèanamh air liosta de shlànaichean a chur an gnìomh ann an dòigh sam bith eile ach le bhith a’ dèanamh leth-bhreac den ghnìomh bhunaiteach aige airson gach seòrsa slàn; chan eil dòigh eile ann:

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 chan eil an eisimpleir seo eadhon ag obair airson seòrsachan soidhnichte. Tha an dòigh-obrach seo gu tur a’ dol an aghaidh a’ phrionnsapail gun a bhith ag ath-aithris thu fhèin (Dry), aon de na prionnsapalan as ainmeil agus as follaisiche, a’ seachnadh cò às a thàinig mòran mhearachdan. Carson a tha Go a’ dèanamh seo? Is e taobh uamhasach de chànan a tha seo.

An aon eisimpleir air D:

import std.stdio;
import std.algorithm;

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

Simple, eireachdail agus dìreach chun a’ phuing. Is e an gnìomh a thathar a’ cleachdadh an seo reduce airson seòrsa teamplaid agus ro-innse. Tha, tha seo a-rithist nas toinnte na an dreach Go, ach chan eil e cho duilich dha prògramadairean snasail a thuigsinn. Dè an eisimpleir a tha nas fhasa a chumail suas agus nas fhasa a leughadh?

Seach-rathad siostam seòrsa sìmplidh

Tha mi a’ smaoineachadh gum bi prògramadairean Go a’ leughadh seo a’ copadh nam beul agus a’ sgreuchail, “Tha thu ga dhèanamh ceàrr!” Uill, tha dòigh eile ann airson gnìomh coitcheann agus seòrsachan a dhèanamh, ach tha e gu tur a 'briseadh an t-siostam seòrsa!

Thoir sùil air an eisimpleir seo de fhuasgladh cànain gòrach gus an duilgheadas fhuasgladh:

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

An gnìomh seo Reduce air iasad bhon artaigil Idiomatic generics ann an Go (mu thuairmeas.: Cha b’ urrainn dhomh an eadar-theangachadh a lorg, bidh mi toilichte ma chuidicheas tu le seo). Uill, mas e gnàthasan-cainnte a th’ ann, bu mhath leam eisimpleir neo-ghnàthach fhaicinn. Cleachdadh interface{} - baoth-chluich, agus anns a 'chànan a tha a dhìth a-mhàin a dhol seachad air taipeadh. Is e eadar-aghaidh falamh a tha seo agus bidh a h-uile seòrsa ga chuir an gnìomh, a’ toirt saorsa iomlan don h-uile duine. Tha an stoidhle prògramadh seo uamhasach grànda, agus chan e sin uile. Feumaidh cleasan acrobatic mar seo cleachdadh meòrachadh runtime. Cha toil le eadhon Rob Pike daoine fa leth a tha a’ dèanamh ana-cainnt air seo, mar a thuirt e ann an aon de na h-aithisgean aige.

Is e inneal cumhachdach a tha seo a bu chòir a chleachdadh gu faiceallach. Bu chòir a sheachnadh mura h-eil e riatanach.

Bhithinn a’ gabhail teamplaidean D an àite na neòinean seo. Ciamar as urrainn do dhuine sam bith sin a ràdh interface{} nas so-leughaidh no eadhon dèan seòrsa sàbhailte?

Na Bròn a thaobh Riaghladh Eisimeileachd

Tha siostam eisimeileachd togte aig Go a chaidh a thogail a bharrachd air solaraichean aoigheachd mòr-chòrdte VCS. Tha fios aig na h-innealan a thig le Go mu na seirbheisean sin agus faodaidh iad còd a luchdachadh sìos, a thogail agus a chuir a-steach bhuapa ann an aon thuit swoop. Ged a tha seo fìor mhath, tha locht mòr ann le dreach! Tha, tha e fìor gum faigh thu an còd tùsail bho sheirbheisean leithid github no bitbucket a’ cleachdadh Go tools, ach chan urrainn dhut an dreach a shònrachadh. Agus a-rithist sìmplidheachd aig cosgais feumail. Chan urrainn dhomh loidsig co-dhùnadh mar sin a thuigsinn.

Às deidh dhaibh ceistean fhaighneachd mu fhuasgladh air an duilgheadas seo, chruthaich sgioba leasachaidh Go snàithlean fòram, a mhìnich mar a bha iad gu bhith faighinn timcheall na cùise seo. B ’e am moladh aca dìreach an stòr gu lèir a chopaigeadh a-steach don phròiseact agad aon latha agus fhàgail“ mar a tha. ” Dè an ifrinn a tha iad a’ smaoineachadh? Tha siostaman smachd dreach iongantach againn le tagadh sgoinneil agus taic dreach nach bi luchd-cruthachaidh Go a’ seachnadh agus dìreach dèan lethbhreac den chòd stòr.

Bagannan cultarail bho Xi

Nam bheachd-sa, chaidh Go a leasachadh le daoine a bha air C a chleachdadh fad am beatha agus leis an fheadhainn nach robh airson rudeigin ùr fheuchainn. Faodar an cànan a mhìneachadh mar C le cuibhlichean a bharrachd (orig.: cuibhlichean trèanaidh). Chan eil beachdan ùra ann, ach a-mhàin taic airson co-shìnteachd (a tha, leis an t-slighe, mìorbhaileach) agus tha seo tàmailteach. Tha co-shìnteachd sàr-mhath agad ann an cànan bacach nach gabh a chleachdadh ach ainneamh.

Is e duilgheadas uamhasach eile gur e cànan modh-obrach a th’ ann an Go (mar uabhas sàmhach C). Bidh thu mu dheireadh a’ sgrìobhadh còd ann an stoidhle modh-obrach a tha a’ faireachdainn àrsaidh agus seann-fhasanta. Tha fios agam nach e peilear airgid a th’ ann am prògramadh a tha ag amas air nithean, ach bhiodh e math a bhith comasach air mion-fhiosrachadh a thoirt a-steach do sheòrsan agus cuairteachadh a thoirt seachad.

Simplidheachd airson do bhuannachd fhèin

Chaidh Go a dhealbhadh airson a bhith sìmplidh agus bidh e a’ soirbheachadh aig an amas sin. Chaidh a sgrìobhadh airson luchd-prògramaidh lag, a 'cleachdadh seann chànan mar theamplaid. Tha e a’ tighinn le innealan sìmplidh airson rudan sìmplidh a dhèanamh. Tha e furasta a leughadh agus furasta a chleachdadh.

Tha e gu math labhairteach, neo-bhrùideil, agus dona dha luchd-prògramaidh snasail.

Спасибо mersinvald airson deasachaidhean

Source: www.habr.com

Cuir beachd ann