الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لماذا برامج الجافا بطيئة ..... ؟

بدأه بنت اليمن في 22 فبراير 2006 · 25 رد · 6,776 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لغة جافا لغة جميلة و تفتح افاق عديدة لإحتراف البرمجة الهدفية OOP ،،،

غير ان الشيء الذي لا احبه في جافا هو ان تنفيذ البرامج فيه فيها بطيء جداً .. حتى ان البرامج المصصمة بإستخدام الجافا بطيئة مقارنة بغيرها ..

اذا كنت مخطئة .. فصوبوني ... .. او اقنعوني ان هذا شيء ممكن تداركه !!!

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#2

السرعة في تنفيذ البرامج مسالة نسبية

و لكن ان كانت الجافا بطيئة فانا اعتقد انا البطا يعود الى ان الجافا تستخدم JVM و التي تاخذ و قت اضافي

منقطع من حين لاخر

#3

هناك بيئة تطوير حديثة للغة ال Java تقلل من بطئها كثيراً ،

لدى الأخ بشير النعيمي معلومات عنها ..

أعتقد أننا لن نحس ببطء ال java مع الجيل الجديد windows vista

لأن microsoft قد تعهدت بتضمين JVMم ع ال windows نفسه،

نبقى بانتظار أحد الخبراء في المنتدى لتوضيح الأمر ..

اللهم طهر أرض فلسطين من العملاء والخونة

#4

لغة الجافا بطيئة لأنها تتكون من عنصرين جوهريين يتسببان في بطئها مقارنة باللغات الأخرى! إلا أن هذين العنصرين هما السبب في توجه الكثير إليها!

العنصرين هما:

1- الحاسب الوهمي: يتمتع مبرمج الجافا أنه لا يبرمج على جهاز معين، فبرنامجه يعمل على جهاز وهمي! فهو لا يبرمج برنامجه ليعمل فقط على جهاز معين مثل Windows أو Linux به برنامجه يعمل على JVM وهذا الجهاز الوهمي هو المسؤول عن تنفيذ البرنامج في داخله!

ماذا يعني هذا؟ يعني هذا أن برنامجك يترجم إلى JVM و هذا الجهاز بدوره يترجم الأوامر (حسب الجهاز الذي يعمل عليه) ليعمل بالصورة المطلوبة على الجهاز الفعلي أيا كان! مثلا، مبرمج J2ME للجوال، لا يبرمج على الجوال فعليا! مثلا أنا صنعت برامج تعمل على الجوال،، لكني صراحة لم أبرمج برامج جوال حقيقة، أنا برمجت على جهاز محمول وهمي!! وبسبب أن هذا الجهاز الوهمي موجود في كل أنواع الجوالات (تقريبا كل الجوالات تحوي JVM خاص بها) تعمل برامجي في كل الجوالات! هل برامجي تتحكم فعليا في الجوال؟ لا.. برامجي تتحكم في الجهاز الوهمي، والجهاز الوهمي بدوره ينفذ الأوامر على الجهاز المطلوب!

أنا صنعت برنامج شبكي أو Web Program بالجافا.. ماذا يعني هذا؟ يعني أني أحتاج إلى خادم وهمي!! فأنا لا أحتاج إلى Microsoft Server مثلا ولا إلى Linux Redhat server! برنامجي سيعمل مثلا على الأجهزة الوهمية التالية: WebSphere من IBM ، أو JBoss من لا أدري! أو Sun Application Server من Sun، أو JRun من لا أدري!! وغيرها وغيرها! وكل هذه الخوادم لها JVM! وبذلك برنامجي يعمل على أيا من هذه الخوادم!

مثلا صنعت Applet ويستخدم JavaBeans، يعمل على المتصفح، برنامجك سيعمل في كل من FireFox، IE, Opera, Mozilla, Netscape, وأي متصفح آخر! ليس مثل ActiveX مثلا (صوبوني إن كنت مخطئا)

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

خذ مثال عكسي: مبرمج C++ سمبيان للجوال، يبرمج على الجوال نفسه، ويتحكم فيه مباشرة، طبعا في النهاية برنامجه سيعمل فقط على جوالات سمبيان المعروفة! ولن تعمل على جوال فيه نظام غير سمبيان!

أعتقد الآن عرفت إحدى الأسباب التي تجعل الكثير من المبرمجين يتوجهون إلى الجافا، ونفسه سبب في بطئ اللغة مقارنة بغيرها! الأمر الذي يهدد مستقبل نظم التشغيل الاحتكارية مثل Windows من Microsoft. لأن هذه البرامج تجعل لك الحرية في اختيار أي نظام تشغيل، أما البرامج المصنوعة من لغات أخرى تربطك بنظام معين!

2- البرمجة الغرضية التوجه. أو OOP: هذه اللغات عموما أبطأ من أختها الكبرها اللغات الهيكلية مثل سي و VB وغيرها! وأعتقد أنك تعرف السبب، ولن أتطرق إلى شرح هذه الفلسفة!

نعود إلى السؤال.. هل الجافا بطيئة إلى حد اليأس؟ لا... بعد التجربة، يتضح أن الجافا ليست بطيئة، بل تبدو اللغة في بعض الأحيان أسرع من قريناتها! لكن للخلاصة،، الجافا أبطأ نسبيا من قريناتها وليست بطيئة لحد الكلمة!

مثلا متصفح Opera مبرمج بالجافا، ومستخدموه يدعون أنه أسرع من كل من Firefox و InternetExplorer! طبعا جربت هذا ووجدت هذا فعلا ظاهرا أن Opera أسرع! لكني لن أقول أن Java أسرع من سي ++ عامة! كل ما أقوله أن جافا ليست بالبطء الذي يرمونه به منافسوها! (ملاحظة أنا مستخدم FireFox بصفة دائمة! وأستخدم Opera فقط على الجوال!! برنامج رائع حقا!!، ينبغي أن يكتب عنه في قسم المقالات!)

أطلت عليكم،

بالمناسبة ابحث في المنتدى، ربما تجد المزيد!

#5

في الحقيقة كلام جميل جداً ..

فقط انا افكر ان عملية مرونة من حيث نظام التشغيل جعل منها تنافس اللغات الاخرى .. على الرغم من ان البطيء - بحسب وجهة نظري - عيب كبير ..

على هذا الاساس هل من الممكن الاعتماد على البرامج الطبية لو لبعسكرية التي تنبى بلغة جافا .. لا اعتقد ذلك ..

و ايضاً .. الدوت نت ممكن تغطي هذا الغرض ... لا ادري .. ما رأيكم ؟

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#6

الحقيقة تقال بان الجافا ليست متفوقة ببرامج سطح المكتب ... و لكنها منافس قوي جدا بمجال EE و ME

و الجافا هي اللي تصلح للتطبيقات العسكرية :)

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#7

كيف ؟؟ :D ...(هو ممكن في حالة ارسال امر امريكي لضرب مجاهدين في العراق ... لان التأخير بيعطي لإخونا فرصة للكر و الفر !!)

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#8

لكن بجد ... ما هي البرامج التي تتفوق جافا فيها ؟؟؟

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#9

هل أسئلتك مطروحة للثقافة العامة؟ يمكنك التثقف من هنا:

www.google.com

www.java.com

www.java.sun.com

http://java.sun.com/j2ee/

http://java.sun.com/j2me/

http://java.sun.com/products/javacard/

http://java.sun.com/webservices/

http://java.sun.com/integration/

أم أنك تريدين فعلا تصميم برنامج عسكري؟! وتواجهك مشكلة في اختيار التقنية، والأجهزة والأسلحة المستخدمة،ونوع الرصاص الخ... أو برنامج طبي، وأنت محتارة في نوع الليزر الذي تريده شراأه لعملية زراعة القلب؟ وبذلك تسألين عن أمر تشغيل الجهاز بأي لغة أنسب؟!

#10

لا ... بكل بساطة اريد ان اعرف لماذا هذه الضجة حول الجافا!! ... اين هو ميدانها .. ؟

اعذروني على الازعاج :D بس انا اشتغلت على الجافا .. و اريد اعرف من وين تاتي اهميتها ..

خلو البرامج المعقدة على جنب (العسكرية و الطبية ....)

و كمان المقدمات الخاصة بكل لغة (التثقيفة على قولة اخونا ابو مازن) .. <بالمناسة .. مشكور اخي الكريم ابو مازن على الوصلات>

لماذا جافا هي الخيار المحبب لبرمجة الالعاب و الجوالات ..

و الله انا اسال بجد .. و اريد من احد تعمق في الجافا اي رد ..

يعني مثلا لمن احد بسألني عن اهمية جافا .. كيف ارد ؟؟؟ :)

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#11

يوجد موضوع لانوريكا .. في قسم المقالات تناقشنا به مطولا اتمنى ان تتطلعي عليه ربما يحوي العديد من الاجابات

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#12

الف الف شكر اخي رامي .. هذه هي المناقشة التي كنت احتاجها و لا ادري كيف فاتتني ..

لكل مهتم .. هذا هو رابط الموضوع :

نقاش يهم كل مبتدئ فى برمجة الجافا للأجهزة الشخصيه, عدلت العنوان :) || هل jvm بطيئة؟

و اعتذر على تكرار الموضوع ..

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#13

أيوه بحب أصطاد فى الأوقات دى :D

الحسنة الوحيده للجافا البطيئة فى موضوع الجوالات أنها مش بطيئه! أصلا الجولات بطيئة جدا وبالتالى الواحد أصبح صابرا على أى لعبه أو برنامج على الموبايل سواء مصنوع بالجافا أو سى++ أو حتى بايثون :)

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

#14

لاحظي أن الموضوع من أنور منقح عدة مرات، يعني مثلا جميع الردود تقريبا في تلك المشاركة كانت ترد على مشاركة محذوفة ليست موجودة الآن! أقترح الانتباه إلى تاريخ كل مشاركة وتاريخ تحريرها أيضا لاتضاح قراءة الموضوع بأكمله!

#15

شكراً لكم جميعاً على الاهتمام ...

بس .. انوريكا .. لازم تنتبه لاني -و بشكل مؤقت- إنضممت الى اخونا الجافيين :D ...

بنت اليمن ،،

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#16
حسام الملحم أبومازن كتب:
لغة الجافا بطيئة لأنها تتكون من عنصرين جوهريين يتسببان في بطئها مقارنة باللغات الأخرى! إلا أن هذين العنصرين هما السبب في توجه الكثير إليها!

العنصرين هما:

1- الحاسب الوهمي: يتمتع مبرمج الجافا أنه لا يبرمج على جهاز معين، فبرنامجه يعمل على جهاز وهمي! فهو لا يبرمج برنامجه ليعمل فقط على جهاز معين مثل Windows أو Linux به برنامجه يعمل على JVM وهذا الجهاز الوهمي هو المسؤول عن تنفيذ البرنامج في داخله!

ماذا يعني هذا؟ يعني هذا أن برنامجك يترجم إلى JVM و هذا الجهاز بدوره يترجم الأوامر (حسب الجهاز الذي يعمل عليه) ليعمل بالصورة المطلوبة على الجهاز الفعلي أيا كان! مثلا، مبرمج J2ME للجوال، لا يبرمج على الجوال فعليا! مثلا أنا صنعت برامج تعمل على الجوال،، لكني صراحة لم أبرمج برامج جوال حقيقة، أنا برمجت على جهاز محمول وهمي!! وبسبب أن هذا الجهاز الوهمي موجود في كل أنواع الجوالات (تقريبا كل الجوالات تحوي JVM خاص بها) تعمل برامجي في كل الجوالات! هل برامجي تتحكم فعليا في الجوال؟ لا.. برامجي تتحكم في الجهاز الوهمي، والجهاز الوهمي بدوره ينفذ الأوامر على الجهاز المطلوب!

أنا صنعت برنامج شبكي أو Web Program بالجافا.. ماذا يعني هذا؟ يعني أني أحتاج إلى خادم وهمي!! فأنا لا أحتاج إلى Microsoft Server مثلا ولا إلى Linux Redhat server! برنامجي سيعمل مثلا على الأجهزة الوهمية التالية: WebSphere من IBM ، أو JBoss من لا أدري! أو Sun Application Server من Sun، أو JRun من لا أدري!! وغيرها وغيرها! وكل هذه الخوادم لها JVM! وبذلك برنامجي يعمل على أيا من هذه الخوادم!

مثلا صنعت Applet ويستخدم JavaBeans، يعمل على المتصفح، برنامجك سيعمل في كل من FireFox، IE, Opera, Mozilla, Netscape, وأي متصفح آخر! ليس مثل ActiveX مثلا (صوبوني إن كنت مخطئا)

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

خذ مثال عكسي: مبرمج C++ سمبيان للجوال، يبرمج على الجوال نفسه، ويتحكم فيه مباشرة، طبعا في النهاية برنامجه سيعمل فقط على جوالات سمبيان المعروفة! ولن تعمل على جوال فيه نظام غير سمبيان!

أعتقد الآن عرفت إحدى الأسباب التي تجعل الكثير من المبرمجين يتوجهون إلى الجافا، ونفسه سبب في بطئ اللغة مقارنة بغيرها! الأمر الذي يهدد مستقبل نظم التشغيل الاحتكارية مثل Windows من Microsoft. لأن هذه البرامج تجعل لك الحرية في اختيار أي نظام تشغيل، أما البرامج المصنوعة من لغات أخرى تربطك بنظام معين!

2- البرمجة الغرضية التوجه. أو OOP: هذه اللغات عموما أبطأ من أختها الكبرها اللغات الهيكلية مثل سي و VB وغيرها! وأعتقد أنك تعرف السبب، ولن أتطرق إلى شرح هذه الفلسفة!

نعود إلى السؤال.. هل الجافا بطيئة إلى حد اليأس؟ لا... بعد التجربة، يتضح أن الجافا ليست بطيئة، بل تبدو اللغة في بعض الأحيان أسرع من قريناتها! لكن للخلاصة،، الجافا أبطأ نسبيا من قريناتها وليست بطيئة لحد الكلمة!

مثلا متصفح Opera مبرمج بالجافا، ومستخدموه يدعون أنه أسرع من كل من Firefox و InternetExplorer! طبعا جربت هذا ووجدت هذا فعلا ظاهرا أن Opera أسرع! لكني لن أقول أن Java أسرع من سي ++ عامة! كل ما أقوله أن جافا ليست بالبطء الذي يرمونه به منافسوها! (ملاحظة أنا مستخدم FireFox بصفة دائمة! وأستخدم Opera فقط على الجوال!! برنامج رائع حقا!!، ينبغي أن يكتب عنه في قسم المقالات!)

أطلت عليكم،

بالمناسبة ابحث في المنتدى، ربما تجد المزيد!

لا أعتقد بأن الجهاز الإقتراضي مازال عائق أمام الأداء حيث أن معظمها أصحبت

JIT = Just In Time Compilation

أي فقط قبل أن يدخل البرنامج للذاكرة قد يكون قد تحول بأكمله إلى لغة آلة على الجهاز المضيف

مثلها مثل الدوت نت ومن المعلوم أن الدوت نت كانت تهدف إلى أن تضاهي الجافا في الهيكيلية والأداء بس مثل مايقولون تبطي عظم

#17

اسمحولي ان اضع بصمة ولا ادري ان كانت صحيحة

بحكم اني ما زلت طالب هندسة برمجيات واتداول الكثير من اللغات البرمجية من سي شارب وسي بلس ولغات الويب

ومعاشرتي للطلاب الذين همهوم الاول هو النجاح ... وليس وضع الرجل المناسب بالمكان المناسب

انا انضميت الى مجتمع الجافا منذ سنة واعمل على تطوير نفسي بها مع العلم اني اطنش الكثير من لغات البرمجة التيي مقررا علي بالجامعة

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

ما يهم بالموضوع ليس السرعة ...اذا ماذا وبما اننا بعصر السرعة ....ساقول لك

ان تصل متاخر خير من ان لا تصل ابدا

ان تصل بالابداع متاخر خير من ان لا تصل بابكر وقت وفي جعبتك القليل لا اقلل من شان لغات برمجة اخرا ولكن هذه الحقيقة

الجـــــــــــــــــــافا ابداع والابدااع لا يؤقت بأي وقت

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

لكي يدفع عشاقها الدولارات ويشترون المنتج

كما تعرفون الجافا تطور نفسها بنفسها وكما يقول المثل بطيختين بيد وحدة ما بتنحمل ....

لكن لا بد من طرق لتسريع هذا الابداع ......سنبدع من اجل عشقنا للجافا

تم تعديل هذه المشاركة بواسطة shadooo في 24 فبراير 2008 في 19:13

#18

السلام،

هذا رابط لنتائج مقارنة بين الــ Java وال.NET

http://www.shudo.net/jit/perf/

أخر تحديث تم في 2005 ولكن تعطي فكرة عن الأداء

سبحان الله وبحمده عدد خلقه ورضا نفسه وزنة عرشه ومداد كلماته

#19

صحيح رغم وجود الـ JIT ما زالت الجافا بطيئة بشكل يصدم أحيانا، خصوصا فيما يتعلق ببرامج الزمن الحقيقي RealTime وذلك ليس فقط بسبب الـ JVM ولكن يوجد سبب جوهري خطير في تصميم الجافا هو التالي:

عند تمرير Object إلى وظيفة Function، لا تقوم الجافا بالتأشير Pointing to address إلى عنوان الكائن، بل تقوم بنسخه كاملا، هل تتخيلون الوقت المستنزف في نسخ كائن أثناء زمن التنفيذ؟ هذا بالإضافة إلى الفجوة في الذاكرة التي سيخلفها تدمير هذا الكائن المؤقت!! استنزاف حقيقي، السبب في هذا التصميم هو أن من طور اللغة أراد (ولديه الحق) بأن يحافظ على مبادئ الـ OOP ويلتزم بقواعدها وبذلك يعفي المبرمج من الدخول في التعامل مع المؤشرات والذاكرة، فبالنهاية هذه الأمور هي من تخصص الآلة وليس الإنسان وكانت الفكرة تستند إلى أن الأجهزة ستسصبح أسرع وبالتالي يصبح الزمن المستنزف مهمل إلى حد بعيد.

#20

أخي عربي عربي

هل تعني أن الجافا تقوم بـ call by value

على حد علمي الجافا تعمل على call by reference

أتمنى لو توضح أكثر

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#21

السلام عليكم

أيضا سمعت انه من اسباب بطئ الجافا له علاقة بالsecurity ما مدى صحة ذلك؟ ارجو التوضيح هذه النقطة

#22

التأخير قديما كان كما ذكر يعود عمل Interprete للByte Code والقيام بتشغيله ، وهذا حال جميع اللغات التي تعتمد على الـ Interpretion، تكون أبطأ من اللغات التي تعمل Compile للكود وتولد Object File وبعدها تربط هذا الملف ببعض الملفات الأخر لينتج الملف التنفيذي .

أما حاليا ، فالترجمه تعتمد على JIT ، لذلك لن تكون هناك مشاكل في موضوع الـ Interpretion، ولكن يبقى مصدر البطئ هو Garbage collection حيث التعامل مع الذاكره يدويا أسرع بكثير من هذا الـ GC ، أيضا الـ GUI يأخذ وقتا وذلك لأنه يعتمد على البيئه المحليه للنظام . كل هذه الأسباب تبطئ من البرنامج .

بالنسبه للأستدعاء في جافا دائما بالقيمه By Value . ولكن ليس بالشكل الذي ذكرته أخي عربي ،

فعندما نعرف متغير ما ونعطيه قيمه ، ثم نمرره لداله تقوم بتغير قيمته. عندما ننتهي عمل الداله يكون المتغير الأول بنفس القيمه ، لأن التمرير بالقيمه (هذا في حال كان المتغير من نوع Primitve مثل Number , Boolean ) .

أما في حال كان لدينا Object Refernce فأيضا التمرير بالقيمه ، لكن هنا نمرر "عنوان" الكائن في الذاكره Heap ( تعريف الكائنات في الجافا هو مثله مثل المؤشرات في سي++ )

المهم عندما نمرر Object لداله ، فنحن فقط نمرر عنوان الكائن الموجود في الذاكره ، وهنا نستطيع في الداله تغيير قيمه الكائن chaneg it state-نمرر العنوان فقط reference وليس الكائن كامل -

لكن لا نستطيع تغير الكائن وجعله يؤشر الى منطقه ما ، فقط تغير قيمته فقط .

جرب أكتب مثال مثلا كائن Student ، ومرره لداله ، وقم بتغير اسم الطالب ، وعندما ترجع للداله ستجد أن اسم الطالب تغير أيضا ، وهذا يؤكد أننا عندما نمرر مؤشر ل كائن نستطيع تغيير قيمته .

قم بعدها بتغير البرنامج قليلا ، واجعل الداله تعمل مثلا Swap للكائنين (طالبين) ، عندما ترجع هذه الداله ستجد أن الطالبين لم يتغيرا . وهذا يؤكد أننا لا نستطيع تغير الكائن وجعله يؤشر الى منطقه ما

تم تعديل هذه المشاركة بواسطة romansy في 13 مارس 2008 في 20:39

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#23

المحير في جافا والكثير يقع فيه بل أنا دائما أنسى ذلك، هو هذه الجملة:

Java passes object references by value

انتبهوا أين وضعت كلمة references إنها مضاف إليه لـ object

الذي يسبب هذا الالتباس هو معرفتنا لوجود هذا:

Pass object by reference

والفرق واضح بين الجملتين، الأولى تحدد تماما أن (نسخ الكائن object references) يتم "تمريرها" بالقيمة by value

معنى ذلك التالي:

لدينا نسخة m من الصف M نمررها للوظيفة fn كالتالي:

fn(m);

وتعريف الوظيفة fn هو مثلا:

void fn(M a){

...

}

البارمتر a لن يستلم أي مقبض handle له علاقة بـ m أبدا، سيجري نسخ قيم المحتويات الخاصة بـ m إلى a

وذلك لأن الجافا عندما تنفذ البرنامج، ستقوم بحجز مساحة في الذاكرة لـ a وهي مخصصة لـ a وبنفس الحجم الافتراضي لـ M الصف الأساسي، وهذا معناه أنه لن يكون هناك تمرير لأي عنوان إلا من أجل البدء بتعبئة محتويات a، أي أن a ليس مؤشر!! وهذا هو الفيصل الحاسم للقضية، أي تجري عملية تعبئة لمحتويات a بما يشابه m

بإمكانكم التأكد من هذا، a أي البارامتر الموجود في تعريف الوظيفة أو الدالة هو نسخة عن الصف M

وهذا هو أحد أهم أسباب بطئ الجافا، بإمكانكم البحث في الويب عن هذا.

تخيل فرق الأداء بين c++ التي تغير مصفوفة M[ ] by reference و جافا by value حيث يتم دوما نسخ محتويات M to argument a إلى البارامتر a

لا أدري لماذا تلخبطت الكود، على كل حال هي كود لوظيفة فارغة

تعيد النوع void ولها argument اسمه a من النوع M

#24

أخي الكريم ، عربي عربي ،

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

عندما نكتب :

Student st =new Student("ali",20);

فالـ st ، يسمى Object Reference ، ماذا يعني هذا الكلام ، يعني أن st هو فقط "عنوان أو مؤشر" لكائن الموجود في الذاكره .

وعندما نسند هذا الـمؤشر Reference لكائن أخر ، فهنا معناه أن الكائن الأخر سوف يشير الى نفس المنطقه في الذاكره :

Student st2 = st;

الان في حال غيرنا st2 ، سوف يتغير st ، وذلك لأنهما يشيران لنفس المنطقه في الذاكره .

وبنفس المنطق ، في حال أرسلنا st لداله ما ، فكل ما في الأمر أن الداله ستتقبل هذا الReference في Object Refrence أخر ، وفي حال أجرينا تعديل داخل الداله ، سوف ينطبق في الخارج والسبب أننا غيرنا القيمه في الذاكره فقط باستخدام مؤشر أخر.

اذا الاستدعاء في جافا للمتغيرات العاديه هو بالقيمه . (مجرد نسخ القيمه)

والأستدعاء للكائنات (مؤشر للكائنات حقيقه) هو عن طريق القيمه أيضا (مجرد نسخ للعنوان) .

أرجوا أن تتضح الصوره، وفي حال كنت مخطئ في فهمي للأمر أرجوا تصحيحي ....

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#25

كلامك صحيح، أنا أخطأت في هذا، شكرا للمتابعة. :rolleyes:

مواضيع مشابهة