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

النصوص في ++c, أي الطريقتين أفضل!

مغلق
بدأه Khaled.Alshaya في 19 يناير 2008 · 31 رد · 3,808 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ,,

مضى علي وقت طويل منذ آخر موضوع طرحته, اليوم نعود بحمد الله, مع لمحة جديدة تحتاج إلى إحابة,

ربما كان العيب الكبير في لغة C هو البلبة الناتجة عن التعامل مع النصوص (في الحقيقة مع المؤشرات من النوع char),

و دائماً ما تتهم ++C بنفس الاتهام رغم أن لا أساس له من الصحة, مكتبة STL وفرت الكائن string و الذي يعتبر أعجوبة نظراً لتصميه, لأنه يعتمد على الـ templates في تصميمه,

و لكن لن نتكلم هنا عن مميزاته و عيوبه, لنبدأ في طرح السؤال و فهم المطلوب :

التعامل مع النصوص يحتاج إلى حذر شديد, فهي تحتاج إلى الكثير من الذاكرة في عملية تخزينها, و تستهلك جهد المعالج إذا تم التعامل معها بشكل غير احترافي!

لننظر إلى المثال التالي :

string str;

for( int i =  0; i < 10000; i++)
	str = str + "ID# " + itos(i) + '\n';

أو بالطبع يمكننا كتابة الكود الذي في الأعلى كالتالي :

string str;

for( int i =  0; i < 10000; i++){
	str += "ID# ";
	str += itos(i);
	str += '\n';
}

الآن نريد أن نعرف أي الطريقتين أفضل, و لماذا ؟؟؟

ملاحظة الدالة itos هي دالة تقوم بتحويل الـ int إلى string لا أكثر, و هذا هو الكود الخاص بها :

string itos(int i)	// convert int to string
{
	stringstream s;
	s << i;
	return s.str();
}

الدالة موجودة في صفحة Bjarne Stroustrup على الرابط التالي :

How do I convert an integer to a string

الحقيقة لا تهمنا دالة التحويل على الإطلاق, كل ما يهمنا هو مناقشة أي الطريقتين المذكورتين في الأعلى أسرع و أكثر توفيراً للذاكرة !!!

أنا أنتظر رأيكم و مناقشتكم !

تحياتي ,,,

#2

الثانية افضل للمعالج ... الاولى يتم نسخ النص القديم كل دورة الى مساحة جديدة تحتويه + الاضافات ( ID# + num ....)

اما الحالة الثانية فلا يتم نسخ النص بأكمله الى بفر جديد الا اذا تجاوز حد المساحة السابقة له ... لكن ليس كل دورة

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

السلام عليكم ,,

أهلاً بك GamingMasteR,,

الحقيقة دائماً ما تكون متابعاً, و يعجبني تحليلك للكود, و خصوصاً تأثيره بالنسبة للمعالج و الذاكرة :rolleyes:

بما أنك أجبت بشكل صحيح على السؤال, ما رأيك أن نعدل السؤال لنجعله أصعب قليلاً B)

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

الكود الأول سيكون :

string str;

for( int i =  0; i < 10000; i++){
	str += "ID# ";
	str += itos(i);
	str += '\n';
}

و الكود الثاني سيكون :

string str;

for( int i =  0; i < 10000; i++)
	str += "ID# " + itos(i) + '\n';

الآن أي الكودين أفضل من ناحية استهلاك الذاكرة و جهد المعالج و لماذا ؟؟ :evil:

لاحظ أنه لم يعد هناك نسخ للنص الأصلي كل مرة :P

تحياتي ,,

#4

لا اعرف :wacko:

اظن الاثنين واحد ...

تم تعديل هذه المشاركة بواسطة GamingMasteR في 19 يناير 2008 في 19:25

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#5

أهلين يا باشا :rolleyes:

الصراحة في فرق و فرق كبير شوي B)

الطريقة الأولى راح تكون أفضل و أسرع, و لكن لماذا ؟؟ -_-

يا أخوان ما في أحد حابب يحرك مخه شوية B)

#6

يمكن لأن الاولى تربط النصوص الاضافية بالنص الاساسي واحدة واحدة

الثانية تربط النصوص الاضافية معا اولا ثم تربط الناتج بالنص الاساسي يعني : حجز بفر اضافي للنصوص الاضافية = زيادة استهلاك المعالج والذاكرة

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

شكرا اخ خالد ..

موضوع فعلا جميل ومفيد ..

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

string str;

for( int i =  0; i < 10000; i++)
	str = str + "ID# " + itos(i) + '\n';

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

وجمع هذه القيمة الناتجة مع القيمة التي ترجع من قبل الدالة itos وجمعها مع '\n' ...

وكل هذا يتم في سطر واحد..

وحسب مفهوم time complexity لهذا الكود فان سطر برمجي واحد يحتوي على مساواة وجمع يأخذ وحدة زمن واحده ..

بينما الكود الثاني يحتوي على ثلاثة اسطر بها مساواة وجمع وهذا يؤدي الى انها تأخذ ثلاث وحدات زمنية ....

هذا جوابي والله اعلم ..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#8

بالنسبة لهذا الكود

string str;

for( int i =  0; i < 10000; i++)
	str += "ID# " + itos(i) + '\n';

أظن أن السي سيقوم بجمع الطرف الأيمن أولا ثم يضيف الناتج في الطرف الأيسر

بمعنى أنه سيضع

"ID# " + itos(i) + '\n';

في مكان بالذاكرة ثم يقوم باضافته على str

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

باختصار تصوري أن السي سيقوم بالآتي

buffer="ID# " + itos(i) + '\n';
str+=buffer;

وبالتالي فان الكود

string str;

for( int i =  0; i < 10000; i++){
	str += "ID# ";
	str += itos(i);
	str += '\n';
}

أفضل

هذا مجرد تخمين والله أعلم

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

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#9

كلام اخي باسم مقنع ..

اتوقع انه صحيح .. والله اعلم .. :)

تحياتي ..,

#10

السلام عليكم ,,

ما شاء الله يا أخوان,

إجابة الأخ باسم هي الإجابة شبه المكتملة و لو أعطيتك درجة عليها لأعطيتك 99 / 100 B)

كما قال أخي باسم, المعامل + يتم تطبيقه على طرفين,

العملية تتم كالتالي, يتم جمع

itos(i) + '\n'

ناتج عملية الجمع, هو كائن string جديد! و لنسميه tempString بعد ذلك يتم جمع الكائن الناتج كالتالي :

"ID# " + tempString

عملية الجمع السابقة أيضاً ينتج عنها كائن جديد!

و لنسميه tempString2, بعد ذلك يتم إسناد tempString2 إلى str و ذلك عن طريق المعامل =+ الذي يحافظ على النص الأصلي في الكائن str !

هل تخيلتم أنه عند المرور على السطر التالي كل مرة يتم حجز كائنين string قبل أن يتم إرسال النصوص إلى الكائن str :rolleyes:

أما بالنسبة للحل الأفضل :

string str;

for( int i =  0; i < 10000; i++){
	str += "ID# ";
	str += itos(i);
	str += '\n';
}

في هذه الحالة, يتم نسخ النصوص إلى الكائن مباشرة من مكانها في الذاكرة, دون الحاجة لاستيعاب عمليات جمعها في كائنات جديدة!

شكراً لكم على المشاركة, و خصوصاً الأخ باسم B)

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 20 يناير 2008 في 20:21

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

اخي انا تكلمت عليها من ناحية الزمن وليس من ناحية الذاكرة ..

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

ولكن لا يهمها اذا تكرر الزائد او لا ..

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

ولكن بالفترة الماضيه حاولت تطوير نفسي به ولكن انشغالي بالدراسه اثر علي ..

لذلك ارجو ان توضح ذلك ..

شكرا لك اخ باسم ولكم جميعا ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#12

السلام عليكم ,,

يا أخ سنان, نحن هنا لا نقارن بين خوارزميتين حتى نتكلم عن تعقيد كل منهما!

عملية نسخ النصوص من مكان ما في الذاكرة إلى الذاكرة الخاصة بكائن النص هي نفس العملية في كلا الحالتين,

و لكن الاختلاف هنا في كيفية توظيف هذه العملية أو لنقل طريقة استخدامها, نسخ نص من مكان ما في الذاكرة يتم بشكل تسلسلي في كائن النص, أي نبدأ بأول حرف و ننتهي بآخر حرف,

سواء استخدمنا المعامل + أو المعامل =+ ,, لأنه ليس لهما علاقة أصلاً بموضوع النسخ نفسه, فهو يتم عن طريق المعامل =

المشكلة تكمن أن المعامل + سينتج عنه كائن جديد يحمل النص الذي قمنا بجمعه, ثم ستتم عملية النسخ,

أما في حالة المعامل =+ فيستم نسخ النص الذي نريده إلى ذاكرة كائن النص مباشرة,

تحياتي ,,

#13

أخي سنان أنا لا أعرف أين الإلتباس عندك لكن سأحاول التوضيح

إذا افترضنا أن المعالج يأخذ واحد نانوثانية لحساب عملية جمع فماذا سيحدث عند حساب 102+234+145 ؟

طبعا المعالج عند قيامه بعملية جمع فانه لا يستطيع جمع أكثر من رقمين وهذا الأمر يرجع إلى تركيب وتصميم المعالج من الداخل ولذلك سيقوم أولا بحساب 102+234 وهذا سيستغرق واحد نانوثانية والناتج سيكون 336 ثم سيقوم بحساب 336+145 وهذا سيستغرق واحد نانوثانية ويكون الناتج 481 وهذا يعني أننا سنحتاج إلى 2 نانوثانية لحساب الناتج النهائي أي ما يساوي - عدد مرات الجمع * وحدة الزمن لكل عملية جمع - وهذا الزمن لا يعتمد على الكود الذي كتبته فقط يعتمد على عدد عمليات الجمع سواء كانت في سطر واحد أو في عشرة أسطر

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#14
اقتباس
في هذه الحالة, يتم نسخ النصوص إلى الكائن مباشرة من مكانها في الذاكرة, دون الحاجة لاستيعاب عمليات جمعها في كائنات جديدة!

هو إنت قريت كدة فى مكان يا أخ خالد؟

#15

السلام عليكم ,,

اقتباس
هو إنت قريت كدة فى مكان يا أخ خالد؟

الصراحة لا :lol: ,

بس راح أوضح وجهة نظري في السطور القادمة :

كل ما فعلته هو الذهاب لموقع مكتبة STL الرسمي على العنوان التالي : basic_string

الـ basic_string هو عبارة عن template و كائن النص string معرف منه بالطريقة التالية :

typedef basic_string<char> string;

معنى هذا الكلام أنك سوف تجد basic_string بدلاً من string في تعاريف الدوال الخاصة بكائن النص,

لو نظرنا إلى تعريف المعامل =+ المأخوذ من نفس الوصلة في الأعلى :

basic_string& operator+=(const basic_string& s)
basic_string& operator+=(const charT* s)
basic_string& operator+=(charT c)

المهم في التعريفات المذكورة هي عملية الإعادة من المعامل basic_string& حيث يتم إرجاع نفس الكائن بالمرجع :rolleyes: و كان من الممكن جعل الـ operator يرجع void و لكن إذا فعلوا ذلك سيفقدوا خاصية الـ chaining,,

مثلاً :

str1 += str2 += str3;

العبارة str2 += str3 ستنفذ و سيتم إرجاع str2 بالمرجع و بذلك يمكننا بعد ذلك مساواتها بـ str1 ,, أما لو كان void فيجب فصل عبارات جمع النصوص عن بعضها,

الآن ما دخلنا بهذا الكلام ؟

المعامل يأخذ كائن أو نص C أو حرف و يقوم بنسخها إلى ذاكرته الخاصة, و لا أعتقد أنه يمكن أن يفعل أكثر من ذلك!

ثم يعيد نفسه بالمرجع ليسمح بالـ chaining ,,

هذا كل ما لدي حالياً :) و إذا أردت يمكن أن نلقي نظرة على تعريف المعامل + , و سوف ترى أنه friend و يقوم بإعادة كائن جديد بعد عملية الجمع,

تحياتي ,,

#16

شكرا لكم اخ خالد واخي باسم على الشرح ..

بالفعل معلومات قيمة ..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#17

السلام عليكم ورحمة الله

باسم الموجي كتب:
طبعا المعالج عند قيامه بعملية جمع فانه لا يستطيع جمع أكثر من رقمين وهذا الأمر يرجع إلى تركيب وتصميم المعالج من الداخل ولذلك سيقوم أولا بحساب 102+234 وهذا سيستغرق واحد نانوثانية والناتج سيكون 336 ثم سيقوم بحساب 336+145 وهذا سيستغرق واحد نانوثانية ويكون الناتج 481 وهذا يعني أننا سنحتاج إلى 2 نانوثانية لحساب الناتج النهائي أي ما يساوي - عدد مرات الجمع * وحدة الزمن لكل عملية جمع - وهذا الزمن لا يعتمد على الكود الذي كتبته فقط يعتمد على عدد عمليات الجمع سواء كانت في سطر واحد أو في عشرة أسطر

أخى باسم لا طبعا , ده ناتج من تعريف عملية الجمع نفسها :P لانها عملية ثنائية كما هو معروف. وحيث اننا بنعمل على معالج تتالى وليس توازى. يبقى زى ماحضرتك قلت هياخد فى عملية الجمع السابقة وحدتين زمن :). همسكلك على الواحده :):):)

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

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#18

السلام عليكم ,,

اقتباس
أخى باسم لا طبعا , ده ناتج من تعريف عملية الجمع نفسها

:rolleyes: كلام جميل,

أستاذ عماد , أوامر المعالج إما أن تأخذ معاملين أو معامل واحد أو لا تأخذ أي معامل, هذا يعتمد على الأمر نفسه,

و لكن الزمن المستغرق لتنفيذ نفس العملية على معالجين مختلفين, يختلف باختلاف بنية المعالج,

بشكل مبسط, تردد المعالج هو عدد الدورات أو ما يسمى بالـ cycles في الثانية الواحدة,

و ستجد في وثائق المعالج, كل عملية مع عدد الدورات التي يحتاجها المعالج لينفذ العملية, يختلف الزمن باختلاف موقع الـ operands هل هي في الذاكرة أو في مسجلات المعالج و طول الـ operands و هكذا,

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

يمكنك حساب الوقت بالثواني عن طريق ضرب عدد الـ cycles بزمن الـ cycle الواحدة,

تحياتي ,,

#19
عماد حمدي احمد كتب:
السلام عليكم ورحمة الله

أخى باسم لا طبعا , ده ناتج من تعريف عملية الجمع نفسها :P لانها عملية ثنائية كما هو معروف. وحيث اننا بنعمل على معالج تتالى وليس توازى. يبقى زى ماحضرتك قلت هياخد فى عملية الجمع السابقة وحدتين زمن :) . همسكلك على الواحده :) :) :)

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

هههههههههههههههه

انت ما جتش تمسك عليه غير دي :) :) :)

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

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

:) :) :) :) :)

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#20

أخوانى م/عماد و م/باسم, إنتوا الإتنين كلامكوا مية مية والله :) المعالج مصمم بحيث إنه يعمل عملية الجمع الثنائية فقط, لماذا؟ لأنها معرفة كذلك كأبسط عملية جمع فى الرياضيات, و العمليات الأخرى يمكن تركيبها من عملية الجمع الثنائية هذه. مفيش داعى بقا حد يمسك على حد حاجة :D

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

والله أعلم

#21
اقتباس
أخوانى م/عماد و م/باسم, إنتوا الإتنين كلامكوا مية مية والله :) المعالج مصمم بحيث إنه يعمل عملية الجمع الثنائية فقط, لماذا؟ لأنها معرفة كذلك كأبسط عملية جمع فى الرياضيات, و العمليات الأخرى يمكن تركيبها من عملية الجمع الثنائية هذه. مفيش داعى بقا حد يمسك على حد حاجة :D

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

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

والله أعلم

طيب إذا كان كلامك صحيح فلماذا اخترعوا += من الأساس

وعندي سؤال حضرني الآن

أيهما أفضل ولماذا

i++
OR
i+=1

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#22

السلام عليكم ,,

أخي blueteeth ,,

اقتباس
أخوانى م/عماد و م/باسم, إنتوا الإتنين كلامكوا مية مية والله المعالج مصمم بحيث إنه يعمل عملية الجمع الثنائية فقط, لماذا؟ لأنها معرفة كذلك كأبسط عملية جمع فى الرياضيات, و العمليات الأخرى يمكن تركيبها من عملية الجمع الثنائية هذه. مفيش داعى بقا حد يمسك على حد حاجة

مع إن الكلام ليس موجهاً لي, و لكن النقاش معك مثمر و لا يمكن أن أفوت الفرصة B)

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

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

بالمناسبة كلامك منطقي, و يمكن تطبيق إحدى المعاملين لإنجاز نفس المهمة غالباً, و لكن هناك فرق جوهري بين المعاملين

لنفترض أن لدينا ثلاث كائنات نص string , و لدينا سطري الكود التاليين :

1 - str1 = str2 + str3;
2 - str1 +=  str2 += str3;

في السطر الأول, سيتم إنشاء كائن نص أولاً و لنسميه tempStr, بعد ذلك سيتم نسخ النص الموجود في str2 إليه, و بعد ذلك يتم نسخ النص الموجود في str3 إليه أيضاً,

بعد ذلك سيتم تطبيق المعامل =, و ذلك بنسخ النص الموجود في tempStr إلى str1, لاحظ هنا أن str2 و str3 لم يتأثرا, لأن ناتج جمعهما هو كائن جديد يحمل النصوص التي التي تم جمعها, و هذا النوع من الكائنات يسمى temporary objects ,

بالنسبة للسطر الثاني, فسيتم إضافة str3 إلى str2, و بعد ذلك يعيد str2 نفسه بالمرجع, و سيتم نسخ str2 إلى str1, لاحظ أن str2 قد تغير إضافة إلى أن str1 قد حصل على ناتج الجمع من str2 و ليس من كائن جديد كما في الحالة السابقة,

هذا باختصار, و أتمنى أن تبدوا رأيكم فيه لأن الموضوع ليس سهلاً بالنسبة لي على الأقل :lol:

بالنسبة للباشمهندس باسم :rolleyes: ,,

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

أنا كنت من متابعي المناقشة الرائعة بالمناسبة :) و لا أعتقد أنها حرب, لأنها كانت مبارزات علمية بين الأخوة ,,

بالنسبة للسؤال :

i++
OR
i+=1

أنا أحب أن أعلق أولاً على موضوع كفائة الكود حتى يتضح القليل لنا بإذن الله,

هناك نوعين من عمليات التحسين على مستوى الكود Optimization (لتوضيح الفكرة فقط), النوع الأول هو الاستخدام الأفضل للكود Optimal solution, و موضوعنا هذا مثال على ذلك,

النوع الثاني, هو الـ Optimization الذي تقوم به المترجمات, المترجمات تقوم باستبدال العبارات كما في سؤالك, بأوامر لغة الأسمبلي, يمكن تخيل العبارات على أنها قوالب يستبدلها المترجم,

و الحقيقة أن كل مترجم له قوالبه الخاصة, لأن المتفق عليه هو قواعد اللغة أو ما يسمى بالـ syntax و معاني هذه القواعد semantic , فكل ما هو مطلوب من المترجم هو ترجمة هذه القواعد دون الإخلال بالمعاني, و كل مترجم هو و شطارته B)

المهم أن عملية الترجمة غالباً يتم إلحاقها بعملية الـ Optimization بشكل تلقائي (يمكنك إجبار المترجمات على أن لا تقوم بعمليات الـ Optimizations على الإطلاق, و قمت بعملها فعلاً باستخدام مترجم على معالج motorola )

لذلك فالعبارتين يمكن أن تكون إحداهما أسرع من الأخرى, و لكن خلال عملية الـ Optimization يتم النظر إلى الأوامر الناتجة و محاولة تحسينها قدر المستطاع,

لذلك لن يكون هناك فرق في الناتج النهائي,

هذا بشكل مبسط, لأن المترجمات (وخصوصاً مترجمات ++C/C وصلت إلى مراحل متقدمة جداً في هذه الأمور, و أحد أساتذتي في الجامعة كان اختصاصه compiler optimization و يعمل على مترجمات لغة ++C بشكل رئيسي ),

ربما كان ++VC أحد أشهر هذه المترجمات, لأن عمليات التطوير تتم عليه بشكل مستمر!

تحياتي ,,

#23

بالنسبة لعملية الضرب فهي لا تعتمد على عملية الجمع المخصصة لجمع رقمين لكنها تتم بنفس الطريقة اليدوية لكن باستخدام النظام الثنائي يعني على سبيل المثال سنأخذ رقم 5 و7 في النظام الثنائي

	  101
x	111
_______
	  101
	1010
  10100
_______
100011

هذا ما يتم بالضبط داخل المعالج فهو يقوم بعمل AND بين كل bit من الرقم الثاني مع جميع الـ bits في الرقم الأول وازاحة الناتج بعدد الخانات المناسب ثو يقوم بجمع النواتج ولذلك فإن ضرب 8bits في 8bits تحتاج إلى عمل 64 AND (يتم حسابهم معا على التوازي) وجمع ثمانية أرقام على التوالي

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#24

شكراً جزيلاً أخي باسم,,

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

ألا يوجد خوارزميات محسنة لهذه العمليات ؟

تعديل : كنت أقصد أنه كيف تتم عملية الحساب على التوازي ؟

بالمناسبة منذ عدة أشهر حاولت تصميم فئة لأعداد بطول 256 bit ولكنها باءت بالفشل الذريع :D

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 22 يناير 2008 في 06:00

#25

أولا أنا لم أدرس عملية القسمة ولا أعرف عنها شئ وبالتأكيد هي أعقد من الضرب بمراحل

ثانيا بالنسبة للتوازي فإن الـ bits يتم إدخالها على 64 AND Gate وبالتالي فإن عملية الضرب للـ bits تتم كلها في آن واحد لكن تبقى المشكلة في عملية الجمع

وستجد هنا الدائرة المنطقية التي تقوم بضرب 2bits في 2bits والدائرة التي تقوم بضرب 4bits في 4bits

http://en.wikipedia.org/wiki/Binary_multiplier

لاحظ أنه في الحالة الأولى احتجنا إلى عملية جمع وحيدة أما في الثانية فاحتجنا إلى ثلاث عمليات جمع لجمع أربع أرقام

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

هذا الموضوع مغلق.

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