Deno 1.0

2020-05-13

Ryan Dahl, Bert Belder, va Bartek Iwańczuk

Dinamik tillar foydali vositalatdir. Skriptlash foydalanuvchilarga komplex sistemalarni tez va qisqa birga bog'lab va fikrlarini hech qanday xotira boshqaruvchi (memory management) yoki tizim yaratish (build system) kabi detallar bilan tashvishlanmasdan ifoda etishga yordam beradi. So'nggi yillarda, "Rust" va "Go" kabi dasturlash tillari murakkab mahalliy mashina kodlarini (native machine code) osonlik bilan yaratish imkonini berdi; ushbu loyihalar kompyuter infratuzlimalarining muhim rivojlanishilaridan biridir. Shu bilan birga, biz ko'plab muammoli domenlarning (problem domains) ko'rib chiqa oladigan kuchli skripting muhiti hali ham zarur deb ta'kidlaymiz.

JavaScript dinamik tillar orasida ko'p ishlatiladiganlardan biridir, u veb-brauser bilan har bir qurilmada ishlaydi. Ko'pgina dasturchilar JavaScriptni yaxshi bilishadi va ko'p mehnati uning bajatilishini optimallashtirishga sarflangan. ECMA International kabi tashkilotlar tomonidan dastur tili ehtiyotkorlik bilan va doimiy ravishda yaxshilanib borgan. Biz shunga ishonamizki, JavaScript - bu dinamik til vositasi uchun tabiiy tanlovdir; Hattoki brauzer muhitida bo'ladimi yoki mustaqil jarayonidami.

Ushbu shohadagi dastlabki harkatlarimizdan biri, Node.js, juda muvaffaqiyatli dasturiy platforma ekanligini isbotlandi.Odamlar buni veb-vositalarni yaratish, mustaqil veb-serverlarni yaratish va ko'plab boshqa foydalanish holatlari uchun foydali deb topdilar. Ammo Node esa 2009 yilda yaratilgan bu paytda JavaScript juda boshqacha tilda edi. Zaruratlar bo'lganligidan, Node keyinchalik standart tashkilotlar tomonidan qabul qilingan tushunchalarni va ularni tilga boshqacha qo'shishlika majbur bo'lishdi. Node-dagi Dizayn xatolarining taqdimotida bu batafsilroq muhokama qilinadi. Node foydalanuvchilarining ko'pligi sababli tizimni rivojlantirish juda qiyin va sekin bo'lib qoldi.

JavaScript tilining o'zgarishlari bilan, va TypeScript kabi yangi qo'shimchalar bilan, Node loyihalarini yashashda qiyinchilik tug'dirishi mumkin. Shu tariqa qurilish tizimlarini boshqarish bilan bog'liq bo'lgan va boshqa asboblarda ko'p kuch ishlatishlar dinamik til skriptlashning yoqimlik tomonini olib qo'yadi. Bundan tashqari, tashqi kutibxonalarni (external libraries) bog'lab turadigan mexanizim NPM omborxonasidir (repository). Bu NPM esa Internet ideallariga mos kelmaydi.

Biz JavaScript-ning landshaftini va uning atrofidagi dasturiy infratuzilmani o'zgarishi, uni soddalashtirishga arzigulik darajada bo'lganligini his qilmoqdamiz. Bizlar skriptlash muhiti keng doirada ishlatilishi biz uni qiziqarli va samarali bo'lish yo'llarini qidirmoqdamiz.

Buyruqlar satridagi skriptlar uchun veb-brauzer (Command-Line Scripts)

Deno - bu veb-brauzerdan tashqarida JavaScript va TypeScript-ni bajarish uchun yangi run-time.

Deno tezkor murrakab bajarilish skripting (Scripting complex functionality) uchun mustaqil vositalar ta'minlashga urinmoqda. Deno bu yakka bajariladigan fayldir (va har doim shunday bo'ladi) (single executable file). Huddi veb-brauzer kabi tashqi (external) kodlarni olishni biladi. Denoda, yagona bir fayl o'zboshimcha murrakab xatti-harakatlarni (arbitrarily complex behavior) hech qanday vositalarsiz aniqlab bera oladi.

1
2
3
4
5
import { serve } from "https://deno.uz/std@0.50.0/http/server.ts";
for await (const req of serve({ port: 8000 })) {
req.respond({ body: "Hello World\n" });
}

Bu yerda to'liq HTTP server moduli bitta satrda qaramlik sifatida bir chiziqqa qo'shildi. U yerda hech qanday konfiguratsiya fayllar yo'q, oldindan hech qanday narsani o'rnarish keraki yo'q, faqat deno run example.js.

Shuningdek brauzerlar singari, kod ham standart holatdagi himoyalangan sinov muhitida (sandbox) bajariladi. Skriptlar qattiq diskka, ochiq tarmoq ulanishlarga (open network connections) ulana olmaydi yoki boshqa biron bir ruhsatsiz zararli harakatlarni ruhsatsiz bajarmaydi. Brauzer API-lar kamera va mikrofonlarni ishlatish oldin foydalanuvchi ruhsat berishi lozim. Deno terminal uchun o'xshash xatti-harakatlar ta'minlaydi. Yuqoridagi misol muvaffaqiyatli bo'lishi uchun '--allow-net' buyruq satri bayrog'i (command-line flag) berilishi lozim.

Deno standart JavaScript API brauzeridan chetlanmaslik uchun ehtiyotkorlik bilan ish tutadi. Albatta, har bir brauzer API Deno uchun tegishli emas, lekin ular qayerda tegishli bo'lsa, Deno standartdan chetga chiqmaydi.

Birinchi klass TypeScript-ni qo'llab-quvvatlash (First Class TypeScript Support)

Biz Deno-ni keng miyosdagi muammolar maydonida foydalanishini xohlaymiz: kichkina bir satrli skriptlardan, to murakkab Server-side biznes logikasigacham. Dasturlar tobora murakkablashib borar ekan, yozishni tekshirishga ega bo'lgan dasturning ahamiyati tobora muhim bo'lib boradi. TypeScript- bu JavaScript tilining kengaytamsi bo'lib, u foydalanuvchilarga ixtiyoriy ravishda ma'lumot turini taqdim etishiga imkonini beradi.

Deno TypeScript-ni qo'shimcha vositalarsiz qo'llab-quvvatlaydi. Runtime TypeScript-ni yodga olgan holda dezaynlashtirilgan. 'deno types' buyrug'i deklaratsiya turlarini (type declarations) Deno tomonidan taqdim etilgan barcha narsalarni ta'minlaydi. Denoning standart modullari barchasi yozilgan TypeScript.

Hamma yo'lni va'da qiladi (Promises All The Way Down)

Node JavaScript-da Promise (va'da) yoki asnc/await tushnchalariga bo'loshidan oldin yaratilgan. Node-ning va'dalarga qarashi qismi EventEmitter-dir, bunda muhim API-lar atrofida asoslangan, ya'ni namely sockets va HTTP. Agar Ergonomikning async/await afzalliklarini chetga surib qo'ysak, EventEmitter-da back-pressure bilan muamolik bo'ladi. TCP socket-ni misol qilib olsak ham bo'ladi. Socket kirib keladigan paketlani qabul qilganida, "data" event-ni chiqaradi. Ushbu "data" chaqiriqlari boshqarib bo'lmaydigan holatda chiqaradi, va jarayonni event-lar bilan to'ldirib tashlaydi. Chunki Node to'xtamasdan yangi data eventlar qabul qiladi, TCP socket-da hech qanday o'rinli back-pressure yo'q, remote sender ushbu server haddan tashqari to'lganligidan habari bo'lmaydi va data-ni yuborishda davom etadi. Ushbu muamoni yumshatish uchun 'pause()' usuli qo'shildi. B muammoni hali qilishi mumkin, lekin qo'shimcha kod talab qildi; va shundan beri toshqin muammosi faqat jarayon juda band bo'lganda o'zini ko'rsatadi, ko'plab Node dasturlari data bilan toshib ketishi mumkin. Natijada tizim yomon qotishi mumkin (tail latency).

Denoda, socket-lar hanuzgacha sinxrondir, ammon yangi ma'lumotlatni olish uchun foydalanuvchilardan read() aniq talab qilinadi. Qabul qilivchi socket to'g'ri ishlashi uchun qo'shimcha pauza semantikasi shart emas. Bu TCP socket-lari uchun noyob emas. Eng pastki tizimning darajadagi bog'laydigan qatlami (level binding layer) tubdan va'dalarga (promises) bog'langan - va biz bu bog'liqliklarni "ops" deb ataymiz. Denodagi barcha qo'ng'iroqlar (callbacks) biron bir shaklda yoki yana bir va'dalardan (promises) kelib chiqadi.

Rust-ning o'zida ham va'da (promise) kabi tushunchasi mavjudir, va u "Futures" ("Fyuchers") deb ataladi. "op" abstraktsiyasi orqali, Deno Rust Future-ga asoslanga API-larni JavaScript va'dalarga (promises) osonlik bilan bog'lay oladi.

Rust API-lar

Biz yetkazib beradigan asosiy tarkibiy qism Deno buyruq satri interfeysidir (CLI). CLI bugungi kundagi 1.0 versiyasidagi narsadir. Ammo Deno monolit dastur emas, lekin Rust qutilari to'plami, boshqa qatlamlarda integratsiyalash uchun yaratilgan.

deno_core qutisi Deno-ning juda boshlang'ish versiyasidir. Bu na TypeScript-ga bog'liq emas na Tokio -ga. Bu shunchaki bizning Op va Resurs infratuzilmani oddiygina taqdim etadi. Ya'ni, bu Rust Futures-larini JavaScript va'dalariga (promises) tartibli usul bilan bog'laydi. Albatta, CLI butunlay deno_core ustidan qurilgan.

rusty_v8 qutisi yuoqri sifatli Rust bog'liqliklarni (bindings) V8-ning C++ API-ga ta'minlaydi. API asl C++ API-ga iloji boricha o'xshashlikka harakat qiladi. Bu zero-cost binding-dir - Rust-da uchragan obyektlar xuddi C++ da boshqaradigan obyektlar kabidir. (Rust V8 bindings-dagi oldingi urinishlar, doimiy tutqichlarni (Persistent handles) ishlatishga majburladi, misol uchun) Bu quti Github Actions CI-da qurilgan ikkilik sanoq sistemasini (binary) ta'minlaydi, lekin bu yana foydalanuvchilarga V8-ni noldan kompilyatsiya (compile) qilishga va uning ko'plab tuzilish konfiguratsiyasini (build configurations) sozlashga imkon beradi. V8-ning barcha manba kodi qutinin o'zida taqsimlanadi. Nihoyat rusty_v8 xavfsiz interfeys bo'lishga urinadi. Bu hali 100% xavfsiz emas, lekin biz bunga yaqinlashmoqdamiz. Huddi V8 kabi murrakab bo'lgan VM bilan xavfsiz usulda bog'lanish ham juda ajoyibdir va Deno-ning o'zida ko'p qiyin hatoliklarni (bugs) topishda imkon berdi.

Barqarorlik (Stability)

Biz Deno-da barqaror API saqlashga va'da beramiz. Denoda juda ko'p interfeys va komponentlar bor, shuning uchun biz "barqaror" deganda nima demoqchiligimizni ko'rsatish muhimdir. Operatsion tizim bilan o'zaro ishlash uchun biz ixtiro qilgan JavaScript API-ning barchasi "Deno" degan namespace-da joylashgan (masalan,Deno.open()). Bular sinchkovlik bilan tekshirib chiqilgan va biz ularga orqaga mos kelmaydigan o'zgarishlarni amalga oshirmaymiz.

Barqarorlashtirishga hali tayyor bo'lmagan barcha funksiyalar '--unstable' buyrug'i satri bayrog'ining orqasida yashiringan. Siz beqaror interfeyslar (unstable interfaces) uchun hujjatlarni ko'rishingiz mumkin. Bu yerda. Keyingi nashrlarda ushbu API-larning ba'zilari barqarorlashadi.

Global namespace-da siz boshqa obyektlarning barcha turlarini topishingiz mumkin (masalan, setTimeout() va fetch()). Bizlar ushubu interfeyslarni xuddi brauzernikiday bir xil qilib qoldirishga harakat qildik; Agarda biz tasodifiy muammolar topsak ularga tuzatishlar kiritamiz. Brauzer standartlari ushbu interfeyslarni aniqlaydi, biz emas. Biz tomonidan kiritilgan har qanday tuzatishlar interfeysdagi o'zgarishlar emas, balki xatoliklarni tuzatganimidir. Agar brauzer standart API bilan kelishmovchilik vujudga kelsa, bu kelishmovchilikni katta relizdan (release) oldin tuztilishi mumkin.

Shuningdek, Deno-da ko'plab Rust API-lar bor, ya'ni deno_core va rusty_v8 qutilari. Bu API-larning hech biri hali 1.0da emas. Biz ularni ustida takrorlashda davom etamiz.

Cheklovlar

Shuni tushunish muhimki, Deno Node-ning kodlaridan yaratilmagan - bu mutlaqo yangi koddandir. Deno bor-yo'g'i ikki yil davomida rivojlanib kegan, Node esa o'n yildan ko'proq vaqt davomida rivojlanib kelgan. Deno-ga bo'lgan qiziqishlarning sonini hisobga olgan holda, biz uni yanada rivojlanib va o'sishini kutmoqdamiz.

Ba'zi dasturlar uchun Deno bugungi kunda yaxshi tanlov bo'lishi mumkin, boshqalarga bunday bo'lmasligi ham mumkin. Bu talablarga bog'liq bo'ladi. Odamlar Deno-ni ishlatishga qaror qilishganda, biz bu cheklovlar haqida oshkor qilib, ular yaxshi tanlov qilishlariga yordam bermoqchimiz.

Bir-biriga to'g'ri kelishlik

Afsuski, ko'p foydalanuvchilar mavjud bo'lgan JavaScript vositalari (tools) bilan bir-biriga mos kelmasligidan asablari buzilishi mumkin. Umumiy qilib aytsak, Deno Node (NPM) paketlari bilan umuman mos kelmaydi. Bu yerda yangi mos keladigan qatlam qurilmoqda https://deno.land/std/node/ lekin u yakulangunicha hali bor.

Deno modul tizimini soddalashtirishga qattiq yondashgan bo'lsa ham, bari bir Deno va Node bir xil maqsadga ega bir-biriga o'xshash tizimlardir. Vaqt o'tishi bilan, biz Deno-dan ko'proq va yana ko'proq Node dasturlarini hech qanday ortiqcha narsalarsiz ishlashga qodir bo'lishini kutamiz.

HTTP Server ishlashi

Biz Deno-ning HTTP Server ishlanishini doimiy ravishda kuzatib boramiz. hello-world Deno HTTP Serveri, sekundiga 25 mingta so'rovni maksimal tezlik kechikishi bilan 1.3 millisekund vaqt sarflaydi. Taqqoslanadigan Node dasturi sekundiga 34 mingta so'rovni notekis maksimal tezlikki bilan 2 va 300 millisekund (oralig'ida) vaqt sarflaydi.

Deno-ning HTTP serveri TCP soketlarining ustida TypeScript-da amalga oshirilgan. Node-ning HTTP serveri C-da yozilgan va JavaScript-ga yuqori darajadagi bog'lanishlar (bindings) sifatida taqdim etilgan. Biz mahalliy HTTP server binding-larini Deno-ga qo'shishlikka qarshilik ko'rsatdik, chunki biz TCP soketini optimallashtirmoqchimiz, va umuman op interfeysni.

Deno bu to'g'ri asenkron server va sekundiga 25 mingta so'rovlar ko'p maqsadlar uchun yetarlidir (Agar shunday bo'lmasa, unda JavaScript eng yaxshi tanlov emas). Bundan tashqari, umumiy va'dalardan (promises) foydalanishlik sababli biz Deno-dan yaxshiroq tail latency namoyish etishligini kutmoqdamiz (yuqorida muhokama qilinganidek). Shuncha gaplardan so'ng, biz shunga ishonamizki tizimda ko'proq ishlanishini yaxshilash mumkin edi, va biz bunga kelajakdagi nashrlarimizda erishimizga umid qilamiz.

TSC Bottleneck

Deno-da Microsoft-ning TypeScript kompilysotini JavaScript-ning turlarini tekshirish va ishlab chiqarishini ko'rish uchun ichida ishlatadi. V8-ni JavaScriptga tahlil qilishga ketadigan vaqtni taqqoslasak, bu juda sekin. Loyihaning boshida biz "V8 Snapshots" bu yerda katta ahamiyatli yaxshilanishlarni taqdim etishini umid qilgandik. Snapshotlar albatta yordam bergan, ammo bari-bir qoniqarsiz sekin edi. Biz mavjud bo'lgan TypeScript kompilatorining ustidan takomillashtirishmiz mumkin deb o'ylaymiz, lekin bu bizga aniq-ki oxirida Rust-ga yozuvni tekshirishni (type checking) qo'shishimiz kerak. Bu juda katta ishdir shuning uchun bu yaqin orada bo'lmaydi, ammo u dasturchilar boshidan kechirgan tanqidiy yo'laridan samaradorlik oshirish taritibini olib uni ta'minlaydi. TSC Rust-ga yuborilishi kerak. Agar siz bu muammo bilan hamkorlik qilishga qiziqqan bo'lsangiz, iltimos biz bilan bog'laning.

Plaginlar / Kengaytmalar (Plugins / Extentions)

Bizda Deno runtime-ni custom ops bilan uzaytirish uchun yangi plagin tizimi mavjud. Biroq, ushbu interfeys hali ham ishlab chiqilmoqda va u barqaror emas deb belgilangan. Shu sababli, Deno tomondan tashqari ta'milangan mahalliy tizimlarga kirish, Deno-ga qiyinchilik tug'diradi.

Minnatdorchilik

Juda katta rahmat Ko'p hissa qo'shganlarga bular ushbu nashrni amalga oshirishga yordam berishdi. Ayniqsa: @kitsonk u tizimning ko'p qisimlarida qo'li tekkan, TypeScript compiler host-dayam ( nafaqat bu bilan cheklangan), deno_typescript, deno to'plami, deno o'rnatish, deno turlari, streamlarini amalga oshirishda. @kevinkassimo loyihning butun tarixidagi son-sanoqsiz xatolarni tuzatishda hissasini qo'shdi. Uning hisssalari orasida timer tizimi, TTY integratsiyasi, wasm support, Deno.makeTempFile, Deno.kill, Deno.hostname, Deno.realPath, std/node's require, window.queueMircotask, va REPL tarixi (history) kiradi. U shuningdek logotipni ham yaratgan. @kt3k uzluksiz qiyoslash tizimini joriy qildi ( deyarli har bir asosiy refaktorda muhim ro'l o'ynadi), signal handler-lari, API ruxsatnomalari, va juda ko'p muhim xatolarni tuzatishda. @nayeemrmn Deno-dan kelib chiqan ko'p nosozliklarni tuzatdi, eng asosiysi u sezilarli darajada stack trace-ni va error reporting-ni (xatolar haqida xabar berish) yaxshiladi, va API ga 1.0 ni barqarorligini ta'minlashga kuchli yordam berdi. @justjavac kichik narsalarga hissasini qo'shgan, lekin deno API-larini veb-standartlari bilan to'g'rilash uchun eng muhim xatolarini to'g'rladi va u yana VS Code deno pluginini yozgan. @zekth std-ga ko'plab modullarini qo'shishda hissasini qo'shdi, ular orasida std/encoding/csv, std/encoding/toml, std/http/cookies, shuningdek boshqa ko'plab xatolarni tuzatishda. @axetroy barcha chiroyli narsalarga tegishli bo'lganlarga hissasini qo'shdi, ko'pgina xatolarni tuzatishda, va VS Code plaginini saqlashda hissasini qo'shdi. @afinch7 plagin tizimini joriy etdi. @keroxp websocket serverini joriy etishda va ko'plab xatolarni tuzatishda hissasini qo'shdi. @cknight ko'plab hujjatlar va std/node polyfills-larni taqdim etib hissasini qo'shdi. @lucacasonato deyarli deno.land veb-saytini barchasini qurdi. @hashrock juda ko'pajoyin san'at asarlarini qildi, misol uchun doc.deno.land saytidagi yuklash sahifasi va shu sahifaning yuqoridagi yoqimli rasmni ham!

Tarjimon: Khodjakbarov Abdullo

So'nggi iltimos:

Bizning yordamchi dasturimizni Deno v1.0 hoodie olish yordamida qo'llab quvvatlashni o'ylab ko'ring:

deno 1.0 hoodieShu yerda buyurtma bering →