Karat untuk pengembang web - mulai cepat dan penerbangan cepat

Halo semuanya! Hari ini saya ingin berbagi pengalaman saya dalam mempelajari bahasa dan implementasi cepat dari proyek jaringan beban tinggi menggunakan koneksi jaringan asinkron non-blocking yang sekarang sangat populer dan populer dalam bahasa Rust yang baru, indah, elegan, dan sangat efektif.
Saya akan memberikan penekanan khusus pada posting pada penjelasan yang cepat dan jelas tentang kemampuan bahasa dan platform untuk spesialis yang memiliki pengalaman luas dalam pengembangan web, karena saya sendiri. Ada kesalahpahaman bahwa kurva entri di Rust sangat, sangat curam. Tetapi saya akan menunjukkan bahwa ini jauh dari kasus. Tuang kopi dan pergi!

Sejarah Singkat Nilai-Nilai Pemrograman


Agar materi tersebut berada di kepala dan hati, menyenangkan untuk mengingat secara singkat apa yang ingin dilakukan orang dalam pemrograman selama 50 tahun terakhir dan apa yang akhirnya mereka dapatkan. Jangan tersinggung, hanya pendapat subjektif pribadi dan holivar, didukung oleh 20 tahun pengalaman pembangunan.

Bahasa Tingkat Rendah: C, C ++


Jelas bahwa Anda dapat menulis program segera dalam bentuk angka pada kode mesin dan banyak yang melakukannya pada ZX Spectrum, BK0010-01 dan pada PC - kode tersebut ternyata sangat cepat :-) Tetapi kita adalah orang-orang, banyak informasi yang tidak sesuai di kepala kita, kita terganggu dan karenanya bahkan penemuan assembler tidak banyak membantu - kode pada tingkat rendah seperti itu sangat jarang ditulis dan sangat akurat dan, kemungkinan besar, jika Anda tidak mengembangkan driver, mikrokontroler atau sistem embedded yang rumit, ini tidak akan berguna dalam kehidupan.


Pada awal 70-an, Bell Labs menemukan bahasa C, yang berakar berkat sintaksis singkat dan abstraksi yang sangat "murah", hampir menjadi "assembler portabel". Jelaslah bahwa jika Anda mengambil amandel, menulis selama 10 tahun pada malam C, tidak makan daging, berdoa dan tidak terganggu oleh jejaring sosial dan seks yang adil, Anda dapat menulis program yang sangat berguna dan cepat, seperti GNU dengan fasih bersaksi, permainan produktif yang sangat baik, tercinta, tetapi bukan alternatif dalam kualitas Windows, dan masih banyak lagi contoh yang bisa diberikan.
Tapi sisi lain dari koin terus membuat dirinya terasa - secara teratur membuka lubang keamanan (seluruh industri untuk "lubang dalam perangkat lunak" telah dibuat), yang disebabkan oleh lubang dalam konsep bahasa C itu sendiri - kompiler seperti banteng yang tidak bertanggung jawab, dengan kekuatan luar biasa, orgasme yang intens dan memori pendek. Kelalaian apa pun - dan Anda tidak bisa begitu saja menghentikan program (mendereferensi pointer nol, membebaskan pointer ganda, keluar dari array), tetapi merusak data secara tidak dapat dibatalkan dan tidak menyadarinya untuk waktu yang lama sampai klien mulai menelepon dan ketika sudah terlambat ("perilaku tidak terdefinisi", berbeda dari kompiler ke kompiler).

Björn Straustrup hanya semakin membingungkan situasi di awal tahun delapan puluhan, menambahkan kemampuan OOP ke C. Meskipun popularitasnya sangat besar, C ++, secara umum, dipandang sebagai serangkaian percobaan pemrograman, dengan demikian, dengan hasil keberhasilan yang berbeda, termasuk mematikan Kadang-kadang bahkan tampaknya tidak ada arti dalam C ++ sejak awal, atau secara bertahap hilang, memunculkan tumpukan konsep-konsep yang rumit dan saling bertentangan secara obyektif, yang semakin lama semakin meningkat dengan setiap standar baru. Terlepas dari tujuan sempurna “abstraksi tanpa biaya”, memungkinkan Anda untuk mendapatkan kode cepat, untuk membuat solusi yang andal, seperti dalam C, syarat-syarat berikut diperlukan:
  • berpengalaman, dari kata "sangat", tim (tahun latihan, "biarawan" pemrograman)
  • penganalisa kode statis yang baik
  • departemen pengujian (dalam kode mungkin ada lubang yang ditinggalkan oleh kompiler yang tidak bertanggung jawab, yang dapat membuat mereka merasa untuk waktu yang lama)
  • persyaratan yang disetujui oleh semua anggota tim yang dipantau dengan cermat (pointer mentah, enkapsulasi ketat, disiplin paling parah untuk variabel penamaan, menginisialisasi objek, dll tidak digunakan)


Jelas bahwa kepatuhan terhadap persyaratan ini, terutama dalam konteks meningkatnya kebutuhan bisnis akan "kode yang bekerja tanpa kejutan mendadak," sangat mahal. Kode dalam proyek tersebut ditulis untuk waktu yang lama, perlu diuji untuk waktu yang lama dan hati-hati, tetapi, kadang-kadang, tanpa C / C ++, sebelum penemuan Rust, itu benar-benar sulit dilakukan.

Sekali lagi, ringkasan C / C ++ - kami memiliki kompiler yang kuat, tetapi "tidak bertanggung jawab" dengan "abstraksi saat ini," yang membantu pengembang sangat sedikit. Akibatnya, semua masalah diteruskan ke pundak programmer. Jika setidaknya satu programmer dalam tim tidak berpengalaman, tidak terlalu berhati-hati dan tidak tahu semua seluk-beluk dari kompiler (pada kenyataannya, tidak ada yang tahu semua seluk-beluk dan pengguna menemukan mereka nanti) - tunggu masalah. Tetapi kemudian program ini bekerja dengan cepat dan mungkin dengan benar :-) Ini, tentu saja, menelurkan seluruh pasar "kruk" - analisa statis, yang, pada gilirannya, harus dibayar oleh Pelanggan. Muncul pertanyaan - mungkinkah menulis kompiler yang lebih ketat dan aman yang membantu pengembang dan melahirkan program tanpa kejutan dan lubang keamanan tingkat rendah?

Java, C #, Kotlin


Situasi dengan kontrol yang terus terang lemah dari "perilaku tidak terbatas" dan persyaratan yang sangat tinggi untuk pengembang di C / C ++ menimbulkan keinginan untuk menciptakan lingkungan pengembangan yang aman, termasuk untuk Internet, dapat diakses oleh sebagian besar pendatang. Jadi di akhir tahun 90-an Jawa muncul.
Pada prinsipnya, sekarang siapa pun dengan tingkat pelatihan yang berbeda dapat menulis apa saja dan apa saja dan ITU BEKERJA dan tidak dimasukkan ke dalam program - tidak ada "lubang" tingkat rendah dalam keamanan dan crash spontan (hampir, tetapi mereka sudah disebabkan oleh bug dalam mesin virtual dan diperbaiki secara terpusat). Hanya ada "lubang" logis atau kode lambat tersembunyi (lahir dari ketidaktahuan algoritma, konsep biaya algoritmik dan melambat ketika volume data meningkat), yang tidak begitu menakutkan lagi dan memungkinkan Anda membuat program dengan cepat, dan jika perlu, menulis ulang potongan kecil dengan tim C / C yang berkualifikasi C ++.
Hal-hal menarik dan berharga yang dibawa dunia Jawa adalah sebagai berikut:
  • kode ini ditulis sekali untuk mesin virtual yang berfungsi pada arsitektur apa pun (windows, linux, mac)
  • pengembang tidak lagi mengelola memori secara langsung, seperti dalam C / C ++ - ini diteruskan ke pundak "pengumpul sampah"; ini menghilangkan risiko perilaku yang tidak terdefinisi, korupsi data yang tersembunyi, dan potensi celah keamanan tingkat rendah
  • kode dikompilasi dengan cepat, saat program sedang berjalan (Just_In_Time kompilasi), karena diketahui bahwa hanya sebagian kecil yang aktif dan sering dijalankan dalam program, sehingga tidak masuk akal untuk mengkompilasi semuanya
  • menjadi lebih mudah untuk menulis kode multi-thread efisien, seperti model memori ditentukan secara ketat (jauh lebih awal dari pada C ++), tetapi lebih lanjut tentang itu, tidak semua masalah dengan "keandalan logis beberapa utas" diselesaikan (kebuntuan, misalnya, atau perlombaan data, masih dimungkinkan)


Tentu saja, munculnya platform yang bersahabat memungkinkan untuk menulis banyak program yang berguna dan tidak berguna, yang langsung dimanfaatkan oleh bisnis. Dan dukungan untuk kompatibilitas mundur di Jawa selama 15 tahun atau lebih telah membuat teknologi begitu populer di dunia perusahaan.

Ya, saya juga memiliki analogi dengan bir dan alkohol yang tidak beralkohol.

Namun, jauh dari langsung, masalah berikut keluar di Jawa:
  • karena "lubang" logis dalam sistem pengetikan, yang diwarisi dari C / C ++, tipe "Null" masuk ke Jawa, yang hingga hari ini menyebabkan banyak masalah dan terus-menerus menyebabkan crash pada programmer "tidak terlalu berpengalaman" yang tidak tahu tentang tipe opsional dan tidak tertarik pada monad dari pemrograman fungsional
  • Proyek Java, kadang-kadang bekerja sedikit lebih lambat, membutuhkan pesanan dengan magnitudo lebih banyak RAM daripada C / C ++ yang dibutuhkan oleh pengumpul sampah (kami memiliki beberapa proyek yang menghabiskan puluhan atau ratusan gigabyte RAM); ini sering bukan masalah langsung, seperti Harga RAM turun, tetapi "sedimen tetap"
  • Meskipun kompilasi jit dan investasi besar dalam mempercepat pengumpul sampah (yang banyak dan baru muncul secara teratur dan terus-menerus mengatakan: "coba GC baru, itu jauh lebih baik"), selama 20 tahun beberapa proyek Jawa yang kaya telah bekerja dengan jeda reguler selama beberapa detik, yang tidak bisa dihilangkan dengan cara apa pun (ada pengumpulan sampah paksa, dan seperti sekrup di GC tidak berputar, pengumpul sampah tidak punya waktu untuk membersihkan semuanya, bahkan bekerja secara paralel dan bahkan menghabiskan lebih banyak sumber daya daripada program itu sendiri)
  • diketahui bahwa aplikasi Java GUI terkadang membeku dan melambat, menyebabkan kemarahan pengguna, karena pengumpulan sampah yang sama dan tidak ada harapan dan tidak diharapkan
  • sintaks bahasanya sangat verbose dan redundan (Anda perlu menulis dan kemudian membaca kata-kata "public static functon" alih-alih, katakanlah, "pub fn" atau "def"), memaksa kadang-kadang untuk mematahkan jari pada kuku dan menyebabkan rasa sakit objektif dan perdarahan dari mata.
  • penurunan tajam dalam persyaratan untuk tingkat kualifikasi pengembang dan kurva entri yang cukup rendah memunculkan banyak kode "tingkat kesegaran yang aneh", yang terus-menerus membuat dirinya terasa sepanjang hidup saya dengan bau busuk yang mengesankan


Setelah membaca, harus jelas bahwa semuanya tidak dapat ditulis dalam Java, itu akan ditulis cukup lambat, maka secara teratur akan melambat dan menggantung selama satu detik di bawah beban, kadang-kadang "makan" banyak RAM (biasanya setidaknya setengah dari RAM di server dimakan), permainan produktif Anda tidak akan dapat melakukannya juga, tetapi beberapa bagian dari logika bisnis yang tidak terlalu menuntut kinerja dan RAM, terutama yang multi-threaded, sangat mungkin, berguna, dan oleh karena itu kami melihat popularitas teknologi di dunia usaha. Dan kami sendiri secara teratur dan aktif menggunakan Java untuk layanan perusahaan.

C #, Scala, Kotlin


"Dan kapan itu tentang Rust?" - tunggu sebentar, kamu perlu sedikit persiapan untuk memakan kesemek manis ini. Jika Anda tidak berbicara tentang fitur-fitur teknologi lainnya, Anda tidak akan mengerti mengapa Rust muncul dan mengapa itu begitu populer dan diminati .

Jadi, mencoba membuat Java lebih baik dan lebih progresif, Microsoft, sebagai penulis TurboPascal / Delphi, pada awal nol muncul dengan C # dan konsep .NET. Secara obyektif, menurut banyak pakar terkemuka, dan di ruang merokok pengembang, "C #" lebih seksi dari Jawa, meskipun, tentu saja, sejauh ini, meskipun Mono, ia sangat melekat pada Microsoft dengan semua arus masuk dan konsekuensi :-)

Scala tidak diragukan lagi merupakan langkah maju yang besar bahasa, tentu saja, ternyata musykil dan canggih secara ilmiah, mengambil banyak hal yang berguna dan tidak berguna dari dunia pemrograman fungsional. Tetapi ada sesuatu yang tidak begitu jelas dengan popularitas. Namun, Apache Spark sangat bagus dan populer, tidak ada yang perlu dikatakan.

Kotlin populer karena membuat Java lebih efisien dan lebih mudah bagi pemula, terutama pada platform seluler yang tidak punya waktu untuk serius mempelajari pemrograman :-)

Tetapi masalah utama dalam C # (pada platform .NET), serta dalam Scala, Kotlin dan dalam bahasa JVM lainnya - tetap ada. Pengumpul sampah, Carl, membuat beban yang terlihat di server dan menghentikan eksekusi kode selama beberapa detik di bawah beban dan persyaratan RAM yang rakus! Dan berapa banyak lagi bahasa dengan pengumpul sampah dan kompilasi jit tidak akan muncul, masalah ini akan tetap ada dan belum ada harapan, bahkan dalam teori.

Scripting


"Tapi bagaimana dengan PHP?" Ya, sekarang mari kita bicara tentang scripting. Tampaknya, mengapa dia? Sekitar akhir 80-an, menjadi jelas bahwa jika Anda perlu dengan cepat menyelesaikan masalah menggunakan kode, tidak harus super cepat, dan aman, tanpa perilaku yang tidak ditentukan dan lubang tingkat rendah, Anda dapat menulis skrip. Skrip ditulis sebelumnya, dalam bash, perl, awk, tetapi ternyata dengan python Anda dapat menulis skrip besar, terutama skrip ilmiah, dan selama bertahun-tahun!

Lua menemukan ceruknya dalam gamedev dan pembelajaran mesin ( Torch ), JavaScript - dalam pengembangan web baik di sisi browser maupun di sisi server (mereka masih tahu bahwa otorisasi dalam infrastruktur "npm" Node.js ditulis ulang dari Node.js dan Golang berkarat?). Python - dalam pembelajaran mesin dan analisis data, serta dalam skrip sistem. Dan PHP - sangat cocok dengan tugas-tugas server untuk pengembangan web.


Keuntungan dari scripting sudah jelas:
  • Kode yang aman dan efisien tanpa perilaku yang tidak ditentukan dan lubang keamanan tingkat rendah, menggunakan algoritma populer dan struktur data (daftar, kamus, antrian), dibuat dalam hitungan menit secara harfiah
  • Awal yang sangat cepat dan kurva entri yang lembut. Butuh beberapa hari untuk mencari tahu dan menulis skrip python yang berguna, mengubah logika nginx melalui skrip di Lua, atau melakukan integrasi toko online di PHP
  • Jika Anda menulis skrip dengan disiplin, mengamati CodeStyle dan seketat mungkin, Anda dapat dengan cepat menyelesaikan masalah kompleks dan membuat produk perangkat lunak besar: sejumlah besar pustaka ilmiah di python, sistem manajemen bisnis dan situs dalam PHP, platform jaringan saraf Torch di LuaJit, skrip permainan dengan sangat game terkenal dan populer, dll.
  • Beberapa jenis pemrograman multi-threaded, di mana I / O adalah bottleneck, cukup efisien diselesaikan dengan python. Dan menggunakan fitur python terbaru dengan futures seperti "async / menunggu" itu bahkan lebih mudah untuk memecahkan masalah pemrosesan sejumlah besar soket jaringan
  • Sangat elegan, tugas memproses secara sinkron sejumlah besar soket, bahkan tanpa multithreading, diselesaikan di Node.js di luar kotak
  • Buat halaman web, gunakan banyak pustaka unix, pergi ke database masih mudah dan nyaman menggunakan PHP dan produk-produk berdasarkan itu
  • Pada python, PHP, JavaScript, sangat mudah untuk menguji hipotesis dan membuat prototipe dalam hitungan jam, bukan bulan
  • Untuk analitik dan pemrosesan data, biasanya sangat nyaman menggunakan python / R bersamaan dengan sejumlah besar pustaka berkualitas tinggi (panda, scikit-learn, seaborn, matplotlib ...)


Namun, Anda tidak dapat mengetahui potensi kerugian dari skrip:
  • Level entri yang rendah dan kecepatan penulisan yang sangat cepat kadang-kadang, dengan tidak adanya kontrol yang tepat atas pengembang, menciptakan banyak kode yang tidak efisien dan sulit dipertahankan pada platform apa pun
  • Tidak adanya kompiler, sistem tipe dan pengetikan statis memerlukan pemeriksaan dinamis parameter yang diteruskan ke fungsi dan metode untuk tipe dan cakupan kode berkualitas tinggi dengan autotest. Kalau tidak, setiap perubahan dalam kode dapat merusak program dan klien, dan bukan pengembang, akan menjadi yang pertama tahu tentang hal itu (ya, saya tahu tentang TypeScript, tetapi ini adalah kruk dan tapal mati)
  • Secara obyektif dan jelas, dalam bahasa tanpa pengetikan dan kompilasi statis, di mana banyak hal terjadi dalam runtime, Anda tidak dapat menggunakan banyak optimasi, dan karenanya, dalam beberapa tugas, skrip perintah kerja dengan magnitudo lebih lambat dan menghabiskan sumber daya berkali-kali lebih banyak. Meskipun ada upaya untuk mengimplementasikan kompilasi jit dalam python (pypy), PHP (hhvm), JavaScript (terjemahan ke dalam kode mesin, wow, Node.js v8), LuaJIT - jangan menipu diri sendiri: semua ini terlihat seperti kruk yang lemah efektif. Alasannya adalah, dan perlu dipahami sekali dan untuk semua, bahwa karena pengetikan bahasa yang disengaja lemah, skrip tidak mungkin pernah berhasil menulis runtime yang efektif, mendekati dalam kecepatan untuk mengetik Java / C # yang jauh lebih kuat.
  • Dan dengan python, sepertinya tidak akan pernah ada multithreading yang efisien, seperti pada Java / C #, karena GIL


Namun sejak itu di sebagian besar aplikasi bisnis, termasuk sistem manajemen situs, CRM, dll. Karena sebagian besar waktu eksekusi kode dihabiskan untuk query ke database, keuntungan dari jit Java / C # sangat diratakan oleh kecepatan penulisan solusi dalam PHP / python / JavaScript, dan secara pribadi, saya akan memilih 10-20 baris dalam PHP untuk membuat aplikasi web dari 10.000 string dan banyak jeroan ayam itik di Jawa / Spring. Dan PHP7 entah bagaimana overclock sehingga berjalan lebih cepat daripada python3 ;-)

Kesimpulan apa yang bisa dibuat di sini? Tidak perlu menyelesaikan semua masalah, seperti yang sekarang populer, hanya dengan scripting - dalam beberapa kasus masuk akal untuk mengambil alat lain yang lebih cocok, jika ada alasan bagus untuk ini:
  • beban jaringan sangat tinggi dan multithreading "ekstrem", ribuan - puluhan ribu soket jaringan, dll.
  • pembatasan penggunaan RAM dan perangkat keras
  • pemrosesan dan komputasi data intensif, matriks dengan jutaan entitas, GPU (meskipun python / numpy / panda dapat membantu di sini)


Seringkali di perusahaan kami mempraktikkan pendekatan ini:
  • cepat membuat keputusan dalam PHP / python / JavaScript / Node.js, luncurkan pertempuran dan mulailah memecahkan masalah pelanggan
  • kami menjalankan fitur, peluang, meningkatkan layanan
  • dalam kasus yang jarang terjadi, dari pengalaman, biasanya tidak lebih awal dari setelah beberapa tahun, beberapa layanan yang sudah stabil dalam fungsionalitas ditulis ulang dalam C / C ++ / Java / Golang / Rust

Oleh karena itu, lebih baik untuk memulai, sebagai aturan, dengan scripting, memulai pertempuran, dan kemudian, jika Anda membutuhkannya secara langsung, Anda perlu mengambil alat lain dan ini berjalan, biasanya sangat lancar dan tanpa risiko.

Pemrograman Fungsional, Lisp, Haskell, F #


Banyak, sepanjang karier seorang pengembang, tidak pernah datang ke sini, tetapi sia-sia. Sangat berguna untuk memahami mengapa FP (pemrograman fungsional) muncul dan mengapa di beberapa daerah sangat populer.

Saya akan menjelaskannya secara sederhana. Ada masalah yang tidak terpecahkan dalam matematika sebagai "masalah terputus-putus" . Jika Anda memasukkannya ke dalam kata-kata yang sangat sederhana dan sangat tidak ketat, tetapi jelas, maka Anda tidak dapat menemukan algoritma yang membuktikan bahwa program akan bekerja tanpa bug. Mengapa Karena pada awalnya, orang-orang mulai pemrograman secara agresif dan imperatif, menggunakan:
  • variabel yang bisa berubah
  • siklus dengan kondisi
  • efek samping

Dan mereka mulai membuat kesalahan. Kami melihat ini sekarang, mengamati sejumlah besar bug baik di web, dan di aplikasi desktop dan seluler. Dan tidak peduli bagaimana Anda menutupi kode dengan autotests, bug masih terus bocor, tersebar di lantai dan cekikikan.
Untuk menghentikan mimpi buruk ini dari permulaan perangkat lunak kereta dan tanpa ampun, pada akhir 50-an, arah pemrograman fungsional dan bahasa Lisp muncul . Sekarang keluarga bahasa ini mewakili, kurang lebih memadai, Haskell .

Terlepas dari kenyataan bahwa sejumlah besar kemungkinan kesalahan dalam kode benar-benar dihilangkan karena:
  • tipe data aljabar dan pencocokan pola pada mereka
  • tidak adanya siklus (hanya melalui rekursi) dan variabel yang bisa berubah dalam jangkauan lengan yang terulur (kruk cara menyiasatinya, tentu saja, dapat ditemukan )
  • pengetikan statis yang sangat ketat dan, pada saat yang sama, keluaran otomatis tipe Hindley-Milner yang sangat nyaman
  • fitur yang sangat kuat, dengan pembagian menjadi "murni" dan "dengan efek samping", dengan kemungkinan penggunaan parsial
  • mengamankan dukungan pemrograman bersamaan
  • dukungan untuk combinator melalui monads untuk semua kesempatan (lebih lanjut tentang itu di bagian Karat)


Haskell «» — , , , : . Haskell «», , , , . Haskell .

, , — Haskell , , , Java/C#.

, . Haskell , , , , . , «» — Haskell .

«C/C++» — Golang, D


, , C/C++ (, Forth). C++ , , D ( — , ).

, - /C++ c RAII , . 2009 Google Golang .
, Golang , , , . Golang Java/C# ( ) , … , Golang:
  • «green threads» ( ), python
  • , , (, Docker ) :-)

. Node.js python .

, Golang , Google vs Sun/Oracle, , , , :-) , « Java/C#» , — . Docker Golang . Golang — Java/C#, , .


, , Swift , c « » . macOS.

— Rust!


, , 40-50 , , , «zero-cost» , , - - :-) , , (Java/C#), , (C/C++), -, — . , ?

— . , , , 50 , 2010 Mozilla Research. , :
  • «zero-cost» ( C/C++ ), .. , , ------ « » (, , )
  • cargo ,
  • (* — ): , — « », , , ,
  • , , ( , , GC , - runtime, )
  • -, Null (!),
  • Haskell pattern-matching , Enumeration (Golang, , )
  • ( Java, )
  • ( Golang — ; Java/C#/Erlang .. , )
  • , ( C/C++)


, , -. ? ! , 50 . , , «» , , .

Rust «» , , Haskell .
Rust , , , Java :-) — Nulls, pattern-matching , generics traits . . , , , « Haskell», .

.

?


! , «» («ownership») . « » ( «lifetime», Rust book, ), ( , ).
/, . /, .
C++, - move-. , rust , .

zero-cost ?


, traits, . , , Golang. , , - pattern-matching, ( Golang, ). / . : . («borrowing»). , ( «read-write locks», ). , , , , .
slice , , , . — « » , , ; , .


:
  • ,
  • ( , )
  • , ---,
  • , , ,


, ( , ) … . / , C/C++ . .


, - , - . - , . Sync/Send, , : , , , .

, , 1-2 futures . , Node.js python async/await, , . , ?

unit


, unit . .

— cargo


Java, «Maven cargo » , : , . , , , .

Heap


, , heap. , , ( ) « » ( «lifetime»). , ( Swift). , — , heap . — , .


, , , . , (2 ) , , , , , AmazonWebServices c tls/ssl, .
, , , , , - . « » ( «lifetimes») .
, . IntelliJ rust , . Notepad++ — .

Rust


  • Memahami bahwa Anda benar-benar perlu menulis kode sistem yang sangat cepat, bekerja di bawah beban tinggi dan mengkonsumsi sumber daya minimum dan tanpa overhead seperti pengumpul sampah. Jika tidak, tulis skrip dengan python / PHP / Node.js dan kembali ke tugas setelah 2-3 tahun (dalam 97% kasus Anda tidak harus kembali).
  • Jangan takut pada Rust. Sorotan utama dari bahasa ini adalah kompiler yang sangat cerdas dan matematis yang TIDAK akan meleset dari kode berbahaya dan salah. Dengan coba-coba, menghindari sudut yang tajam, Anda akan belajar cara memprogram menggunakan kompiler secara ketat dan aman :-)
  • Mulai belajar bahasa dengan " Karat buku ". Buku yang indah dan seksi yang mudah dibaca dan menyenangkan untuk dibaca. Tetapi lebih baik membacanya 2 kali, "menyelesaikan" semua contoh.
  • " Buku masak karat " sangat membantu. Juga diinginkan untuk “menyelesaikannya” dan melihat bagaimana kodenya bekerja, untuk merasakannya.
  • Ada literatur tentang Rust untuk pengguna tingkat lanjut, seperti Rustonimicon , tetapi saya tidak menyarankan Anda repot - repot dengan hal-hal teknis yang benar-benar rumit.



Pahami sekali lagi - untuk menguasai teknologi, Anda harus mulai menulis kode yang bermanfaat bagi perusahaan. Kompiler Rust sangat cerdas sehingga memberikan jaminan (pada kenyataannya, sangat penting, kompiler C ++ tidak tahu bagaimana melakukannya) dan tidak mengkompilasi kode berbahaya / rusak memori, jadi bereksperimen sebanyak yang Anda inginkan dan Anda akan mendapatkan kode dengan cepat dan aman dan bahkan lebih baik Anda akan mulai pemrograman: - )

Detail Implementasi Proyek


Saya akan mengungkapkan sedikit detail dari proyek ini. Amazon SQS menumpahkan ratusan paket data per detik. Antrian dibaca, diurai secara lokal oleh pekerja, setiap pesan diproses oleh broker dan dialihkan ke server eksternal lain. Ada beberapa server eksternal. Awalnya, solusi diimplementasikan melalui skrip: skrip, mengambil proses dalam sistem operasi, membaca pesan, diproses dan dikirim melalui jaringan. Pada beberapa server besi yang kuat (8 core, 16 GB RAM), ratusan skrip diluncurkan (masing-masing!), Secara simultan membaca dari SQS, memproses dan mengirim data. Sederhana, andal, tetapi asupan zat besi mulai mengganggu. Biaya besi terus meningkat.

Karat sebagian besar menggunakan perpustakaan standar dan modul dari kargo:
  • rusoto_sqs - untuk bekerja dengan Layanan Web Amazon, tanpa pertanyaan, berfungsi sesuai kebutuhan di luar kotak
  • rustls - untuk tl, termasuk. interaksi dengan layanan TLS dari Google, Apple dan penggunaan sertifikat klien
  • signal-hook - untuk mencegat kill dan membawa ke akhir transaksi untuk mengirim data
  • futures, tokio-rustls - “lazy”, multithreaded, asynchronous bekerja dengan soket TLS jaringan, ala Node.js
  • argumen baris perintah clap - parsing
  • serde_json - formasi json, tidak ada yang menarik di sini


Sayangnya, itu bukan tanpa menggunakan blok "tidak aman" dan "std :: mem :: transmute" - pustaka standar tidak dapat menemukan alat untuk mem-parsing data biner ke dalam pohon.

Yang utama, jika Anda bisa menyebutnya begitu, "memasukkan" terjadi dalam kompilasi - perpustakaan tidak dikompilasi pada CentOS6 karena "assembler usang" dalam binutils, tetapi tidak ada masalah pada CentOS7.

Kesan umum adalah bahwa pengembangan pada Rust lebih menyerupai, "scripting ketat" daripada pemrograman sistem, tidak lebih lama dari scripting atau pengembangan web, baik dalam hal sumber daya dan pengujian. Dalam hal ini, kompilasi statis yang ketat, tidak adanya pengumpul sampah dan tipe data aljabar.

Perasaan keseluruhan sangat positif. Namun, bukannya beberapa server besi (8 core, 16 GB RAM), masalahnya mulai diselesaikan dengan satu proses (dengan puluhan utas) yang memakan tidak lebih dari 5 GB RAM dan menciptakan beban yang tidak terlalu mencolok pada core, dengan lalu lintas di wilayah 0,5-1 gigabit .

Kesimpulan


Yah, itu berakhir lama, tapi, semoga, menginspirasi dan berguna tentang teknologi yang efektif. Sekarang Anda tahu alat lain dan Anda bisa lebih aman menggunakannya jika perlu. Kami meninjau sejarah perkembangan bahasa pemrograman, kemampuan dan fiturnya, dan mungkin telah membuat atau akan menarik kesimpulan yang tepat. Semoga berhasil dengan proyek Anda dan suasana hati yang baik, tidak, bagus!

PS:
* - Ya, saya hampir lupa. Tentu saja, Anda perlu berbicara tentang blok yang tidak aman. Di blok ini Anda dapat:
  • untuk memprogram hal-hal yang tidak tersedia dalam karat biasa - dereference pointer "mentah" dan melakukan beberapa hal yang lebih berbahaya, kadang-kadang diperlukan dalam pemrograman sistem. Tapi semuanya tidak begitu menakutkan:
  • blok yang tidak aman terlihat dan tidak ada sama sekali, atau kode yang bertanggung jawab terkonsentrasi di dalamnya
  • Perpustakaan standar karat diuji secara menyeluruh, yang berarti kami percaya bahwa blok yang tidak aman berfungsi di dalamnya
  • perpustakaan populer dalam kargo juga diuji secara menyeluruh (semuanya dibangun untuk unit dan pengujian integrasi dalam karat) dan oleh karena itu mereka dapat dengan aman diambil dan digunakan

Yaitu di blok "tidak aman" Anda tidak dapat terlibat dalam pesta pora yang sewenang-wenang, tersedia di C - tetapi hanya dengan jenis aktivitas berbahaya tertentu . Karena itu, Anda dapat dan harus tidur nyenyak :-)

Source: https://habr.com/ru/post/id477342/


All Articles