C++: مقدمة في C++
إذا سألت عشرة مبرمجين "ما أصعب لغة برمجة؟"، سيقول خمسة على الأقل C++. لكن إذا سألت "ما اللغة التي تتمتع بأفضل أداء وأدق تحكم ويمكنها كتابة أنظمة منخفضة المستوى؟"، سيقول العشرة جميعًا C++. في هذا الدرس لن نكتب أي كود — دعونا نتعرف أولًا على C++: من هي، من أين جاءت، ماذا يمكنها أن تفعل، وهل تستحق التعلم.
1. ما هي C++؟
C++ هي لغة برمجة مُترجمة، ذات كتابة ساكنة، متعددة الأنماط. بعبارة بسيطة:
- مُترجمة — يجب ترجمة الكود إلى كود آلي قبل تشغيله (مثل الطبخ: حضّر المكونات أولًا، ثم اطبخ)
- ذات كتابة ساكنة — نوع كل متغير يُحدد وقت الترجمة (مثل تعبئة نموذج: لكل حقل نوع محدد)
- متعددة الأنماط — تدعم البرمجة الإجرائية والكائنية والعامة (مثل صندوق عدة: مفتاح ربط/مفك/مثقاب — يملكها جميعًا)
(1) علاقتها مع C
C++ هي "الترقية الفائقة" لـ C — في عام 1983، أضاف المبرمج الدنماركي Bjarne Stroustrup الأصناف إلى لغة C، مما مكّن C من القيام بالبرمجة الكائنية أيضًا.
2. لماذا تتعلم C++؟
| السبب | الشرح |
|---|---|
| سقف الأداء | C++ تُترجَم إلى كود آلي يعمل مباشرة على العتاد — لا آلة افتراضية، لا مترجم، لا جامع قمامة — فائق السرعة |
| تحكم فائق | كيف تُخصَّص الذاكرة، كيف تُستخدم ذواكر CPU المؤقتة، كيف تقفز المؤشرات — أنت المسؤول |
| فرص وظيفية واسعة | محركات الألعاب، التداول عالي التردد، الأنظمة المدمجة، القيادة الذاتية، أنظمة التشغيل — كلها مجال C++ |
| أساس متين | بعد تعلم C++، يصبح "المنطق الداخلي" للغات الأخرى (Java/Python/Go) شفافًا |
| قيمة طويلة الأمد | C++ موجودة منذ أكثر من 40 عامًا وما زالت تتطور (C++23 صدرت للتو) — لن تصبح قديمة |
▶ مثال 1: Hello World (صعوبة ⭐)
#include <iostream>
int main() {
std::cout << "Hello, C++ World!" << std::endl;
return 0;
}
الخرج:
Hello, C++ World!
نتيجة التشغيل:
Hello, C++ World!
#include <iostream>— تضمين مكتبة الإدخال/الإخراج (مثلimportفي Python)int main()— نقطة دخول البرنامج (مثلif __name__ == "__main__":في Python)std::cout << "..."— الإخراج على الشاشة (مثلprint()في Python)return 0;— إخبار نظام التشغيل "انتهى البرنامج بشكل طبيعي" (0 تعني نجاح)
▶ مثال 2: ما مدى سرعة C++؟ (صعوبة ⭐⭐)
#include <iostream>
#include <chrono>
int main() {
// Use chrono for high-precision timing
auto start = std::chrono::high_resolution_clock::now();
// Run 1 billion empty iterations
long count = 0;
for (long i = 0; i < 1'000'000'000; i++) {
count++;
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration<double>(end - start).count();
std::cout << "1 billion loops time: " << duration << " seconds" << std::endl;
return 0;
}
الخرج:
1 billion loops time: 0.5 seconds
chrono المستخدمة هنا أُدخلت في C++11 وتوفر دقة على مستوى النانوثانية. لا تحتاج لفهمها بعد — فقط تعوّد على أسلوب C++: #include لاستيراد المكتبات، int main() كنقطة دخول، std::cout للإخراج، وusing namespace std; لتجنب كتابة std:: في كل مرة.
3. C++ مقابل C مقابل Python
| البُعد | C | C++ | Python |
|---|---|---|---|
| النوع | مُترجمة | مُترجمة | مُفسَّرة |
| النمط | إجرائية | متعددة الأنماط (إجرائية+كائنية+عامة) | متعددة الأنماط (كائنية+وظيفية) |
| إدارة الذاكرة | يدوية (malloc/free) | يدوية+مؤشرات ذكية (new/delete/unique_ptr) | تلقائية (جمع القمامة) |
| الأداء | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| صعوبة التعلم | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
| التطبيقات النموذجية | أنوية أنظمة التشغيل، التعريفات | محركات الألعاب، التداول عالي التردد، محركات المتصفحات | تحليل البيانات، الذكاء الاصطناعي، خلفيات الويب |
| حجم الكود | كبير | كبير | صغير |
| وداءة الأخطاء | ضعيفة (خطأ تقسيم؟ خمّن بنفسك) | متوسطة (أخطاء الترجمة صارمة) | جيدة (رسائل خطأ واضحة) |
(1) تشبيه من الحياة الواقعية
- C — سيارة سباق بناقل حركة يدوي: سريعة، لكن يجب عليك إدارة القابض وتبديل التروس والتحكم بسرعة الدوران بنفسك — المبتدئون يتوقفون بسهولة (خطأ تقسيم)
- C++ — سيارة سباق بناقل حركة يدوي + GPS + مستشعرات احتياطية: لا تزال سريعة، لكن مع الكثير من الميزات المساعدة (أصناف/قوالب/مؤشرات ذكية) — إذا استُخدمت جيدًا، فهي أكثر أمانًا من C
- Python — سيارة كهربائية ذاتية القيادة: مريحة، كتابة الكود مثل الحديث، لكن عندما تريد "السباق" فلن تتمكن من مجاراة السرعة
4. تطور معايير C++
مرت C++ بتحديثات معايير متعددة منذ نشأتها. كل تحديث يضيف مجموعة من الميزات الجديدة، مما يجعل C++ أقوى وأسهل بشكل متزايد.
| العام | المعيار | الاسم المستعار | الميزات الجديدة الرئيسية |
|---|---|---|---|
| 1998 | C++98 | أول معيار دولي | القوالب، الاستثناءات، RTTI |
| 2003 | C++03 | ترقيع بسيط | إصلاح أخطاء |
| 2011 | C++11 | C++0x | تحديث كبير: auto، حلقة for المدى، nullptr، Lambda، shared_ptr، thread، قوائم التهيئة |
| 2014 | C++14 | — | تحسينات بسيطة (make_unique، Lambda عام) |
| 2017 | C++17 | — | روابط مهيكلة، if constexpr، تعبيرات الطي، string_view، مكتبة نظام الملفات |
| 2020 | C++20 | — | الوحدات، الكوروتينات، المفاهيم، المدى |
| 2023 | C++23 | — | std::print، flat_map، تعزيز الوحدات |
(1) أي معيار يستخدمه هذا الدرس؟
C++17 — تحقيق التوازن بين "الميزات الجديدة مفيدة" و"دعم المترجم مستقر".
- C++11 هي خط الأساس "الواجب تعلمه" (نقطة بداية C++ الحديثة)
- C++17 هي النقطة المثالية "الموصى بها" (معظم الميزات الجديدة مستقرة)
- C++20 رائعة، لكن بعض الميزات لا يدعمها MinGW بالكامل، لذا سنذكرها باختصار فقط
auto الذي تتعلمه من C++11، وstd::string_view من C++17. إذا سألك مقابِل "ما الميزات الجديدة في C++11؟"، فهذا سؤال متكرر.
5. ماذا يمكن أن تفعل C++؟
يمكن تلخيص مجالات تطبيق C++ في جملة واحدة: "الأماكن التي تتطلب أداءً فائقًا، وتحتاج تحكمًا دقيقًا بالعتاد، ولا تحتمل الأخطاء."
(1) السيناريو 1: تطوير الألعاب (الأكثر شهرة)
- محركات الألعاب: Unreal Engine مكتوب بـ C++
- منطق اللعبة: العديد من ألعاب AAA لديها المنطق الأساسي بـ C++ (عرض الرسوم/محركات الفيزياء/مسار الذكاء الاصطناعي)
- لماذا C++؟: يجب أن تعرض الألعاب 60 إطارًا في الثانية، ويجب حساب كل إطار خلال 16 مللي ثانية — Python لا تستطيع ذلك
(2) السيناريو 2: التداول عالي التردد (الأكثر ربحية)
- أنظمة التداول الكمي: أنظمة HFT في وول ستريت/لندن تتطلب زمن استجابة على مستوى الميكروثانية
- لماذا C++؟: Python تحتاج ميكروثواني فقط لبدء استدعاء دالة؛ C++ يمكن أن تكون دقيقة على مستوى النانوثانية
(3) السيناريو 3: الأنظمة المدمجة وإنترنت الأشياء (الأكثر انتشارًا)
- برامج المتحكمات الدقيقة: الغسالات، أفران الميكروويف، الساعات الذكية — كلها C/C++
- إلكترونيات السيارات: نظام السيارة في تسلا يحتوي على الكثير من كود C++
- لماذا C++؟: الأجهزة المدمجة لديها ذاكرة محدودة (بضعة كيلوبايت إلى بضعة ميجابايت) — فقط C++ تستطيع التحكم بالذاكرة بدقة
(4) السيناريو 4: محركات المتصفحات وقواعد البيانات (الأكثر أساسية)
- محركات المتصفحات: محرك V8 في Chrome (الذي يشغل JavaScript)، محرك Blink في Edge — كلها C++
- قواعد البيانات: MySQL، PostgreSQL، محركات MongoDB الأساسية — كلها C/C++
- لماذا C++؟: هذه الأنظمة الأساسية تتعامل مع مليارات الطلبات يوميًا — حتى انخفاض بسيط في الأداء يسبب بطءًا عالميًا
(5) السيناريو 5: أنظمة التشغيل والتعريفات (الأدنى مستوى)
- أنظمة التشغيل: نواة Windows (جزئيًا)، نواة Linux (جزئيًا)، نواة macOS (جزئيًا) — كلها C/C++
- لماذا C++؟: أنظمة التشغيل يجب أن تتفاعل مباشرة مع العتاد — فقط C/C++ يمكنها التعامل المباشر مع الذاكرة وسجلات العتاد
6. سيناريوهات التطبيق الشائعة
- خوادم عالية الأداء: المراسلة الفورية (خلفية WeChat)، البث المباشر — C++ تتعامل مع طبقة الشبكة، دعم ملايين الاتصالات المتزامنة
- معالجة الرسوم والصور: الخوارزميات الأساسية لـ Photoshop، OpenCV (مكتبة الرؤية الحاسوبية) — كلها C++
- البلوكتشين: عقد Bitcoin وEthereum الأساسية — C++ تضمن الأداء والأمان
- الحوسبة العلمية: المحاكاة العددية واسعة النطاق (التنبؤ بالطقس/محاكاة الفيزياء النووية) — عمليات المصفوفات في C++ يمكن أن تستغل CPU بالكامل
▶ مثال 3: تفاعل بسيط مع المستخدم (صعوبة ⭐)
#include <iostream>
#include <string>
int main() {
std::string name;
int age;
std::cout << "Please enter your name: ";
std::cin >> name;
std::cout << "Please enter your age: ";
std::cin >> age;
std::cout << "Hello," << name << "!Next year you " << (age + 1) << " years old。" << std::endl;
return 0;
}
الخرج:
Please enter your name:
Please enter your age:
Hello, ! Next year you years old。
نتيجة التشغيل:
Please enter your name: Xiao Ming
Please enter your age: 18
Hello,Xiao Ming!Next year you 19 years old。
std::cin يقرأ إدخال المستخدم من لوحة المفاتيح، std::cout يُخرج على الشاشة. std::string هو نوع السلاسل النصية في C++، والذي يتطلب #include <string>.
❓ أسئلة شائعة
new/delete بنفسك — انسَ وتحصل على تسرب ذاكرة. لكن Java لديها عبء أداء الآلة الافتراضية، لذا محركات الألعاب/التداول عالي التردد لا تزال تستخدم C++.std::string).vector/map)، خوارزميات (sort/find)، مكررات. تعلم STL يرفع الكفاءة 10 أضعاف؛ المرحلة 6 ستغطيها بعمق.📖 ملخص
- C++ هي ترقية لـ C، تدعم البرمجة الكائنية، بأداء من الدرجة الأولى
- أسباب جوهرية لتعلم C++: أداء فائق، تحكم دقيق، فرص وظيفية واسعة، أساس متين
- C++ مقابل Python: الأولى مُترجمة/سريعة/صعبة، والثانية مُفسَّرة/بطيئة/سهلة — سيناريوهات مختلفة، لكل مميزاتها
- معايير C++ تتطور باستمرار: C++11 (نقطة بداية C++ الحديثة)، C++17 (مستخدمة في هذا الدرس)، C++20 (رائعة لكن الدعم غير مكتمل)
- مجالات تطبيق C++: محركات الألعاب، التداول عالي التردد، الأنظمة المدمجة، محركات المتصفحات، أنظمة التشغيل — كلها مجالات تتطلب "أداءً فائقًا"
- STL (مكتبة القوالب القياسية) هي الميزة القاتلة في C++، ستُغطى بعمق في المرحلة 6
📝 تمارين
-
أساسي (صعوبة ⭐): ابحث عن "برمجيات/ألعاب/أنظمة مشهورة مكتوبة بـ C++" واذكر 5 على الأقل لتقدير اتساع تطبيقات C++.
-
متوسط (صعوبة ⭐⭐): هل لديك مترجم C++ مثبت على حاسوبك؟ افتح طرفية/سطر أوامر واكتب
g++ --versionأوclang++ --versionلترى إن كان هناك خرج. إن لم يكن، سجّل إصدار نظام التشغيل (Windows 10/11؟ macOS؟ أي توزيعة Linux؟) — الدرس القادم سيعلّمك كيفية تثبيت واحد. -
تحدي (صعوبة ⭐⭐⭐): لدى C++ مقولة شهرة — "تعلم صياغة C++ فقط دون تعلم أساسيات الحاسوب غير مجدي عمليًا." ابحث واقرأ مقالًا عن "ما أساسيات الحاسوب التي تحتاجها لتعلم C++" (جرّب البحث عن "هل تحتاج تعلم بنية الحاسوب قبل C++")، واكتب تأملًا بـ 200 كلمة أو أقل: هل تعتقد أنك بحاجة لتعلم C قبل C++؟ لماذا؟