jalmod

سؤال بسيط يراودني كثيرا عندما تعلمت لغة JAVA

5 ردود في هذا الموضوع

السلام عليكم و رحمة الله و بركاته...  :) 

أعضاء الفريق العربي للبرمجة جميع أتمنى أن تكونوا في أحسن حال  :D 

 

و أنا فخور لأني أتواجد اليوم بينكم في هذا الصرح الشامخ  ^_^ 

 

لدي سؤال بسيط جدا جدا أتمنى لو أجد جوابا شافيا له عندكم  :hmm: 

 

أنا درست في الجامعة لغة البرمجة C و ++C و هذه السنة انتقلنا الى دراسة لغة JAVA

و لاحظت مدى التشابه الكبير بينها في النص البرمجي Syntax مثلا جمل التحكم مثل if , if else, if elseif و for, while, do.. while

جميعها متشابه تماما كما في لغة C

 

حتى طريقة تعريف المتغيرات int , float, double, char هي نفسها في لغة C !  :blink:

 

فسؤالي هو

س : ما الفائدة من ابتكار لغة برمجة مشابه للغة أخرى ؟

س : و ما هي قصة لغة JAVA ؟

س : و لماذا كل هذه الضجة حولها ؟

س : و لماذا لا نستخدم لغة ++C بدلا عنها لأنها مشابه لها تماما ؟

 

و في الختام شكرا جزيلا لكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
س : ما الفائدة من ابتكار لغة برمجة مشابه للغة أخرى ؟

تسهيل انتقال المبرمجين من لغتهم للغة الجديدة بأقل مجهود، و لأن أسلوب برمجة اللغه الأصلية سهل و محبوب.

 

 

س : و ما هي قصة لغة JAVA ؟

قصة طويلة، أبحث فى جوجل.

 

 

س : و لماذا كل هذه الضجة حولها ؟

لا أعرف، قد يكون لأنها تعمل على أغلب المنصات بنفس الكود ... ربما :)

 

 

س : و لماذا لا نستخدم لغة ++C بدلا عنها لأنها مشابه لها تماما ؟

بعض الأمور تستطيع إنجازها فى الجافا بشكل أيسر و أبسط مما ستكون عليه فى ++C و العكس صحيح، و كما أن لكل مقام مقال فلكل لغة برمجة نمط محدد من البرامج تعمل فيه افضل من غيرها.

 

 

و الله ولي التوفيق

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جافا تختلف كثيراً عن c++، الإختلاف في الكتابة ليس كثير لأنها تستخدم صيغ عائلة c (الأقواس المعقوفة {}، do while for، else else if) لكن طريقة عمل اللغة مختلفة كلياً (أنت تنظر لطريقة الكتابة وليس لعمل اللغة).

 

أبرز اختلاف أن c++ تحول برامجها لأسمبلي ثم تعليمات معالج، أي أن البرنامج الذي تكتبة لمعالج i386 لن يعمل على معالج mips.

 

المعالج i386 يفهم البيانات:

\x66\xb8\x01\x00

بأنها نقل رقم 16 بت (1) لمسجل ax (تقابل mov ax, 1).

 

نفس التعليمة تقريباً في معالج mips:

\x20\x08\x00\x01

اضافة رقم 16 (1) لمسجل $t0 و $0 (تقابل addi $t0, $0, 1)

 

أيضاً هناك اختلاف في الملف التنفيذي بين الأنظمة (القالب الذي يضم تلك التعليمات مع معلومات أخرى)، نظام ويندوز يستخدم بنية pe ولينكس يستخدم elf، نفس البرنامج لنفس المعالج لن يعمل إذا اختلف النظام.

 

جافا تستخدم تعليمات أسمبلي (java bytecode) خاصة بها لمعالج وهمي (java vm)، نفس العملية السابقة تفابل في جافا:

\x04\x3b

هي تعليمتين (هناك تعيلميات مخصصة iconst_X لوضع الأرقام من 0 إلى 5 في المكدس، نظراً لشيوع هذه العمليات، مثل i = 0 و i = 1 وغيرها):

iconst_1      ضع الرقم 1 في أعلى المكدسistore_0            حمل مافي أعلى المكدس لمسجل المتغيرات صفر

الآن آلة جافا ممكن أن تقرأ هذه التعليمات وتنفذها، شيء كهذا:

while(1){  uint8_t inst = java_vm_read_byte(file);  switch(inst)  {    ...    case 0x04:      java_vm_stack_push_int(1);      break;    ...    case 0x3b:      jint n = java_vm_stack_pop_int();      java_vm_set_variable_0_int(n);      break;    ...  }}

لكن أغلب آلات جافا لاتنفذ التعليمات بل تحولها لتعليمات المعالج المستخدم لتسريع الأداء (just in time compilation).

 

الإختلاف الثاني المهم في طريقة إدارة الذاكرة الديناميكية، في c++ إذا احتجت مساحة من الذاكرة، تقوم يدوياً بطلبها (سواء باستخدام new أو malloc) ثم تحررها يدوياً (باستخدام delete أو free)، البعض يستخدمون المؤشرات الذكية مثل std::unique_ptr و std::shared_ptr، يغللف المؤشر داخل class ويحذف المؤشر داخل الهدام destructor لكنها لاتحل كل المشاكل.

 

في جافا إدارة الذاكرة آلية، لاتجز المساحة يدوياً بل تطليها وتعطيك آلة جافا كائن فيه خانه تمثل عداد الإستخدام reference counter، أول ماتنشئ الكائن يكون العداد 1 وعندما تجعل متغير يشير لكائن يزيد وعندما يلغلي المتغير الإشارة للكائن ينقص، إذا وصل للصفر فيحذف الكائن آلياً وتحرر الذاكرة التي حجزها، شيء كهذا:

    Object o1 = new Object(); // ref_counter = 1    Object o2 = o1;           // ref_counter++ (2)        o2 = null;                // ref_counter-- (1)    o1 = null;                // ref_counter-- (0 => مات)

هذه لاتحل كل المشاكل كالمشكلة في هذا المثال:

class Klass{  public Klass klass;}class file{  public static void main(String args[])  {    Klass o = new Klass(); // ref_counter = 1        o.klass = o;    // ref_counter++ (2)    o = null;      // ref_counter-- (1)  }}

رغم أنه لن يمكننا الوصول للكائن الذي كان o يشير له، لكن عداد الإشارة لايزال 1 لذا لن يحذف وسيبقى عالق في الذاكرة (هنا تعجز المؤشرات الذكية c++ كـshared_ptr لأنها تستخدم أيضاً العداد).

 

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

 

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

 

هذه ربما أهم الفروقات بين اللغتين.

 

أنت طالب حاسب، الأرجح أنك ستأخذ مستقبلاً مادة عن مفاهيم لغات البرمجة programming language concepts ومادة عن بناء المصرفات compilers design، ركز فيها ورايح تعطيك معلومات كثيرة تفهم بها أي لغة.

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ما شاء الله ردود ممتازة

إنما صاحب الموضوع هاجر باين عليه!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
س : ما الفائدة من ابتكار لغة برمجة مشابه للغة أخرى ؟

 

 

لا  فائدة

 

 

س : و ما هي قصة لغة JAVA ؟

 

شوية ناس مبرمجين أرادوا حل مشكلة دعم البرنامج بين عدة انظمة تشغيل وهاردوير. فعوضا من حل المشكلة بالشكل السليم (نشر شفرة المصدر وتطبيق مكتبات معيارية شاملة على نهج POSIX) قرروا حل المشكلة بالشكل الغير سليم (انشاء virtual machine و memory hog)

 

 

س : و لماذا كل هذه الضجة حولها ؟

 

لانه عمليا في يومنا هذا، هذا هو الحل الوحيد السهل لإنشاء برنامج cross-platform لان البشر أخطؤوا ولم يحلوا المشكلة بالشكل السليم.

 

 

س : و لماذا لا نستخدم لغة ++C بدلا عنها لأنها مشابه لها تماما ؟

 

حتى لو هناك برنامج يستخدم مكتبة C++11 المعيارية الباينري المخرج من الكومبايلر مخصص لجهاز من نوعية معينة. يعني لا يمكن تشغل برنامج كومبايلد ليعمل على جهاز SPARK على جهاز Intel. الجافا يحل المشكلة حيث انك تقوم بكومبايل البرنامج ليعمل على الvirtual machine للجافا والشركة المصنعة للجافا قامت بإنتاج هذا الvirtual machine لعدة انظمة تشغيل وهاردوير.

 

طبعا هذا ليس حل جيد بل "تاجيل للمشكلة" حيث انهم نقلوا المشكلة من نطاق إلى نطاق آخر وليس حق حقيقي. يعني برنامج جافا حديث قد لا يعمل على java virtual machine  قديم. لكن معظم البشر مبسوطين لان تحديث السوفتوير اسهل من تغيير الهاردوير.

 

الحل الصحيح هو: اعتماد مكتبات معيارية شاملة + تطبيق هذه المكتبات الشاملة + كتابة الكود بشكل نظيف + نشر شفرة المصدر لنتمكن عمل الكومبايل على الأجهزة الأخرى

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .