Poukisa Go se yon move pou pwogramè Unsmart

Atik la te ekri kòm yon repons a yon pibliye deja atik antipod.

Poukisa Go se yon move pou pwogramè Unsmart

Pandan de ane ki sot pase yo, mwen te itilize Go pou aplike yon sèvè RADIUS espesyalize ak yon sistèm fakturasyon devlope. Sou wout la, m ap aprann sibtilite lang nan tèt li. Pwogram yo tèt yo trè senp epi yo pa objektif atik sa a, men eksperyans nan sèvi ak Go tèt li merite kèk mo nan defans li. Go ap vin tounen yon langaj de pli zan pli endikap pou kòd serye, évolutive. Lang lan te kreye pa Google, kote li aktivman itilize. Anba liy, mwen onètman panse ke konsepsyon an nan lang nan Go se move pou pwogramasyon UNintelligent.

Ki fèt pou pwogramasyon fèb?

Moun ki fèb yo pale de pwoblèm. Pale fò sou lide ak rèv...

Go se trè fasil yo aprann, tèlman fasil ke ou ka li kòd la ak nòmalman pa gen fòmasyon nan tout. Karakteristik sa a nan lang lan yo itilize nan anpil konpayi mondyal lè yo li kòd la ansanm ak espesyalis ki pa debaz (manadjè, kliyan, elatriye). Sa a trè pratik pou metodoloji tankou Design Driven Development.
Menm pwogramè inisyasyon yo kòmanse pwodwi kòd byen desan apre yon semèn oswa de. Liv mwen etidye a se "Go Programming" (pa Mark Summerfield). Liv la trè bon, li touche anpil nuans nan lang nan. Apre lang konplike san nesesite tankou Java, PHP, mank de majik se entérésan. Men, pi bonè oswa pita, anpil pwogramasyon limite gen lide pou yo sèvi ak ansyen metòd nan yon nouvo domèn. Èske sa vrèman nesesè?

Rob Pike (ideolojis prensipal lang nan) te kreye lang Go a kòm yon lang endistriyèl ki fasil pou konprann ak efikas pou itilize. Lang lan fèt pou pwodiktivite maksimòm nan ekip gwo e pa gen okenn dout sou li. Anpil pwogramè inisyasyon plenyen ke gen anpil karakteristik ke yo manke. Dezi sa a pou senplisite se te yon desizyon konsyan pa konsèpteur lang nan, epi yo nan lòd yo byen konprann poukisa li te nesesè, nou dwe konprann motivasyon an nan devlopè yo ak sa yo te ap eseye reyalize nan Go.

Se konsa, poukisa li te fè senp konsa? Men kèk sitasyon ki soti nan Rob Pike:

Pwen kle isit la se ke pwogramè nou yo pa chèchè. Yo, kòm yon règ, byen jèn, vin jwenn nou apre yo fin etidye, petèt yo etidye Java, oswa C/C++, oswa Python. Yo pa ka konprann yon gwo lang, men an menm tan nou vle yo kreye bon lojisyèl. Se poutèt sa lang lan ta dwe fasil pou konprann ak aprann.

Li ta dwe abitye, apeprè pale menm jan ak C. Pwogramasyon k ap travay nan Google kòmanse karyè yo byen bonè epi yo sitou abitye ak lang pwosedi yo, an patikilye fanmi C. Egzijans pou pwodiktivite rapid nan yon nouvo langaj pwogramasyon vle di ke lang lan pa ta dwe twò radikal.

Pawòl ki gen bon konprann, pa vre?

Artifacts nan senplisite

Senplisite se yon kondisyon ki nesesè pou bote. Lev Tolstoy.

Kenbe li senp se youn nan objektif ki pi enpòtan nan nenpòt konsepsyon. Kòm ou konnen, yon pwojè pafè se pa yon pwojè kote pa gen anyen yo ajoute, men youn nan ki pa gen anyen yo retire. Anpil moun kwè ke yo nan lòd yo rezoud (oswa menm eksprime) pwoblèm konplèks, yo bezwen yon zouti konplèks. Sepandan, se pa sa. Ann pran lang PERL pa egzanp. Ideolist lang yo te kwè ke yon pwogramè ta dwe gen omwen twa fason diferan pou rezoud yon pwoblèm. Ideolojis lang Go yo te pran yon lòt chemen yo te deside ke yon sèl fason, men yon sèl vrèman bon, te ase pou atenn objektif la. Apwòch sa a gen yon fondasyon serye: sèl fason se pi fasil pou aprann ak pi difisil pou bliye.

Anpil imigran plenyen ke lang nan pa genyen abstraksyon elegant. Wi, sa a se vre, men sa a se youn nan avantaj prensipal lang nan. Lang nan gen yon minimòm de maji - kidonk pa gen okenn konesans pwofon yo oblije li pwogram nan. Kòm pou verbosity nan kòd la, sa a se pa yon pwoblèm nan tout. Yon pwogram Golang byen ekri li vètikal, ak estrikti ti kras oswa pa gen okenn. Anplis de sa, vitès la nan lekti yon pwogram se omwen yon lòd nan grandè ki pi gran pase vitès la nan ekri li. Si ou konsidere ke tout kòd la gen fòma inifòm (fè lè l sèvi avèk kòmandman gofmt entegre), Lè sa a, li kèk liy siplemantè se pa yon pwoblèm ditou.

Pa trè ekspresif

Atizay pa tolere lè libète li limite. Presizyon se pa responsablite li.

Akòz dezi a pou senplisite, Go manke konstriksyon ki nan lòt lang yo pèrsu kòm yon bagay natirèl pa moun ki abitye yo. Okòmansman, li ka yon ti jan enkonvenyan, men Lè sa a, ou remake ke pwogram nan se pi fasil epi li pi klè pou li.

Pou egzanp, yon sèvis piblik konsole ki li stdin oswa yon dosye ki soti nan agiman liy lòd ta sanble sa a:

package main

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

func main() {

    flag.Parse()

    scanner := newScanner(flag.Args())

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

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

    fmt.Println(text)
}

func newScanner(flags []string) *bufio.Scanner {
    if len(flags) == 0 {
        return bufio.NewScanner(os.Stdin)
    }

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

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

    return bufio.NewScanner(file)
}

Solisyon an nan menm pwoblèm nan nan D, byenke li sanble yon ti jan pi kout, se pa pi fasil pou li

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

Lanfè kopye

Moun pote lanfè nan tèt li. Martin Luther.

Débutan toujou ap plenyen sou Go an tèm de mank de jenerik. Pou rezoud pwoblèm sa a, pifò nan yo sèvi ak kopi dirèk kòd. Pou egzanp, yon fonksyon pou rezime yon lis nonb antye relatif, tankou pwofesyonèl ta dwe kwè ke fonctionnalités a pa ka aplike nan nenpòt lòt fason pase pa senp kopi-kole pou chak kalite done.

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 main() {

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

    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

Lang nan gen ase mwayen pou aplike konstriksyon sa yo. Pou egzanp, pwogram jenerik ta bon.

package main

import "fmt"

func Eval32(list []int32, fn func(a, b int32)int32) int32 {
    var res int32
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int32Add(a, b int32) int32 {
    return a + b
}

func int32Sub(a, b int32) int32 {
    return a + b
}

func Eval64(list []int64, fn func(a, b int64)int64) int64 {
    var res int64
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int64Add(a, b int64) int64 {
    return a + b
}

func int64Sub(a, b int64) int64 {
    return a - b
}

func main() {

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

    fmt.Println(Eval32(list32, int32Add))
    fmt.Println(Eval64(list64, int64Add))
    fmt.Println(Eval64(list64, int64Sub))
}

Epi, byenke kòd nou an te tounen yon ti jan pi long pase ka anvan an, li te vin jeneralize. Se poutèt sa, li pa pral difisil pou nou aplike tout operasyon aritmetik.

Anpil moun pral di ke yon pwogram nan D sanble siyifikativman pi kout, epi yo pral gen rezon.

import std.stdio;
import std.algorithm;

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

Sepandan, li se sèlman pi kout, men se pa plis kòrèk, depi aplikasyon an D konplètman inyore pwoblèm nan nan manyen erè.

Nan lavi reyèl, kòm konpleksite nan lojik ogmante, diferans lan diminye rapidman. Diferans lan fèmen menm pi rapid lè ou bezwen fè yon aksyon ki pa ka fèt lè l sèvi avèk operatè lang estanda.

An tèm de antretyen, ekstansiblite, ak lizibilite, nan opinyon mwen, lang Go a genyen, byenke li pèdi nan verbosity.

Pwogramasyon jeneralize nan kèk ka ban nou benefis ki pa ka nye. Sa a se klèman ilistre pa pake a sòt. Se konsa, sòt nenpòt lis, nou jis bezwen aplike koòdone nan sort.Interface.

import "sort"

type Names []string

func (ns Names) Len() int {
    return len(ns)
}

func (ns Names) Less(i, j int) bool {
    return ns[i] < ns[j]
}

func (ns Names) Swap(i, j int) {
    ns[i], ns[j] = ns[j], ns[i]
}

func main() {
    names := Names{"London", "Berlin", "Rim"}
    sort.Sort(names)
}

Si w pran nenpòt pwojè sous louvri epi kouri kòmandman grep "koòdone{}" -R, ou pral wè konbyen fwa yo itilize entèfas ki konfizyon. Kanmarad fermer pral imedyatman di ke tout sa a se akòz mank nan jenerik. Sepandan, sa a se pa toujou ka a. Ann pran DELPHI kòm egzanp. Malgre prezans menm jenerik sa yo, li gen yon kalite VARIANT espesyal pou operasyon ak kalite done abitrè. Lang Go a fè menm bagay la.

Soti nan yon kanon nan ti zwazo

Epi fòk straitjacket la anfòm gwosè foli a. Stanislav Lec.

Anpil fanatik ekstrèm ka reklame ke Go gen yon lòt mekanis pou kreye jenerik - refleksyon. Epi yo pral gen rezon... men sèlman nan ka ki ra.

Rob Pike avèti nou:

Sa a se yon zouti pwisan ki ta dwe itilize ak prekosyon. Li ta dwe evite sof si sa nesesè.

Wikipedya di nou sa ki annapre yo:

Refleksyon refere a pwosesis pandan ke yon pwogram ka kontwole ak modifye pwòp estrikti ak konpòtman li pandan ekzekisyon. Paradig pwogramasyon ki kache refleksyon yo rele pwogram meditativ. Sa a se yon kalite metaprogramming.

Sepandan, kòm ou konnen, ou dwe peye pou tout bagay. Nan ka sa a se:

  • difikilte pou ekri pwogram yo
  • vitès ekzekisyon pwogram lan

Se poutèt sa, refleksyon dwe itilize ak prekosyon, tankou yon zam gwo kalib. Sèvi ak refleksyon san refleksyon mennen nan pwogram ilizib, erè konstan ak vitès ki ba. Jis bagay la pou yon pwogramè snob kapab montre kòd li devan lòt kòlèg, plis pragmatik ak modès.

Bagaj kiltirèl soti nan Xi? Non, soti nan yon kantite lang!

Ansanm ak fòtin la, dèt yo tou kite eritye yo.

Malgre ke anpil moun kwè ke lang nan se antyèman ki baze sou eritaj C a, se pa sa a. Lang nan enkòpore anpil aspè nan pi bon langaj pwogramasyon yo.

sentaks

Premye a tout, sentaks estrikti gramatikal yo baze sou sentaks lang C a. Sepandan, lang DELPHI te gen yon gwo enfliyans tou. Kidonk, nou wè ke parantèz redondants yo, ki redwi anpil lizibilite nan pwogram nan, yo te konplètman retire. Lang lan genyen tou operatè ":=" nannan lang DELPHI la. Se konsèp nan pakè prete nan lang tankou ADA. Deklarasyon antite ki pa itilize yo prete nan lang PROLOG la.

Semantik

Pakè yo te baze sou semantik lang DELPHI la. Chak pake encapsule done ak kòd epi li gen antite prive ak piblik. Sa a pèmèt ou diminye koòdone nan pake a yon minimòm.

Operasyon aplikasyon an pa metòd delegasyon te prete nan lang DELPHI.

Konpilasyon

Se pa san rezon ke gen yon blag: Go te devlope pandan y ap konpile yon pwogram C. Youn nan fòs lang nan se konpilasyon ultra-rapid li yo. Lide a te prete nan lang DELPHI. Chak pake Go koresponn ak yon modil DELPHI. Pakè sa yo recompiled sèlman lè vrèman nesesè. Se poutèt sa, apre pwochen edisyon an, ou pa bezwen konpile tout pwogram nan, men pito rekonpile sèlman pakè ki chanje yo ak pakè ki depann de pakè sa yo chanje (e menm lè sa a, sèlman si entèfas pakè yo te chanje).

Konstriksyon wo nivo

Lang nan gen anpil diferan konstriksyon wo nivo ki pa gen okenn rapò ak lang ki ba nivo tankou C.

  • Fisèl
  • Hash tab
  • Tranch
  • Sezisman kanna prete nan lang tankou RUBY (ki, malerezman, anpil pa konprann oswa itilize nan tout potansyèl li).

Jesyon memwa

Jesyon memwa jeneralman merite yon atik separe. Si nan lang tankou C++, kontwòl konplètman kite nan men pwomotè a, Lè sa a, nan lang pita tankou DELPHI, yo te itilize yon modèl konte referans. Avèk apwòch sa a, referans siklik yo pa te pèmèt, depi grap òfelen yo te fòme, Lè sa a, Go te bati-an deteksyon nan grap sa yo (tankou C#). Anplis de sa, pèseptè fatra a pi efikas pase aplikasyon pifò kounye a li te ye e li ka deja itilize pou anpil travay an tan reyèl. Lang nan tèt li rekonèt sitiyasyon lè yon valè nan magazen yon varyab ka resevwa lajan sou pil la. Sa a diminye chaj la sou manadjè memwa a ak ogmante vitès la nan pwogram nan.

Konkou ak konkou

Paralelism ak compétitivité lang nan pi lwen pase lwanj. Pa gen lang ki ba-nivo ki ka menm fè konpetisyon ak Go. Pou nou jis, li vo anyen ke modèl la pa te envante pa otè yo nan lang nan, men yo te tou senpleman prete nan bon ansyen lang ADA a. Langaj la kapab trete dè milyon de koneksyon paralèl lè l sèvi avèk tout CPU, pandan y ap gen yon lòd nan grandè pwoblèm mwens konplèks ak enpas ak kondisyon ras ki tipik pou kòd milti-threaded.

Benefis adisyonèl

Si li pwofitab, tout moun ap vin dezenterese.

Lang bay nou tou yon kantite avantaj san dout:

  • Yon sèl dosye ègzèkutabl apre bati pwojè a anpil senplifye deplwaman aplikasyon yo.
  • Tape estatik ak enferans kalite ka siyifikativman redwi kantite erè nan kòd ou a, menm san yo pa ekri tès yo. Mwen konnen kèk pwogramè ki fè san yo pa ekri tès yo ditou ak bon jan kalite a nan kòd yo pa soufri anpil.
  • Trè senp kwa-konpilasyon ak portabilite ekselan nan bibliyotèk la estanda, ki anpil senplifye devlopman nan aplikasyon pou kwa-platfòm.
  • Ekspresyon regilye RE2 yo san danje epi yo gen tan egzekisyon previzib.
  • Yon bibliyotèk estanda pwisan ki pèmèt pifò pwojè yo fè san yo pa kad twazyèm pati.
  • Lang lan se ase pwisan pou konsantre sou pwoblèm nan olye ke fason yo rezoud li, men ase ba nivo ke pwoblèm nan ka rezoud avèk efikasite.
  • Sistèm ekolojik Go a deja gen zouti devlope ki soti nan bwat la pou tout okazyon: tès, dokimantasyon, jesyon pake, linters pwisan, jenerasyon kòd, detektè kondisyon ras, elatriye.
  • Go vèsyon 1.11 prezante jesyon depandans semantik entegre, bati sou tèt hosting VCS popilè. Tout zouti ki fòme ekosistèm Go yo sèvi ak sèvis sa yo pou telechaje, konstwi, ak enstale kòd nan men yo nan yon sèl kou. Epi sa se gwo. Avèk rive nan vèsyon 1.11, pwoblèm nan ak vèsyon pake te tou konplètman rezoud.
  • Paske lide debaz lang lan se diminye majik, langaj la ankouraje devlopè yo pou yo jere erè klèman. Ak sa a kòrèk, paske otreman, li pral tou senpleman bliye sou manyen erè tout ansanm. Yon lòt bagay se ke pifò devlopè fè espre inyore manyen erè, prefere olye pou yo trete yo tou senpleman voye erè a anlè.
  • Lang lan pa aplike metodoloji OOP klasik la, paske nan fòm pi li a pa gen okenn virtuality nan Go. Sepandan, sa a se pa yon pwoblèm lè w ap itilize interfaces. Absans OOP siyifikativman diminye baryè pou antre pou débutan yo.

Senplisite pou benefis kominote a

Li fasil pou konplike, difisil pou senplifye.

Go te fèt yo dwe senp epi li reyisi nan objektif sa a. Li te ekri pou pwogramè entelijan ki konprann benefis travay ann ekip epi ki fatige ak varyasyon alkole nan lang nan nivo Enterprise. Èske w gen yon seri estrikti sentaktik relativman ti nan asenal li yo, li se pratikman pa sijè a chanjman sou tan, kidonk devlopè yo gen anpil tan libere pou devlopman, epi yo pa pou alkole etidye inovasyon lang.

Konpayi yo tou resevwa yon kantite avantaj: yon baryè antre ba pèmèt yo jwenn byen vit yon espesyalis, ak imuabilite nan lang nan pèmèt yo sèvi ak menm kòd la menm apre 10 ane.

Konklizyon

Gwosè sèvo gwo pa janm fè okenn elefan yon gayan Pri Nobèl.

Pou pwogramè sa yo ki gen ego pèsonèl ki gen priyorite sou lespri ekip, ansanm ak teyorisyen ki renmen defi akademik ak "amelyorasyon pwòp tèt yo" san limit, lang nan vrèman move, paske li se yon langaj atizanal ki pa pèmèt ou jwenn. plezi ayestetik soti nan rezilta travay ou epi montre tèt ou pwofesyonèl devan kòlèg li yo (si nou mezire entèlijans pa kritè sa yo, epi yo pa IQ). Tankou tout bagay nan lavi, li se yon kesyon de priyorite pèsonèl. Menm jan ak tout inovasyon entérésan, lang nan te deja vini yon fason lontan soti nan refi inivèsèl nan akseptasyon an mas. Langaj la se enjenyeu nan senplisite li, epi, kòm ou konnen, tout bagay enjenyeu se senp!

Sous: www.habr.com

Add nouvo kòmantè