لمعانٍ أخرى، طالع دينو (توضيح).

**دينو** هو منفذ لـ JavaScript وTypeScript في وقت تشغيل مبني على محرك V8 JavaScript ولغة البرمجة Rust. تم إنشاؤه بواسطة Ryan Dahl ، المصمم الأصلي لـ Node.js ، ويركز على الأمان والإنتاجية. تم الإعلان عنه من قبل داهل في عام 2018 خلال حديث له بعنوان «10 أشياء مؤسفة حول Node.js». يقوم «دينو (البرمجية)» بالتنفيذ في وقت التشغيل وكذلك إدارة الحزم ضمن ملف تنفيذي واحد، بدلاً من طلب ذلك من برنامج منفصل لإدارة الحزم أي يستغني على npm.

نظرة تاريخية
------------

تم الإعلان عن Deno في JSConf EU 2018 من قبل Ryan Dahl في حديثه حول «10 أشياء مؤسفة عن Node.js».، وذكر ريان عن أسفه لقرارات التصميم الأولية لـNode.js ، مع التركيز على اختياراته بعدم استخدام الـ Promises في تصميم واجهة برمجة التطبيقات، واستخدام نظام بناء GYP القديم، و node\_modules و package.json ، وترك ملحقات الملفات، وmagical module باستخدام index.js وكسر بيئة الحماية (sandboxed) من V8.

وقدم Ryan Dahl في النهاية النموذج الأولي لـ Deno ، تهدف إلى ربط النظام من خلال تمرير الرسائل باستخدام أدوات مثل Buffers Protocol ، وتوفير أوامر الطرفية (موجه الأوامر) للتحكم في الوصول.

نظرة عامة حول دينو
------------------

تهدف دينو إلى أن تكون بيئة نصية منتجة وآمنة للمبرمج الحديث. على غرار نود.جي إس، دينو نؤكد على التحريك بالحدث event-driven architecture- ، وتوفير IO الأساسية من <a href="https://en.wikipedia.org/wiki/Non-blocking\_I/O" rel="mw:ExtLink" title="Non-blocking I/O" class="mw-redirect cx-link" data-linkid="97">non-blocking</a> ، جنبا إلى جنب مع الإصدارات المحجوبة (blocking. يمكن استخدام Deno لإنشاء خوادم الويب وإجراء الحسابات العلمية وما إلى ذلك.

### مقارنة مع Node.js

كل من دينو ونود.جي أس يعملان في وقت التشغيل مبني على محرك جافا سكريبت V8 المصمم من جوجل، وهو نفس المحرك المستخدم في جوجل كروم.

كلاهما لديه حلقات الحدث ويوفر واجهات سطر الأوامر CLI لتشغيل البرامج النصية ومجموعة واسعة من أدوات النظام المساعدة.

يختلف Deno بشكل أساسي مع Node.js في الجوانب التالية:

1. يستخدم (Module ES) كنظام الوحدة النمطية الافتراضي، بدلاً من CommonJS .
2. يستخدم عناوين URL لتحميل التبعيات (المكتبات) المحلية أو البعيدة، كما هو الحال في المتصفحات.
3. يتضمن مدير حزم مدمجًا لجلب الموارد، وبالتالي لا حاجة لـ Npm .
4. يدعم TypeScript، باستخدام مترجم TypeScript مع آليات التخزين المؤقت.
5. تهدف إلى توافق أفضل مع المتصفحات مع مجموعة واسعة من ال Web API.
6. يسمح بالتحكم في نظام الملفات والوصول إلى الشبكة من أجل تشغيل البرنامج في وضع الحماية.
7. إعادة تصميم واجهة التطبيقات البرمجية الـAPI لاستخدام ميزات Promises و ES6 و TypeScript.
8. يقلل حجم واجهة برمجة التطبيقات الأساسي، مع توفير مكتبة قياسية كبيرة بدون تبعيات (مكتبات) خارجية.
9. استخدام قنوات تمرير الرسائل لاستدعاء واجهات برمجة تطبيقات النظام المتميزة واستخدام عمليات الربط.

أمثلة
-----

فيما يلي برنامج نصي Deno أساسي دون أي أذونات للقراءة / الكتابة / الشبكة (في وضع الحماية): 

```
deno run main.ts

```
 الأوامر الصريحة المطلوبة لطلب الأذونات: 

```
deno run --allow-read --allow-net main.ts

```
 لفحص شجرة التبعيات للبرنامج، استخدم الأمر الفرعي `info` : 

```
deno info main.ts

```
 يشبه برنامج hello-world الأساسي في Deno ما يلي (كما هو الحال في Node.js): 

```
console.log("مرحبا يا عالم");

```
 يوفر Deno مساحة الاسم (namespace) لمعظم واجهات برمجة التطبيقات الخاصة بـ Deno والتي لا تتوفر في المتصفح. يمكن تنفيذ برنامج Unix cat على النحو التالي: 

```
/\* cat.ts \*/

/\* Deno APIs are exposed through the `Deno` namespace. \*/
const { stdout, open, copy, args } = Deno;

// Top-level await is supported
for (let i = 0; i < args.length; i++) {
 const filename = args[i]؛ // Obtains command-line arguments.
 const file = await open(filename); // Opens the corresponding file for reading.
 await copy(stdout, file); // Performs a zero-copy asynchronous copy from `file` to `stdout`.
}

```
 تعمل وظيفة `Deno.copy` المذكورة أعلاه بنفس الطريقة التي تعمل بها Go's `Copy.io` ، حيث `stdout` (الإخراج القياسي) هو وجهة `Writer` و `file` هو مصدر للـ `Reader` .

لتشغيل هذا البرنامج، نحتاج إلى توفير إذن القراءة من نظام الملفات: 

```
deno run --allow-read cat.ts myfile

```
 يقوم نص Deno التالي بتنفيذ برنامج خادم HTTP أساسي: 

```
// Imports `serve` from the remote Deno standard library, using URL.
import { serve } from "https://deno.land/std@v0.21.0/http/server.ts";

// `serve` function returns an asynchronous iterator, yielding a stream of requests
for await (const req of serve({ port: 8000 })) {
 req.respond({ body: "Hello World\n" });
}

```
 عند تشغيل هذا البرنامج، يقوم **دينو** تلقائيًا بتنزيل ملفات المكتبات القياسية البعيدة (في خوادم خارجية) وتخزينها مؤقتًا وتحويلها.

وبالمثل، يمكننا تشغيل برنامج نصي قياسي لمكتبة (مثل خادم ملفات (HTTP server)) مباشرة بدون تنزيل مباشر.

لتنفيذ البرنامج بجميع الأذونات أضف الأمر الفرعي `-A` مثل المثال التالي: 

```
$ deno run -A https://deno.land/std/http/file_server.ts
Download https://deno.land/std/http/file\_server.ts
Compile https://deno.land/std/http/file\_server.ts
...
HTTP server listening on http://0.0.0.0:4500/

```

المراجع
-------

1. ↑  وصلة مرجع:. الوصول: 25 أغسطس 2019.
2. ↑  "Contributors, denoland/deno, Github". مؤرشف من الأصل في 2019-05-30. اطلع عليه بتاريخ 2019-07-05.
3. ↑  "Release 1.39.0". 13 ديسمبر 2023. اطلع عليه بتاريخ 2023-12-19.
4. ↑  "deno/LICENSE at master". *GitHub*. مؤرشف من الأصل في 2019-05-29. اطلع عليه بتاريخ 2019-07-05.
5. ↑  "The MIT License". *Open Source Initiative*. 17 سبتمبر 2018. مؤرشف من الأصل في 2020-05-09. اطلع عليه بتاريخ 2018-09-17.
6. ↑  "Deno: Secure V8 TypeScript Runtime from Original Node.js Creator". *InfoQ*. مؤرشف من الأصل في 2020-01-08. اطلع عليه بتاريخ 2019-05-17.
7. 1 2  JSConf (6 يونيو 2018)، *10 Things I Regret About Node.js - Ryan Dahl - JSConf EU 2018*، مؤرشف من الأصل في 2020-04-25، اطلع عليه بتاريخ 2019-05-17
8. 1 2 3  "Deno Manual". *deno.land*. مؤرشف من الأصل في 2020-04-15. اطلع عليه بتاريخ 2019-05-17.
9. ↑  Paul Krill (21 يونيو 2018). "Ryan Dahl's Node.js regrets lead to Deno". InfoWorld. مؤرشف من الأصل في 2020-04-25.
10. ↑  Dahl، Ryan (6 يونيو 2018). "Design mistakes in Node" (PDF). *Github*. مؤرشف من الأصل (PDF) في 2020-02-22.

روابط خارجية
------------

* دينو على موقع Open Hub (الإنجليزية)
* الموقع الرسمي

* أيقونة بوابةبوابة برمجة الحاسوب
* أيقونة بوابةبوابة برمجيات حرة

|  |
| --- |
| **دينو** في المشاريع الشقيقة: |
|  | 
* صور وملفات صوتية من كومنز.
 |