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

هل من اهتمام عربي باللغات ال Functional ؟!

رائج
بدأه Khaled.Alshaya في 30 مايو 2009 · 108 رد · 9,129 مشاهدة · في الأخبار والنقاشات التقنية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

رغم أني من محبي ++C حتى النخاع, إلا أني أجد المتعة أيضاً في اللغات الـ functional بشكل لا يصدق :)

الحقيقة, أني لم أرى حتى الآن لا موقعاً و لا حتى شخصاً عربياً يتكلم عنها! لماذا هذا التجاهل ؟

على الرغم من أن هذه اللغات, توفر طريقة مختلفة للتفكير, و برأي البعض أفضل بكثير من الـ imperative العقيمة :huh:

فمثلاً... أردت اختبار هذا الشيء بنفسي ... قررت أن أكتب الـ merge sort بـ scheme ... و المفاجأة ؟

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

الغريب أن اللغات الـ functional تبدو لوهلة صعبة الفهم, و لكن ما إن تفهم المغزى منها, حتى تكتب دون توقف... و الغريب أن ما تكتبه يكون صحيحاً من المرة الأولى غالباً... بالنسبة لي على الأقل!

هذا كود لدالة merge sort كتبته بـ scheme ... لاتنظر إلىه على أنه من كتابة كائنات فضائية.. تعلمت scheme منذ أقل من عدة أشهر... و أجدها أسهل بكثير من أي لغة تعلمتها حتى الآن!

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

; Khaled Alshaya


(define (append listOne listTwo)
		(cond
			((null? listOne) listTwo)
			(else (cons (car listOne) (append (cdr listOne) listTwo)))
))

(define (merge listOne listTwo)
		(cond
			((null? listOne) listTwo)
			((null? listTwo) listOne)
			((< (car listOne) (car listTwo)) (append (cons (car listOne) '()) (merge (cdr listOne) listTwo)))
			((= (car listOne) (car listTwo)) (append (cons (car listOne) '()) (merge (cdr listOne) listTwo)))
			(else (append (cons (car listTwo) '()) (merge listOne (cdr listTwo))))
))

(define (mergesort lis)
		(cond
			((null? lis) '())
			((null? (cdr lis)) lis)
			(else (merge (cons (car lis) '()) (mergesort (cdr lis))))
))

(mergesort '(99 77 88 66 44 55 33 11 22 0))

هل من اهتمام عربي بهذه الأسلوب من البرمجة ؟!

و إذا كان كذلك ماهي اللغة التي تفضلها ؟

تحياتي ....

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 30 مايو 2009 في 03:03

#2

طيب لو حضرتك تسمحلى اتطفل

Programming = Visual Studio & C

Database = SQL & Oracle

دى تقريبا معلومات الشباب العربى عن البرمجة ( و انا منهم )

ما هى اللغات ال functional على فكرة انا درست لغة برمجة ذات واجهة رسومية فى صغرى تسمى LOGO لكن هل لوجو تعتبر لغة Functional ?

الى حد ما اعتبر رضعت برمجة لكن مصطلح Functional غريب على أذنى لو ممكن نبذة أو أى موضوع يتحدث عنهم

أسف على الإزعاج

تقبل تحياتى

تم تعديل هذه المشاركة بواسطة dvd_besoo في 30 مايو 2009 في 03:18

#3

السلام عليكــم ورحمـة الله وبركاتــه ،،

-_- I wish you all luck

but really I don't understand a lot of it

To be or not to be

#4

كانت ليا تجربة مع Scheme بس حاليا Haskell هى لغتى المفضلة

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#5

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

اقتباس
ما هى اللغات ال functional على فكرة انا درست لغة برمجة ذات واجهة رسومية فى صغرى تسمى LOGO لكن هل لوجو تعتبر لغة Functional ?

للأسف لا أعرف LOGO إلا بالإسم فقط .... و أعرف عن السلحفاة فيها :lol:

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

حسناً لدي مقالين أتمنى أن يفيدو في الموضوع, و الاثنان لا يتحدثان عن لغة functional بعينها, بل عن المفهوم بشكل عام...

الأول قم بطباعته :wink: و اقرأه على مهل... و ستسوعب معظم مفاهيم الـ functional languages :)

و الثاني هو من الخبير Joel في مقال قديم له...

اقتباس
كانت ليا تجربة مع Scheme بس حاليا Haskell هى لغتى المفضلة

أهلاً أخ أحمد .... جميل .... haskell :)

الحقيقة أني دائماً ما أقرأ أن الكثير من مبرمجي fp يفضلونها على غيرها كثيراً... حتى على ML التي أعجبت بها أيضاً...

الشيء الوحيد الذي أعرفه عنها أن الـ syntax رائع, و أفضل بكثير من syntax لغة lisp المزعج للبعض (ليس لي :lol: )

الشيء الآخر... عندما درست scheme قمنا بقارنة اسلوب scheme المتمثل في eager approach عند الحديث تطبيق جميع قيم وسائط الدالة قبل استدعاءها... و بين أسلوب haskell

المبتكر, و المتمثل في تطبيق الدوال عند الحاجة, أو ما يسمى lazy approach و كيف أننا يمكن أن نقوم بتعريف infinite data structures بسبب هذه الميزة...

و لكن حقيقية لم أتعلمها و لم اكتب سطر واحد بها :)

أتمنى أن تعطينا فكرة عنها, و عن نصيحتك في أفضل المقالات للبداية بها, و حتى أفضل compiler أو interpreter للعمل عليه :)

تحياتي ..

1
#6

مشكلة Haskell فى حاجتين

1- انها معقدة بعض الشئ .. ممكن تحاول تتعلمها مرتين وتلاته وتفشل -ويمكن السبب هو ال Monads مع انها بسيطة فعلا لكن مشكلتها فى فهم انها بسيطة :S-

2- انها مش كان ليها وثائق واضحة لإزاى نستخدمها فى ال real world

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

موضوع ال Lazy Evalutation فعلا من الحاجات اللى تشد -لأنها مش بتحقق اى قيمة الا اذا كانت محتاجاها فعلا-

نيجى لنقطة تانية وهى انها statically typed حتى لو مش حددت ال type فهى هتعتمد على طريقة ذكية وهى ال type inference

functional-programming-joke.png

فى كذا مصدر رائع لhaskell حاليا

دروس رائعة جداLYAH

http://learnyouahaskell.com

فى كتاب على wikibooks يشمل -متأكد انها هتعجبك - Write yourself a Scheme in 48 Hours

و YAHT

http://en.wikibooks.org/wiki/Haskell

---

YAHT

http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf

---

Haskell for C Programmers

http://www.haskell.org/~pairwise/intro/intro.html

ولحل ازمة ال Monads

http://ertes.de/articles/monads.html

ومن اهم الأشياء كتاب Real World Haskell

http://book.realworldhaskell.org/read/

الكتاب متاح اونلين

ودى صفحة ال implementations

انا عن نفسى بتستخدم GHC

http://haskell.org/haskellwiki/Implementations

مع Haskell Platform

تم تعديل هذه المشاركة بواسطة ahmed_youssef في 30 مايو 2009 في 05:45

2
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#7

تعرفت على الـfunctional programming عن طريق بايثون في البداية و أنا الأن أحاول تعلم #F و هي لغة functional تعمل تحت الدوت نت.

أعتقد أنه أهم أسباب عدم الاهتمام (عدم المعرفة في الواقع!) بهذه اللغات هو أنها تتطلب طريقة تفكير جديدة تماماً و التي تعتمد بشكل كبير على الجانب الرياضي لعلم الحاسب، و هو أمر يصعب على الكثير (حتى بين طلاب علوم الحاسب) بسبب عدم اهتمام الجامعات العربية بشكل عام باللغات الـfunctional.

#8

هذا النوع يعتبر جحيما :D

اصبت بالجنون بسبب prolog و lisp ... لا اظن انني ساجرب هذا النوع على الاقل للسنة او السنتين القادمتين :D

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#9

حالياً Python

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 30 مايو 2009 في 12:08

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#10

بايثون بتتيح ال functional programming ولكن

اقتباس
Lastly, even though a number of functional programming features have been introduced over the years, Python still lacks certain features found in “real” functional programming languages. For instance, Python does not perform certain kinds of optimizations (e.g., tail recursion). In general, because Python's extremely dynamic nature, it is impossible to do the kind of compile-time optimization known from functional languages like Haskell or ML. And that's fine.

http://python-history.blogspot.com/2009/04...l-features.html

تم تعديل هذه المشاركة بواسطة ahmed_youssef في 30 مايو 2009 في 20:01

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#11

الاصدارة القادمة من VS و هي 2010 ستحمل #F كلغة كاملة مدعومة من Microsoft و يمكنك استخدام الBeta 1 الان

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#12

اخذنا كورس في الجامعة بعنوان programming paradigms يهدف الى تعريف الطلاب على بعض الاساليب (كيف نترجم paradigm؟) الاخرى في البرمجة, فدرسنا فيه لغة Haskell

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

لغة بايثون تدعم الكثير من خصائص الـ Functional programming و اجد نفسي استخدم هذه الخصائص في كثير من الاحيان .. من دون تفكير :)

#13
Better Ruby Through Functional Programming(PDF File , 7 MB) - 30 May 2009

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 31 مايو 2009 في 10:10

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#14

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

عذراً على التأخير,

شكراً أخ أحمد :)

اقتباس
تعرفت على الـfunctional programming عن طريق بايثون في البداية و أنا الأن أحاول تعلم #F و هي لغة functional تعمل تحت الدوت نت.

أعتقد أنه أهم أسباب عدم الاهتمام (عدم المعرفة في الواقع!) بهذه اللغات هو أنها تتطلب طريقة تفكير جديدة تماماً و التي تعتمد بشكل كبير على الجانب الرياضي لعلم الحاسب، و هو أمر يصعب على الكثير (حتى بين طلاب علوم الحاسب) بسبب عدم اهتمام الجامعات العربية بشكل عام باللغات الـfunctional.

بالفعل, microsoft أدركت أهمية هذا الأسلوب في البرمجة, و ستطرح #F قريباً مع VS!

و مقالات عديدة ذات مستوى رفيع ظهرت مقدماً على CodeProject باستخدام #F!

المشكلة حقيقة أخ System Down ليست في اللغات الـ Functional, على العكس, أرى أن المصادر الجيدة حولها معظمها أكاديمي جاف, لا يصلح لشخص يريد تعلم البرمجة من البداية,

ستجد كم هائل من المصطلحات البهلوانية, لمفاهيم بسيطة حقيقية,

اقتباس
هذا النوع يعتبر جحيما

اصبت بالجنون بسبب prolog و lisp ... لا اظن انني ساجرب هذا النوع على الاقل للسنة او السنتين القادمتين

المشكلة مع اللغات الـ Functional, أنني لم أفهم الفكرة حتى وقت قريب, و لكن في يوم من الأيام فقط ظهرت لمبة فوق رأسي :lol: و aha!

بعدها فهمت المغزى,

كنت أفكر بطريقة imperative في لغة ليست imperative, و مادمت تفكر بهذه الطريقة ستصعب الأمور على نفسك :)

أما python فهي تسير بالاتجاه الصحيح, نحو الـ multiparadigm و هذا هو الأسلوب الصحيح بالفعل بدلاً من تقييد المبرمج بإسلوب معين!

و لكن python ليست functional بالمعنى المتعارف عليه...

و كما ذكر الأخ حسن, نحن نستخدم مفاهيم من هذا الأسلوب سواء كنا ندري عنه أم لا ندري....

فمثلاً for each هي functional في الحقيقية...

و بالطبع الـ recursion ... إضافة إلى العديد من الميزات الأخرى في لغات البرمجة الـ imperative,

بالمناسبة الـ lambda expressions ظهرت في GCC النسخة الرابعة, و الآن VC 2010 سيظهر بها أيضاً,

رغم أن boost كانت تضم إمكانية كتابة lambda expressions, لأنهم يقومون حقيقية بكتابة أكواد بهلوانية لجعل هذا الشيء ممكن قبل cpp0x و ذلك باستخدام الـ metaprogramming :)

و لكن الـ lambda expressions ستصبح في قلب ++C نفسها في الإصدار المرتقب...

الحقيقة أنا لم أقصد بهذا الموضوع, أن نتحول للبرمجة للـ functional بشكل كامل, فأنا لا أصدق أن أسلوباً واحداً يمكن أن يحل جميع المشاكل,

و لكن هذا الأسلوب بالفعل, فيه ميزات يمكن أن تسهل البرمجة بشكل لا يصدق, كالـ lambda expressions, على سبيل المثال,

أفضل لغة multiparadigm, بدلاً من اللغات الـ pure :)

هل تعتقدون أن Microsoft ستنجح مع #F, أم أن السيطرة ستبقى للغات الـ Functional التقليدية ؟!

أرى الكثير من المقالات التي ظهرت حولها حتى قبل ظهور VS2010!

تحياتي ...

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

#15

الميزة في #F أنها تعطيك خصائص الFunctional مع دعم الFramework فيمكنك بناء تطبيقات ASP.net أو WPF أو خدمات WCF أو غيرها باستخدام #F

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#16

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

من المقولات المفضلة لدي عن لغة ليسب (و لكنها تنطبق بشكل عام على جميع اللغات الـfunctional ) ـ

اقتباس
"Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot."

- Eric Raymond, "How to Become a Hacker"

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

#17

أهلاً System Down :)

بالفعل بعد تجربة scheme على الأقل توأم lisp أجد تفكيري ثأثر كثيراً على الرغم من أني لا أعرف كيف أنتج بها تطبيقاً صغيراً على الأقل و كل ما أعمله هو من خلال interpreter :)

اقتباس
اللغات الـfunctional تحتاج خلفية أكاديمية جيدة (بالذات رياضياً) و ليست مناسبة بتاتاً للمبتدئين

المشكلة أصلاً أنه حتى اللغات الـ Imperative اصعب :angry: و لكن عقولنا أصبحت Imperative :lol:

لذلك لم نعد نجد الصعوبة فيها, و لكي نتعلم functional language ... فإننا يجب أن نرمي بعرض الحائط مسلمات اعتادت عقولنا عليها...

فمثلاً MIT حتى وقت قريب و لفترة طويلة كانت المادة الأولى في تخصص علوم الحاسب فيها تدرس بـ Scheme! من خلال الكتاب الأسطوري SICP بالطبع :)

في الماضي حسبما أعرف, فإن الجامعات إما تبدأ بـ C أو Scheme, و كلهم جامعات مرموقة على مستوى العالم....

فمثلاً Scheme يمكنك تعلمها خلال نصف ساعة (دون مزح), و بعدها ابدأ بالبرمجة!

اللغة صغيرة جداً, و سهلة جداً,

و طريقة التفكير الـ functional نتبعها حتى دون أن ندري :)

خذ مثلاً, هل جربت في حياتك كلها أن تقوم بكتابة quicksort باستخدام الحلقات loops فقط, دون recursion أنا لم أجرؤ حتى :lol:

العمليات على الأشجار الثنائية tree, هل جربت استخدام الحلقات ؟ لا أعتقد أن هناك مدرس مادة data structure يجرؤ أن يقول لطلابه أن ذلك ممكن :lol:

بالمقابل هناك الكثير من علماء الحاسب يقولون بأن عقولنا Imperative :) و هناك البعض يقولون بأنها دخيلة على عقولنا و الـ functional هي الأفضل,

آراء كثيرة و في النهاية الـ imperative paradigm هو السائد,

ربما ليس لأنه الأسهل, و لكن لأن الحواسيب الحالية هي حواسيب تعتمد بشكل أو بآخر على آلة Turing!

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 2 يونيو 2009 في 11:04

#18

الذي جعلني أقرأ بشكل مكثف في الـfunctional كان كود بايثون لعملية sort دون حلقات. جلست ساعة اقرأ فيه و أنا لا أفهم شيئاً ثم ... :o ... وضح الأمر!

#19
اقتباس
الذي جعلني أقرأ بشكل مكثف في الـfunctional كان كود بايثون لعملية sort دون حلقات. جلست ساعة اقرأ فيه و أنا لا أفهم شيئاً ثم .... وضح الأمر!

بالفعل مع هذه الـ functional فجأة تظهر اللمبة فوق الرأس :lol: لا أدري لماذا و لكن فجأة يصبح الكود منطقياً بعد أن كان خزعبلات :)

الآن لدي فزورة functional :calc:

مالفرق بين بين استخدام for each و استخدام حلقة عادية لإجراء عملية معينة على عناصر مصفوفة مثلاً ؟!

حسناً مثال حتى يصبح الحديث واضحاً ....

في ++C مالفرق بين ::

int main()
{
	int list[5] = {10, 20, 30, 40, 50};

	for(int i = 0; i < 5; i++)
		list *= list;


	return 0;
}

و بين ::

#include <algorithm>

void someUselessFunction(int& number)
{
	number *= number;
}

int main()
{
	int list[5] = {10, 20, 30, 40, 50};

	std::for_each(list, list+5, someUselessFunction);

	return 0;
}

هناك شيء يمكن للمترجم أن يقوم بتحسينه في حالة for each و لكن يستحيل عليه تقريباً أن يقوم به في حالة الحلقات العادية!

ماهو ؟! هنا السؤال ..... لم تصل المترجمات بعد إلى فعل ذلك, و لكننا ربما نراه في الزمن القريب :)

تحياتي ...

#20
Khaled.Alshaya كتب:

بالفعل مع هذه الـ functional فجأة تظهر اللمبة فوق الرأس :lol: لا أدري لماذا و لكن فجأة يصبح الكود منطقياً بعد أن كان خزعبلات :)

الآن لدي فزورة functional :calc:

مالفرق بين بين استخدام for each و استخدام حلقة عادية لإجراء عملية معينة على عناصر مصفوفة مثلاً ؟!

حسناً مثال حتى يصبح الحديث واضحاً ....

في ++C مالفرق بين ::

int main()
{
	int list[5] = {10, 20, 30, 40, 50};

	for(int i = 0; i < 5; i++)
		list *= list;


	return 0;
}

و بين ::

#include <algorithm>

void someUselessFunction(int& number)
{
	number *= number;
}

int main()
{
	int list[5] = {10, 20, 30, 40, 50};

	std::for_each(list, list+5, someUselessFunction);

	return 0;
}

هناك شيء يمكن للمترجم أن يقوم بتحسينه في حالة for each و لكن يستحيل عليه تقريباً أن يقوم به في حالة الحلقات العادية!

ماهو ؟! هنا السؤال ..... لم تصل المترجمات بعد إلى فعل ذلك, و لكننا ربما نراه في الزمن القريب :)

تحياتي ...

اذا كنت تقصد أنه في حالة الforeach يمكن للمترجم أن يستخدم اكثر من core في حالة وجود أكثر من core و تقسيم الloop عليهم للحصول على كود أسرع, أعتقد أن هذا غير ممكن في ال++C العادية القياسية, في الC++ 10 سيمكن هذا باستخدام الtask parallel library

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#21

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

اقتباس
اذا كنت تقصد أنه في حالة الforeach يمكن للمترجم أن يستخدم اكثر من core في حالة وجود أكثر من core و تقسيم الloop عليهم للحصول على كود أسرع, أعتقد أن هذا غير ممكن في ال++C العادية القياسية, في الC++ 10 سيمكن هذا باستخدام الtask parallel library

صحيح :clapping:

لكن الحقيقة لم أقصد المكتبات الجديدة من Microsoft :)

في الحقيقة هناك مكتبتان, الأولى Task Parallel Library و هذه لجماعة الـ NET. حسبما قرأت, و الثانية التي ينتظرها مبرمجو VC بفارغ الصبر B) هي الـ Parallel Pattern Library ...

أعتقد أن البعض بدأ يخاف من الأسماء من الآن :lol:

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

عموماً الـ الـ Parallel Pattern Library ستصدر رسمياً ربما بعد أن تصدر Cpp0x و ذلك لأنها تعتمد على دعم Cpp0x للـ MultiTasking من خلال الأجزاء التي ستظهر في اللغة و الإضافات التي ستقبع في المكتبة القياسية,

عموماً كنت أريد الإشارة فقط إلى أن for each هي من الـ functional style و لا علاقة لها بالـ parallel for التي نتحدث عنها في المكتبات الجديدة.

و الفكرة بكل بساطة هي أن for each تستقبل دالة, تطبقها على كل عنصر في المصفوفة على سبيل المثال,

و بالتالي يصبح باستطاعة المترجم أن يقوم بتطبق الدالة على نصف المصفوفة في نواة و تطبيق الدالة على النصف الآخر في نواة أخرى على سبيل المثال, و ربما تطبيق الدالة على كل عنصر في جهاز مختلف كلياً!

بينما في حالة الـ for فإن المترجم لن يكون لديه semantics واضحة (دليل؟ على طريقة الأخ حسن :lol: ) عن مانريده في هذه الحلقة!

بمعنى أبسط لن يعرف المترجم أنك تريد تطبيق عملية معينة على "كل" عنصر!

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 4 يونيو 2009 في 18:19

#22
اقتباس
و الفكرة بكل بساطة هي أن for each تستقبل دالة, تطبقها على كل عنصر في المصفوفة على سبيل المثال,

و بالتالي يصبح باستطاعة المترجم أن يقوم بتطبق الدالة على نصف المصفوفة في نواة و تطبيق الدالة على النصف الآخر في نواة أخرى على سبيل المثال, و ربما تطبيق الدالة على كل عنصر في جهاز مختلف كلياً!

بينما في حالة الـ for فإن المترجم لن يكون لديه semantics واضحة (دليل؟ على طريقة الأخ حسن ) عن مانريده في هذه الحلقة!

بمعنى أبسط لن يعرف المترجم أنك تريد تطبيق عملية معينة على "كل" عنصر!

ما ذكرته هو ليس دقيقاً بالنسبة ل++C و هذا لأنها لا تعمل على Virtual Machine و لهذا فلا يمكن للمترجم أن يتوقع عدد الCores على الجهاز الذي يعمل عليه البرنامج في النهاية, و أيضاً لا يمكنه أن يتوقع هل هذه الCores جاهزة أم هي بالفعل Overloaded و غيرها من القرارات الصعبة على المترجم أن يتنبأ بها و يضع كود ملائم لها داخل الكود الذي تكتبه

هذا النوع من القرارات أسهل كثيراً في اللغات التي تعمل على Virtual Machines مثل #C أو Java أو Smalltalk أو Python أو Ruby أو أو أو....

1

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#23

الحقيقة أن كتابة برامج تعمل على التوازي في لغة Imperative شبه مستحيل من الأساس :)

أنا كل ما كنت أريده ضرب مثال على فائدة الـ functional style لا أكثر,

عموماً ::

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

حسناً, نظرياً كلامك صحيح, و لكن الـ MultiTasking سيكون مدعوماً في المكتبة القياسية لـ Cpp0x و بالطبع الاحتمالات التي ذكرتها ستكون محسوبة :)

و أيضاً "نظرياً" المفترض أن البرامج المكتوبة للـ virtual machine أن تكون "أسرع" عند تطبيق مفهوم JIT, و لكن الواقع يقول بأن مترجمات C و ++C لا تقارع على الإطلاق :)

مستوى الـ Optimization في تلك المترجمات يضرب بعرض الحائط كل فوائد الـ virtual machine "النظرية", رغم أن برامجنا تترجم للـ 386 :) بالطبع دون أن ندخل الـ Metaprogramming في ++C بالموضوع :lol:

تحياتي ..

#24
Khaled.Alshaya كتب:
الحقيقة أن كتابة برامج تعمل على التوازي في لغة Imperative شبه مستحيل من الأساس :)

أنا كل ما كنت أريده ضرب مثال على فائدة الـ functional style لا أكثر,

عموماً ::

حسناً, نظرياً كلامك صحيح, و لكن الـ MultiTasking سيكون مدعوماً في المكتبة القياسية لـ Cpp0x و بالطبع الاحتمالات التي ذكرتها ستكون محسوبة :)

و أيضاً "نظرياً" المفترض أن البرامج المكتوبة للـ virtual machine أن تكون "أسرع" عند تطبيق مفهوم JIT, و لكن الواقع يقول بأن مترجمات C و ++C لا تقارع على الإطلاق :)

مستوى الـ Optimization في تلك المترجمات يضرب بعرض الحائط كل فوائد الـ virtual machine "النظرية", رغم أن برامجنا تترجم للـ 386 :) بالطبع دون أن ندخل الـ Metaprogramming في ++C بالموضوع :lol:

تحياتي ..

لا يوجد شئ مطلق لا يمكن أن تقول أن أي برنامج كُتب بال++C اسرع من أي برنامج كُتب بال#C أو غيرها فهناك الكثير من العوامل منها

الClass Library التي تأتي مع ال#C على سبيل المثال تحوي آلاف من المهام التي تمت كتابتها لكي تعمل بأفضل Performance ممكن و العديد منها غير موجود بنفس الجودة على ++C و تُرك للمبرمج لبناءه, و هنا تبدأ المشاكل و الReliability للبرنامج تنخفض و فرصة حدوث المشاكل تزيد

أيضاً لا جدال في أن الVirtual Machines تقدم الكثير من المهام التي لا يمكن للمترجم أن يفعلها في وقت الترجمة و لهذا تجد جميع برامج ال++C يتم بناءها على 386 Intruction Set افتراضياً و هنا يحاول المترجم أن يلعب على العامل المشترك الأدنى حتى يضمن أن البرنامج سيعمل على أغلب الأجهزة.

لكن في الVirtual machine Environment هذه القرارات تترك لأثناء التشغيل و منها أيضاً قرار ال64bit او 32bit و هو قرار قمة في الصعوبة اذا كنت تبني برامج بال++C لأنك يجب أن تقدم أكثر من نسخة من برنامجك لكي تعمل على كل processor و أيضاً تجربهم .

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#25

رغم أن نقاشنا خرج عن الموضوع الأساسي و لكن لا بأس مادام النقاش ذا فائدة :)

يبدو أن لديك خبرة بـ #C و NET. ,

اقتباس
لا يوجد شئ مطلق لا يمكن أن تقول أن أي برنامج كُتب بال++C اسرع من أي برنامج كُتب بال#C أو غيرها فهناك الكثير من العوامل منها

كما قلت لك نظرياً "المفروض" أن البرامج المكتوبة للـ Virtual Machines و تتبع مفهوم الـ JIT أن تكون أسرع من البرامج المترجمة :)

و لكن الحقيقة هي العكس, و عكس واضح جداً جداً, انظر إلى الفرق بين مترجمات NET. و بين مترجم VC من مايكروسوفت نفسها :)

اقتباس
الClass Library التي تأتي مع ال#C على سبيل المثال تحوي آلاف من المهام التي تمت كتابتها لكي تعمل بأفضل Performance ممكن و العديد منها غير موجود بنفس الجودة على ++C و تُرك للمبرمج لبناءه, و هنا تبدأ المشاكل و الReliability للبرنامج تنخفض و فرصة حدوث المشاكل تزيد

هناك أمران,

اللغة, و المكتبة,

بالنسبة للغة لايمكن مقارنة ++C لا بـ Java و لا بـ #C فالأولى لغة برمجة عامة, و #C و Java لغات برمجة للـ business...

لغة ++C تختلف اختلافاً جذرياً في مفهومها عن Java و #C,

الشيء الوحيد المتشابه هو الـ Syntax, ليس أكثر و الباقي مختلف حتى النخاع,

بالنسبة للمكتبة, فصحيح أن مكتبة ++C ليست كبيرة, لسببين, الأول أن وراء ++C "متطوعون" حتى Stroustrup نفسه لا يعمل بدوام كامل على اللغة و يمضي وقت فراغه فقط :)

إضافة إلى ذلك فإن المكتبة القياسية, يجب أن توجد حيث توجد اللغة, و لا أعتقد أن NET. Framework يمكن أن يفيد محرك Google أو حتى المسبار الذي حط على المريخ :)

و الـ Reliability هي شيء نظري, فما أراه هو العكس هو أن البرامج المكتوبة بـ C و ++C برامج حقيقية, و لا توجد حتى الآن برامج حقيقية مكتوبة بـ Java أو #C إلا من رحم ربي,

في النهاية, النقطة الوحيدة التي تميز الـ Virtual Machine Approach هو إمكانية عمل الكود على أي منصة,

و تكتب تلك الـ VMs بواسطة ++C كما هو الحال مع الـ Net. و الـ JVM ...

تحياتي ..

1

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