Napa Go Bad kanggo Unsmart Programmer

Artikel iki ditulis minangka respon kanggo diterbitake sadurunge artikel antipodean.

Napa Go Bad kanggo Unsmart Programmer

Sajrone rong taun kepungkur aku wis nggunakake Go kanggo ngleksanakake server RADIUS khusus kanthi sistem tagihan sing dikembangake. Sadawane dalan, aku sinau seluk-beluk basa dhewe. Program kasebut gampang banget lan dudu tujuan artikel iki, nanging pengalaman nggunakake Go dhewe kudu sawetara tembung kanggo pertahanan. Go dadi basa sing saya mainstream kanggo kode serius lan skalabel. Basa kasebut digawe dening Google, sing digunakake kanthi aktif. Intine, aku jujur ​​mikir yen desain basa Go ora becik kanggo programer UNintelligent.

Dirancang kanggo programer sing lemah?

Wong sing ringkih ngomongake masalah. Omongan sing kuat babagan ide lan impen ...

Go gampang banget kanggo sinau, supaya gampang sampeyan bisa maca kode kasebut tanpa latihan. Fitur basa iki digunakake ing akeh perusahaan global nalika kode kasebut diwaca bebarengan karo spesialis non-inti (manajer, pelanggan, lsp.). Iki trep banget kanggo metodologi kaya Design Driven Development.
Malah programer anyar wiwit gawΓ© kode cukup prayoga sawise minggu utawa loro. Buku sing daksinaoni yaiku "Go Programming" (dening Mark Summerfield). Buku kasebut apik banget, nyentuh akeh nuansa basa. Sawise basa rumit sing ora perlu kayata Jawa, PHP, kekurangan sihir nyegerake. Nanging cepet utawa mengko, akeh programer winates duwe idea kanggo nggunakake cara lawas ing lapangan anyar. Apa iki pancen perlu?

Rob Pike (ideolog utama basa) nggawe basa Go minangka basa industri sing gampang dingerteni lan efektif digunakake. Basa kasebut dirancang kanggo produktivitas maksimal ing tim gedhe lan ora ana keraguan babagan iki. Akeh programer anyar sing sambat manawa ana akeh fitur sing ilang. Kepinginan kanggo kesederhanaan iki minangka keputusan sing disadari dening para desainer basa, lan supaya bisa ngerti sebabe dibutuhake, kita kudu ngerti motivasi para pangembang lan apa sing diupayakake ing Go.

Dadi kenapa digawe gampang banget? Mangkene sawetara kuotasi saka Rob Pike:

Titik kunci ing kene yaiku programer kita dudu peneliti. Padha, minangka aturan, cukup enom, teka kanggo kita sawise sinau, mbok menawa padha sinau Jawa, utawa C / C ++, utawa Python. Dheweke ora ngerti basa sing apik, nanging ing wektu sing padha kita pengin nggawe piranti lunak sing apik. Mula basane kudu gampang dimangerteni lan disinaoni.

Dheweke kudu akrab, kira-kira padha karo C. Programer sing kerja ing Google miwiti karir luwih awal lan biasane ngerti basa prosedural, utamane kulawarga C. Syarat kanggo produktivitas cepet ing basa pamrograman anyar tegese basa kasebut ora radikal banget.

Tembung wicaksana, ta?

Artefak Kesederhanaan

Kesederhanaan minangka syarat sing dibutuhake kanggo kaendahan. Lev Tolstoy.

Tetep prasaja minangka salah sawijining tujuan sing paling penting ing desain apa wae. Kaya sing sampeyan ngerteni, proyek sing sampurna dudu proyek sing ora ana sing kudu ditambahake, nanging ora ana sing bisa dicopot. Akeh wong sing percaya yen kanggo ngrampungake (utawa malah nyatakake) masalah sing rumit, alat sing rumit dibutuhake. Nanging, ora. Ayo dadi contone basa PERL. Ideolog basa percaya yen programmer kudu duwe paling ora telung cara kanggo ngatasi masalah. Para ideolog saka basa Go njupuk dalan sing beda; padha mutusake yen siji cara, nanging sing apik banget, cukup kanggo nggayuh tujuan kasebut. Pendekatan iki nduweni dhasar sing serius: siji-sijine cara sing luwih gampang kanggo sinau lan luwih angel dilalekake.

Akeh migran ngeluh yen basa kasebut ora ngemot abstraksi sing elegan. Ya, iki bener, nanging iki minangka salah sawijining kaluwihan utama basa kasebut. Basa kasebut ngemot minimal sihir - mula ora ana kawruh jero sing dibutuhake kanggo maca program kasebut. Minangka kanggo verbosity kode, iki ora masalah ing kabeh. Program Golang sing ditulis kanthi apik maca vertikal, kanthi struktur cilik utawa ora ana. Kajaba iku, kacepetan maca program paling sethithik urutan gedhene luwih saka kacepetan nulis. Yen sampeyan nganggep sing kabeh kode wis format seragam (rampung nggunakake printah gofmt dibangun ing), banjur maca sawetara baris ekstra ora masalah ing kabeh.

Ora ekspresif banget

Seni ora toleran nalika kebebasane diwatesi. Akurasi dudu tanggung jawabe.

Amarga kepinginan kanggo kesederhanaan, Go ora duwe konstruksi sing ing basa liya dianggep minangka sesuatu sing alami dening wong sing wis biasa. Kaping pisanan, bisa uga ora trep, nanging sampeyan bakal weruh manawa program kasebut luwih gampang diwaca lan ora ambigu.

Contone, sarana console sing maca stdin utawa file saka argumen baris perintah bakal katon kaya iki:

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

Solusi kanggo masalah sing padha ing D, sanajan katon luwih cendhek, ora luwih gampang diwaca

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

Neraka salinan

Manungsa nggawa neraka ing awake dhewe. Martin Luther.

Wiwitan terus-terusan sambat babagan Go babagan kekurangan obat generik. Kanggo ngatasi masalah iki, umume nggunakake salinan kode langsung. Contone, fungsi kanggo nyimpulake dhaptar integer, sing bakal dadi profesional percaya yen fungsi kasebut ora bisa ditindakake kanthi cara liya tinimbang kanthi copy-paste sing gampang kanggo saben jinis data.

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

Basa kasebut nduweni sarana sing cukup kanggo ngetrapake konstruksi kasebut. Contone, pemrograman umum bakal apik.

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

Lan, sanajan kode kita dadi luwih suwe tinimbang kasus sadurunge, nanging wis umum. Mulane, ora bakal angel kanggo nindakake kabeh operasi aritmetika.

Akeh sing bakal ngomong yen program ing D katon luwih cendhek, lan bakal bener.

import std.stdio;
import std.algorithm;

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

Nanging, mung luwih cendhek, nanging ora luwih bener, amarga implementasine D rampung nglirwakake masalah penanganan kesalahan.

Ing urip nyata, minangka kerumitan logika mundhak, longkangan nyepetake kanthi cepet. Longkangan nutup malah luwih cepet nalika sampeyan kudu nindakake tumindak sing ora bisa dileksanakake nggunakake operator basa standar.

Ing babagan maintainability, extensibility, lan readability, miturut pendapatku, basa Go menang, sanajan kalah ing verbosity.

Pemrograman umum ing sawetara kasus menehi keuntungan sing ora bisa dipungkiri. Iki jelas digambarake dening paket urut. Dadi, kanggo ngurutake dhaptar apa wae, kita mung kudu ngetrapake antarmuka 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)
}

Yen sampeyan njupuk proyek open source lan mbukak printah "antarmuka{}" -R grep, sampeyan bakal weruh sepira kerepe antarmuka bingung digunakake. Comrades close-minded bakal langsung ngomong sing kabeh iki amarga lack of generik. Nanging, iki ora tansah kasus. Ayo njupuk DELPHI minangka conto. Senadyan ana generik sing padha, ngemot jinis VARIANT khusus kanggo operasi kanthi jinis data sewenang-wenang. Basa Go nglakoni sing padha.

Saka mriem nganti sparrows

Lan straitjacket kudu pas ukuran Madness. Stanislav Lec.

Akeh penggemar ekstrem bisa ngaku yen Go duwe mekanisme liya kanggo nggawe generik - refleksi. Lan padha bakal bener ... nanging mung ing kasus langka.

Rob Pike ngelingake kita:

Iki minangka alat sing kuat sing kudu digunakake kanthi ati-ati. Sampeyan kudu nyingkiri kajaba strictly perlu.

Wikipedia ngandhani kita ing ngisor iki:

Refleksi nuduhake proses sajrone program bisa ngawasi lan ngowahi struktur lan prilaku dhewe sajrone eksekusi. Paradigma pemrograman sing ndasari refleksi diarani pemrograman reflektif. Iki minangka jinis metaprogramming.

Nanging, kaya sing sampeyan ngerteni, sampeyan kudu mbayar kabeh. Ing kasus iki yaiku:

  • kangelan ing nulis program
  • kacepetan eksekusi program

Mula, refleksi kudu digunakake kanthi ati-ati, kaya senjata kaliber gedhe. Panggunaan refleksi sing ora dipikirake nyebabake program sing ora bisa diwaca, kesalahan sing terus-terusan lan kacepetan sing sithik. Mung bab kanggo programmer snob bisa kanggo nuduhake mati kode ing ngarep liyane, liyane pragmatic lan andhap asor kolega.

Bagasi budaya saka Xi? Ora, saka sawetara basa!

Bebarengan karo rejeki, utang uga ditinggalake marang ahli waris.

Sanajan kasunyatane akeh sing percaya yen basa kasebut adhedhasar warisan C, nanging ora kaya ngono. Basa kasebut nggabungake akeh aspek basa pamrograman sing paling apik.

sintaks

Kaping pisanan, sintaksis struktur gramatikal adhedhasar sintaksis basa C. Nanging, basa DELPHI uga nduweni pengaruh sing signifikan. Mangkono, kita waca sing kurung keluwih, kang nemen nyuda readability saka program, wis rampung dibusak. Basa kasebut uga ngemot operator ":=" sing ana ing basa DELPHI. Konsep paket dipinjam saka basa kaya ADA. Deklarasi entitas sing ora digunakake dipinjam saka basa PROLOG.

Semantik

Paket kasebut adhedhasar semantik basa DELPHI. Saben paket encapsulates data lan kode lan ngemot entitas pribadi lan umum. Iki ngidini sampeyan nyuda antarmuka paket kanthi minimal.

Operasi implementasine kanthi metode delegasi dipinjam saka basa DELPHI.

Kompilasi

Ora ana alesan sing guyon: Go dikembangake nalika program C dikompilasi. Salah sawijining kekuwatan basa kasebut yaiku kompilasi ultra-cepet. Ide kasebut dipinjam saka basa DELPHI. Saben paket Go cocog karo modul DELPHI. Paket-paket kasebut dikompilasi maneh mung yen perlu. Mulane, sawise suntingan sabanjurΓ©, sampeyan ora perlu kanggo ngumpulake kabeh program, nanging mung recompile mung paket diganti lan paket sing gumantung ing paket diganti iki (lan malah banjur, mung yen antarmuka paket wis diganti).

Konstruksi tingkat dhuwur

Basa kasebut ngemot macem-macem konstruksi tingkat dhuwur sing ora ana hubungane karo basa tingkat rendah kaya C.

  • strings
  • Tabel hash
  • irisan-irisan
  • Ngetik bebek dipinjam saka basa kaya RUBY (sing, sayangΓ©, akeh sing ora ngerti utawa nggunakake kanthi maksimal).

Manajemen memori

Manajemen memori umume pantes artikel kapisah. Yen ing basa kaya C ++, kontrol ditinggalake kanggo pangembang, banjur ing basa sabanjure kaya DELPHI, model pangetungan referensi digunakake. Kanthi pendekatan iki, referensi siklik ora diidini, amarga kluster yatim piatu dibentuk, banjur Go duwe deteksi klompok kasebut (kaya C #). Kajaba iku, kolektor sampah luwih efisien tinimbang implementasine sing saiki dikenal lan bisa digunakake kanggo akeh tugas nyata-nyata. Basa kasebut dhewe ngenali kahanan nalika nilai kanggo nyimpen variabel bisa dialokasikan ing tumpukan. Iki nyuda beban ing manager memori lan nambah kacepetan program.

Concurrency lan Concurrency

Paralelisme lan daya saing basa ora bisa dipuji. Ora ana basa tingkat rendah sing bisa saingan adoh karo Go. Kanggo adil, perlu dicathet yen model kasebut ora diciptakake dening penulis basa, nanging mung dipinjam saka basa ADA lawas sing apik. Basa kasebut bisa ngolah jutaan sambungan paralel kanthi nggunakake kabeh CPU, nalika duwe urutan masalah sing kurang rumit karo deadlocks lan kahanan balapan sing khas kanggo kode multi-threaded.

keuntungan tambahan

Yen entuk bathi, kabeh wong bakal ora duwe pamrih.

Basa uga menehi kita sawetara keuntungan sing ora diragukan:

  • File eksekusi siji sawise mbangun proyek kasebut nyederhanakake panyebaran aplikasi.
  • Ketik statis lan inferensi jinis bisa nyuda jumlah kesalahan ing kode sampeyan, sanajan tanpa tes nulis. Aku ngerti sawetara programer sing nindakake tanpa nulis tes lan kualitas kode ora nandhang sangsara.
  • Kompilasi salib sing gampang banget lan portabilitas perpustakaan standar sing apik banget, sing nyederhanakake pangembangan aplikasi lintas platform.
  • Ekspresi reguler RE2 aman lan duwe wektu eksekusi sing bisa diprediksi.
  • Pustaka standar sing kuat sing ngidini umume proyek bisa ditindakake tanpa kerangka pihak katelu.
  • Basa kasebut cukup kuat kanggo fokus ing masalah tinimbang carane ngatasi, nanging cukup tingkat rendah supaya masalah kasebut bisa dirampungake kanthi efisien.
  • Sistem eko ​​Go wis ngemot alat sing wis dikembangake kanggo kabeh kesempatan: tes, dokumentasi, manajemen paket, linter sing kuat, generasi kode, detektor kahanan balapan, lsp.
  • Go versi 1.11 ngenalake manajemen dependensi semantik sing dibangun, dibangun ing ndhuwur hosting VCS sing populer. Kabeh alat sing nggawe ekosistem Go nggunakake layanan kasebut kanggo ngundhuh, mbangun, lan nginstal kode saka wong-wong mau kanthi cepet. Lan sing apik. Kanthi tekane versi 1.11, masalah karo versi paket uga rampung dirampungake.
  • Amarga ide inti basa kasebut yaiku nyuda sihir, basa kasebut menehi insentif para pangembang supaya bisa ngatasi kesalahan kanthi jelas. Lan iki bener, amarga yen ora, mung bakal lali babagan penanganan kesalahan. Bab liyane yaiku umume pangembang kanthi sengaja nglirwakake penanganan kesalahan, luwih milih tinimbang ngolah kanggo nerusake kesalahan kasebut munggah.
  • Basa kasebut ora ngetrapake metodologi OOP klasik, amarga ing wangun murni ora ana virtualitas ing Go. Nanging, iki ora dadi masalah nalika nggunakake antarmuka. Ora ana OOP kanthi signifikan nyuda alangan kanggo mlebu kanggo pamula.

Kesederhanaan kanggo kepentingan masyarakat

Gampang rumit, angel nyederhanakake.

Go dirancang kanthi prasaja lan sukses ing tujuan kasebut. Iki ditulis kanggo programer cerdas sing ngerti keuntungan kerja tim lan kesel karo variasi basa tingkat Enterprise sing ora ana watese. Duwe pesawat relatif cilik saka struktur sintaksis ing arsenal sawijining, iku sacoro prakteke ora tundhuk owah-owahan liwat wektu, supaya pangembang wis akèh wektu dibebaske munggah kanggo pembangunan, lan ora endlessly sinau inovasi basa.

Perusahaan uga nampa sawetara kaluwihan: alangi entri kurang ngidini kanggo cepet golek spesialis, lan immutability basa ngidini kanggo nggunakake kode padha malah sawise 10 taun.

kesimpulan

Ukuran otak sing gedhe durung nate nggawe gajah dadi pemenang Hadiah Nobel.

Kanggo para programer sing ego pribadhi luwih dhisik tinimbang semangat tim, uga para ahli teori sing seneng tantangan akademik lan "perbaikan diri" sing ora ana pungkasan, basa kasebut pancen ala, amarga iki minangka basa artisanal tujuan umum sing ora ngidini sampeyan entuk. kesenengan estetis saka asil karya lan nuduhake dhewe profesional ing ngarepe kolega (kasedhiya yen kita ngukur Intelligence dening kritΓ©ria iki, lan ora IQ). Kaya kabeh ing urip, iki minangka prioritas pribadi. Kaya kabeh inovasi sing migunani, basa kasebut wis adoh saka penolakan universal nganti ditampa kanthi massal. Basa iku akale ing gamblang, lan, sing ngerti, kabeh akale iku prasaja!

Source: www.habr.com

Add a comment