Kini idi ti Apẹrẹ Go jẹ buburu fun Awọn oluṣeto Smart

Ni awọn oṣu to kọja Mo ti nlo Go fun awọn imuse. Ẹri ti Igbimọ (isunmọ.: koodu lati ṣe idanwo iṣẹ ṣiṣe ti imọran) ni akoko ọfẹ rẹ, apakan lati kawe ede siseto funrararẹ. Awọn eto funrararẹ rọrun pupọ ati kii ṣe idi ti nkan yii, ṣugbọn iriri ti lilo Go funrararẹ yẹ awọn ọrọ diẹ nipa rẹ. Lọ awọn ileri lati jẹ (isunmọ.Nkan ti a kọ ni ọdun 2015) ede olokiki fun koodu iwọn to ṣe pataki. Google ti ṣẹda ede naa, nibiti o ti nlo ni itara. Laini isalẹ, Mo ro nitootọ pe apẹrẹ ti ede Go jẹ buburu fun awọn olutọpa ọlọgbọn.

Apẹrẹ fun alailagbara pirogirama?

Go jẹ rọrun pupọ lati kọ ẹkọ, o rọrun pupọ pe ifihan jẹ mi ni irọlẹ ọjọ kan, lẹhin eyi Mo le tẹlẹ koodu ni iṣelọpọ. Iwe ti mo lo lati ko Go ni a npe ni Ifihan si siseto ni Go (translation), o wa lori ayelujara. Iwe naa, bii koodu orisun Go funrararẹ, rọrun lati ka, ni awọn apẹẹrẹ koodu to dara, o si ni awọn oju-iwe 150 ti o le ka ni ijoko kan. Irọrun yii jẹ onitura ni akọkọ, pataki ni agbaye siseto ti o kun fun imọ-ẹrọ idiju. Àmọ́ nígbẹ̀yìngbẹ́yín, ọ̀rọ̀ náà á dìde pé: “Ṣé èyí rí bẹ́ẹ̀ lóòótọ́?”

Google sọ pe o rọrun Go ni aaye tita rẹ ati pe ede jẹ apẹrẹ fun iṣelọpọ ti o pọju ni awọn ẹgbẹ nla, ṣugbọn Mo ṣiyemeji rẹ. Awọn ẹya wa ti o padanu tabi alaye apọju. Ati gbogbo nitori aini igbẹkẹle ninu awọn olupilẹṣẹ, pẹlu arosinu pe wọn ko ni anfani lati ṣe ohunkohun ti o tọ. Ifẹ fun ayedero yii jẹ ipinnu mimọ nipasẹ awọn apẹẹrẹ ede, ati lati ni oye ni kikun idi ti o nilo rẹ, a gbọdọ loye iwuri ti awọn olupilẹṣẹ ati ohun ti wọn n gbiyanju lati ṣaṣeyọri ni Go.

Nítorí náà, idi ti a ṣe ki o rọrun? Nibi ni o wa kan tọkọtaya ti avvon Rob Pike (isunmọ.: ọ̀kan lára ​​àwọn olùdájọ́ èdè Go):

Koko pataki nibi ni pe awọn olupilẹṣẹ wa (isunmọ.: Googlers) kii ṣe awọn oniwadi. Wọn jẹ, gẹgẹ bi ofin, wọn jẹ ọdọ, wa si wa lẹhin ikẹkọ, boya wọn kọ Java, tabi C/C ++, tabi Python. Wọn ko le loye ede nla kan, ṣugbọn ni akoko kanna a fẹ ki wọn ṣẹda sọfitiwia to dara. Ìdí nìyẹn tó fi yẹ kí èdè wọn rọrùn fún wọn láti lóye kí wọ́n sì kọ́ wọn.
 
O yẹ ki o faramọ, ni aijọju sisọ iru si C. Awọn olupilẹṣẹ ti n ṣiṣẹ ni Google bẹrẹ awọn iṣẹ ṣiṣe wọn ni kutukutu ati pe wọn mọ pupọ julọ pẹlu awọn ede ilana, ni pataki idile C. Ibeere fun iṣelọpọ iyara ni ede siseto tuntun tumọ si pe ede ko yẹ ki o jẹ ipilẹṣẹ pupọ.

Kini? Nitorinaa Rob Pike n sọ ni ipilẹ pe awọn olupilẹṣẹ ni Google ko dara, iyẹn ni idi ti wọn fi ṣẹda ede kan fun awọn aṣiwere (isunmọ.: dumbed down) ki wọn le ṣe nkan kan. Iru igberaga wo ni wo awọn ẹlẹgbẹ tirẹ? Mo ti gbagbọ nigbagbogbo pe awọn olupilẹṣẹ Google jẹ ọwọ ti a yan lati imọlẹ julọ ati ti o dara julọ lori Earth. Dajudaju wọn le mu nkan ti o nira sii bi?

Artifacts ti nmu ayedero

Jije rọrun jẹ ibi-afẹde ti o yẹ ni eyikeyi apẹrẹ, ati igbiyanju lati ṣe nkan ti o rọrun jẹ nira. Bibẹẹkọ, nigba igbiyanju lati yanju (tabi paapaa ṣalaye) awọn iṣoro idiju, nigbakan a nilo irinṣẹ eka kan. Idiju ati intricacy kii ṣe awọn ẹya ti o dara julọ ti ede siseto, ṣugbọn aaye aarin kan wa ninu eyiti ede le ṣẹda awọn abstractions yangan ti o rọrun lati loye ati lo.

Ko ṣe afihan pupọ

Nitori ifaramo rẹ si ayedero, Go ko ni awọn igbelewọn ti a rii bi adayeba ni awọn ede miiran. Eyi le dabi imọran ti o dara ni akọkọ, ṣugbọn ni iṣe o ṣe abajade ni koodu ọrọ-ọrọ. Idi fun eyi yẹ ki o han gbangba - o nilo lati rọrun fun awọn olupilẹṣẹ lati ka koodu awọn eniyan miiran, ṣugbọn ni otitọ awọn simplifications wọnyi ṣe ipalara kika kika. Ko si awọn kuru ni Go: boya pupọ tabi nkankan.

Fun apẹẹrẹ, ohun elo console ti o ka stdin tabi faili kan lati awọn ariyanjiyan laini aṣẹ yoo dabi eyi:

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

Botilẹjẹpe koodu yii tun gbiyanju lati jẹ gbogbogbo bi o ti ṣee ṣe, ọrọ-ọrọ fi agbara mu Go wa ni ọna, ati bi abajade, yanju iṣoro ti o rọrun ni abajade ni iye nla ti koodu.

Nibi, fun apẹẹrẹ, jẹ ojutu si iṣoro kanna ni 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);
    }
}

Ati awọn ti o jẹ diẹ kika bayi? Emi yoo fi ibo mi fun D. koodu rẹ jẹ kika diẹ sii nitori pe o ṣe apejuwe awọn iṣe diẹ sii kedere. D nlo awọn imọran ti o ni idiwọn pupọ diẹ sii (isunmọ.: yiyan iṣẹ ipe и awọn awoṣe) ju ninu awọn Go apẹẹrẹ, ṣugbọn nibẹ ni gan ohunkohun idiju nipa a ni oye wọn.

Apaadi didaakọ

Imọran olokiki fun ilọsiwaju Go jẹ gbogbogbo. Eyi yoo kere ju ṣe iranlọwọ lati yago fun didakọ koodu ti ko wulo lati ṣe atilẹyin fun gbogbo awọn iru data. Fun apẹẹrẹ, iṣẹ kan fun akopọ atokọ ti awọn odidi ko le ṣe imuse ni ọna miiran ju nipa daakọ-lẹẹmọ iṣẹ ipilẹ rẹ fun iru odidi kọọkan; ko si ọna miiran:

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

Ati apẹẹrẹ yii ko ṣiṣẹ paapaa fun awọn oriṣi ti o fowo si. Ọna yii rú patapata ilana ti ko tun ara rẹ ṣe (gbẹ), ọkan ninu awọn julọ olokiki ati awọn ilana ti o han gbangba, aibikita ti o jẹ orisun ti ọpọlọpọ awọn aṣiṣe. Kini idi ti Go ṣe eyi? Eyi jẹ ẹya ẹru ti ede.

Apẹẹrẹ kanna lori D:

import std.stdio;
import std.algorithm;

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

Rọrun, yangan ati taara si aaye naa. Iṣẹ ti a lo nibi ni reduce fun awoṣe iru ati predicate. Bẹẹni, eyi tun jẹ idiju diẹ sii ju ẹya Go lọ, ṣugbọn kii ṣe pe o nira fun awọn pirogirama ọlọgbọn lati ni oye. Apẹẹrẹ wo ni o rọrun lati ṣetọju ati rọrun lati ka?

Simple iru eto fori

Mo ro pe awọn olupilẹṣẹ Go ti n ka eyi yoo jẹ foomu ni ẹnu ti wọn si pariwo, “O ṣe aṣiṣe!” O dara, ọna miiran wa lati ṣe iṣẹ jeneriki ati awọn oriṣi, ṣugbọn o fọ eto iru patapata!

Wo apẹẹrẹ yii ti atunṣe ede aṣiwere lati ṣiṣẹ ni ayika iṣoro naa:

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

Yi imuse Reduce ti a ya lati article Idiomatic jeneriki ni Go (isunmọ.: Emi ko le ri itumọ, Emi yoo dun ti o ba ṣe iranlọwọ pẹlu eyi). O dara, ti o ba jẹ idiomatic, Emi yoo korira lati rii apẹẹrẹ ti kii ṣe idiomatic. Lilo interface{} - a farce, ati ninu awọn ede ti o ti nilo nikan lati fori titẹ. Eyi jẹ wiwo ti o ṣofo ati gbogbo awọn oriṣi ṣe imuse rẹ, gbigba ominira pipe fun gbogbo eniyan. Yi ara ti siseto jẹ burú ilosiwaju, ati awọn ti o ni ko gbogbo. Awọn iṣẹ iṣe acrobatic bii iwọnyi nilo lilo iṣaro akoko asiko. Paapaa Rob Pike ko fẹran awọn ẹni-kọọkan ti o ṣe ilokulo eyi, bi o ti mẹnuba ninu ọkan ninu awọn ijabọ rẹ.

Eyi jẹ ohun elo ti o lagbara ti o yẹ ki o lo pẹlu iṣọra. O yẹ ki o yago fun ayafi ti o muna pataki.

Emi yoo mu awọn awoṣe D dipo ọrọ isọkusọ yii. Bawo ni ẹnikẹni ṣe le sọ iyẹn interface{} diẹ kika tabi paapa tẹ ailewu?

Awọn Egbé ti Iṣakoso Igbẹkẹle

Go ni eto igbẹkẹle ti a ṣe sinu oke ti awọn olupese alejo gbigba olokiki VCS. Awọn irinṣẹ ti o wa pẹlu Go mọ nipa awọn iṣẹ wọnyi ati pe o le ṣe igbasilẹ, kọ, ati fi koodu sii lati ọdọ wọn ni isubu kan. Lakoko ti eyi jẹ nla, abawọn pataki kan wa pẹlu ikede! Bẹẹni, o jẹ otitọ pe o le gba koodu orisun lati awọn iṣẹ bii github tabi bitbucket nipa lilo awọn irinṣẹ Go, ṣugbọn o ko le pato ẹya naa. Ati lẹẹkansi ayedero ni laibikita fun iwulo. Emi ko ni anfani lati loye ọgbọn ti iru ipinnu bẹẹ.

Lẹhin ti o beere awọn ibeere nipa ojutu kan si iṣoro yii, ẹgbẹ idagbasoke Go ṣẹda forum o tẹle, eyi ti o ṣe ilana bi wọn yoo ṣe gba ni ayika ọrọ yii. Iṣeduro wọn ni lati daakọ gbogbo ibi-ipamọ sinu iṣẹ akanṣe rẹ ni ọjọ kan ki o fi silẹ “bi o ti ri.” Kini apaadi ti wọn nro? A ni awọn eto iṣakoso ẹya iyalẹnu pẹlu fifi aami si nla ati atilẹyin ẹya ti awọn olupilẹṣẹ Go foju kọju si ati daakọ koodu orisun nikan.

Awọn ẹru aṣa lati Xi

Ni ero mi, Go ni idagbasoke nipasẹ awọn eniyan ti o ti lo C ni gbogbo igbesi aye wọn ati nipasẹ awọn ti ko fẹ gbiyanju nkan tuntun. Ede le ṣe apejuwe bi C pẹlu awọn kẹkẹ afikun (origi.: ikẹkọ wili). Ko si awọn imọran titun ninu rẹ, ayafi fun atilẹyin fun parallelism (eyiti, nipasẹ ọna, jẹ iyanu) ati pe eyi jẹ itiju. O ni afiwe ti o dara julọ ni ede ti o rọrun, arọ.

Iṣoro gbigbo miiran ni pe Go jẹ ede ilana (bii ẹru ipalọlọ ti C). O pari koodu kikọ ni ara ilana ti o kan lara ti igba atijọ ati igba atijọ. Mo mọ siseto iṣalaye ohun kii ṣe ọta ibọn fadaka, ṣugbọn yoo jẹ nla lati ni anfani lati ni anfani lati ṣe alaye awọn alaye sinu awọn oriṣi ati pese fifin.

Irọrun fun anfani tirẹ

A ṣe apẹrẹ Go lati rọrun ati pe o ṣaṣeyọri ni ibi-afẹde yẹn. A kọ ọ fun awọn olupilẹṣẹ alailagbara, ni lilo ede atijọ bi awoṣe. O wa ni pipe pẹlu awọn irinṣẹ ti o rọrun lati ṣe awọn ohun ti o rọrun. O rọrun lati ka ati rọrun lati lo.

O jẹ ọrọ-ọrọ pupọ, aibikita, ati buburu fun awọn olutọpa ọlọgbọn.

Спасибо mersinvald fun àtúnṣe

orisun: www.habr.com

Fi ọrọìwòye kun