شرح مادة CPCS 301 لغات البرمجة - جامعة الملك عبدالعزيز

فريق زدني فريق زدني 18 مارس 2026
9 دقائق للقراءة
شرح مادة CPCS 301 لغات البرمجة - جامعة الملك عبدالعزيز

مادة CPCS 301، لغات البرمجة (Programming Languages). هي المادة اللي تكسر كل افتراضاتك عن البرمجة. لو قضيت سنتين وأنت تفكر “البرمجة = جافا أو بايثون”، هذه المادة تفتح لك باب تكتشف فيه إن طرق التفكير في حل المشاكل أوسع بكثير مما تتخيل. في خطة قسم علوم الحاسب بجامعة الملك عبدالعزيز، CPCS 301 هي مادة السنة الثالثة اللي تفرّق بين من يكتب كود فقط ومن يفهم لماذا تُصمَّم اللغات بهذه الطريقة.

المادة تجيب على أسئلة ما كنت تفكر فيها من قبل: ليش جافا مختلفة عن بايثون؟ ليش Haskell لا تسمح لك تغيّر قيمة متغيّر؟ كيف Prolog تحل المشاكل بدون ما تقول لها “كيف” تحلها؟ ما الفرق بين نوع ثابت ونوع ديناميكي؟ كل هذي الأسئلة لها إجابات في CPCS 301.

📋 ملخص سريع

  • رمز المادة: CPCS 301، لغات البرمجة (Programming Languages)
  • الساعات المعتمدة: 3 ساعات نظري
  • المتطلبات السابقة: CPCS 204 (هياكل البيانات 1) + CPCS 222 (رياضيات منفصلة)
  • السنة الدراسية: السنة الثالثة
  • المواضيع الرئيسية: نماذج البرمجة، بناء الجملة والدلالة، أنظمة الأنواع، النطاق والربط، إدارة الذاكرة، البرمجة الوظيفية، البرمجة المنطقية، مفاهيم التزامن
  • اللغات المستخدمة للتطبيق: مفاهيم Haskell / Scheme (وظيفي)، Prolog (منطقي)، مقارنات مع جافا
  • يقود إلى: مواد مثل مترجمات اللغات، الذكاء الاصطناعي، تصميم الأنظمة

ليش مادة CPCS 301 صعبة على كثير من الطلاب؟

بصراحة، الصعوبة مو في كمية الحفظ. الصعوبة إن المادة تطلب منك تغيّر طريقة تفكيرك بالكامل.

في جافا تعلّمت تكتب خطوات واضحة: “احسب هذا، خزّن هناك، ادور على هذه القائمة”. هذا ما يسمى النموذج الأمري (Imperative). الكود يخبر الحاسب كيف يحل المشكلة خطوة بخطوة.

الآن CPCS 301 يأتيك ويقول: “ماذا لو أخبرت الحاسب ماذا تريد بدل كيف تحصل عليه؟” هذا ما يفعله النموذج الوظيفي والمنطقي. الفكرة صح مذهلة، لكنها تحتاج وقت عشان تستوعبها.

  • نموذج جديد = طريقة تفكير جديدة: مو مجرد لغة جديدة فيها syntax مختلف
  • البرمجة الوظيفية تحظر التغيير: لا متغيرات تتغيّر، لا حلقات تقليدية، كل شيء بالدوال
  • Prolog تعمل عكس ما تتوقع: أنت تعطيها الحقائق والقواعد، هي تكتشف الإجابة
  • المادة نظرية بامتياز: مو مجرد “اكتب كود يشتغل”، لازم تفهم المفاهيم بعمق

ℹ️ قراءات مسبقة مفيدة

قبل ما تبدأ الفصل، راجع مادة CPCS 203 البرمجة كائنية التوجه عشان تكون واضح على نموذج OOP كنموذج مقارنة. كذلك راجع أساسيات الدوال الرياضية لأن البرمجة الوظيفية مبنية عليها.

نظرة عامة على مادة CPCS 301، توزيع الأسابيع

الأسابيعالموضوعالمفاهيم الرئيسية
1-2مقدمة في لغات البرمجةتاريخ اللغات، معايير تصميم اللغات، أجيال اللغات
3-4بناء الجملة والدلالة (Syntax & Semantics)BNF، Parse Trees، الدلالة التشغيلية
5-6أنظمة الأنواع (Type Systems)Static vs Dynamic، Strong vs Weak، Type Inference
7-8النطاق والربط (Scope & Binding)Static Scope، Dynamic Scope، Closures
9إدارة الذاكرة (Memory Management)Stack، Heap، Garbage Collection، Manual Memory
10-11البرمجة الوظيفية (Functional Programming)Haskell/Scheme، Pure Functions، Higher-order Functions
12مزيد من البرمجة الوظيفيةRecursion، Map/Filter/Fold، Lazy Evaluation
13-14البرمجة المنطقية (Logic Programming)Prolog، Facts، Rules، Unification، Backtracking
15مفاهيم التزامن + مراجعةThreads، Race Conditions، Synchronization

1. نماذج البرمجة، Paradigms

هذا أهم مفهوم في المادة وكل شيء ثاني يبنى عليه.

نموذج البرمجة هو الفلسفة اللي تحكم كيف تنظّم برنامجك وتفكّر في حل المشكلة. ما في نموذج “أحسن” من الثاني بشكل مطلق. كل واحد مناسب لنوع معيّن من المشاكل.

مقارنة نماذج البرمجة الأربعة الرئيسية

النموذجالفكرة الأساسيةأمثلة لغاتنقطة القوة
الأمري (Imperative)خطوات واضحة: افعل هذا ثم هذاPascalالتحكم الكامل في الذاكرة والتنفيذ
كائني التوجه (OOP)بيانات + سلوك في كائناتJava، C++، Pythonتنظيم كود المشاريع الكبيرة
الوظيفي (Functional)دوال رياضية خالصة بدون حالةHaskell، Erlang، Schemeالتوازي وسهولة الاختبار
المنطقي (Logic)حقائق وقواعد، الحاسب يستنتجPrologالمسائل المنطقية والبحث

معظم لغات اليوم تدعم أكثر من نموذج. بايثون مثلا تدعم الأمري وOOP والوظيفي في نفس الوقت. لكن في CPCS 301 تدرس كل نموذج بشكل منفصل عشان تفهم الفرق الحقيقي.

💡 كيف تجيب الامتحان؟

في أسئلة مقارنة النماذج، ركّز على ثلاثة محاور: كيف يخزّن البيانات (متغيرات قابلة للتغيير مقابل غير قابلة)، كيف يكرّر (حلقات مقابل تكرار ذاتي)، وكيف يتعامل مع الحالة (stateful مقابل stateless). هذي الثلاثة تكفيك للإجابة على أي سؤال مقارنة.

2. بناء الجملة والدلالة، Syntax vs Semantics

فهم الفرق بين هذين المفهومين ضروري.

Syntax = القواعد النحوية للغة. ما هي الجمل الصحيحة تركيبيا؟ Semantics = معنى الجمل الصحيحة تركيبيا. ماذا تعني وقت التنفيذ؟

مثال: الجملة التالية في جافا صحيحة syntax لكن لها معنى مختلف عن ما يتوقع المبتدئ:

// صحيحة syntax، لكن semantics مختلفة عن المتوقع
int x = 5;
int y = x++;   // y = 5، x = 6  (لا y = 6 كما يتوقع كثيرون)
int z = ++x;   // z = 7، x = 7

BNF، Backus-Naur Form

BNF هي طريقة رسمية لوصف قواعد syntax أي لغة. مثلا قواعد تعبير حسابي بسيط:

<expr>   ::= <expr> "+" <term> | <expr> "-" <term> | <term>
<term>   ::= <term> "*" <factor> | <term> "/" <factor> | <factor>
<factor> ::= "(" <expr> ")" | <number>
<number> ::= [0-9]+

هذه القواعد تقول: التعبير إما مجموع حدود أو حد واحد، والحد إما ضرب عوامل أو عامل واحد، إلخ.

Parse Trees

لما المترجم يقرأ 3 + 5 * 2، يبني شجرة تحليل تحدد الأولوية:

      +
     / \
    3   *
       / \
      5   2

المُفسّر يحسب الأعمق أولا: 5 * 2 = 10، ثم 3 + 10 = 13. الشجرة هي ما يضمن إن * له أولوية على +.

3. أنظمة الأنواع، Type Systems

نظام الأنواع هو أحد أهم قرارات تصميم اللغة ويؤثر على كيفية كتابتك للكود وأنواع الأخطاء اللي تواجهها.

Static vs Dynamic Typing

النوع الثابت (Static): يتحقق من الأنواع وقت الترجمة. الأخطاء تظهر قبل تشغيل البرنامج.

// جافا - Static Typing
int x = 5;
x = "hello";  // خطأ في الترجمة، قبل التشغيل

النوع الديناميكي (Dynamic): يتحقق من الأنواع وقت التشغيل. مرونة أكبر لكن الأخطاء تظهر متأخرة.

# بايثون - Dynamic Typing
x = 5
x = "hello"  # لا مشكلة، نفس المتغير يقبل أي نوع
x = x + 1    # خطأ هنا فقط وقت التشغيل

Strong vs Weak Typing

النوع القوي (Strong): لا تحويلات ضمنية بين أنواع غير متوافقة. النوع الضعيف (Weak): يحوّل بين الأنواع تلقائيا، أحيانا بنتائج مفاجئة.

// جافاسكريبت - Weak Typing
console.log(1 + "2");   // "12" (حوّل الرقم لنص!)
console.log(1 - "2");   // -1  (حوّل النص لرقم!)
console.log([] + []);   // ""  (ماذا؟!)

Type Inference

بعض اللغات الثابتة النوع تقدر تستنتج النوع بدون إعلان صريح:

-- Haskell يستنتج إن x من نوع Integer
x = 42
-- Haskell يستنتج إن هذه الدالة تأخذ رقمين وترجع رقم
add a b = a + b

⚠️ سؤال مهم في الامتحانات

كثير من أسئلة الاختبار تطلب تصنيف لغة: هل هي statically أو dynamically typed، وهل هي strongly أو weakly typed؟ C مثلا statically typed لكن weakly typed (تقبل implicit casting)، بينما Python dynamically typed لكن strongly typed (ما تقبل 1 + “2” بدون خطأ). هذا التمييز مهم.

4. النطاق والربط، Scope and Binding

Binding يعني ربط اسم بقيمة أو موقع ذاكرة. يصير في أوقات مختلفة:

  • Static Binding (Early): وقت الترجمة. أسرع، لكن أقل مرونة.
  • Dynamic Binding (Late): وقت التشغيل. أبطأ قليلا، لكن أكثر مرونة. هذا ما يجعل Polymorphism يشتغل في جافا.

Scope يعني أين في البرنامج يكون اسم معين مرئيا ويمكن استخدامه.

Static Scope مقابل Dynamic Scope

النطاق الثابت (Static/Lexical Scope): النطاق يُحدَّد حسب مكان الكود في الملف. معظم اللغات الحديثة تستخدم هذا.

// جافا - Static Scope
int x = 10;

void outer() {
    int x = 20;  // يخفي x الخارجية
    inner();     // inner ترى x = 20 لأنها داخل outer
}

void inner() {
    System.out.println(x);  // ترى x الخارجية = 10
    // لأنها معرّفة خارج outer
}

النطاق الديناميكي (Dynamic Scope): النطاق يُحدَّد حسب سلسلة الاستدعاءات وقت التشغيل. يستخدمه Emacs Lisp القديم وبعض إصدارات Perl.

Closures

الـ Closure هو دالة تحمل معها النطاق الذي عُرِّفت فيه. هذا مفهوم مهم في البرمجة الوظيفية والجافاسكريبت:

# بايثون - Closure
def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

counter = make_counter()
print(counter())  # 1
print(counter())  # 2
print(counter())  # 3
# counter "تتذكر" count حتى بعد انتهاء make_counter

أسئلة أنظمة الأنواع والـ Scope محيّرتك؟

أسئلة Static vs Dynamic Typing والـ Closures من أصعب أجزاء CPCS 301. أرسل لنا السؤال ونوضح لك المفهوم بأمثلة عملية

اطلب شرح مخصص

5. إدارة الذاكرة، Memory Management

كيف تُخصَّص الذاكرة وتُحرَّر من أهم قرارات تصميم اللغة.

المناطق الرئيسية في الذاكرة

المنطقةمحتواهامن يتحكم فيها
Stackالمتغيرات المحلية، معاملات الدوالتلقائي، LIFO عند انتهاء الدالة
Heapالكائنات المنشأة بـ newالمبرمج (C/C++) أو GC (جافا/بايثون)
Static/Globalالمتغيرات العامة والـ staticطول فترة تشغيل البرنامج

إدارة يدوية مقابل تلقائية

إدارة يدوية (C/C++): المبرمج مسؤول عن التخصيص والتحرير. سريعة جدا لكن عُرضة للأخطاء.

// C - إدارة يدوية
int* arr = malloc(10 * sizeof(int));  // تخصيص
arr[0] = 5;
free(arr);  // تحرير يدوي - لو نسيت = memory leak!
arr = NULL; // لو نسيت = dangling pointer!

Garbage Collection (جافا/بايثون): المُجمّع التلقائي يحرر الذاكرة. أسهل للمبرمج لكن أبطأ قليلا وأقل تحكّما.

// جافا - Garbage Collection تلقائي
Student s = new Student("أحمد");
s = null;  // الـ GC سيحرر الذاكرة تلقائيا

Smart Pointers (C++ الحديث وRust): نهج وسط، تلقائي لكن بدون GC وبأداء عالٍ.

ℹ️ سؤال مهم: ليش جافا أبطأ من C؟

أحد الأسباب الرئيسية هو الـ Garbage Collector. الـ GC أحيانا “يوقف” البرنامج لحظيا عشان ينظف الذاكرة. في C تتحكم أنت متى يحصل هذا بالضبط. هذا ترادف بين سهولة البرمجة وأداء التشغيل.

6. البرمجة الوظيفية، Functional Programming

هنا كثير من الطلاب يتوقفون ويقولون “ما فاهم شيء”. ركّز معي.

الفكرة الأساسية

في البرمجة الوظيفية، كل شيء دالة رياضية. الدالة الرياضية الحقيقية:

  • نفس المدخلات تعطي دائما نفس المخرجات
  • لا تأثيرات جانبية (لا تغيّر متغيرا خارجها، لا تطبع، لا تكتب لملف)

هذه تسمى Pure Function.

مقارنة: جافا مقابل Haskell لنفس المشكلة

جافا (أمري): حساب مجموع قائمة

// جافا - أمري، نخبره كيف يحسب
public static int sum(int[] arr) {
    int total = 0;
    for (int i = 0; i < arr.length; i++) {
        total += arr[i];  // نغيّر total في كل خطوة
    }
    return total;
}

Haskell (وظيفي): نفس المشكلة

-- Haskell - نخبره ماذا يعني "مجموع القائمة"
sum [] = 0                   -- مجموع قائمة فارغة = 0
sum (x:xs) = x + sum xs     -- مجموع القائمة = الأول + مجموع الباقي

لا متغيرات تتغيّر، لا حلقات. فقط تعريف رياضي متكرر. الدالة sum (x:xs) تقول: “مجموع قائمة فيها رأس x وذيل xs هو x زائد مجموع xs”.

Higher-Order Functions

دوال تأخذ دوال أخرى كمعاملات أو ترجع دوال. هذه من أقوى ميزات البرمجة الوظيفية.

Map: طبّق دالة على كل عنصر في القائمة

-- Haskell
double x = x * 2
result = map double [1, 2, 3, 4]  -- [2, 4, 6, 8]

-- أو بدالة مجهولة (lambda)
result2 = map (\x -> x * 2) [1, 2, 3, 4]  -- [2, 4, 6, 8]

Filter: احتفظ فقط بالعناصر اللي تحقق شرط

-- Haskell
evens = filter (\x -> x `mod` 2 == 0) [1..10]
-- [2, 4, 6, 8, 10]

Fold (Reduce): اجمع القائمة في قيمة واحدة

-- Haskell
total = foldl (+) 0 [1, 2, 3, 4, 5]  -- 15
-- يبدأ من 0، يضيف كل عنصر على التوالي

Scheme، مثال عملي

Scheme هي لغة وظيفية من عائلة Lisp. كل شيء فيها قوائم ودوال:

; Scheme - تعريف دالة تحسب مضروب عدد
(define (factorial n)
  (if (= n 0)
      1
      (* n (factorial (- n 1)))))

(factorial 5)  ; => 120
; Scheme - تصفية الأعداد الزوجية
(define (even? x) (= (remainder x 2) 0))
(filter even? '(1 2 3 4 5 6))  ; => (2 4 6)

البرمجة الوظيفية وHaskell محيّرتك؟

مفاهيم Recursion وMap وFilter وFold تربك كثير من طلاب CPCS 301. أرسل لنا واجبك أو موضوع محدد وفريقنا يشرح لك خطوة بخطوة حتى تفهم الفكرة بعمق.

أرسل واجبك على واتساب

7. البرمجة المنطقية، Logic Programming

إذا كانت البرمجة الوظيفية تطلب منك تفكير مختلف، البرمجة المنطقية تطلب منك عقلية مختلفة تماما.

الفلسفة الأساسية

في جافا وHaskell، أنت تعطي الحاسب خطوات أو تعريفات. في Prolog:

  1. تعطي حقائق (Facts) عن العالم
  2. تعطي قواعد (Rules) للاستنتاج
  3. تسأل استفسار (Query) وProlog يبحث عن الإجابة بنفسه

أنت تصف ما هو صحيح، مو كيف تجد الإجابة.

Prolog، مثال عملي

% حقائق: علاقات عائلية
parent(ahmed, khalid).    % أحمد هو والد خالد
parent(ahmed, fatima).    % أحمد هو والد فاطمة
parent(khalid, omar).     % خالد هو والد عمر
male(ahmed).
male(khalid).
male(omar).
female(fatima).
% قواعد للاستنتاج
grandparent(X, Z) :- parent(X, Y), parent(Y, Z).
sibling(X, Y) :- parent(Z, X), parent(Z, Y), X \= Y.
% الاستفسارات
?- grandparent(ahmed, omar).
% true. (أحمد جد عمر)

?- sibling(khalid, fatima).
% true. (خالد وفاطمة إخوة)

?- grandparent(ahmed, X).
% X = omar. (Prolog يجد كل أحفاد أحمد)

كيف يعمل Prolog: Unification و Backtracking

Unification: Prolog يحاول مطابقة الاستفسار مع الحقائق والقواعد. إذا المتغير X ظهر في استفسار، Prolog يجرب يربطه بكل قيمة ممكنة.

Backtracking: لو مسار أعطى نتيجة خاطئة، Prolog يرجع ويجرب مسار ثاني تلقائيا. أنت ما تبرمج هذا البحث، Prolog يعمله بنفسه.

% مثال: ترتيب قائمة
?- permutation([1,2,3], X).
% X = [1, 2, 3] ;
% X = [1, 3, 2] ;
% X = [2, 1, 3] ;
% ... كل التبديلات الممكنة

⚠️ خطأ شائع مع Prolog

كثير من الطلاب يحاولون يفكرون في Prolog بطريقة أمرية: “إيش الخطوات؟”. هذا ما يشتغل. لازم تفكر: “ما الحقائق اللي أعرفها؟ ما القواعد اللي تنطبق؟” دع Prolog يتولى البحث.

مقارنة: جافا مقابل Prolog لنفس المشكلة

جافا: إيجاد الأرقام الأولية حتى N

// جافا - نخبره كيف يبحث
public static boolean isPrime(int n) {
    if (n < 2) return false;
    for (int i = 2; i <= Math.sqrt(n); i++)
        if (n % i == 0) return false;
    return true;
}

Prolog: نفس المشكلة

% Prolog - نصف ما معناه "أولي"
is_prime(2).
is_prime(N) :-
    N > 2,
    \+ has_factor(N, 2).

has_factor(N, F) :-
    N mod F =:= 0.
has_factor(N, F) :-
    F * F < N,
    F1 is F + 1,
    has_factor(N, F1).

8. مفاهيم التزامن، Concurrency Concepts

التزامن هو تشغيل أجزاء متعددة من البرنامج في نفس الوقت (أو ما يشبه ذلك).

المشاكل الرئيسية

Race Condition: متغيّران يتنافسان على تعديل نفس البيانات في نفس الوقت.

// جافا - Race Condition خطيرة
int counter = 0;

// Thread 1 وThread 2 يشتغلان في نفس الوقت
// كلاهما يقرأ counter = 5
// كلاهما يحسب counter + 1 = 6
// كلاهما يكتب 6
// النتيجة: 6 بدل 7، ضاعت خطوة!

Deadlock: Threadان يكل منهم ينتظر الثاني يحرر مورد.

// Thread 1 يحجز lockA وينتظر lockB
// Thread 2 يحجز lockB وينتظر lockA
// النتيجة: توقف تام للبرنامج

الحلول

Synchronization في جافا:

// synchronized تضمن إن Thread واحد فقط يدخل الدالة
public synchronized void increment() {
    counter++;
}

البرمجة الوظيفية كحل:

هذا أحد الأسباب اللي تجعل البرمجة الوظيفية مهمة في العصر الحديث. لما لا توجد حالة قابلة للتغيير (no mutable state)، لا يوجد race condition أصلا. كل دالة تعمل على نسختها الخاصة من البيانات.

ℹ️ ربط بالمادة

مفاهيم التزامن في CPCS 301 تمهيد نظري. ستدرسها بعمق أكبر في مادة أنظمة التشغيل. ركّز هنا على فهم المشاكل (Race Condition، Deadlock) والحلول المبدئية (Synchronization، Immutability).

أنواع أسئلة اختبارات CPCS 301

ما تتوقعه في الاختبارات

  1. مقارنة النماذج: يعطيك مشكلة أو كود ويسألك في أي نموذج هو، أو ما الفرق بين نموذجين
  2. تحليل BNF وParse Trees: يعطيك قواعد BNF ويطلب منك ترسم شجرة تحليل لتعبير معين، أو تحدد إذا كان التعبير صحيح وفق القواعد
  3. تتبع كود Haskell أو Scheme: يعطيك دالة وظيفية ويطلب تتبع نتيجتها خطوة بخطوة
  4. Prolog: يعطيك قاعدة بيانات Prolog ويطلب نتيجة استفسار، أو يطلب كتابة قاعدة معينة
  5. أسئلة أنظمة الأنواع: صنّف هذه اللغة، ما الخطأ في هذا الكود بناء على نظام الأنواع
  6. إدارة الذاكرة: ما الفرق بين Stack وHeap، متى يحدث Memory Leak، كيف يعمل GC
  7. النطاق والربط: ما قيمة هذا المتغيّر في هذه النقطة بناء على نوع النطاق

كيف تنجح في مادة CPCS 301

خطة النجاح في المادة

  1. لا تقاوم طريقة التفكير الجديدة: أصعب خطوة هي تقبّل إنك ستفكر بشكل مختلف. لما تدرس Haskell، انسَ جافا مؤقتا
  2. ابدأ بالأمثلة قبل النظرية: في البرمجة الوظيفية، جرّب المثال أولا وشوف المخرجات، ثم ارجع اقرأ التعريف
  3. ارسم مسارات Prolog يدويا: لما تدرس Backtracking، ارسم شجرة البحث على ورقة وتتبع كيف Prolog يبحث
  4. ربط كل مفهوم بلغة تعرفها: لو فهمت فكرة في سياق جافا أو بايثون، ابحث عن نظيرها في اللغة الجديدة
  5. اعمل على الواجبات مبكرا: مو مادة تحتمل تأجيل الواجب للليلة السابقة. المفاهيم تحتاج وقت “تنضج” في الذهن
  6. اسأل عن المفهوم مو عن الكود: لو ما فهمت الـ Closure مثلا، اسأل “ليش هذا يتذكر القيمة؟” مو “ليش الكود يعطي هذا”

ربط المادة بمسارك المهني

فهم نماذج البرمجة يجعلك مبرمجا أفضل حتى في لغاتك العادية:

  • بايثون: تستخدم map, filter, lambda وهذه وظيفية. الآن ستفهمها بعمق.
  • جافا 8+: Streams وLambdas مستوحاة من البرمجة الوظيفية. CPCS 301 تشرح لك السبب.
  • JavaScript: Closures وFirst-class Functions من صميم المادة. ستفهم JS بشكل أفضل.
  • Scala, Kotlin, Swift: لغات حديثة تمزج OOP مع الوظيفي. فهمك للنماذج يساعدك تتعلمها أسرع.
  • الذكاء الاصطناعي: كثير من خوارزميات AI تُكتب بلغات وظيفية أو منطقية.

لو تبي تطوّر مهاراتك في أساسيات جافا أو أساسيات بايثون قبل ما تبدأ المادة، هذان الدليلان يغطيان الأساسيات اللي تحتاجها.

💡 نصيحة من طلاب سبقوك

أفضل استراتيجية لاجتياز CPCS 301 هي دراسة كل نموذج على حدة وبتركيز، ثم مقارنته بالنماذج الأخرى. لا تحاول تفهم كل شيء معا. أسبوع للأمري، أسبوع للOOP، أسبوعان للوظيفي، أسبوعان للمنطقي. والمقارنة تجي بعد الفهم مو قبله.

الكتب والمصادر المقترحة

لمادة CPCS 301 عادة يُستخدم كتاب “Concepts of Programming Languages” لـ Robert W. Sebesta. الكتاب يغطي كل مواضيع المادة لكن ثقيل. إليك طريقة ذكية لاستخدامه:

  • قبل المحاضرة: اقرأ العناوين الرئيسية للفصل فقط (5 دقائق)
  • بعد المحاضرة: اقرأ الفصل كاملا، الآن ستفهم أكثر لأن عندك سياق
  • للمراجعة: الأمثلة في نهاية كل فصل أهم من القراءة النظرية المكررة
  • للاختبار: حل أسئلة الفصول السابقة أفضل من حفظ التعريفات

مشاريع أو واجبات CPCS 301؟ فريقنا جاهز

سواء كان واجب Haskell أو برنامج Prolog أو تقرير مقارنة نماذج البرمجة، فريق زدني متخصص في مواد علوم الحاسب بجامعة الملك عبدالعزيز. أرسل تفاصيل ما تحتاجه واحصل على رد خلال ساعة.

تواصل معنا على واتساب

خلاصة

مادة CPCS 301 لغات البرمجة هي واحدة من أكثر المواد اللي تبني تفكيرك كمبرمج. مو لأنها صعبة، بل لأنها تكشف لك إن “البرمجة” أوسع بكثير من أي لغة بعينها.

المفاهيم الأساسية اللي تحتاج تتقنها:

  • نماذج البرمجة: الأمري، كائني التوجه، وظيفي، منطقي. وما الفرق بين كل منها
  • Syntax و Semantics: القواعد النحوية والمعنى، وBNF كأداة وصف
  • أنظمة الأنواع: Static مقابل Dynamic، Strong مقابل Weak
  • النطاق والربط: Static Scope، Dynamic Scope، Closures
  • إدارة الذاكرة: Stack وHeap، Manual وAutomatic، Garbage Collection
  • البرمجة الوظيفية: Pure Functions، Recursion، Higher-order Functions، Map/Filter/Fold
  • Prolog: Facts وRules وQueries وBacktracking
  • التزامن: Race Condition وDeadlock والحلول الأساسية

لما تجلس في امتحان CPCS 301 وتحس إن السؤال صعب، توقف واسأل نفسك: “عن أي نموذج يتكلم؟ ما الفلسفة الأساسية لهذا النموذج؟” كثير من الأسئلة تنحل لو بدأت من الفلسفة مو من الكود.

هل تحتاج خصوصي؟