Rust geliştiricisinin ilk git deneyimi

Yazar | Nick Cameron

Baş Editör | Guo Rui

Son birkaç haftadır Go'da programlar yazıyorum. Go'yu ilk kez büyük ve önemli bir projede kullanıyorum. Rust'un özelliklerini incelerken, deneyim örnekleri ve oyuncak programları yazma dahil olmak üzere Go hakkında çok şey okudum. Ama onunla gerçekten programlama yapmak tamamen farklı bir deneyim.

Bu deneyimi yazmanın ilginç olacağını düşünüyorum. Bu yazıda, Go ve Rust arasında çok fazla karşılaştırma yapmaktan kaçınmaya çalışacağım, ancak Rust'tan Go'ya geçiş yaptığım için kaçınılmaz olarak bazı karşılaştırmalara yer verilecek. Önceden belirtmek gerekir ki Rust'a daha fazla taraftarım, ancak objektif olmaya çalışacağım.

Genel izlenim

Go'da programlama duygusu harika. Kütüphane programı istediğim her şeye sahip ve genel uygulama nispeten tamamlandı. Öğrenme deneyimi de çok pürüzsüz, Go'nun dikkatlice tasarlanmış ve pratik bir dil olduğunu söylemeliyim. Örneğin: Go'nun sözdizimini öğrendikten sonra, diğer dillerdeki deyimleri Go olarak genişletebilirsiniz. Biraz Go öğrendiğiniz sürece, Go dilinin diğer özelliklerini nispeten daha kolay tahmin edebilirsiniz. Diğer dillerden biraz bilgi alarak, çok fazla arama yapmak zorunda kalmadan (Google) Go kodunu okuyabilir ve anlayabilirim. C / C ++, Java, Python, vb. İle karşılaştırıldığında Go'nun çok fazla sorun noktası yoktur ve daha üretkendir. Ancak yine de bu dillerle aynı çağdadır. Diğer dillerden bazı dersler almış olsa da, şahsen ben bile o neslin en iyi dili olabileceğini düşünüyorum, ama kesinlikle o nesil dillere ait. Bu, yenilikten ziyade kademeli bir gelişmedir (açık olması gerekir, bu, yazılım mühendisliği açısından değerinin eleştirilmesi anlamına gelmez, artımlı iyileştirme genellikle iyi etkiler getirir). İyi bir örnek sıfırdır: Rust ve Swift gibi diller, tüm ilgili hatalar sınıfını ortadan kaldırmış ve ortadan kaldırmıştır. Git, riskin bir bölümünü azaltır: hiçbir değer yoktur ve sıfır ile 0'ı birbirinden ayırır. Ancak temel fikri değişmedi ve aynı zamanda genel bir boş işaretçi başvurusu çalışma zamanı hatası olacak.

Öğrenmesi kolay

Git öğrenmesi çok kolay. İnsanların bunu sık sık söylediklerini biliyorum, ancak üretkenliğimdeki hızlı artış beni gerçekten şok etti. Go dili, dokümantasyonu ve araçları sayesinde, "değerli" ve gönderilebilir kod yazmam yalnızca iki günümü aldı.

Öğrenme kolaylığına katkıda bulunan birkaç faktör şunlardır:

  • Go çok akıcı. Pek çok dil kendini küçük göstermeye çalışır, ancak Go bunu gerçekten yapıyor (bu temelde iyi bir şey ve bu öz disiplin ruhundan etkilendim).

  • Standart kitaplık mükemmeldir (ve ayrıca çok küçüktür). Ekosistemden kütüphane programlarını bulmak ve kullanmak çok kolaydır.

  • Diğer dillerde bulunmayan birkaç şey var. Go, diğer mevcut dillerden pek çok içerik çıkardı ve onları geliştirdi ve sonunda onları iyi bir şekilde bir araya getirdi. Alışılmadık olmaktan kaçınmak için büyük çaba sarf etti.

Sıkıcı standart kod

Go kodu hızla çok tekrarlı hale gelir. Bunun nedeni, makroların veya jeneriklerin çoğaltılmasını azaltmak için bir mekanizmadan yoksun olmasıdır (arabirimler soyutlama için iyi olsa da, kod çoğaltmasını azaltmada o kadar etkili değildirler). Sonunda birçok fonksiyon yazacağım ve hatta farklı tipler dışında bunlar aynı. Hata işleme ayrıca tekrarlamaya da yol açabilir. Hatta birçok işlevde gerçekten değerli koddan daha fazla standart kod vardır. İf err! = Nil {return err} gibi.

Standart kodu azaltmak için jeneriklerin veya makroların kullanılması bazen kodu yazmayı kolaylaştırmak için okunabilirliğini kaybetmemesi gerektiği gerekçesiyle eleştirilir. Go'nun tam olarak bir karşı örnek sağladığını buldum.Kodu kopyalamak ve yapıştırmak genellikle hızlı ve kolaydır, ancak kodu okumak sinir bozucu olabilir, çünkü pek çok alakasız kodu görmezden gelmeniz veya aynı kodun çoğunda ince farklar bulmanız gerekir.

Sevdiğim bir şey

Derleme zamanı : Kesinlikle hızlı, kesinlikle Rust'tan çok daha hızlı. Ama aslında beklediğim kadar hızlı değil (orta ila büyük projeler için hızının sadece C / C ++ 'ya yakın veya biraz daha hızlı olduğunu hissediyorum. Ve tam zamanında derlemeyi dört gözle bekliyorum).

Gorutin ve kanal : Go'nun koroutinler oluşturmak ve kanalları kullanmak için hafif bir sözdizimi sağlaması övgüye değer. Sadece küçük bir detay olmasına rağmen, Go'nun eşzamanlı programlama deneyimini diğer dillerden üstün kılar ve sözdiziminin gücünü gerçekten ortaya çıkarır.

arayüz : Karmaşık değillerdir, ancak anlaşılması ve kullanılması kolaydır ve birçok yerde pratiktir.

Eğer ...; ... {} dilbilgisi : Değişkenlerin kapsamını if ifadeleriyle sınırlayabilmek gerçekten çok iyi. Bu, Swift ve Rust'a izin verildiğinde benzer bir etkiye sahiptir, ancak daha çok yönlüdür (Go, Swift ve Rust gibi desen eşleştirmesine sahip değildir, bu nedenle izin verirse kullanamaz).

Test ve dokümantasyon yorumlarının kullanımı kolaydır .

Go toolchain çok arkadaş canlısı : Komut satırında birden fazla araç kullanmadan her şeyi tek bir yere koyun.

Çöp toplayıcıya (GC) sahip olun : Bellek yönetimi konusunda endişelenmeyin, programlamayı gerçekten kolaylaştırır.

değişken parametre .

Sevmediğim şeyler

Aşağıdaki içerik belirli bir sırada değildir.

sıfır dilim : Sıfır, sıfır dilim ve boş dilimlerin aynı olmadığını bilmek, üçüncü değil, yalnızca ikisine ihtiyacımız olduğunu garanti edebilirim.

Numaralandırılmış türler birinci vatandaş değildir : Numaralandırmaları simüle etmek için sabitleri kullanmak geriye doğru bir adım gibi geliyor.

Döngüsel referanslara izin verme : Bu aslında paketin bölünmüş proje modülündeki kullanılabilirliğini sınırlar, çünkü bir pakette çok sayıda dosyanın birikmesini teşvik eder (veya çok sayıda parçalanmış küçük paket, bir araya getirilmesi gereken dosyalar dağınıksa, aynı zamanda kötüdür) ).

değiştirmek Eksik maçlara izin verilir .

aralık için İfade bir çift "dizin / değer ". Yalnızca indeksi elde etmek kolaydır (sadece değeri göz ardı edin); ancak yalnızca değeri elde etmek için onu açıkça beyan etmeniz gerekir. Bence bu yaklaşım tersine çevrilmelidir çünkü çoğu durumda indekslerden çok değerlere ihtiyacım var.

dilbilgisi:

  • Tanım ve amaç tutarsızdır.

  • Derleyiciler bazen çok seçici olabilir (örneğin, sondaki virgüllere izin vermek veya bunlara izin vermemek); iyi araçlar bu sorunu hafifletebilir, ancak bazen yine de can sıkıcı ekstra adımlar üretirler.

  • Çok değerli bir dönüş türü kullanırken, tür üzerinde parantezler gereklidir, ancak dönüş ifadesinde bu gerekli değildir.

  • Bir yapının bildirilmesi iki anahtar sözcük gerektirir (tür ve yapı).

  • Genel veya özel değişkenleri işaretlemek için sermaye terminolojisini kullanmak, Macar terminolojisine benziyor, ancak daha kötü.

Örtülü arayüz. En sevdiğim şeylerde de göründüğünü biliyorum, ancak bazen gerçekten can sıkıcı oluyor - özellikle arayüzü uygulayan tüm türleri veya belirli bir tür için hangi arabirimlerin uygulandığını bulmaya çalışırken.

Farklı paketlerdeki alıcılarla işlev yazamazsınız Dolayısıyla, arabirim bir "ördek türü" olsa bile, bu arabirimi diğer paketlerdeki türler için uygulayamazsınız, bu da bunların kullanışlılığını büyük ölçüde azaltır.

Ve daha önce bahsettiğim şey, Go, jenerik ve makrolardan yoksundur.

tutarlılık

Bir dil tasarımcısı ve programcısı olarak, Go ile ilgili belki de en şaşırtıcı şey, yerleşik işlevleri ile kullanıcılar için mevcut olanlar arasında sık sık tutarsızlıklar olmasıdır. Birçok dilin hedeflerinden biri, derleyici sihrini olabildiğince ortadan kaldırarak kullanıcıların yerleşik işlevleri kullanabilmesidir. Operatör aşırı yüklemesi basit ama tartışmalı bir örnektir. Ama Go'nun çok sihri var! Böyle bir sorunla karşılaşmak sizin için kolaydır: bu yerleşik işlevlerin yapabildiğini yapamazsınız.

Beni etkileyen bazı şeyler:

  • Birden çok değeri ve kanalı döndürmek için sözdizimi harikadır, ancak bu ikisi birlikte kullanılamaz çünkü tuple türü yoktur.

  • For ... range deyimini diziler ve dilimler üzerinde yinelemek için kullanabilirsiniz, ancak yineleyici kavramından yoksun olduğu için diğer koleksiyonlarla hiçbir şey yapamazsınız.

  • Len veya append gibi işlevler genel işlevlerdir, ancak kendi işlevleriniz küresel işlevlere dönüştürülemez. Bu genel işlevler yalnızca yerleşik türleri kullanabilir. Go "jenerik içermese" bile jenerik olabilirler.

  • Operatör aşırı yüklemesi olmadan, == can sıkıcı olurdu. Çünkü karşılaştırılabilir olmadıkları sürece sözlüklerde anahtar olarak özel türleri kullanamayacağınız anlamına gelir. Bu öznitelik tür yapısından türetilir ve programcılar bu özniteliği geçersiz kılamaz.

sonuç olarak

Go, basit, küçük ve hoş bir dildir. Ayrıca bazı köşeleri de vardır, ancak çoğu özenle tasarlanmıştır. Öğrenme hızı inanılmazdır ve diğer dillerin daha az bilinen bazı özelliklerinden kaçınır.

Go, Rust'tan çok farklı bir dildir. Her ikisi de genel olarak "sistem dili" veya "C diline alternatif" olarak tanımlanabilse de, tasarım hedefleri, uygulama alanları, dil stilleri ve öncelikleri aynı değildir. Çöp toplama büyük bir fark getirir: GC kullanmak Go'yu daha basit, daha küçük ve anlaşılması daha kolay hale getirir. Rust, GC kullanmak yerine inanılmaz derecede hızlıdır (özellikle yalnızca yüksek iş hacmini değil, gecikmeyi de garanti etmeniz gerektiğinde) ve Go'da imkansız olan (veya en azından performanstan ödün vermeden) özellikleri veya programlama modellerini destekleyebilir. Öncül altında başarmak imkansızdır).

Go derlenmiş bir dildir, çalışma zamanı iyi uygulanmıştır ve hızı şüphesizdir. Rust aynı zamanda derlenmiş bir dildir, ancak çalışma süresi çok daha küçüktür ve gerçekten hızlıdır. Başka kısıtlamaların yokluğunda, Git veya Pas'ı seçmenin aslında bir değiş tokuş anlamına geldiğini düşünüyorum: Bir yandan, Go'nun daha kısa bir öğrenme eğrisi ve daha basit prosedürleri var (Bu, daha hızlı geliştirme hızı anlamına gelir); Öte yandan, Rust gerçekten mükemmel bir performansa sahip ve yazı tipi sistemi daha etkileyici (Bu, programı daha güvenli hale getirir ve ayrıca daha hızlı hata ayıklama ve hata bulma anlamına gelir).

Feragatname: Bu makale PingCAP'den gelir ve yazar tarafından gönderilir ve telif hakkı kendisine aittir.

Tencent Cloud "Weimeng'i" kurtarır! 766 çevrimiçi toplantı düzenleyin, 100'den fazla sunucu tahsis edin ve alarm saati yalnızca 2 saat için ayarlanabilir

Ağır! Milli Eğitim Bakanlığı, 179 üniversitede yeni lisans AI ana dallarını tekrar onayladı

Yapay zekanın gelecekteki eğitimi değiştirmesinin 5 yolu!

Linux, ana masaüstü işletim sistemi olacak mı?

6 adım, Ubuntu sanal makine ortamında Hadoop'u Docker'ın kendi DNS'si ile yapılandırmayı öğretir | Ekli kod

Bir proje geliştirirken bir blockchain platformu nasıl seçilir? Size cevap vermek için Ethereum, RSK üzerinden Bitcoin ve Ardor olmak üzere üç ilginç platformu analiz ettik!

TIOBE March programlama dili sıralaması: Java yükseliyor, Delphi artık mükemmel değil
önceki
Huawei, Wuhan'daki çalışanları günde 2.000 RMB'ye kadar sübvanse ediyor; iPhone SE 2 seri üretimi veya erteleme; PowerShell 7.0 yayınlandı | Geek Headlines
Sonraki
Transformer neden bir grafik sinir ağıdır?
Tencent Cloud Weimeng'i "kurtarıyor"! 766 çevrimiçi toplantı düzenleyin, 100'den fazla sunucu tahsis edin ve alarm saati yalnızca 2 saat için ayarlanabilir
1w2'nin altındaki programcılar 2020'de gerçeklerle yüzleşecek ...
Ali mühendisleri size bir B-end dikey pazarlama merkezinin nasıl tasarlanacağını öğretir
Duotu sizi Wuhan'a götürüyor: Hubei, 0! Wuhan, 0
Wuhan'da beyaz melek sayesinde binlerce ışık yanıyor, en sıcak olanı Wuhan halkının kalbi.
Kimura Takuya'nın 18 yaşındaki kızı da çıkış yaptı! Alev kırmızı dudaklar fotoğraf pozlama
Guiyang County Köprüsü Merkez Okulu bahar girişinde acil durum tatbikatını başlattı
Suxian Bölgesinde Wugaishan Eyaletine ait Orman Çiftliği, gerçek çatışmaya yakın orman yangını söndürme tatbikatları gerçekleştirdi.
Li County, Changde: İşleri Dengelemek ve Yoksul Haneler için Gelir Artışı Motorları Kurmak için Yoksulluğu Azaltma Çalıştayı
Juxian Wenxin Lisesi: Tam süreç, tam eleman simülasyon alıştırmaları, okulun başlangıcına hazırlanın
Juxian No.4 Orta Okulu: Salgın önleme ve kontrol gevşek değildir ve gerçek savaş tatbikatı okula hazırdır
To Top