Me yasa Go Design Yayi Mummuna ga Masu Shirye-shiryen Waya

A cikin watannin da suka gabata ina amfani da Go don aiwatarwa. Hujja na Tunani (kusan: code don gwada aikin ra'ayi) a cikin lokacinsa na kyauta, wani bangare don nazarin harshen shirye-shirye da kansa. Shirye-shiryen da kansu suna da sauƙi kuma ba manufar wannan labarin ba, amma ƙwarewar amfani da Go kanta ya cancanci 'yan kalmomi game da shi. Tafi alkawuran zama (kusan: labarin da aka rubuta a cikin 2015) sanannen harshe don lambar ƙima mai mahimmanci. Google ne ya kirkiro harshen, inda ake amfani da shi sosai. A ƙasa, ina tunanin gaskiya cewa ƙirar harshen Go ba shi da kyau ga masu shirye-shirye masu wayo.

An tsara don masu shirye-shirye masu rauni?

Tafi yana da sauƙin koya, da sauƙi har gabatarwar ta ɗauki ni wata maraice, bayan haka zan iya riga na iya yin code da kyau. Littafin da na koya Go shi ake kira Gabatarwa zuwa Shirye-shirye a cikin Go (fassarar), yana samuwa akan layi. Littafin, kamar lambar tushe ta Go kanta, yana da sauƙin karantawa, yana da kyawawan misalai na lamba, kuma yana ɗauke da shafuka kusan 150 waɗanda za a iya karanta su a tafi ɗaya. Wannan sauƙi yana da daɗi da farko, musamman a cikin duniyar shirye-shiryen da ke cike da fasaha mai rikitarwa. Amma a ƙarshe, ba da daɗewa ba tunanin ya taso: "Shin da gaske haka?"

Google yayi iƙirarin sauƙi na Go shine wurin siyar da yaren kuma an tsara yaren don iyakar yawan aiki a cikin manyan ƙungiyoyi, amma ina shakka. Akwai fasalulluka waɗanda ko dai sun ɓace ko dalla-dalla. Kuma duk saboda rashin amincewa ga masu haɓakawa, tare da tsammanin cewa ba za su iya yin wani abu daidai ba. Wannan sha'awar sauƙi shine yanke shawara mai hankali daga masu zanen harshe, kuma don cikakken fahimtar dalilin da yasa ake buƙata, dole ne mu fahimci kwarin gwiwar masu haɓakawa da abin da suke ƙoƙarin cimma a Go.

To me yasa aka yi shi da sauki? Ga wasu maganganu guda biyu Rob Pike (kusan: daya daga cikin masu kirkiro harshen Go):

Babban abin lura anan shine masu shirye-shiryen mu (kusan: Googlers) ba masu bincike ba ne. Su, a ka’ida, matasa ne, suna zuwa wurinmu bayan sun yi karatu, watakila sun karanci Java, ko C/C++, ko Python. Ba za su iya fahimtar babban harshe ba, amma a lokaci guda muna son su ƙirƙira software mai kyau. Shi ya sa ya kamata yarensu ya kasance da sauƙin fahimta da koyo.
 
Ya kamata ya zama saba, kusan yana magana kama da C. Masu shirye-shirye da ke aiki a Google suna fara ayyukansu da wuri kuma galibi sun saba da yarukan tsari, musamman dangin C. Bukatun don saurin samarwa a cikin sabon yaren shirye-shirye yana nufin kada harshen ya kasance mai tsattsauran ra'ayi.

Menene? Don haka Rob Pike yana faɗin cewa masu haɓakawa a Google ba su da kyau sosai, shi ya sa suka ƙirƙiri yare ga wawaye (kusan: dumbed down) domin su sami damar yin wani abu. Wane irin girman kai ne ke kallon abokan aikin ku? Na yi imani koyaushe cewa masu haɓaka Google an zabo su ne daga mafi haske kuma mafi kyau a Duniya. Tabbas za su iya ɗaukar wani abu mafi wuya?

Abubuwan kayan tarihi na sauƙi mai yawa

Kasancewa mai sauƙi shine manufa mai dacewa a kowane zane, kuma ƙoƙarin yin wani abu mai sauƙi yana da wuyar gaske. Koyaya, lokacin ƙoƙarin warware (ko ma bayyana) matsaloli masu rikitarwa, wani lokacin ana buƙatar kayan aiki mai rikitarwa. Matsala da tsatsauran ra'ayi ba shine mafi kyawun fasali na yaren shirye-shirye ba, amma akwai tsaka-tsaki wanda harshe zai iya ƙirƙirar ƙayatattun abubuwan ƙirƙira masu sauƙin fahimta da amfani.

Ba mai bayyanawa sosai ba

Saboda jajircewar sa ga sauƙi, Go ba shi da gine-ginen da ake ganin na halitta ne a wasu harsuna. Wannan yana iya zama kamar kyakkyawan ra'ayi da farko, amma a aikace yana haifar da lambar magana. Dalilin wannan ya kamata ya zama a bayyane - yana buƙatar sauƙi ga masu haɓakawa don karanta lambar wasu mutane, amma a gaskiya waɗannan sauƙaƙan suna cutar da iya karantawa. Babu gajarta a cikin Go: ko dai da yawa ko ba komai.

Misali, kayan aikin wasan bidiyo wanda ke karanta stdin ko fayil daga gardamar layin umarni zai yi kama da haka:

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

Ko da yake wannan lambar kuma tana ƙoƙarin zama gaba ɗaya kamar yadda zai yiwu, Go's tilasta verbosity ya shiga hanya, kuma a sakamakon haka, warware matsala mai sauƙi yana haifar da adadi mai yawa.

Anan, alal misali, shine mafita ga wannan matsala a ciki 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);
    }
}

Kuma wa ya fi karatu yanzu? Zan ba da kuri'ata ga D. Lambar sa ta fi iya karantawa saboda ya bayyana ayyukan a fili. D yana amfani da dabaru masu rikitarwa da yawa (kusan: madadin aikin kira и alamu) fiye da a cikin misalin Go, amma da gaske babu wani abu mai rikitarwa game da fahimtar su.

Jahannama ta kwafi

Shahararriyar shawara don inganta Go ita ce ta gaba ɗaya. Wannan zai aƙalla taimakawa guje wa kwafin lambar da ba dole ba don tallafawa kowane nau'in bayanai. Misali, ba za a iya aiwatar da wani aiki don tara lissafin lamba ba ta wata hanya dabam ta hanyar kwafin-manna ainihin aikinsa ga kowane nau'in lamba; babu wata hanya:

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

Kuma wannan misali baya aiki don nau'ikan sa hannu. Wannan tsarin gaba daya ya saba wa ka'idar rashin maimaita kanku (bushe), daya daga cikin mafi shahara kuma bayyananne ka'idoji, yin watsi da wanda shine tushen kurakurai da yawa. Me yasa Go ke yin haka? Wannan mummunan al'amari ne na harshe.

Misali daya akan D:

import std.stdio;
import std.algorithm;

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

Mai sauƙi, m kuma madaidaiciya zuwa ma'ana. Aikin da ake amfani da shi anan shine reduce don nau'in samfuri da predicate. Ee, wannan ya sake yin rikitarwa fiye da sigar Go, amma ba mai wahala ga masu shirye-shirye masu wayo su fahimta ba. Wane misali ne ya fi sauƙi a kula da shi kuma ya fi sauƙin karantawa?

Sauƙaƙe tsarin kewaye

Ina tsammanin masu shirye-shiryen Go suna karanta wannan za su kasance suna kumfa a baki suna kururuwa, "Kuna yi ba daidai ba!" Da kyau, akwai wata hanya don yin aikin jeri da nau'ikan, amma ya karya nau'in nau'in!

Dubi wannan misali na gyaran harshe na wawa don aiki a warware matsalar:

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

Wannan aiwatarwa Reduce an aro daga labarin Ƙididdigar ƙididdiga a cikin Go (kusan: Ba zan iya samun fassarar ba, zan yi farin ciki idan kun taimaka da wannan). To, idan yana da ma'ana, zan ƙi in ga misali mara kyau. Amfani interface{} - farce, kuma a cikin harshen ana buƙatar kawai don ƙetare buga rubutu. Wannan sigar fanko ce kuma kowane nau'in aiwatar da shi, yana ba da cikakken 'yanci ga kowa da kowa. Wannan salon shirye-shiryen yana da munin muni, kuma ba haka ba ne. Ayyukan acrobatic irin waɗannan suna buƙatar yin amfani da tunani na lokacin gudu. Ko Rob Pike ba ya son mutanen da ke cin zarafin wannan, kamar yadda ya ambata a cikin daya daga cikin rahotannin sa.

Wannan kayan aiki ne mai ƙarfi wanda ya kamata a yi amfani da shi tare da taka tsantsan. Yakamata a guji shi sai dai idan ya zama dole.

Zan ɗauki samfuran D maimakon wannan maganar banza. Ta yaya wani zai ce haka interface{} mafi karantawa ko ma rubuta lafiya?

Bala'in Gudanarwar Dogara

Go yana da ginannen tsarin dogara da aka gina a saman mashahuran masu ba da sabis VCS. Kayan aikin da ke zuwa tare da Go sun san game da waɗannan ayyukan kuma suna iya saukewa, ginawa, da shigar da lamba daga gare su a cikin faɗuwar rana. Duk da yake wannan yana da kyau, akwai babban aibi tare da siga! Ee, gaskiya ne cewa zaku iya samun lambar tushe daga ayyuka kamar github ko bitbucket ta amfani da kayan aikin Go, amma ba za ku iya tantance sigar ba. Kuma sake sauƙi a kashe amfani. Ba zan iya fahimtar hikimar irin wannan shawarar ba.

Bayan yin tambayoyi game da mafita ga wannan matsala, ƙungiyar ci gaban Go ta ƙirƙira zaren dandalin, wanda ya bayyana yadda za su shawo kan wannan batu. Shawarwarsu ita ce kawai a kwafi duk ma'ajiyar cikin aikin ku wata rana kuma ku bar shi "kamar yadda yake." Me suke tunani? Muna da tsarin sarrafa sigar ban mamaki tare da babban alamar alama da goyan bayan sigar waɗanda masu ƙirƙirar Go suka yi watsi da su kuma kawai kwafi lambar tushe.

Kayan al'adu daga Xi

A ganina, Go ya samo asali ne daga mutanen da suka yi amfani da C a duk rayuwarsu da kuma waɗanda ba sa son gwada sabon abu. Za a iya siffanta harshen a matsayin C tare da ƙarin ƙafafun (asali.: ƙafafun horo). Babu wani sabon ra'ayi a ciki, sai dai don goyon baya ga daidaito (wanda, ta hanyar, yana da ban mamaki) kuma wannan abin kunya ne. Kuna da kyakkyawan daidaito a cikin harshe mara amfani, gurgu.

Wata matsala mai tada hankali ita ce Go yaren tsari ne (kamar abin tsoro na C). Za ku ƙare rubuta lambar a cikin salon tsari wanda ke jin tsoho da tsufa. Na san shirye-shiryen daidaita abubuwan ba harsashi na azurfa ba ne, amma zai yi kyau a sami damar taƙaita cikakkun bayanai cikin nau'ikan da samar da ɓoyewa.

Sauƙi don amfanin kanku

An tsara Go don zama mai sauƙi kuma ya yi nasara a wannan burin. An rubuta shi don masu tsara shirye-shirye masu rauni, ta amfani da tsohon harshe azaman samfuri. Ya zo cikakke tare da kayan aiki masu sauƙi don yin abubuwa masu sauƙi. Yana da sauƙin karantawa da sauƙin amfani.

Yana da matukar fa'ida, mara ban sha'awa, kuma mara kyau ga masu shirye-shirye masu wayo.

Спасибо mersinvald don gyarawa

source: www.habr.com

Add a comment