شرارات لإنتاج لغة برمجة

logo-sharkنعم شرارة، شيء ما يشتعل فجأة داخل دماغك، يضيء بسرعة و يختفي مع أول تشتيت لانتباهك، كما بدأت بلفتة بسيطة تنتهي بابسط شاردة تمر بها، هذه اللمعة هي هذه الشرارة و هي قد تكون بداية حريق كبير.

كأي مبرمج (مبرمج قديم طبعا) مبتديء، بدأت حياتي البرمجية بلغة بيسك Basic، على أجهزتنا القديمة، كانت مجرد كتابة و إخراج النتائج كتابةً او رسوم، و قمة الروعة عندما ترى الحاسب يقوم بتنفيذ الاوامر بالتسلسل التي تعطيها له.

القرش

مع تقدمي في مجال البرمجة انتقلت إلى لغة التجميع (لغة الآلة) و منها استطعت قراءة البيوس Bios للجهاز و قراءة طريقة عمل لغة البرمجة Basic على نفس الجهاز، مع قراءتي لها كانت تخطر على بالي أفكار أكثر (ماذا لو كان) و (ماذا لو عملنا كذا) و هكذا وجدت نفسي بدأت بكتابة لغة برمجة جديدة تختلف عن البيسك و إن كانت أول الأمر متخلفة جدا عنها.

كانت لي أهداف فيها لتسهيل بعض الاعمال علي، مثلا اريد فيها عدم ترقيم الاسطر الاجباري كما هو معروف في البيسك في ذلك الوقت، و هذه الفكرة ليست من عندي اقتبستها من لغة التجميع لا اكثر، قمت بتسمية هذه اللغة بـ “القرش”، لا تستغرب من الاسم، نحن نتكلم عن مبرمج عمره 17 سنة.

كانت مجرد بداية و انتهت فورا عندما تعرفت على الاجهزة الأحدث و اكتشفت كماً هائلا من لغات البرمجة الموجودة مسبقاً لم أعرفها من قبل و لكن “القرش” كان سببا في اختياري لغة البرمجة التي تناسبني، عندما كان الخيار بين الـ Pascal و الـ C استقر رأي على لغة Pascal، و هكذا صار “القرش” الشرارة الاولى للرغبة في صنع لغة برمجة  وفي  اختيار لغة برمجة.

التعريب

مع دخول الانترنت اصبح الاطلاع على عمل الآخرين أسهل و خاصة مع المصادر المفتوحة، وقع ذلك الوقت بين يدينا أنا و صديقي في العمل(1) مصدراً للغة بيسك مكتوب بلغة الدلفي، كانت قراءة المصدر سهلة و بسيطة بحيث لمعت لنا فكرة تعريبها من باب المتعة، قمنا فقط باستبدال الكلمات الانكليزية إلى كلمات عربية و حرصنا على استخدام كلمات لا تحتاج إلى همزة أو تنوين مثل Print إلى “اطبع” بدون همزة، أو If إلى “اذا” و Then إلى “اذن” لتفريقها عن “إذا“، كان الهدف هو التبسيط ليس إلا.

استغرقنا العمل عليها نحن الاثنين عدة ساعات، و كنا نضحك من النتائج الممتعة التي وصلنا إليها، و عدنا للعمل في اليوم التالي فأصبحت طي النسيان، و حتى أني لا أذكر أين وضعت المصدر البرمجي، لكن ما لمع في ذهني ذلك الوقت هو لماذا يجب ان تكون عربية، لماذا لا تكون متعددة اللغات، يعني أن نستطيع كتابتها بالانكليزية و حفظها بشكل ثنائي Binary ثم استرجاعها باللغة العربية أو أي لغة بشرية تكون مدعومة بها، أي عبر عمل Compile ثم Decompile مثلاً.

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

هذا الاسلوب يتطلب الاستغناء عن اكبر قدر ممكن من الكتابة البشرية، مثل procedure و function و void و var أو حتى if، عندها بدأت بوضع القواعد عبر المزج بين لغة Pascal و C و لغات برمجية أخرى التي غالباً مشتقة من صيغ اللغة C.

البحث

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

تلك اللغة البرمجية التي في دماغي في بداية الامر أطلقت عليها اسم nop_code، ثم قررت إعطاءها اسما عربيا، هو ترجمتي لكلمة script لأني إذا كنت من سيصنعها فستكون مكتوبة بلغة باسكال و ستكون حتما لغة script كما هو الحال في php و اللغات المشابهة، اخترت اسم “سرد” أو “sard” كترجمة لكلمة script و في نفس الوقت بعيدة عن اللفظ الثقيل للقاريء الاجنبي.

التحدي

عند تعلمي لبرمجة اندرويد كان لابد لي من استعمال لغة جافا، صادفني مشاكل بفهم ال scope فيها وهو مختلف عن اسلوب اللغات Pascal و ال C.

دخلت إلى مجتمعهم عبر المحادثة Chat، فسألني احد المبرمجين اذا كانت اعجبتني لغة الجافا، فاخبرته بـ “لا”، اخبرته طالما وجدت “void” فهي لن تعجبني، و دخلنا في ذلك النقاش بأن هذا الامر غير ممكن منطقيا، كانت الاشكالية بالنسبة له هو التعارض بتفسير Parsing النص، و بما اني قادم من الباسكال لا من السي (وهذا ما اخبرته) فكان اعتقادي باننا اذا وضعنا تعريف المتحول او التابع (الدالة) بعد اسم المتحول و ليس قبلها فسوف تُحل المشكلة.

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

الآلة الحاسبة

عند تعلمي لأي لغة برمجة جديدة تكون الآلة الحاسبة اول مشروع كامل اتدرب عليه من خلالها، و في كل مرة اكتب برنامج الآلة الحاسبة أكتب مكتبة صغيرة تتلقى الاوامر البسيطة (العمليات الحسابية) و تتلقى كذلك الكتابة (الارقام)، و في كل مرة أقول في نفسي مالفرق بينها و بين لغة البرمجة، كان الفرق بالنسبة لي هو المتحولات، و التوابع و عملية الإسناد فقط.

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

كتابتي للآلة الحاسبة بسط لي كتابة لغة البرمجة و ربما خدعني و أعطاني أملاً زائفا، و لكنه كان جميلا جدا، هذا الامل كان حافزا لكتابة هذه اللغة.

الماضي

قرر احد اقاربي استرجاع ذكرياته مع لغة البرمجة التي تعلمها في صغره، لغة البيسك، فسألني اذا كانت مازالت موجودة، و مساعدته في استعمالها.
بحثت على الانترنت لأجدها مليئة بلغات البيسك المختلفة من البسيطة للمعقدة، و عندما كنت اجربها، كنت استرجع الماضي و أغوص في الذكريات، شيء ما يشتعل الآن و لكن ليس في دماغي بل في قلبي، القرش يتحرك 😛

أخيرا

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

نشرت المصدر على github  تحت رخصة MIT لم اسمها لغة برمجة بعد حتى تكتمل، استثنيت المعلومات  التقنية في التدوينة لتسهيل القراءة، يمكن طرح المعلومات التقنية في التعليقات.

(1) بلال الحمد
 
قمت بنقل المشورع إلى لغة D
https://github.com/parmaja/sard

و اوقفت العمل بها على لغة باسكال
اصبحت D بنفس  المستودع الاصلي أما الباسكال
https://github.com/parmaja/fpc-sard

16 فكرة على ”شرارات لإنتاج لغة برمجة

  1. السلام عليكم

    أمر رائع، إنشاء لغة برمجية جديدة من الأمور الممتع مراقبتها.
    إن خوض التجربة في حد ذاتها متعة عظيمة.
    في سبيل تجربة سرد قمت بإنزال لازروس في جهازي (كنت قد مسحتها من قبل) ، وحملت البرنامج الذي به المثال.
    في البداية عند التشغيل اشتكى من عدم وجود الحزمةMiniCommons ، فأزلتها من قائمة الاعتماديات (يبدو أن هذه الحزمة أضحت من البديهيات في مشاريعك (: )
    أيضا كان يعطيني خطأ في ملف SynEdit كالتالي:

    procedure TCustomSynEdit.MarkTextAsSaved;
    exit;
    if FLeftGutter.Visible and FLeftGutter.ChangesPart(0).Visible then

    قمت بإضافة exit في بداية الدالة ومشى الحال.
    لعبت قليلا بمفردات اللغة. كنت دائما أنسى وضع الفاصلة المنقوطة بعد علامة نهاية الكتلة }
    {….};
    أجدها غريبة قليلا.
    قمت بتجربة الكود التالي
    //x := 500;
    x : integer = 500 + 5;
    MyProc := {
    x := 10;
    y := 101;
    := x + y;
    };

    := ‘Result is ‘ + MyProc + x;
    يعطيني:
    Result is 111505

    لماذا عامل المتغير x كنص وليس كرقم.

    تحياتي

  2. كيف استعطت تشغليها 😀
    لم اتوقع من احد ان يفكر حتى في مناقشتها، عملتها للمتعة فقط 😛

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

  3. مازالت بحاجة للتطوير مثلا لا يتعامل مع الافضلية، يعني افضلية الضرب على الجمع مثلا بالرغم من ان التابع (الحلقة) سهلة فتركتها للآخر.

    في مثالك، انت لم تعرف تابع MyProc انت عرفت متحول و اسندت إليه ناتج قيمة بولوك.
    اذا ارتدت تعريف تابع ازل فقط الـ =
    MyProc:{

    }

    على ما يبدو عندي بق انه لا يستطيع ان يرى هذا التابع ضمن الاقواس.
    توقفت عند مشكلة الحيّز (الـ Scope الـ Global Scope)

    و سأكملها عند اول فرصة لي.

  4. الفاصلة المنقوطة بعد البلوك ضرويرية لاسباب لم تكتمل بعد، عندي مخطط وضع اكثر من بلوك/كتلة كمدخلات لتابع واحد، هذه قصة طويلة.

  5. عموما، خلق لغة برمجية تفتح أبوابا لا تغلق من المتعة والألم والكثير من الوقت
    ربما تنتقل باللغة من مجرد سكريبت إلى ترجمتها إلى لغة أخرى مثل فري باسكال

    مند فترة وأنا أتابع فريق عمل لغة Nimrod (خارجين من عباءة باسكال)
    nimrod-lang.org
    اللغة يتم ترجمتتها إلى لغة c ومن تم للغة الآلة.

  6. صحيح، و لكن لدي اهداف اكبر من اني اجعلها تولد ملف تنفيذي، اريدها تغيير في بعض المفاهيم البرمجية.
    مثلا التعامل مع الكائنات بدلا من التوابع، يعني لايوجد عندي توابع functions بل كائنات و انت تستطيع طلب الكائن للتنفيذ كانك تطلب التابع.
    ايضا التعامل مع الكائنات من خلال تحديد خصائصة ضمن block لكن هذه في مرحلة متقدمة و صعب شرحها مالم ترغب في ان اوجع رأسك بالفكرة 😀

  7. مثال على التعقيد، هذه اللغة لا يوجد فيها if ، يجب علينا ايجاده على شكل object
    يعني تعليمة if هي object كائن يتم استدعائه بمعطيات الشرط و جواب الشرط.

  8. أوكي، كنت أبحث عن مقالة قرأتها منذ فترة لصاحب لغة جديدة له نفس التوجهات حيث يريد أن يكون كل شيء في اللغة منهاجا لكائن ما حتى تعليمة if
    http://wasyl.eu/programming/2014/03/01/introducing-september.html

    الفكرة رائعة أن تكون كل مفردات اللغة كائن من نوع ما. أو تابع مثل لغة lisp

    لا زلت أعاني من مشكلة الفاصلة المنقوطة بعد علامة نهاية الكتلة، بعد عشر محاولات خاطئة اكتشف ان المشكلة في نسياني لهذه الفاصلة، ورسالة الخطأ لا تدلني عليها ولكنها تدلني -منطقيا- على التعليمة التي تليها. سوف أتعود عليها قريبا.

  9. انا نفسي لم اعتد عليها و هي مزعجة بشكل بعد تسكير القوس المفروض ان ينهي الجملة بنفسه و لا داعي للفاصلة المنقوطة
    لكني برمجيا اترك مثل هذه الامور بعد الانتهاء من كل السانتاكس و السكانر حتى لا تعرقل تقدمه.

    الفكرة في وجودها هو امكانية تمرير اكثر من بلوك للتابع (الكائن) الواحد

    myfunc(10,5){
    some code
    }
    {
    some code
    };

    مثل المثال أذا انهى الجملة بدون الفاصلة بعد القوس الكبير سيضيع البلوك الذي بعده،
    هذا الشكل عبارة عن استدعاء لتابع (كائن) بمعطيات parameters و ببلوكات يعني ليس فقط بارامترات بل ايضا بلوكات
    و للتابع حرية تنفيذ هذه اللبولكات حسب ما هو مبرمج.
    من هذه الطريقة يمكننا عمل كائن اسمه while مثلا أو if
    اللغة ساويتها بسرعة (شهر و نصف عمل متواصل) فهي في بدايتها (جنين) و للأسف لا يوجد كهرباء لدينا أو لا صحة الشباب حتى اتابع فيها 🙂
    انتظر تحسن الظروف.
    لكن اذا احببت ان تتابع فيها فلا مانع تستطيع ان تعمل fork عنها.

  10. جميلة الـ September
    يمكن قراءة الكود بسهولة
    https://bitbucket.org/krajzega/september
    لكن ما زالت تعتمد على وجود كلمات اساسية مثل class و field و method

    انا سأواجه صعوبات بسبب ذلك 😛

  11. >>لكن اذا احببت ان تتابع فيها فلا مانع تستطيع ان تعمل fork عنها.
    لاأظني أستطيع، تريد رجالها.

  12. تريد شبابا 😀

  13. السلام عليكم
    ماشاء الله..
    ذكرتني بعض المرات التي جلسناها معا وكنت تريني بعضا من نتائج عملك والتي كانت سوابق في ذلك الوقت.
    جعلتني من وقتهاافكر بشكل مختلف للوصول للحلول المبدعة
    تحية لك وبارك الله فيك وفي علمك

  14. اهلا اخي هشام زمان ما شفناك 😀
    هذه الايام تغيرنا لم نعد نستطيع المتابعة في اي عمل نتيجة الظروف.
    عسى نشوف اولادنا يكملوا المشوار.

  15. الأمر رائع جدا و بما أن خالد الشقروني في النقاش أشكره على دروسه في الدلفي

أضف تعليق