عودة الكتابة الديناميكية: هل ده ممكن؟

ولا الكتابة الثابتة كانت النموذج الصح من البداية؟

صورة بواسطة Michael Marais على Unsplash

لو بتتابع عالم البرمجة دلوقتي، هتلاحظ حاجة: الكتابة الثابتة (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 (ثابت):

// 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 (قوي):

# 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 Typing؟

لو جمعنا خصائص Static + Strong، هنلاقي:

"إحنا (المبرمجين) اللي بنقرر إيه نوع كل متغير، والكمبيوتر مش هيغيره أبداً من غير إذننا."

الكلمات المهمة: "إحنا اللي بنقرر"

ده بيدي المبرمج السلطة عشان يضمن صحة الكود. زي ما تيد نيلسون قال:

"الأخبار الكويسة عن الكمبيوترات: إنها بتعمل اللي بتقوله." — تيد نيلسون

التركيز على الصحة (Correctness) ده هو جوهر عقلية Static Typing - وبتتجاوز مجرد مصطلحات علوم الحاسب.

خليني أوضحلك إزاي العقلية دي موجودة في بايثون، حتى من غير Type Hints!

عقلية الكتابة الثابتة في بايثون (من غير Type Hints!)

ممكن تقول: "بس يا عم الحاج، بايثون Dynamic! إزاي فيها عقلية Static؟"

الإجابة: العقلية موجودة في طريقة كتابة الكود، مش في اللغة نفسها! (زي البرمجة الكائنية - ممكن تعملها في أي لغة)

مثال 1: Data Classes ضد Dictionaries

الكود "الديناميكي" (مش محبب في المشاريع الكبيرة):

def get_user_details() -> Dict:
    return {
        "first_name": "بارت",
        "last_name": "سيمبسون",
    }

المشكلة:

الكود "الثابت" (المفضل في المشاريع الكبيرة):

@dataclass
class UserDetails:
    first_name: str
    last_name: str

def get_user_details():
    return UserDetails(
        first_name="بارت",
        last_name="سيمبسون",
    )

المميزات:

لاحظ: ماستخدمتش Type Hints في الـ method، لكن العقلية موجودة!

مثال 2: Enums ضد Strings

الكود "الديناميكي":

if state == "alive":
    normal_walk()
elif state == "dead":
    lie_down()
elif state == "zombie":
    zombie_walk()

المشكلة:

الكود "الثابت" (بيستخدم 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()

المميزات:

مرة تانية: مفيش Type Hints، لكن العقلية موجودة!

مزايا العقلية دي

لازم أعترف: العقلية دي مفيدة جداً!

الفوائد:

أنا شخصياً بستفيد منها كل يوم!

لكن... فيه سؤال مهم

بس هل العقلية دي هي الحل المثالي لكل حاجة؟ هل فيه عقلية Dynamic Typing كمان؟ إيه اللي هنخسره لو تخلينا عن النهج الديناميكي؟

عشان نجاوب على الأسئلة دي، لازم نقارن مجالين: هندسة البرمجيات و الذكاء الاصطناعي.

الذكاء الاصطناعي الرمزي = الكتابة الثابتة للذكاء الاصطناعي

في الأيام الأولى للذكاء الاصطناعي (الستينات والسبعينات)، النهج السائد كان Symbolic AI (الذكاء الاصطناعي الرمزي).

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

ملخص النهج ده:

"إحنا (المبرمجين) اللي بنقرر إيه القواعد نستخدمها، والكمبيوتر مش هيغيرها أبداً من غيرنا."

هل لاحظت التشابه؟ قارن مع تعريف Static Typing:

"إحنا اللي بنقرر إيه نوع كل متغير، والكمبيوتر مش هيغيره أبداً من غيرنا."

نفس العقلية بالضبط!

المشكلة المشتركة

في السعي للصحة (Correctness)، بنحد من قدرات البرمجيات/الذكاء الاصطناعي لبس اللي إحنا نفسنا نقدر نستوعبه.

والحقيقة: عقولنا البشرية محدودة! مش هنقدر نتخيل كل الحالات الممكنة.

Machine Learning = Dynamic Typing للذكاء الاصطناعي

لو 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 بيقول:

"المستقبل موجود فعلاً - بس مش موزع بالتساوي."

يعني: تلميحات من المستقبل موجودة دلوقتي في أماكن مختلفة!

ChatGPT: تلميحة من المستقبل

تعالى نقارن: 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

الترجمات: [EN], [NL]