Чаро Go барои барномасозони беақл бад аст

Мақола ҳамчун посух ба мақолаи қаблан нашршуда навишта шудааст мақолаи антиподеанӣ.

Чаро Go барои барномасозони беақл бад аст

Дар тӯли ду соли охир ман Go-ро барои татбиқи сервери махсуси RADIUS бо системаи ҳисоббарории таҳияшуда истифода мебарам. Дар ин роҳ ман нозукиҳои худи забонро меомӯзам. Худи барномаҳо хеле соддаанд ва ҳадафи ин мақола нестанд, аммо таҷрибаи истифодаи худи Go дар дифоъи он сазовори чанд калима аст. Go ба забони рӯзафзуни маъмул барои коди ҷиддӣ ва миқёспазир табдил меёбад. Забон аз ҷониби Google сохта шудааст, ки дар он фаъолона истифода мешавад. Дар поён, ман ростқавлона фикр мекунам, ки тарҳи забони Go барои барномасозони UNintelligent бад аст.

Барои барномасозони заиф тарҳрезӣ шудааст?

Заифон аз мушкилот сухан меронанд. Сӯҳбати қавӣ дар бораи ғояҳо ва орзуҳо ...

Гузаштанро омӯхтан хеле осон аст, он қадар осон аст, ки шумо метавонед кодро бидуни омӯзиш мутолиа кунед. Ин хусусияти забон дар бисёре аз ширкатҳои ҷаҳонӣ ҳангоми хондани код дар якҷоягӣ бо мутахассисони ғайрирасмӣ (менеҷерҳо, муштариён ва ғ.) истифода мешавад. Ин барои методологияҳо ба монанди Design Driven Development хеле қулай аст.
Ҳатто барномасозони навкор пас аз як ё ду ҳафта ба тавлиди коди хуб шурӯъ мекунанд. Китобе, ки ман аз он омӯхтам, "Барномасозӣ биравед" (аз ҷониби Марк Саммерфилд). Китоб хеле хуб аст, ба бисьёр нозукихои забон дахл дорад. Пас аз забонҳои нолозим мураккаб ба монанди Java, PHP, набудани ҷодугарӣ тароватбахш аст. Аммо дер ё зуд, бисёре аз барномасозони маҳдуд идеяи истифодаи усулҳои кӯҳна дар соҳаи нав доранд. Оё ин воқеан зарур аст?

Роб Пайк (идеологи асосии забон) забони Go-ро ҳамчун забони саноатӣ офаридааст, ки барои фаҳмидан осон ва самаранок истифода мешавад. Забон барои ҳосилнокии ҳадди аксар дар дастаҳои калон тарҳрезӣ шудааст ва ба ин шубҳае нест. Бисёре аз барномасозони навкор шикоят мекунанд, ки хусусиятҳои зиёде мавҷуданд, ки онҳо намерасанд. Ин хоҳиши соддагӣ тасмими бошуурона аз ҷониби тарроҳони забон буд ва барои пурра фаҳмидани он, ки чаро он зарур аст, мо бояд ангезаи таҳиягарон ва он чизеро, ки онҳо дар Go ноил шудан мехостанд, бифаҳмем.

Пас чаро ин қадар содда карда шуд? Инҳоянд чанд иқтибос аз Роб Пайк:

Дар ин ҷо нуктаи асосӣ ин аст, ки барномасозони мо муҳаққиқ нестанд. Онҳо, чун қоида, хеле ҷавонанд, пас аз таҳсил ба мо меоянд, шояд онҳо Java, ё C/C++ ё Python-ро омӯхтаанд. Онҳо забони олиро фаҳмида наметавонанд, аммо дар айни замон мо мехоҳем, ки онҳо нармафзори хуб эҷод кунанд. Аз ин рӯ, забон бояд барои фаҳмидан ва омӯхтан осон бошад.

Ӯ бояд шинос бошад, тақрибан ба C монанд бошад. Барномасозоне, ки дар Google кор мекунанд, карераи худро барвақт оғоз мекунанд ва асосан бо забонҳои мурофиавӣ, бахусус оилаи C, ошно ҳастанд. Талабот барои ҳосилнокии зуд дар забони нави барномасозӣ маънои онро дорад, ки забон набояд аз ҳад радикалӣ бошад.

Суханони оқилона, ҳамин тавр не?

Артефактҳои оддӣ

Соддаӣ шарти зарурии зебоӣ аст. Лев Толстой.

Содда нигоҳ доштани он яке аз ҳадафҳои муҳимтарин дар ҳама гуна тарроҳӣ мебошад. Тавре ки шумо медонед, лоиҳаи комил лоиҳае нест, ки дар он чизе барои илова кардан вуҷуд надорад, балки лоиҳаест, ки аз он ҳеҷ чиз хориҷ карда намешавад. Бисёр одамон боварӣ доранд, ки барои ҳалли (ё ҳатто ифода кардани) мушкилоти мураккаб як асбоби мураккаб лозим аст. Бо вуҷуди ин, он нест. Барои мисол забони PERL-ро гирем. Идеологҳои забон бар ин назаранд, ки барномасоз барои ҳалли як масъала бояд ҳадди ақал се роҳи гуногун дошта бошад. Идеологхои забони Го рохи дигарро пеш гирифтанд, онхо карор доданд, ки барои расидан ба максад як рох, вале хакикатан хуб кифоя аст. Ин равиш заминаи ҷиддӣ дорад: роҳи ягонаро омӯхтан осонтар ва фаромӯш кардан душвортар аст.

Бисёре аз муҳоҷирон шикоят мекунанд, ки дар забон абстраксияҳои шево вуҷуд надорад. Бале, ин дуруст аст, аммо ин яке аз афзалиятҳои асосии забон аст. Забон ҳадди ақали ҷодугарӣ дорад - бинобар ин барои хондани барнома дониши амиқ лозим нест. Дар бораи муфассал будани код бошад, ин умуман мушкилие нест. Барномаи хуб навишташудаи Голанг амудиро бо сохтори кам ё тамоман мехонад. Илова бар ин, суръати хондани барнома ҳадди аққал як миқдори бузургтар аз суръати навиштани он аст. Агар шумо фикр кунед, ки ҳамаи кодҳо форматкунии якхела доранд (бо истифода аз фармони дарунсохташудаи gofmt анҷом дода мешавад), пас хондани чанд сатри иловагӣ умуман мушкиле нест.

На он қадар ифоданок

Санъат вақте ки озодии он маҳдуд аст, таҳаммул намекунад. Дақиқӣ масъулияти ӯ нест.

Аз сабаби хоҳиши соддагӣ, Go конструксияҳое надорад, ки дар забонҳои дигар аз ҷониби одамони ба онҳо одаткарда ҳамчун чизи табиӣ қабул карда мешаванд. Дар аввал ин метавонад то андозае нороҳат бошад, аммо баъд шумо мебинед, ки хондани барнома хеле осонтар ва якхелатар аст.

Масалан, утилитаи консоле, ки stdin ё файлро аз аргументҳои сатри фармон мехонад, чунин хоҳад буд:

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

Ҳалли як масъала дар 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);
    }
}

Ҷаҳаннам нусхабардорӣ

Инсон дӯзахро дар дохили худ мебарад. Мартин Лютер.

Шурӯъкунандагон пайваста аз Go аз набудани генерикҳо шикоят мекунанд. Барои ҳалли ин масъала, аксарияти онҳо нусхабардории мустақими кодро истифода мебаранд. Масалан, функсия барои ҷамъбасти рӯйхати ададҳои бутун, чунин мутахассисони эҳтимолӣ боварӣ доранд, ки ин функсияро ба ҷуз бо роҳи нусхабардории оддӣ барои ҳар як намуди маълумот амалӣ кардан мумкин нест.

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

Забон барои татбиқи чунин сохтҳо воситаҳои кофӣ дорад. Масалан, барномасозии умумӣ хуб мебуд.

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

Ва, гарчанде ки рамзи мо нисбат ба парвандаи қаблӣ каме дарозтар шуд, он умумӣ шудааст. Аз ин ру, ичрои хамаи амалхои арифметикй барои мо душвор нест.

Бисёриҳо мегӯянд, ки барнома дар D ба таври назаррас кӯтоҳтар менамояд ва онҳо дуруст хоҳанд буд.

import std.stdio;
import std.algorithm;

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

Аммо, он танҳо кӯтоҳтар аст, аммо дурусттар нест, зеро татбиқи D мушкилоти коркарди хатогиҳоро комилан нодида мегирад.

Дар ҳаёти воқеӣ бо зиёд шудани мураккабии мантиқ фосила зуд кам мешавад. Вақте ки шумо бояд амалеро иҷро кунед, ки бо истифода аз операторҳои стандартии забон иҷро карда намешавад, фосила боз ҳам зудтар баста мешавад.

Аз нуқтаи назари нигоҳдорӣ, васеъшавӣ ва хондан, ба андешаи ман, забони Go пирӯз мешавад, гарчанде ки он дар ифшогарӣ аз даст медиҳад.

Барномасозии умумӣ дар баъзе мавридҳо ба мо манфиатҳои раднашаванда медиҳад. Инро бастаи навъҳо равшан нишон медиҳад. Ҳамин тавр, барои ба тартиб даровардани ҳама гуна рӯйхат, мо бояд танҳо интерфейси 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)
}

Агар шумо ягон лоиҳаи кушодаасосро гиред ва фармони grep "interface{}" -R -ро иҷро кунед, шумо хоҳед дид, ки то чӣ андоза интерфейсҳои печида истифода мешаванд. Рафикони наздикфикр дархол мегуянд, ки хамаи ин аз нарасидани генерикхо мебошад. Аммо, ин на ҳама вақт чунин аст. Биёед DELPHI-ро мисол гирем. Сарфи назар аз мавҷудияти ҳамин генерикҳо, он дорои як навъи махсуси VARIANT барои амалиёт бо намудҳои ихтиёрии додаҳо мебошад. Забони Go низ ҳамин тавр мекунад.

Аз туп то гунҷишкҳо

Ва курта бояд ба андозаи девонавор мувофиқат кунад. Станислав Лек.

Бисёре аз мухлисони шадид метавонанд даъво кунанд, ки Go механизми дигари эҷоди генерикҳо - инъикос дорад. Ва онҳо дуруст хоҳанд буд ... аммо танҳо дар ҳолатҳои нодир.

Роб Пайк моро огоҳ мекунад:

Ин як воситаи пурқувватест, ки бояд бо эҳтиёт истифода шавад. Аз он бояд канорагирӣ кард, агар қатъӣ зарур бошад.

Википедиа ба мо чунин мегӯяд:

Мулоҳиза ба раванде дахл дорад, ки дар давоми он барнома метавонад сохтор ва рафтори худро ҳангоми иҷро назорат ва тағир диҳад. Парадигмаи барномасозӣ, ки дар асоси инъикос қарор дорад, барномасозии рефлексивӣ номида мешавад. Ин як намуди метапрограммасозӣ аст.

Аммо, чунон ки шумо медонед, шумо бояд барои ҳама чиз пардохт кунед. Дар ин ҳолат он аст:

  • душворӣ дар навиштани барномаҳо
  • суръати иҷрои барнома

Аз ин рӯ, инъикос бояд бо эҳтиёт истифода шавад, ба монанди силоҳи калибри калон. Истифодаи беандешонаи инъикос боиси пайдо шудани барномаҳои хонданашаванда, хатогиҳои доимӣ ва суръати паст мегардад. Танҳо чизе барои як барномасози snob он аст, ки қодир аст рамзи худро дар назди дигар ҳамкорони прагматиктар ва хоксор нишон диҳад.

Бағоҷи фарҳангӣ аз Си? Не, аз якчанд забонҳо!

Дар баробари сарват қарзҳо низ ба ворисон гузошта мешаванд.

Сарфи назар аз он, ки бисёриҳо боварӣ доранд, ки ин забон комилан ба мероси C асос ёфтааст, ин тавр нест. Забон бисёр ҷанбаҳои беҳтарин забонҳои барномасозиро дар бар мегирад.

наҳвӣ

Пеш аз ҳама, синтаксиси сохторҳои грамматикӣ ба синтаксиси забони Си асос ёфтааст. Бо вуҷуди ин, забони DELPHI низ таъсири назаррас дошт. Ҳамин тариқ, мо мебинем, ки қавсҳои зиёдатӣ, ки хондани барномаро хеле кам мекунанд, комилан хориҷ карда шудаанд. Ин забон инчунин дорои оператори ":=" мебошад, ки ба забони DELPHI хос аст. Мафҳуми бастаҳо аз забонҳо ба монанди ADA гирифта шудааст. Эъломияи субъектҳои истифоданашуда аз забони PROLOG гирифта шудааст.

Семантик

Бастаҳо ба семантикаи забони DELPHI асос ёфтаанд. Ҳар як баста маълумот ва кодро фаро мегирад ва дорои объектҳои хусусӣ ва ҷамъиятӣ мебошад. Ин ба шумо имкон медиҳад, ки интерфейси бастаро то ҳадди аққал кам кунед.

Амалиёт бо усули намояндагӣ аз забони DELPHI гирифта шудааст.

Тартиб

Бесабаб нест, ки шӯхӣ вуҷуд дорад: Go ҳангоми таҳияи барномаи C таҳия шудааст. Яке аз ҷиҳатҳои тавонои забон ин тартиб додани хеле зуди он аст. Идея аз забони DELPHI гирифта шудааст. Ҳар як бастаи Go ба модули DELPHI мувофиқат мекунад. Ин бастаҳо танҳо дар ҳолати зарурӣ аз нав тартиб дода мешаванд. Аз ин рӯ, пас аз таҳрири навбатӣ, ба шумо лозим нест, ки тамоми барномаро тартиб диҳед, балки танҳо бастаҳо ва бастаҳои тағирёфтаро, ки аз ин бастаҳои тағирёфта вобастаанд, дубора тартиб диҳед (ва ҳатто дар ин ҳолат, танҳо агар интерфейсҳои бастаҳо тағир ёфта бошанд).

Сохтмони сатҳи баланд

Забон бисёр конструксияҳои гуногуни сатҳи баландро дар бар мегирад, ки ба ҳеҷ ваҷҳ бо забонҳои сатҳи паст ба монанди C алоқаманд нестанд.

  • Сатрҳо
  • Ҷадвалҳои хэш
  • Бурида
  • Навиштани мурғобӣ аз забонҳое ба мисли RUBY гирифта шудааст (ки мутаассифона, бисёриҳо намефаҳманд ё ба пуррагӣ истифода мебаранд).

Идоракунии хотира

Идоракунии хотира умуман сазовори мақолаи алоҳида аст. Агар дар забонҳое, ба монанди C++, назорат комилан ба ихтиёри таҳиякунанда гузошта шуда бошад, пас дар забонҳои баъдӣ ба монанди DELPHI, модели ҳисобкунии истинод истифода мешуд. Бо ин равиш, истинодҳои даврӣ иҷозат дода намешуд, зеро кластерҳои ятим ташкил карда шуда буданд, пас Go дар дохили ин гуна кластерҳо (ба монанди C#) муайян мекунад. Илова бар ин, коллектори партовҳо нисбат ба аксари татбиқҳои ҳозираи маълум самараноктар аст ва аллакай метавонад барои бисёр вазифаҳои вақти воқеӣ истифода шавад. Худи забон ҳолатҳоеро эътироф мекунад, ки арзиш барои нигоҳ доштани тағирёбанда дар стек ҷудо карда мешавад. Ин сарбории менеҷери хотираро коҳиш медиҳад ва суръати барномаро зиёд мекунад.

Ҳамзамон ва ҳамзамон

Параллелизм ва рақобатпазирии забон болотар аз таъриф аст. Ягон забони сатҳи паст ҳатто метавонад аз фосилаи дур бо Go рақобат кунад. Барои одилона, бояд қайд кард, ки модел аз ҷониби муаллифони забон ихтироъ нашудааст, балки танҳо аз забони хуби қадимии ADA гирифта шудааст. Ин забон қодир аст, ки миллионҳо пайвастагиҳои мувозиро бо истифода аз ҳама CPU-ҳо коркард кунад, дар ҳоле ки дорои як қатор мушкилоти камтар мураккаб бо бунбастҳо ва шароити нажод, ки барои коди бисёрсоҳавӣ хосанд.

Манфиатҳои иловагӣ

Агар фоидаовар бошад, ҳама фидокор мешаванд.

Забон инчунин ба мо як қатор манфиатҳои шубҳанок медиҳад:

  • Як файли иҷрошаванда пас аз сохтани лоиҳа ҷойгиркунии барномаҳоро хеле осон мекунад.
  • Навиштани статикӣ ва хулосаи намуд метавонад шумораи хатогиҳоро дар коди шумо ҳатто бидуни санҷишҳои навиштан ба таври назаррас коҳиш диҳад. Ман баъзе барномасозонро медонам, ки умуман бидуни навиштани тестҳо кор мекунанд ва сифати коди онҳо ба таври ҷиддӣ осеб намебинад.
  • Ҷамъоварии хеле содда ва интиқоли аълои китобхонаи стандартӣ, ки таҳияи барномаҳои кросс-платформаро хеле осон мекунад.
  • Ифодаҳои муқаррарии RE2 аз ришта бехатаранд ва вақтҳои иҷрошаванда доранд.
  • Китобхонаи пурқудрати стандартӣ, ки ба аксари лоиҳаҳо имкон медиҳад, ки бидуни чаҳорчӯбаи тарафи сеюм кор кунанд.
  • Забон ба қадри кофӣ тавоно аст, ки ба мушкилот тамаркуз кунад, на ин ки чӣ гуна ҳалли он, аммо сатҳи пасти он, ки мушкилотро самаранок ҳал кардан мумкин аст.
  • Системаи Go eco аллакай дорои асбобҳои таҳияшуда барои ҳама ҳолатҳо мебошад: озмоишҳо, ҳуҷҷатгузорӣ, идоракунии бастаҳо, линтерҳои пурқувват, тавлиди код, детектори шароити мусобиқа ва ғайра.
  • Версияи Go 1.11 идоракунии дарунсохташудаи вобастагии семантикиро ҷорӣ кард, ки дар болои хостинги маъмули VCS сохта шудааст. Ҳама асбобҳое, ки экосистемаи Go-ро ташкил медиҳанд, ин хидматҳоро барои зеркашӣ, сохтан ва насб кардани код аз онҳо дар як лаҳза истифода мебаранд. Ва ин бузург аст. Бо омадани версияи 1.11, мушкилот бо версияи бастаҳо низ комилан ҳал карда шуд.
  • Азбаски идеяи асосии забон кам кардани ҷоду аст, забон таҳиягаронро ташвиқ мекунад, ки ба таври возеҳ коркарди хатогиҳоро анҷом диҳанд. Ва ин дуруст аст, зеро дар акси ҳол, он дар бораи коркарди хатогиҳо комилан фаромӯш мекунад. Чизи дигар ин аст, ки аксари таҳиягарон дидаву дониста коркарди хатогиҳоро нодида мегиранд ва ба ҷои коркарди онҳо бартарӣ медиҳанд, ки хаторо ба боло интиқол диҳанд.
  • Забон методологияи классикии OOP-ро татбиқ намекунад, зеро дар шакли софи он дар Go виртуалӣ вуҷуд надорад. Аммо, ин мушкилот ҳангоми истифодаи интерфейсҳо нест. Набудани OOP монеаи вурудро барои шурӯъкунандагон ба таври назаррас коҳиш медиҳад.

Содда ба манфиати чамъият

Мушкил кардан осон, содда кардан душвор.

Go барои содда тарҳрезӣ шудааст ва он дар ин ҳадаф муваффақ мешавад. Он барои барномасозони интеллектуалӣ навишта шудааст, ки бартариҳои кори дастаҷамъиро мефаҳманд ва аз тағирёбии беохири забонҳои сатҳи Enterprise хаста шудаанд. Доштани маҷмӯи нисбатан хурди сохторҳои синтаксисӣ дар арсенали худ, он амалан бо мурури замон тағир намеёбад, бинобар ин таҳиягарон вақти зиёдеро барои рушд озод мекунанд, на барои омӯзиши беохири навовариҳои забон.

Ширкатҳо инчунин як қатор бартариҳоро мегиранд: монеаи пасти воридшавӣ ба онҳо имкон медиҳад, ки мутахассисро зуд пайдо кунанд ва тағйирнопазирии забон ба онҳо имкон медиҳад, ки ҳатто пас аз 10 сол ҳамон кодро истифода баранд.

хулоса

Андозаи калони мағзи сар ҳеҷ гоҳ ягон филро барандаи ҷоизаи Нобел нагардондааст.

Барои он барномасозоне, ки нафси шахсии онҳо аз рӯҳияи даста бартарӣ дорад, инчунин теоретикҳое, ки мушкилоти таълимӣ ва "худтакмилдиҳии беохир"-ро дӯст медоранд, забон воқеан бад аст, зеро он забони ҳунарии умумӣ аст, ки ба шумо имкон намедиҳад аз натиҷаи кори худ лаззати эстетикӣ гиред ва худро дар назди ҳамкорон касбӣ нишон диҳед (ба шарте, ки мо зеҳнро аз рӯи ин меъёрҳо чен кунем, на аз рӯи IQ). Мисли ҳама чиз дар ҳаёт, он масъалаи афзалиятҳои шахсӣ аст. Мисли ҳама навовариҳои арзишманд, забон аз инкори умумӣ то қабули оммавӣ аллакай роҳи дурро тай кардааст. Забон бо соддагии худ доно аст ва чунон ки шумо медонед, ҳама чизи оқилона содда аст!

Манбаъ: will.com

Илова Эзоҳ