Dart: مقدمة لغة Dart — من النشأة إلى النظام البيئي

Dart — لغة وُلدت لتعدد المنصات، من Flutter إلى CLI، من الويب إلى الخادم، قاعدة كود واحدة تعمل في كل مكان.

1. ما ستتعلمه


2. قصة مطور حقيقي

(1) نقطة الألم: كابوس تجزئة تطوير المنصات المتعددة

Bob مطور متكامل المسؤول عن منتج SaaS لتحليل بيانات التجارة الإلكترونية. يحتاج إلى صيانة واجهة ويب (JavaScript) وتطبيقات جوالة (Kotlin + Swift) وخدمات خلفية (Go) وأدوات CLI (Python) في نفس الوقت. أربع لغات، أربع سلاسل أدوات، أربع قواعد كود — إصلاح خطأ واحد يتطلب تغييرات في أربعة أماكن. عندما طلب مدير المنتج "لوحة معلومات في الوقت الفعلي"، كان على Bob أن يوازن مرارًا وتكرارًا بين Flutter والتطوير الأصلي، مع ارتفاع تكاليف التواصل بين الفريق إلى 20 ساعة أسبوعيًا.

(2) حل Dart

يوفر Dart حزمة تقنية موحدة: لغة واحدة تغطي الواجهة الأمامية (Flutter Web) والجوال (Flutter Mobile) والخلفية (Dart shelf) و CLI (dart:io). أعاد Bob كتابة المشروع بالكامل بـ Dart، ولم تعد هناك حاجة لكتابة منطق الأعمال الأساسي إلا مرة واحدة.

DART
// كود Dart واحد - يعمل على Android و iOS والويب وسطح المكتب والخادم
import 'package:flutter/material.dart';
import 'package:shelf/shelf.dart';

class DataProcessor {
  // منطق الأعمال الأساسي - يتشاركه جميع المنصات
  Future<Report> generate(User user, DateRange range) async {
    final raw = await fetchRawData(user.id, range);
    return Report(clean(raw), analyze(raw));
  }
}

(3) النتيجة: 4 قواعد كود → 1 قاعدة كود، وقت الإصدار من 3 أيام إلى 4 ساعات

أعاد Bob كتابة المنتج بالكامل بـ Dart في 3 أسابيع. كانت النتيجة: 4 قواعد كود → 1 قاعدة كود (تقليل سطور الكود بنسبة 60%)، ووقت الإصدار من 3 أيام إلى 4 ساعات (تحسن 18 مرة)، وانخفاض تكاليف اتصال الفريق من 20 ساعة/أسبوع إلى ساعتين/أسبوع.

TEXT 📖 للعرض فقط
قبل Dart: 4 لغات، 4 قواعد كود، 3 أيام/إصدار، 20 ساعة/أسبوع للتواصل
بعد Dart:  1 لغة،  1 قاعدة كود، 4 ساعات/إصدار، 2 ساعة/أسبوع للتواصل
ROI: 18 مرة تحسن في سرعة الإصدار، 60% تقليل في الكود

3. خلفية Dart: من "استبدال JavaScript" إلى "ملك التطوير متعدد المنصات"

(1) النشأة (2011-2017): استبدال JavaScript الذي فشل

بدأت Google في تطوير Dart في عام 2011، بهدف أن تكون "لغة ويب منظمة تحل محل JavaScript". ومع ذلك، رفض مجتمع الويب التوحيد المقترح في عام 2014، ودخلت Dart في فترة برود. في عام 2017، حددت Google اتجاهًا جديدًا لـ Dart — التركيز على أجهزة Flutter للجوال، والتخلي عن استبدال JS.

الفترة الموقع الحدث الرئيسي
2011-2013 بديل JS إصدار 1.0، ترويج مواصفات ECMAScript
2014-2016 فترة برود رفض التوحيد، تحطم المعنويات
2017-2018 ولادة Flutter Flutter 1.0، إعادة تحديد الموقع
2018-2020 اختراق Flutter Flutter يحتل المرتبة الثانية في تطوير الجوال
2020-2022 ما بعد Flutter Dart 2.12 أمان القيم الفارغة، توسيع النظام البيئي للخادم
2023+ Dart 3 الركائز الثلاث الكبرى: أمان القيم الفارغة + مطابقة الأنماط + الأصناف المختومة

(2) نظام Dart 3: ثلاث ركائز كبرى

Dart 3 ليس "Dart 2.15 المُرقَّم"، بل إعادة تصميم كاملة. الركائز الثلاث:

العمود الأول: أمان سليم للقيم الفارغة (Sound Null Safety)

DART
// Dart 3 — لا يمكن أن يكون Null ضمنيًا، يجب التصريح به صراحةً
String name = 'Bob';           // ✅ نوع غير قابل للفراغ
String? nickname;             // ✅ نوع قابل للفراغ، يتطلب ?
// String name = null;        // ❌ خطأ في وقت الترجمة: لا يمكن تعيين null لغير قابل للفراغ

void greet(String? name) {
  print('Hello, ${name?.toUpperCase() ?? "stranger"}!');
  //                       ^؟ عامل أمان القيم الفارغة: name قد يكون null
  //                              ^? ?? توفير null
}

العمود الثاني: مطابقة الأنماط (Pattern Matching)

DART
// Dart 3 — مطابقة أنماط قوية + تفكيك الكائنات
String describe(Object obj) => switch (obj) {
  [int n] when n > 0  => 'positive integer $n',
  [int n]             => 'non-positive integer $n',
  [String s]          => 'string "$s"',
  [List l]            => 'list of ${l.length} items',
  _                  => 'unknown',
};

العمود الثالث: الأصناف المختومة (Sealed Classes)

DART
// Dart 3 — تعداد شامل مغلق لزمن الترجمة
sealed class Result<T> {}
class Success<T> extends Result<T> { final T value; Success(this.value); }
class Failure<T> extends Result<T> { final String error; Failure(this.error); }

String handle(Result<int> r) => switch (r) {
  Success(:final value) => 'Got $value',
  Failure(:final error) => 'Error: $error',
};
// المحول البرمجي يضمن: تم تغطية جميع الفروع الفرعية ✅

▶ مثال: نظام الرسم البياني للأنواع من Dart 2 إلى Dart 3

100%
graph LR
    A[Dart 2.x<br/>null يمكن أن تكون في أي مكان] -->|Dart 2.12<br/>Null Safety| B[يجب التصريح صراحةً بـ null]
    B -->|Dart 3.0<br/>الركيزة الأولى| C[تغطية كاملة لأنواع null]
    C -->|Dart 3.0<br/>الركيزة الثانية| D[مطابقة الأنماط]
    C -->|Dart 3.0<br/>الركيزة الثالثة| E[الأصناف المختومة + switch شامل]
    D --> F[Dart 3.4<br/>تعبيرات مُختومة + أنماط]
    E --> F
TEXT 📖 للعرض فقط
> **الإخراج:** هذا الرسم البياني يُظهر تطور نظام أنواع Dart من Dart 2.x (حيث يمكن أن يكون null في أي مكان) إلى Dart 2.12 (Null Safety) إلى Dart 3.0 (الركائز الثلاث الكبرى) وأخيراً Dart 3.4 (التعبيرات المُختومة).

4. Dart vs JavaScript / TypeScript / Kotlin: الاختلافات الجوهرية

(1) جدول المقارنة

البُعد Dart JavaScript TypeScript Kotlin
نظام الأنواع ثابت مع استنتاج ديناميكي ثابت تدريجي ثابت
وقت التشغيل Dart VM / V8 / AOT V8 / JIT نفس V8 JVM / Native
هدف واحد متعدد المنصات ✅ (Flutter) ❌ (KMP قيد التطوير)
معالجة null آمنة افتراضيًا ⚠️ null/undefined ⚠️ strictNullChecks اختياري ⚠️ اختياري
نموذج التزامن Future/Stream أصلي Promise/async نفس Promise Coroutine
نظام البناء pub npm/yarn npm/yarn Gradle
سرعة البدء ⚡ سريع ⚡ سريع ⚠️ بطيء (tsc) ⚠️ بطيء (Gradle)

(2) الكود يخبر القصة: نفس المهمة في 4 لغات

JAVASCRIPT
// JavaScript: متكرر، فحص null يدوي في كل مكان
async function processUser(user) {
  if (!user) return null;
  if (!user.name) return null;
  return user.name.toUpperCase();
}
TYPESCRIPT
// TypeScript: يحل مشاكل النوع، ولكن null لا يزال فخًا
async function processUser(user: User | null): Promise<string | null> {
  if (!user?.name) return null;
  return user.name.toUpperCase();
}
DART
// Dart: التحقق من null في وقت الترجمة، لا حاجة لفحص يدوي
Future<String?> processUser(User? user) async {
  return user?.name.toUpperCase();
  //      ^؟ المحول البرمجي يضمن: إذا كان user أو name null، النتيجة null
  //          ^ آمن — ?. عامل أمان القيم الفارغة + نوع الإرجاع String?
}
KOTLIN
// Kotlin: مشابه لـ Dart، ولكن النظام البيئي أصغر
suspend fun processUser(user: User?): String? {
  return user?.name?.uppercase()
}

الإخراج:

TEXT 📖 للعرض فقط
Dart و Kotlin كلاهما آمنان افتراضيًا، لكن نظام Dart البيئي (Flutter + pub.dev) أكثر اكتمالًا في المنصات المتعددة.
TypeScript يحل النوع ولكن null لا يزال يتطلب فحصًا يدويًا. JavaScript به أكبر مخاطرة.

5. مشهد النظام البيئي لـ Dart: من الأدوات إلى التطبيقات

(1) الخريطة البيئية

100%
graph TB
    DART[Dart SDK<br/>لغة + أدوات] --> FLUTTER[Flutter<br/>UI متعدد المنصات]
    DART --> SERVER[خادم Dart<br/>shelf / Aqueduct]
    DART --> CLI[أداة CLI<br/>dart:io]
    DART --> WEB[ويب Dart<br/>dart:html]
    FLUTTER --> ANDROID[Android]
    FLUTTER --> IOS[iOS]
    FLUTTER --> WEB2[الويب]
    FLUTTER --> DESKTOP[سطح المكتب<br/>Windows/macOS/Linux]
    SERVER --> BACKEND[خدمة خلفية API]
    CLI --> SCRIPT[نص معالجة البيانات]
    WEB --> WEBAPP[تطبيق ويب]
    DART --> PUB[pub.dev<br/>35,000+ حزمة]

(2) مشهد pub.dev (اعتبار 2024)

الفئة عدد الحزم الأكثر شيوعًا
طلب HTTP 200+ dio, http, chopper
إدارة الحالة 150+ provider, riverpod, bloc
التسلسل 80+ json_serializable, freezed
التخزين المحلي 100+ shared_preferences, hive, drift
التوجيه 50+ go_router, auto_route
الترجمة 40+ intl, easy_localization
أدوات الاختبار 100+ mockito, test, integration_test

▶ مثال: استعلام pub.dev

BASH
# تثبيت حزمة HTTP الأكثر شيوعًا
dart pub add dio

# عرض إحصائيات الحزمة
$ curl https://pub.dev/api/packages/dio
{
  "name": "dio",
  "version": "5.4.0",
  "downloads30Days": 1200000,
  "likes": 8500,
  "points": 180
}

الإخراج:

TEXT 📖 للعرض فقط
dio: 1.2 مليون تنزيل شهريًا — المعيار الواقعي لطلبات HTTP في Dart.

6. نظرة عامة على مشروع Bob DataPipeline

سيرافقك هذا المسار التعليمي من خلال بناء نظام خط أنابيب بيانات كامل، DataPipeline، خلال 24 درسًا:

100%
graph LR
    L1[01-08<br/>أساسيات اللغة] --> L2[09-12<br/>أنواع متقدمة]
    L2 --> L3[13-16<br/>ميزات Dart 3]
    L3 --> L4[17-18<br/>البرمجة المتقدمة]
    L4 --> L5[19-22<br/>النظام البيئي والأدوات]
    L5 --> L6[23-24<br/>مشروع كامل]
    L1 -.Bob DataPipeline.-> L6
المرحلة الدروس المحتوى الأساسي الإخراج
أساسيات اللغة 01-08 القواعد + المتغيرات + هياكل التحكم + الوظائف + الأصناف سكريبت CLI واحد
الأنواع المتقدمة 09-12 المجموعات + الأدوية العامة + التعدادات + أمان null أداة معالجة البيانات
ميزات Dart 3 13-16 Future/Stream + العزلات + الميزات الجديدة خدمة متزامنة
النظام البيئي والأدوات 17-22 حزم + اختبار + توليد الكود SDK كامل
المشروع 23-24 تصميم + تحسين + نشر خط أنابيب البيانات مشروع الإنتاج

▶ مثال: معاينة كود DataPipeline — ما ستبنيه في نهاية المسار

TEXT 📖 للعرض فقط
> **الإخراج:** شغّل في DartPad محلي أو باستخدام `dart run`. جميع الأمثلة في دورة Dart مبنية على Dart 3.x / Flutter 3.x، وقد تختلف النتائج قليلاً مع إصدار SDK.

: معاينة كود DataPipeline

DART
// معاينة DataPipeline - ما ستبنيه
void main() {
  // الخطوة 1: تحديد مصدر البيانات
  final source = ApiSource('https://api.example.com/orders');

  // الخطوة 2: إنشاء خط أنابيب
  final pipeline = DataPipeline(
    name: 'E-Commerce Analytics',
    maxRecords: 1200000,
  );

  // الخطوة 3: المعالجة والإخراج
  print(pipeline.summary);
  // الإخراج: E-Commerce Analytics: capacity 1200000 records
}

الإخراج: شغّل في DartPad محلي أو باستخدام dart run. جميع الأمثلة في دورة Dart مبنية على Dart 3.x / Flutter 3.x، وقد تختلف النتائج قليلاً مع إصدار SDK.

TEXT 📖 للعرض فقط
E-Commerce Analytics: capacity 1200000 records

7. ملخص نقاط المعرفة الأساسية لهذا الدرس

# المفهوم المستوى الأهمية
1 Dart = لغة من Google مصممة لتعدد المنصات مبتدئ ⭐⭐⭐⭐⭐
2 Dart 3 = ركائزه الثلاث: أمان القيم الفارغة / مطابقة الأنماط / الأصناف المختومة متوسط ⭐⭐⭐⭐⭐
3 نظام Dart البيئي Flutter + pub.dev + جانب الخادم + CLI متوسط ⭐⭐⭐⭐
4 أمان null: String غير قابل للفراغ، String? قابل للفراغ مبتدئ ⭐⭐⭐⭐⭐
5 مطابقة الأنماط والأصناف المختومة تجعل switch شاملاً في وقت الترجمة متوسط ⭐⭐⭐⭐
6 مقارنة Dart مع JS / TS / Kotlin تساعد في تحديد موعد اختياره متوسط ⭐⭐⭐

❓ أسئلة شائعة

س هل أحتاج إلى تعلّم Dart قبل Flutter؟
ج نعم. Dart هي أساس Flutter، وفهم نظام الأنواع والتزامن في Dart يجعلك أكثر فعالية بكثير عند كتابة Flutter. معظم الأخطاء في تطوير Flutter هي في الواقع سوء فهم لميزات Dart (الانتشار التفاعلي، التمييز بين أنواع Future).
س ما الفرق بين Dart و JavaScript بالضبط؟
ج ① نظام الأنواع: Dart ثابت + آمن افتراضيًا لـ null، JS ديناميكي + null/undefined فخ ② نموذج التزامن: كلاهما async/await، لكن Dart يحتوي على Zone لعزل الأخطاء ③ الترجمة: يدعم Dart AOT (تنفيذ أصلي) + JIT (تطوير)، JS يفسر V8 JIT فقط ④ مكتبات Dart منطقية جدًا بسبب نظام الأنواع (معظم أخطاء وقت التشغيل تصبح أخطاء وقت الترجمة).
س لماذا اختارت Google Dart لتطوير Flutter بدلاً من إعادة استخدام JavaScript؟
ج لأن أداء JavaScript JIT لا يمكنه تلبية متطلبات 60 إطارًا في الثانية لـ Flutter. اختارت Google Dart لأن AOT المجمّع مسبقًا يمكنه الوصول إلى أداء قريب من C الأصلي. والأهم من ذلك: نظام الأنواع القوي لـ Dart يجعل واجهة Flutter المُحددة بالأدوات (مثل StatelessWidget) أنظف بكثير.
س هل يمكن تشغيل Dart على JVM؟
ج لا. Dart ليس لديه JVM، بل لديه Dart VM المستقل. ولكن Dart يمكنه الترجمة إلى JavaScript (لتشغيل المتصفح) أو الكود الأصلي (للتشغيل على ARM/x86). بيئات التشغيل المدعومة: Dart VM + V8 (JS) + Native (AOT) + Flutter Web (CanvasKit).
س هل Dart 3 متوافق مع الإصدارات السابقة؟
ج Dart 3 ليس متوافقًا بنسبة 100%. ① يجب التصريح بـ null صراحةً (معظم الكود القديم يحتاج إلى هجرة) ② حذف معامل ? الاختياري، يجب استخدام القيمة الافتراضية ③ بناء الجملة القديم لتفكيك النوع as محذوف، استخدم تحويل النمط. الأداة dart fix يمكنها أتمتة معظم ترقيات البنية.
س متى يجب عدم اختيار Dart؟
ج ① التطبيقات ذات متطلبات الأداء المتطرفة (محركات الألعاب، معالجة الإشارات) — فكر في C++/Rust ② الفرق التي لديها بالفعل خبرة عميقة في JavaScript/TypeScript ولديها مكتبة كبيرة موجودة — تكلفة الهجرة قد لا تستحق ③ المشاريع قصيرة الأجل جدًا (مثل صفحة واحدة) — تكلفة تعلّم Dart لا تستحق.

📖 ملخص


📝 تمارين

  1. أساسي (الصعوبة ⭐): ثبّت Dart SDK (الإصدار 3.0+)، وأنشئ مشروع hello_dart باستخدام dart create، وعدّل bin/main.dart لإخراج "Hello, Dart 3!"، ثم شغّله باستخدام dart run. تلميح: راجع خطوات التثبيت في القسم 5.
  2. متوسط (الصعوبة ⭐⭐): في مشروع Bob DataPipeline، استخدم Dart 3's sealed class لتعريف DataResult<T> الذي يحتوي على ثلاث حالات: Success<T>(value) و Loading<T>(previous) و Error<T>(message). اكتب دالة handle تتعامل مع جميع الفروع الفرعية (المحول البرمجي يضمن عدم تفويت أي حالة). تلميح: راجع مثال النمط المختوم في القسم 3.
  3. تحدٍّ (الصعوبة ⭐⭐⭐): قارن الفروق بين Dart و JavaScript من جوانب: نظام الأنواع، نموذج التزامن، أداء وقت التشغيل، وتعدد المنصات. أنشئ جدول مقارنة (في مشروعك الخاص)، وقم بترميز نفس المهمة (مثل استدعاء API + معالجة null) في كلتا اللغتين، واختبر التحويلات البرمجية لـ TS + Dart عبر tsc --noEmit و dart analyze للتحقق من أن Dart يلتقط المزيد من أخطاء null في وقت الترجمة. تلميح: راجع مثال المقارنة في القسم 4.

← السابق: فهرس الدورة | التالي: تركيب بيئة التطوير والأدوات →

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%