نقاش حول تعلم لغات البرمجة في الجامعات

السلام عليكمlanguages

دار بيني وبين اﻷخ المقداد نقاش حول تعلم لغات البرمجة في الجامعة. فأحببت أن أنقله في تدوينة منفصلة حتى تعم الفائدة:

المقداد

استاذ معتز لدي تجربة خارج نطاق الموضوع اريد مشورتك فيها ، قبل مدة بدأت في تعلم اساسيات البرمجة من حلال احد الدورات الاجنبية ، الدورة فعلا كانت مميزة وزاخرة بالكثير من المعلوامات عن الاساسيات البرمجية مثل الشروط والحلقات التكرارية ومفهوم كتابة الكود بشكل صحيح وجعله مقروء سواء اكان لك او لغيرك من المبرمجين وتعرفت ايضا علي مفهوم تنظيم الكود وتنظيفه من اجل التخفيف وعدم الاكثار من الكلاسات في البرنامج للتقليل من استهلاك الموارد ، فعلا معلومات قل ما تشرح في محتوي عربي ، بعدها انتقلت الي السي شارب في دورة اخري لكن واجهتني مشكلة كبيرة في التعامل معها فالسي شارب تحتاج منك لمعرفة كبيرة بالكائنات واستخدامها , واغرب شء لم انتبه له هو ان لغات الدوت نت هي لغات من فئة الـ manged language التي تحتاج الي مكتبات خارجية حتي تعمل ففكرت هل عند كتابة برنامج لشخص ساحتاج عند التحزيم الي اجبار المستخدم باستخدام حزمة اضافية ليعمل برنامجي عنده هنا اقتنعت بجدوي اللغات الـ native وتذكرت كلامك عن موضوع الـ Free pascal لذا ساعاود الكرة معها من اجل بداية جديدة معها لتعلم البرمجة عبرها , ساعطي نظرة علي كتابك املا في ايجاد ما اطمح اليه ، فعلا الكثير من المبرمجين يبدأون في تعلم لغة ما وتجد بعد تعبهم النتيجة غير مرضية بسبب عدم اخذ معلومات كافية عن اللغة قبل البدء وضياع الكثير من الزمن والجهد مثل الذي حدث معي .

معتز

في الحقيقة كل لغة برمجة لها إمكاناتنا ومجالها. وإنت في الجامعة عليك تعلم أكثر من لغة برمجة وأكثر من نوع، أي نوع managed ونوع آخر native وثالث script language في مجال العمل سوف تجد استخدامات لها الثلاثة

المقداد

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

معتز

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

المقداد

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

علي علي العموم هذا مثال لدورة في اعادة صناعة الكود البرمجي موجه للمبرمجين ، ما يعجبني في اسلوب دورات الشخص انها زاخرة بالمعلومات التي تضعك علي مسار صحيح وتغير من طريقة عملك علي البرنامج ككل , درست له في السابق دورة متعلقة بالاساسيات البرمجية , لكن هذه الدورة مختلفة فهي موجهة للمبرمجين , علي العموم هذا رابط الدورة علي الموقع الرئيسي واذا احببت رابط التحميل سارفقه لك : http://www.lynda.com/Developer-Programming-Foundations-tutorials/Foundations-Programming-Refactoring-Code/122457-2.html
ولي عودة ان شاء الله

.

المقداد

خطوتي الاولي مع الـ ObjPascal :

بعد يومين من تجربتي لقراءة كتابك الخاص ابدأ مع اوبجكت باسكال بدأت في تصفح الكتاب وفعلا معلومات زاخرة جدا ويشرح المكونات بشكل دقيق وايضا وجدت التجانس في الدروس من حيث التعقيد فانت تصعد بسلاسة في كل مرة .
ما اعجبني ايضا في الباسكل اكتشفت انني لست غبيا كما كنت اعتقد في السابق حين جربت السي شارب ، اصبحت اتفهم الاخطأ جيدا واطبق البرنامج دون ظهور اي خلل وحتي في حال ظهور اجدها اخطاء غير منطقية او الـ logical error وبدأت اهتم اكثر بنظافة الكود وترتيبه من اجل الراحة في فيما بعد ونتيجة كتابة الكود النظيف علمتني مهارة جديدة الا وهي تصيد الاخطاء حتي قبل تنفيذ البرنامج فصرت اعرف انني اخطاءت في السطر الفلاني ونسيت شيئا هنالك وهكذا ،
ايضا اصبحت افكر في محاول تعقيد الكود بوضع بعض الفرضيات مثلا برنامج المطعم ماذا لو اضفنا رسالة للزبون تخبره اذا كان يريد عصيرا بعد طلبه لوجبة .:)
ايضا من الملاحظات التي لاحظتها هي عند استخدامك لعبارة الشرط مع الـ else لاحظت ان اضافة الـ semicolon عند نهاية التعابير تؤدي الي خلل عند ترجمة البرنامج بعتبار ان دورها يخبر المترجم بانتهاء العبارات لذا كنت اكتبها في اخرعبارة او statement ينتهي عندها التعبير وهو الشيء الذي لم تذكره في الكتاب .
برنامج الاوزان وجدته معقدا بعض الشيء وخاصة جزئية اضافة الدالة التي اضطررت الي اضافتها بعد مجموعة من الاخطاء والرسال من مصحح الاخطاء بعدم وجود الـ idefiner وتم حل المشكلة بعد اضافة المكتبة ، ايضا حاولت فهم كيف تم التفكير في هذا البرنامج بعد البحث وجدت انها معادلة رياضية قديمة تم صياغتها في شكل برنامج .
طبعا كل هذا الكلام ولم اتخطي الصفحة الـ 26 من الكتاب لكن احببت طرح تجربتي مع اللغة كمبتدي فيها .

معتز

لغة الباسكال هي لغة غنية تجمع بين سهولة التعلم واﻹستخدام الحقيقي في بيئة عملية، وهي مثال حقيقي للغة برمجة Native وتجمع بين الطريقتين structured و object oriented
بالنسبة للـ semicolon مع عبارة IF فهي مشكلة حقيقة، وقد حدثت لي مرة أن قمت بإضافتها في نهاية الشرط فكان يتم تنفيذ الشرط في كل اﻷحوال. سوف احاول ذكر هذا الموضوع عند التعديل القادم بإذن الله

المقداد

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

40 thoughts on “نقاش حول تعلم لغات البرمجة في الجامعات

  1. الجامعة تختلف عن العمل، حيث أن الجامعة هي فترة أكاديمية، ليس بالضرورة أن يتم دراسة لغات البرمجة أو أي أداة أخرى شريطة أن تكون اﻷفضل، بل احياناً تتم الدراسة على اﻷفكار المطبقة في تقنية معينة، حتى لو لم يستخدمها أحد. هذا التوسع في الدراسة يجعل الشخص منفتح على علم الحاسوب. بعد التخرج يصبح الوضع أضيق أحياناً حيث في كثير من المؤسسات والشركات المتخصصة في البرمجيات يصبح الشخص محصور في أدوات معينة لا يستطيع تخطيها إلى شيء آخر، ومنهم من يجلس عشرات السنوات في أداة واحدة. لذلك فرصة الجامعة هي فرصة مواتية لتحصيل أكبر كم من المعرفة ومعرفة كيف يُفكر من يقوم بإنتاج هذه التقنيات.
    أما بالنسبة لتساؤلك عن لغات البرمجة عالية المستوى، فهي لا تتيح للمبرمج معرفة جوهر الكمبيوتر والمعالج والذاكرة ونظام التشغيل، بل تجعله معزول عن كل هذا ليكون أكثر إنتاجية، فهي مفيدة لشخص ينتج إنتاج تجاري لكنها من ناحية علمية ليست جيدة.

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

  3. لغة managed ليس لها علاقة بحاجتها لمكتابات خارجية واجب نسخها للزبون، ما تقصده هو اللغات التي البايت كود، او السكربت، حتى ال Native قد تحتاج ذلك

    لا انصح باحتراف الباسكال، مع اني انصحك بتعلمها، فيها مفاهيم مختلفة عن اللغات الاخرى انا حاليا افتقد لها بعد ان تركتها.

  4. اهلا وسهلا استاذ زاهر ، المقصود باللغات الـ managed هنا هي لغات مثل الجافا والدونت والتي تعتمد علي حزم خارجية لتعمل في حالة الجافا ” الة جافا الافتراضية ” وفي حال الدوت نت تحتاج الي ” الفريم ورك ” لتعمل , قد يكون الامر ربما هو عقدة برمجية مووثة من عهود مضت وهي الاهتمام بالموارد المأخوذة من النظام من خلال البرنامج في حين ان الاجهزة الحديثة قل اهتمام المبرمجين بامور الذاكرة واستهلاك الموارد قليلا بعد ان اصبح العتاد ، بالنسبة للمكتبات للاسف فكرتي الي الان محدودة عن استخداماتها في البرامج بشكل عام , فقط اعرف التعامل مع المكتبات الاساسية مثل الاخرج والادخال ومكتبات العمليات الرياضية .
    بالنسبة لتعلم الباسكال نعم لاحظت الاختلافات بينها وبين اللغات الاخري الحديثة ولكن تعلم المفاهيم البرمجية عبرها امر مريح للمبتدء عموما خاصا اذا توفر مورد يقدم اللغة في شكل متسلسل ويعرف الاساسيات البرمجية بعدها يمكن الانتقال الي لغات اخري .

  5. تعريف الـ managed code حسب ويكيبيديا هو :
    Managed code is a term coined by Microsoft to identify computer program source code that requires and will execute only under the management of a Common Language Runtime virtual machine,

    وهو بذلك يوجد بينه وبين نظام التشغيل عازل وهو عبارة عن الـ Virtual Machine والذي لا يسمح له بالوصول إلى ذاكرة غير الذاكرة التي يوفرها له الـ Virtual Machine، وهذا حسبما أفهم.

  6. الفرق بين اللغات الطبيعية واللغات الـ managed والمفسرة ، كل اللغات في النهاية تترجم الي مستوي الالة بلا شك سواء اكانت ستحول الي البايت كود او تترجم مباشرة الي لغة الالة ، الزيادة هنا في عن اللغات التي تترجم مباشرة الي لغة الالة تكمن في موضوع الادارة , ادارة البرنامج في بيئة افتراضية قبل التشغيل وتحديد حجم الموارد المستهلكة يقع علي عاتق البيئة الافتراضية ما يهمنا هو الخصائص المستفادة من وضع البرنامج في بيئة مثل هذه هو الاستفادة من التصحيح قبل التجميع وهي في الاصل ميزة خاصة باللغات المفسرة ، ادارة الذاكرة والموارد فلغات مثل السي شارب تحمل مميزات مثل مجمعات النفايات او الـgarbage collector فلا اعتقد ان مميزات مثل هذه ستكون بدون البيئات الافتراضية .
    وعلي فكرة حتي لغات مثل السي بلس بلس يمكن تحويلها الي هذا النوع من اللغات عبر صنع بيئة افتراضية قبل التشغيل واكيد ستضيف الكثير من الخصائص للغة .
    وبالنسبة للتعريف التابع للويكيبيديا ’ تقريبا تعني ” البرامج التي يتم طلبها لا يتم تنفيذها الا تحت ادارة البيئة الافتراضية الخاصة باللغة في زمن التشغيل ” هذا حسب مافهمته من الترجمة ، ونسبيا جزئية العازل بين نظام التشغيل صحيحة فالبيئة المصنوعة من خلال الالة الافتراضية مثلا هي تشغيل البرنامج في بيئة منعزلة اولا وبعد التأكد منه يتم تشغيله هذا معرفتي عن الموضوع ككل .

  7. >تشغيل البرنامج في بيئة منعزلة اولا وبعد التأكد منه يتم تشغيله هذا معرفتي عن الموضوع ككل .
    الآلة اﻹفتراضية هي التي تقوم بتشغيل برامج البايت كود، حيث أنها ملفات ليست ثُنائية وليست لغة اﻵلة، لذلك لا يمكن تشغيلها في نظام التشغيل مباشرة. اﻵلة اﻹفتراضية تقوم بترجمة برامج البايت كود إلى لغة الذاكرة أثناء التشغيل، أي في الذاكرة فقط وليس في القرص الصلب، ثم تقوم بتشغيلها، مثلما تفعل لغات البرمجة المفسرة، حيث يقوم المُفسر أثناء التشغيل بتحويلها إلى لغة اﻵلة في الذاكرة حتى يتسنى تشغيلها

  8. لغة D هي Native و Managed بنفس الوقت، لغة PHP هي سكريبت (مفسرة) و Managed بنفس الوقت، لا ارتباط بين ال Managed و ال Virtual Machine
    حتى الباسكال هي نوعا ما Managed عند استعمال النصوص او نوع من ال object او Interfaces باسلوب Reference Count

  9. هذا يعني أن التعريف في ويكيبيديا غير صحيح إذا كانت لغة D managed و native أي لا تحتاج لتعمل تحت run-time:
    source code that requires and will execute only under the management of a run-time

  10. اصبح أصحاب الـ managed code يرون الـ Non-managed code عيباً، حيث أن اﻷول لا يسمح للمبرمج استخدام مؤشرات صريحة pointers حتى لا يحدث access violation

  11. عندما تتعامل مع مستوى منخفض التعامل مع المؤشرات ليس عيبا و ان كان يمكن تجازه باستعمال Objects قدر الامكان
    اما في التطبيقات فانا ايضا اعتبره عيبا.

  12. المشكلة تكمن في احتمال حدوث access violation أو أسواء من ذلك وهو تغيير سلوك البرنامج بطريقة غير متوقعة بسبب استخدام مؤشر يؤشر لمكان غير المخصص له، أو خارج ذاكرة البرنامج، مما يجعل نظام التشغيل يقوم بغلقه، كما يحدث في البرامج المكتوبة بلغة سي وسي ++، وبرامج أوبجكت باسكال أيضاً معرضة لهذه المشاكل.
    لكن فريق الـ non-managed يرون أن المؤشرات هي مهمة في البرامج ولا يمكن اﻹستغناء عنها.

  13. حسب معرفتي، ال Managed Code هوا الكود الذي يحتاج لمكتبة إضافية لعمله لانه لا يترجم للغة الالة مباشرة، مثل جافا تترجم لبايت كود وسي# تترجم ل IL لذلك لابد من وجود طبقة VM مثلا Java VM او MS CRL لترجمة هذا الكود للغة الالة حسب معمارية المعالج المترجم له.

    بينما لغات ال native يقوم المترجم بترجمة الكود للغة الألة المصمم لها المترجم مباشرة.

    هناك شق اخر وهو معظم لغات ال managed code لا تحتاج للتعامل مع الذاكرة بشكل مباشرة، لذلك لا تستخدم فيها المؤشرات، وليس هناك حاجة لطلب حجز مسبق لمقدار من الذاكرة وتفريغه عند الانتهاء منه مثلما يتم مع لغة سي وباسكال مثلاً.

    لكن مثلا لغة Objective C وهي لغة Native تعتمد على معمارية ARC، وبذلك لا تحتاج لتفريغ الذاكرة بعد الانتهاء منها حيث سوف يتم ذلك تلقائياً وايضا نسخ دلفي الجديدة الخاصة بالموبايل تعتمد نفس المعمارية، ايضا كما ذكر زاهر يمكن عمل نفسي الشي مع دلفي عند استخدام ال interfaces او عند التعامل مع strings, dynamic array.

  14. مرحباً بك أخ محمد نسمان بعد غيبة طويلة.
    في الحقيقة هُناك مزاعم حول أن الـ byte code يكون في بعض اﻷحيان أسرع من الـ Native وذلك لأنه يتم تحديد نوع المعالج قبل وقت الترجمة فتتم ترجمته بطريقة يُستفاد منها من كل إمكانات المعالج، فيتغير بذلك تنفيذه من جهاز إلى آخر لنفس البرنامج. أما البرامج الـ Native فيتم معها التحديد مسبقاً لإستهداف معمارية 32 عوماً أو 64 عموماً مع التضحية بالفوارق الدقيقة بين المعالجات وقدرات كل منها، حيث يتم ترجمة البرنامج على العامل المشترك اﻷصغر.
    هذا إقتباس لـ James Gosling يشرح هذا الفارق:
    http://stackoverflow.com/questions/5641356/why-is-it-that-bytecode-might-run-faster-than-native-code

    You download the latest copy of Mozilla,and it’ll run on pretty much any Intel architecture CPU. There’s pretty much one Linux binary. It’s pretty generic, and it’s compiled with GCC, which is not a very good C compiler.

    When HotSpot runs, it knows exactly what chipset you’re running on. It knows exactly how the cache works. It knows exactly how the memory hierarchy works. It knows exactly how all the pipeline interlocks work in the CPU. It knows what instruction set extensions this chip has got. It optimizes for precisely what machine you’re on.

  15. نعم هو بطيء خصوصاً عند تشغيل البرنامج لأول مرة، ويستهلك ذاكرة كبيرة.
    مرة قُمت بعمل لقياس السرعة بواسطة ألغورثم اﻷعداد اﻷوليةا، وكانت عبارة عن حلقة تقوم بمقارنة اﻷرقام وتلف حوالي 2 مليار مرة. كانت النتيجة أن سرعة دلفي وفري باسكال وجافا هي نفس الوقت، حوالي 6 ثواني، أو 6 دقائق (لا أذكر بالضبط) لكن السي شارب كانت 9

    تعدد المعماريات له أثر سلبي على البرامج الـ native. في السابق كان يكفي فقط إنتاج برنامج 32 بت لمعالج i386 لنظام وندوز. أما اﻵن فأصبح هُناك عدد كبير من المنصات وفي زيادة مستمرة. كذلك المعالجات مختلفة لنفس المنصة، وهذا كله يصب في صالح اللغات التي تعتمد على الآلات اﻹفتراضية للتشغيل.
    العام الماضي اشتريت جهاز RasberryPi وهو من معمارية ARM لم استطع تشغيل برنامج Free Pascal عليه، مع أنه يستطيع ذلك، لكن ليس بالإعدادات القياسية، يحتاج لخبرة وتغيير في الإعدادات وربما إعادة ترجمة الـ free pascal .
    أما جافا فقد عملت عليه مباشرة، ومع أن معالجه 700 ميغاهيرتز فقط وذاكرته 500 ميقا إلا أن عدد من برامج الجافا عملت عليه مثل برنامج Swing GUI و حتى برنامج الويب، اﻵن استخدم برنامج الويب الموجود فيه بصورة مستمرة في العمل، ربما اتكلم عن هذه التجربة لاحقاً.

    تعدد المعماريات في لغات البرمجة الطبيعية هي موجودة نظرياً تحت شعار write once and compile every where. لكن من ناحية عملية فالموضوع صعب. مثلاً لازاراس تجد أنهم ينصحون بإستخدام نُسخة Win32 بت حتى في وندوز 64 بت حتى لو كان الهدف إصدار برامج 64 بت، لديهم مشاكل أو مشكلة لم يتم علاجها بعد في بيئة وندوز 64 بت.

    برنامج توربو بيرد أقوم بترجمته إلى أربعة منصات Win32, Win64, Linux32, Linux64. وهي عملية مرهقة،أحتاج لثلاث أنظمة تشغيل لأقوم بذلك. يوجد شخص يقوم بترجمتها إلى Macintosh لكنه لا يتوفر دائماً، لذلك نُسخة الماكنتوش دائماً متأخرة.

    المشكلة الحقيقية في البرامج الـ managed ليست السرعة، لكن استهلاك الذاكرة، حيث أن السرعة ربما تختلف فقط في تشغيل البرامج، لكن استهلاك الذاكرة يمكن أن يصل إلى 10 أضغات أو 20 ضعف.

  16. سبب استهلاك الذاكرة ليس له علاقة بكونها Byte Code
    لغة D هي Native لكنها تأحذ ذاكرة كبيرة لانها تستعمل GC اي ادارة الذاكرة بنفسهها مثل الجافا و السي شارب
    فشي freepascal في الراسبيرباي يرجع لقدم ععد الكود لديها و التوافقية.

    حتى الجافا لاتعمل على كل الاجهزة مثل اجهزة الاندوريد مثلا او IOS

  17. سبب استهلاك الذاكرة يمكن قراءته في هذا الرابط:
    http://java.dzone.com/articles/why-does-my-java-process
    منها:
    Garbage collection, JIT Optimization,
    نعم الجافا لاتعمل في IOS, Android وذلك لعدم وجود JVM فيها. فإذا تم عمل JVM في هذه اﻷنظمة متوافقة مع الـ JVM القياسية يُمكن حينها تشغيل برامج جافا. لكن اعتقد أن عدم وجود JVM لهذه المنصات مشاكل تنافسية و استراتيجية، فلا يُعقل أن تقوم شركة أوراكل بمقاضات قوقل على أندرويد ثم تقوم بعمل منصة جافا له.
    لكن على اﻷقل كود جافا (السورس) يمكن نقله إلى Anroid مثلاً إذا كانت لديك مكتبة للتعامل مع قاعدة البيانات مثلاً أو للإتصال مع مخدمات الويب HTTP/ Socket/ Web service clients
    كلها مشتركة بين الجافا SE وجافا الـ Anroid

  18. يوجد عامل آخر له أهمية أكبر من أداء لغة البرمجة ومن استخدامها للموارد، وهو الدعم الفني لها واﻹنتاجية العالية، واﻹستخدام التجاري. فاللغات واﻷدوات ذات اﻹنتاجية العالية والدعم المتوفر والمستخدمة تجارياً بكثرة هي التي تنجح. لذلك فإن ظهور لغات برمجة جديدة بمواصفات ممتازة و تُمثل الإحتياجات الحديثة، ربما لا تلقى نجاح بسبب هذه العوامل التي ذكرتها، مثل لغة Google go و Ceylon كلها لا تستطيع منافسة اللغات اﻷقدم مثل جافا وسي والتي لها دعم فني كبير جداً ومالانهاية من الصفحات التي تتكلم عن التجارب وحل للمشاكل، والمكتبات التي تغطي كل اﻹستخدام التجاري في كافة المجالات.

  19. سبب ظهورmanaged كود هي المشاكل الناتجة عن ال Pointer ، خاصة الامنية.
    بالنسبة للسرعة فالفرق مع native يقل اكثر فاكثر مع العتاد الجديد.
    شخصيآ اعمل اكثر على javascript حيث اصبح بالامكان برمجة تطبيقات دات آداء جيد ما جعل javascript الاكثر تعدد للمعماريات.

  20. @أبو اياس،

    منذ أكثر من عشرين عام وعند ظهور الجافا وهناك مزاعم أن سرعة التنفيذ تقارب من لغات ال Native مثل سي++، لكن معظم الإختبارات التي تتم تكون على مميزات موجودة فيها، أعتقد هناك اختبار في الجافا او السي# يظهر أن عملية ال hashing أسرع من لغات من سي++، لكن عملياً وذلك لأنه يتم عمل أقصى تحسين لهذه العمليات، لكن لو جربت أنت تقوم ببناء أي خورازمية بين لغات ال Managed و Native، فلن يمكن الوصول لسرعة ال native بأي لغة من ال Mnaaged.

    @زاهر،

    إستهلاك الذاكرة أكبر دائما في لغات ال Managedلأنه هناك ذاكرة إضافية لل VM بالإضافة إلى ما يحتاجه البرنامج نفسه، لكن في ال Native تكون الذاكرة خاصة بالبرنامج فقط.

    @azrak،
    الموضوع الأمني ليس مشكلة، لكن دائما ما كان يروج لهذا الموضوع بشكل مستمر، لغة سي تسمح بالكتابة في أي موقع في الذاكرة، لكن النسخ الجديدة من نظم التشغيل أصبحت لا تسمح بهذا بشكل مباشر مثل ما كان سابقاً أيام ويندوز 95 و98
    لكن أيضا إستخدام المؤشرات اساس معظم العمليات التي تحتاج إلى تحسين التعامل مع البيانات في الذاكرة. لكنها سلاح ذو حدين.

    اللغات المعتمدة على أوبجت باسكال تستخدم المؤشرات بشكل ضمني، لذلك هي موجودة لضمان السرعة لكن لن تحتاج للعمل بها وفهمها مثل اللغات المعتمدة على لغة سي ومشتقاتها

  21. في اللغات التي تعتمد ال GC لا تقوم بتحرير ال object فورا، بل ممكن يبقى مدة طويلة في الذاكرة، لذلك لن تجد حدث virtual يخبرك متى تم تدمير ال object جرب ابحث عنه في الجافا، لانك من الافضل ان لا تعرف 😀

  22. صحيح، الاصل في لغات ال Managed أن لا تقوم بذلك بنفسك، فعملية تفريغ الذاكرة في لغات ال managed تتم من خلال ثلاث طرق:
    1. عندما يصبح حجم الذاكرة كبير، يقوم الGC بالعمل على تفريغها.
    2. في لحظات الخمول للجهاز، يتم استدعاء ال GC للعمل على تفريغ الذاكرة في الخلفية حتى لا يؤثر على الأداء.
    3. عند استدعاء ال GC بشكل مباشر، مثل gc.collect، لكن لا ينصح بها لانها سوف تسبب بطء في البرنامج.

  23. موضوع الـ garbage collector في رأيي هي ميزة مهمة.
    في أحدى البرامج التي كتبتها بواسطة دلفي كان فيها تسريب في الذاكرة memory leak حيث يتضخم حجم البرنامج كثيراً إلى أن يقوم بحجز كل الذاكرة في الجهاز. راجعت الكود وقمت بتغييرات لكن دون فائدة. في النهاية اصبحت أراقب حجم ذاكرة البرنامج، فإذا زادت من 200 ميقا يقوم البرنامج بغلق نفسه ثم العمل مرة أخرى. وبعد اربع سنوات اكتشفت المشكلة وكانت بسبب الكتابة في الـ Memo بكثرة ومسحها، حيث تبين أن المسح لا يعمل، أو به مشكلة، وعند الإستغناء عن الـ Memo واستبدالها بـ Label لكتابة آخر حدث يحدث في البرنامج تم حل المشكلة جذرياً.
    بالنسبة لموضوع السرعة، فأكثر البرامج التي قُمت بتكابتها بالجافا هي برامج ويب، وهي سريعة جداً وليس هُناك أي فرق بينها وبين الـ Apache مثلاً، حيث أن الجافا تستخدم مخدمات ويب مكتوبة بالجافا نفسها مثل Apache Tomcat. أكثر من مرة عملت عليها تجارب لمعرفة الحد اﻷقصى للطلبات في الثانية، وكانت النتيجة مطابقة للـ PHP بل أفضل في بعض اﻷحيان.
    أما مقارنة بالدلفي Web broker أو IntraWeb فالجافا JSP والـ Servlet أفضل بكثير، على اﻷقل لا يحدث memory leak بسبب الـ Garbage collector.
    كما قال اﻷخ Azrak فإن الفارق في السرعة يتقلص كل مرة في المستقبل مع زيادة قدرة المعالجات ومع زيادة الـ optimization بالنسبة للـ JVM.
    طبعاً اﻷفضل من الدراسات المكتوبة في النت هو أن يقوم الشخص بالتجربة بنفسه حتى لا تكون المعلومات التي يقرأها عن لغة معينة هي نظرية بحتة.

  24. لم احب ال GC لهذا السبب، لانها عادت بنا لنقطة الصفر
    بدون ال GC انت مضطر لقتل الكائن بنفسك، مثلا انشأت connection لقاعدة بيانات انت مضطر ان تطلب connection.free مثلا لكي تقتله، عند حدث ال destroy اطلب توابع فك الاتصال و انها مايجب انهاءه في الكائن connection ، طبعا اذا اخطأت و لم اطلبه سيحدث memory leak

    في حالة ال GC لست مضطرا لأن اطلب قتل الكائن، لكن ال GC لن يقتله و سيبقى الاتصال مفتوحا طوال ماهو في الذاكرة، عندما سألت عن الحل كان الرد اطلب تابع خاص لفك الاتصال مثلا connection.disconnected طبعا اذا نسيته سبيقى في الذاكرة و هي حالة شبيهة ب ال memory leak بالنسبة لي ايضا.

    طالما يجب ان اطلب تابعا عند الانتهاء من الكائن فأنا افضل ان ادير العملية بيدي و احرر الكائن افضل من ان انتظر GC ليقوم بذلك.

  25. المشكلة في لغة جافا أنه لا يوجد فيها destroy أو Free فقط تقوم بعمل close، وصحيح أنك تحتاج لإغلاق الـ connection بنفسك عند النهاية، هذه مشكلة حقيقية واجهتها. كان المفترض أن يكون الحل هو بعمل override للـ destroy ووضع الـ close هناك، لكن لم أجد هذه الطريقة.
    في لغة باسكال ودلفي هذه المشكلة موجودة أيضاً، حيث لا بد من إغلاق اﻹتصال مع قاعدة البيانات عند الإنتهاء من استخدامها وإلا اصبحت متصلة، لكن الفرق هو أنك تستطيع وضع الـ close عند الـ Destroy والتي يتم ندائها تلقائياً عند استدعاء free وبهذه الطريقة يكون لا يتم إغلاق اﻹتصال إلا عند نداء free وعند لغات الـ GC لا يتم اﻹغلاق إلا عند نداء close وفي هذه الحالة نفس المشكلة في كلا النوعين لابد من استدعاء إجراء لإغلاق اﻹتصال

  26. @أبو إياس :
    قبل جافا 7 کنا نکتب :

    PrintWriter pw = null;
    try {
       File file = new File("C:\\test.txt");
       pw = new PrintWriter(file);
    } catch (IOException e) {
       System.out.println("error");
    } finally {
       if (pw != null) {
          try {
             pw.close();
          } catch (IOException e) {
          }
       }
    }
    

    جافا 7 ادخلت try-with-resources Statement :

    public static void viewTable(Connection con) throws SQLException {
    
        String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
    
        try (Statement stmt = con.createStatement()) {
            ResultSet rs = stmt.executeQuery(query);
    
            while (rs.next()) {
                String coffeeName = rs.getString("COF_NAME");
                int supplierID = rs.getInt("SUP_ID");
                float price = rs.getFloat("PRICE");
                int sales = rs.getInt("SALES");
                int total = rs.getInt("TOTAL");
    
                System.out.println(coffeeName + ", " + supplierID + ", " + 
                                   price + ", " + sales + ", " + total);
            }
        } catch (SQLException e) {
            JDBCTutorialUtilities.printSQLException(e);
        }
    }
    

    لا داعی لإغلاق الـ connection بنفسك عند النهاية . لان الکاێن java.sql.Statment implement AutoCloseable and Closeable interfaces.

  27. نعم صحيح، لكن هذا لا يمكن عمله مع قاعدة البيانات.
    مثلاً لديك Class لقاعدة بيانات، تستخدمها لفترة في البرنامج، فلا مفر من استخدام أمر اﻹغلاق بعد الإنتهاء منها حتى تستخدم إتصال واحد:

    MyDB db = new MyDB();
    db.readCustomer...
    displayCumstomers..
    db.updateInfo().
    display another thing
    db.close();
    
  28. java.sql.Connection is interface that extend from AutoCloseable ,
    AutoClosable interface have one method : void close() throws Exception.
    Closes this resource, relinquishing any underlying resources. This method is invoked automatically on objects managed by the try-with-resources statement.

    یمکنک تجربە :

    
    public class testCase implements AutoCloseable {
    
        public void doSomeWork() throws Exception {
            System.out.println("do Same work Message");
        }
    
        @Override
        public void close() throws Exception {
            System.out.println("closing Message");
        }
    
        public static void main(String[] args) {
    
            try (testCase res = new testCase()) {
    
                res.doSomeWork();
    
            } catch (Exception e) {
    
                System.out.println(e);
    
            }
    
        }
    
    }
    
    
  29. یمکنک إغلاق الـ connection بنفسك connection.close() لکن لا تنسا Connection#commit() لتفادی SQLException:

    Connection con = null;
    try {
        // assume this method returns an opened connection with setAutoCommit(false)
        con = createConnection(); 
    
        // do DB stuff
    
        con.commit();
    } catch (SQLException e) {
        if (con != null) {
            // what if con.commit() failed, is this still necessary,
            // will it hurt anything?
            con.rollback();
        }
    } finally {
        if (con != null) {
            con.close();
        }
    }
    
  30. قمت بتجربة AutoCloseable لكن لم يحدث شيء، لم يتم نداء close تلقائياً، وجوده مثل عدمه واحد.
    الفكرة كانت أني لا أريد نداء con.close() لكن كان من المفترض أن يقوم الـ Garbage collector بإغلاقها

  31. جافا 7
    لدي كلاس إسمها SQLConnection استخدمها في باقي الكلاسات:

    public class SQLConnection implements AutoCloseable {
        Connection connection = null;
        String lastError;
    
    .....
    
        @Override
        public void close() {
            if (connection != null){
                try {
                  connection.close();
                  General.writeEvent("Connection closed", "");
                  
                } catch (SQLException ex) {
                    General.writeEvent("Error while closing connection: " + ex.toString(), "");
                }
            }
        }
    
    
        

    يتم استخدامها في كلاس اسمه Hours

    public class Hours extends SQLConnection {
    
    

    ثم يتم استخدام Hours في داخل البرنامج كالآتي:

              if (request.getParameter("insert") != null){
                  try{
                    Hours hours = new Hours();
                    double h = Double.parseDouble(request.getParameter("hours"));
                    String details = request.getParameter("details");
                    Operation op = hours.insertHour(userID, projectid, h, aday, details);
                    if (op.success){
                        out.println("<p id='infomessage'>Added</p>");
                        hours.insertLog(userID, 4);
                    }
                    else
                    {
                        out.println("<p id='errormessage'>" + op.errorMessage + "</p>");
                    }
                    hours.close();
    
                  }
                  catch (NumberFormatException | IOException ex){
                        General.writeEvent("Error in Methods.insertHour:" + ex.toString(), null);
                  }
              }
    
    

    عندما حذفت hours.close(); لم يتم إغلاق اﻹتصال تلقائياً، أي لافرق عند إضافة AutoCloseable وبين حذفها

  32. لا داعي ل hours.close();
    ضع ما ترید لل Garbage collector بإغلاقها داخل try catch :

    try (Hours hours= new hours();) {
            
        double h = Double.parseDouble(request.getParameter("hours"));
        String details = request.getParameter("details");
        
            ...;
    }
    

    او داخل SQLConnection کالمثال اعلاە .
    try (Statement stmt = con.createStatement())…

  33. الطريقة اﻷولى قمت بتجربتها ونجحت. شكراً لك
    الطريقة الثانية استخدمها لإغلاق الـ Statement أو ResultSet
    بالمناسبة، كيف تكتب اسمك باللغة العربية، وكيف يُنطق Azrak anonim

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s