
لو بتتابع عالم البرمجة دلوقتي، هتلاحظ حاجة: الكتابة الثابتة (Static Typing) كسبت المعركة!
مش مصدقني؟ روح على Stack Overflow أو كورا واسأل: "إيه أحسن: Static ولا Dynamic Typing؟" - هتلاقي معظم الإجابات بتفضل Static Typing.
الدليل في كل حتة:
ولو حاولت تعارض الوضع ده (زي ما DHH - مخترع Ruby on Rails - عمل)، ممكن تتعرض للإلغاء (cancel) من المجتمع!
السؤال: ليه Static Typing كسب؟ وهل فيه مستقبل لـ Dynamic Typing؟
عشان نفهم ده، لازم الأول نفهم: Static Typing مش بس مصطلح تقني - ده عقلية كاملة.
1. Static vs. Dynamic Type Checking (فحص النوع الثابت ضد الديناميكي):
Static (ثابت):
x عدد صحيح، هيفضل عدد صحيح طول عمره// Java - Static Typing
int x = 5; // x هو عدد صحيح
x = "hello"; // ❌ خطأ! مش ممكن
Dynamic (ديناميكي):
# Python - Dynamic Typing
x = 5 # x عدد صحيح دلوقتي
x = "hello" # ✅ تمام! دلوقتي x نص
2. Strong vs. Weak Typing (الكتابة القوية ضد الضعيفة):
Strong (قوي):
x عدد، مش هتقدر تدمجه مع نص من غير تحويل صريح# Python - Strong Typing
x = 5
y = "عمر "
print(y + x) # ❌ خطأ! مش ممكن
print(y + str(x)) # ✅ تمام: "عمر 5"
Weak (ضعيف):
// JavaScript - Weak Typing
"11" + 1 // "111" (دمج نصوص!)
"11" - 1 // 10 (طرح أرقام!)

اللغات بتقع في أربع خانات:
الملاحظة المهمة: بايثون Dynamic لكن Strong! - يعني القيم (Values) هي اللي ليها أنواع، مش المتغيرات.
لو جمعنا خصائص Static + Strong، هنلاقي:
"إحنا (المبرمجين) اللي بنقرر إيه نوع كل متغير، والكمبيوتر مش هيغيره أبداً من غير إذننا."
الكلمات المهمة: "إحنا اللي بنقرر"
ده بيدي المبرمج السلطة عشان يضمن صحة الكود. زي ما تيد نيلسون قال:
"الأخبار الكويسة عن الكمبيوترات: إنها بتعمل اللي بتقوله." — تيد نيلسون
التركيز على الصحة (Correctness) ده هو جوهر عقلية Static Typing - وبتتجاوز مجرد مصطلحات علوم الحاسب.
خليني أوضحلك إزاي العقلية دي موجودة في بايثون، حتى من غير Type Hints!
ممكن تقول: "بس يا عم الحاج، بايثون Dynamic! إزاي فيها عقلية Static؟"
الإجابة: العقلية موجودة في طريقة كتابة الكود، مش في اللغة نفسها! (زي البرمجة الكائنية - ممكن تعملها في أي لغة)
الكود "الديناميكي" (مش محبب في المشاريع الكبيرة):
def get_user_details() -> Dict:
return {
"first_name": "بارت",
"last_name": "سيمبسون",
}
المشكلة:
"first_name" لـ "First_Name" → الكود هينكسر!الكود "الثابت" (المفضل في المشاريع الكبيرة):
@dataclass
class UserDetails:
first_name: str
last_name: str
def get_user_details():
return UserDetails(
first_name="بارت",
last_name="سيمبسون",
)
المميزات:
لاحظ: ماستخدمتش Type Hints في الـ method، لكن العقلية موجودة!
الكود "الديناميكي":
if state == "alive":
normal_walk()
elif state == "dead":
lie_down()
elif state == "zombie":
zombie_walk()
المشكلة:
"Alive" بدل "alive" → مش هيشتغل (ومش هتعرف ليه!)"aliev" مثلاًالكود "الثابت" (بيستخدم Enum):
class State(Enum):
ALIVE = 1
DEAD = 2
ZOMBIE = 3
if state == State.ALIVE:
normal_walk()
elif state == State.DEAD:
lie_down()
elif state == State.ZOMBIE:
zombie_walk()
المميزات:
State.ALIEV → خطأ فوريمرة تانية: مفيش Type Hints، لكن العقلية موجودة!
لازم أعترف: العقلية دي مفيدة جداً!
الفوائد:
أنا شخصياً بستفيد منها كل يوم!
بس هل العقلية دي هي الحل المثالي لكل حاجة؟ هل فيه عقلية Dynamic Typing كمان؟ إيه اللي هنخسره لو تخلينا عن النهج الديناميكي؟
عشان نجاوب على الأسئلة دي، لازم نقارن مجالين: هندسة البرمجيات و الذكاء الاصطناعي.
في الأيام الأولى للذكاء الاصطناعي (الستينات والسبعينات)، النهج السائد كان Symbolic AI (الذكاء الاصطناعي الرمزي).
الفكرة الأساسية:
ملخص النهج ده:
"إحنا (المبرمجين) اللي بنقرر إيه القواعد نستخدمها، والكمبيوتر مش هيغيرها أبداً من غيرنا."
هل لاحظت التشابه؟ قارن مع تعريف Static Typing:
"إحنا اللي بنقرر إيه نوع كل متغير، والكمبيوتر مش هيغيره أبداً من غيرنا."
نفس العقلية بالضبط!
في السعي للصحة (Correctness)، بنحد من قدرات البرمجيات/الذكاء الاصطناعي لبس اللي إحنا نفسنا نقدر نستوعبه.
والحقيقة: عقولنا البشرية محدودة! مش هنقدر نتخيل كل الحالات الممكنة.
لو Symbolic AI هو Static Typing للذكاء الاصطناعي، فـ Machine Learning هو Dynamic Typing بتاعه!
الفرق:
في المجالين (البرمجة والذكاء الاصطناعي)، إحنا بنتأرجح من Static لـ Dynamic والعكس على مر السنين!
الثنائية دي مش جديدة - أصولها بترجع لـ David Hume و "مشكلة الاستقراء":
المعادلة الصعبة:
الصحة (Correctness) بتيجي على حساب العمومية (Generality)
مثال 1: كود "حي-ميت-زومبي"
if state == State.ALIVE:
normal_walk()
elif state == State.DEAD:
lie_down()
elif state == State.ZOMBIE:
zombie_walk()
المشكلة: لو صادف الكود يسوع المسيح (مات وقام!)، الكود هينكسر - مفيش حالة ليه!
ده مثال على: صحة على حساب عمومية
مثال 2: Symbolic AI ضد Machine Learning
كلنا عارفين إيه اللي حصل:
طبعاً في مقابل العمومية، بنضحي بالصحة:
فاكر اللي قلناه في البداية؟
"الأخبار الكويسة عن الكمبيوترات: إنها بتعمل اللي بتقوله."
تيد نيلسون أضاف تكملة:
"الأخبار الوحشة: إنها بتعمل اللي بتقوله (مش اللي عايزه يعمله)!" — تيد نيلسون
الفرق مهم!
ساعات مش عايز الكمبيوتر يعمل بالضبط اللي قلته - عايزه يفهم اللي أنا قاصده ويعمله!
طبعاً مفيش حد يقدر يتنبأ بالمستقبل، لكن زي ما William Gibson بيقول:
"المستقبل موجود فعلاً - بس مش موزع بالتساوي."
يعني: تلميحات من المستقبل موجودة دلوقتي في أماكن مختلفة!
تعالى نقارن: JavaScript و Python 2 ليهم مشاكل بسبب نظام الأنواع:
JavaScript (Weak Typing):
"11" + 1 // "111" (دمج نصوص - مش منطقي!)
"11" - 1 // 10 (طرح أرقام - منطقي!)
Python 2 (Strong Typing):
3 / 2 # 1 (مش 1.5 - مش منطقي!)
ChatGPT مش عنده المشاكل دي!
Prompt: 1 + 3
ChatGPT: حاصل جمع 1 و 3 هو 4.
Prompt: "2" + "2"
ChatGPT: التعبير "2" + "2" بيدمج النصين، والنتيجة "22".
Prompt: 1/1/2020 + two weeks
ChatGPT: لو 1/1/2020 يعني 1 يناير 2020، إضافة أسبوعين تدي 15 يناير 2020.
ChatGPT بيفهم السياق (Context) وبيعمل اللي إنت قاصده، مش بس اللي كتبته حرفياً!
أتوقع إن لغات البرمجة في المستقبل هتكون:
زي ChatGPT: مش Static ومش Dynamic - ذكي!
الواقع: Static Typing كسب الجولة دي، ولأسباب وجيهة:
لكن:
موقفي الشخصي:
في النهاية: البرمجة مش دين - مفيش "الطريق الوحيد الصحيح". استخدم الأداة المناسبة للمشكلة المناسبة.
طارق عمرو، 22 يوليو 2023