مصطفى 36a2

أفكار McCarthy التي غيرت البرمجة ...

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

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

أثناء قراءة أحد المقالات عن أفكار لغة LISP التي جددت مفهوم البرمجة بشكل كبير ...

(لغة LISP من أوائل لغات البرمجة جاءت بعد Fortran وهي من اختراع john McCarthy ..1950..شكلت ثورة في عالم البرمجة

ولا يزال تطويرها قائما حتى الآن ...(تجاوزت 9 نسخ حتى وصلت إلى أقل قدر ممكن من تعقيد التركيب النحوي)

حتى أنه يقال على سبيل التقدير للغة :

لم يعد هناك داع لتطالب بلغة برمجة جديدة ... اطلب لهجة جديدة من لغة LISP )

رأيت أن إدراجها هنا ومناقشتها فيه فائدة ...

أفكار McCarthy التي غيرت البرمجة يمكن تلخيصها في 9 أفكار

فيما يلي تعدادها مع تلخيص بسيط جدا لها ..

1. Conditionals

أول من أدخل الجمل الشرطية إلى البرمجة حيث كانت FORTRANقبلها لا تحوي إلا علىgoto للتحكم بسير البرنامج

2. A function type.

صار التابع يعتبر نوعاً يمكن التعامل معه كباقي الأنواع وهذا ما نعبر عنه حاليا

بالمؤشر إلى تابع ...

3. Recursion.

مفهوم العودية برمجياً ...(طبعا كان موجود رياضيا قبل ذلك )

4. A new concept of variables.

كل المتغيرات هي مؤشرات ..فمثلا عملية الإسناد ليست نسخ المحتوى من متحول آخر

بل نسخ عنوان القيمة من مؤشر لآخر

فصار المتحول اسمه place بصفته ال يهمنا الا المكان الذي يشير اليه

5. Garbage-collection.

طالما تحدثنا عن المؤشرات يجب التحدث عن الذاكرة وإدارة الذاكرة دون اقحام المبرمج في الأمر

6. Programs composed of expressions.

هل تظن أن المعامل الشرطي الثلاثي صناعة محلية ؟

إنه من اختراع McCarthy بجدارة منقطعة النظير

(x?1:2)

العبارة السابقة كان يعبر عنها ب:

(if x 1 2)

البرنامج مبني كشجرة من العبارات الرياضية والمkنطقية ..كل عبارة تعوض بناتجها ...

مثلا

للتعبير عن الشرط التالي :

(foo?x==1:x==2)

يمكننا كتابته كما يلي

(if foo (= x 1) (= x 2))

لاحظ الآن اخراج الشرط كعامل مشترك

ويمكن التعبير عنه كما يلي

(= x (if foo 1 2))

والتي تكافئ بالنسبة لنا :

(x==(foo?1:2))

أليست رائعة

7. A symbol type

اي وجود نوع خاص للسلاسل النصية

وهذه السلاسل يمكن أن تتضمن أي شيء بدئا من ثوابت رياضية مثل PI أو e وانتهاءا بأسماء الأشخاص

8. A notation for code.

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

نصل إلى الفكرة الأخيرة

9. The whole language always available.

أترك لكم قراءتها من النص الأصلي ...كوني لم أستطع شرحهاblush.gif

..وننتظر شرحها من أحد الأعضاء مشكوراً لمناقشتها

9. The whole language always available.

There is no real distinction between read-time, compile-time, and runtime.

You can compile or run code while reading,

read or run code while compiling,

and read or compile code at runtime.

Running code at read-time lets users reprogram Lisp's syntax;

running code at compile-time is the basis of macros;

compiling at runtime is the basis of Lisp's use as an extension language in programs like Emacs;

and reading at runtime enables programs to communicate using s-expressions,an idea recently reinvented as XML.

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

3

شارك هذا الرد


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

جزاك الله خيرا على هذه المعلومات

0

شارك هذا الرد


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

موضوع جميل و لكن عندى استفسار انت تقول

(لغة LISP من أوائل لغات البرمجة جاءت بعد Fortran وهي من اختراع john McCarthy ..1950..شكلت ثورة في عالم البرمجة

ولا يزال تطويرها قائما حتى الآن ...(تجاوزت 9 نسخ حتى وصلت إلى أقل قدر ممكن من تعقيد التركيب النحوي)

كيف لا يزال تطويرها قائما و نحن لا نسمع عنها ؟؟!! او لا نسمع عنها كثيرا قهى ليست من ضمن اللغات المشهورة مثل java و c , vb.net ؟؟ :blush:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
كيف لا يزال تطويرها قائما و نحن لا نسمع عنها ؟؟!!

سمعت بها الآن laugh.gif

يبدو أنك لا تحب القراءة .... إنها أشهر من نار على علم ... إنها بدون مبالغة ..أم اللغات الحالية جميعاً ... ( حسنا لست متعصبا لها ... ولكن هذا ما يُقال عنها دوماً )

بالتوفيق

0

شارك هذا الرد


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

Lisp لغة لامثيل لها بحال!

2. A function type.

صار التابع يعتبر نوعاً يمكن التعامل معه كباقي الأنواع وهذا ما نعبر عنه حاليا

بالمؤشر إلى تابع ...

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

7. A symbol type

اي وجود نوع خاص للسلاسل النصية

وهذه السلاسل يمكن أن تتضمن أي شيء بدئا من ثوابت رياضية مثل PI أو e وانتهاءا بأسماء الأشخاص

يوجد خلط كبير بخصوص ال symbol ... ال symbol هي string قائم بذاته في أبسط صورة على سبيل المثال كما في اللغات التي تدعم ال enumerations

RED, BLUE, GREEN فهي قيمة مجردة لايوجد ابسط منها (هي كذلك في روبي) للتعبير عن محتوى ما وكذلك يمكن أن يحوي قيم كذلك

.

There is no real distinction between read-time, compile-time, and runtime.

You can compile or run code while reading,

read or run code while compiling,

and read or compile code at runtime.

Running code at read-time lets users reprogram Lisp's syntax;

running code at compile-time is the basis of macros;

compiling at runtime is the basis of Lisp's use as an extension language in programs like Emacs;

and reading at runtime enables programs to communicate using s-expressions,an idea recently reinvented as XML.

lisp لغة تستطيع أن تبرمجها/تعيد برمجتها كما تشاء (ابحث عن ال macros)

lisp واللغات المشابهة مثل scheme تعتمد في قراءة البرنامج ليس على مجرد قراءة مجموعة من الحروف ولكنها تتعامل ب forms (او ربما انسب وصفها ب lisp objects )

إضافة أخيرة الكثير يصل إلى ذهنه أن lisp لاعلاقة لها بالبرمجة الكائنية! ولكنها معلومة خاطئة تماما، وهي تدعم البرمجة الكائنية بطريقة ممتازة

موضوع جميل و لكن عندى استفسار انت تقول

كيف لا يزال تطويرها قائما و نحن لا نسمع عنها ؟؟!! او لا نسمع عنها كثيرا قهى ليست من ضمن اللغات المشهورة مثل java و c , vb.net ؟؟ :blush:

هذا غير صحيح، lisp شهيرة جدا في تطبيقات الذكاء الصناعي وفي الحياة الأكاديمية فضلا عن سهولتها وقوتها (تعبيرية وبرمجيا تخيل لغة تستطيع أن تبرمجها!) ربما لايوجد لغة تقارن بها أصلا إلا إذا كانت من نفس العائلة ك scheme او clojure!

1

شارك هذا الرد


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

بارك الله فيك أخي ahmed_youssef

lisp شهيرة جدا في تطبيقات الذكاء الصناعي وفي الحياة الأكاديمية فضلا عن سهولتها وقوتها (تعبيرية وبرمجيا تخيل لغة تستطيع أن تبرمجها!) ربما لايوجد لغة تقارن بها أصلا إلا إذا كانت من نفس العائلة ك scheme او clojure!

فعلاً ... أستغرب عدم انتشارها في الأوساط العادية للمبرمجين ... لا تجد من يتحدث عن فلسفة LISP ... عن أسلوب LISP عن تطبيقات LISP ... للأسف...

موضوع مفيد جدا بارك الله فيكم

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


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

السلام عليكم

مقالة رائعة

4. A new concept of variables.

كل المتغيرات هي مؤشرات ..فمثلا عملية الإسناد ليست نسخ المحتوى من متحول آخر

بل نسخ عنوان القيمة من مؤشر لآخر

فصار المتحول اسمه place بصفته ال يهمنا الا المكان الذي يشير اليه

- إذاً فعلى هذا لابد أن توجد طريقة لنسخ قيم المتغيرات ! تم تعديل بواسطه ahmedsaoud31
0

شارك هذا الرد


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

john McCarthy مؤسس ال AI وتنبأ بال Cloud Computing ... فعلا عالم كبير و شخص سابق عصره بمراحل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
- إذاً فعلى هذا لابد أن توجد طريقة لنسخ قيم المتغيرات !

طان يجدر بك السؤال عن كيفية انشاء مؤشر واسناده لعنوان في الذاكرة ... smile.gif

john McCarthy مؤسس ال AI وتنبأ بال Cloud Computing ... فعلا عالم كبير و شخص سابق عصره بمراحل

ربما يكون قدوة لكثير منا بعقليته وذكائه wink.gif

بالتوفيق

0

شارك هذا الرد


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

السلام عليكم

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

1

شارك هذا الرد


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

بداية علينا فهم أنواع الكائنات في LISP ...

Every Lisp object is either an atom or a list

Examples of atoms:

numbers:

235.4 2e10 #x16 2/3

variables:

 foo 2nd-place *foo*

constants: pi t nil :keyword

strings, chars:

"Hello!" #\a

arrays:

#(1 "foo" A) #1A(1 "foo" A) #2A((A B C) (1 2 3))

structures:

[left]#s(person first-name dana last-name nau)
[/left]

Here are some atoms.


eve
1
bananastand
carbon

Here are some lists:


(1 2 3 4)
((i hate) (peanut butter) (and jelly))
(you (walrus (hurt) the (one you) love))
(add 3 (mult 4 5))
(garbage (garbage) out)
(car ((in the garage) park))
(deeper and (deeper and (deeper and (deeper we went))))

انظر المثال الأخير كم هو ممتعlaugh.gif

لتعريف نواة ... فإننا نكتب مثلا :

(SETQ a 15)

وبذلك يمكننا تعريف متحول آخر لنسنده إلى قيمة المتحول القديم :

(SETQ b a)

ان أي عملية بين قوسين ينتج عنها قيمة أو شيء ما ... يتم حفظ هذا الشيء ما في مكان من الذاكرة ..إلى حين أن يتم الإشارة إليه من قبل أحد المؤشرات ...

وفيما يلي التوابع المستخدمة لعملية الاسناد

functions: defconstant, defparameter, defvar, set, setq, psetq, setf,
andpsetf

انظر هنا الى عملية اسناد طويلة بعض الشيء ... (كل عنصر يتم اسناده للعنصر التالي ):

(setq x0 1 x1 1 x2 (+ x1 x0) x3 (+ x2 x1) x4 (+ x3 x2))

وهذه طريقة لعمل swapلعنصرين :

(setq temp x1 x1 x4 x4 temp)

الفكرة الأساسية التي عليك استيعابها هي أن المتحول عندما تتغير قيمته فهذا يعني أنه غير مكانه الذي يؤشر إليه ... وليس أن القيمة التي يؤشر عليها تغيرت ...

مثلاً ... لدينا x=2ولدينا y=3

فكتبنا ... y=x فصارت y==2 وأين ذهبت القيمة الأولى 3 ... قد تكون لا زالت في الذاكرة ...ولكن لا شيء يشير إليها...

الفكرة رائعة الآن لذلك ركز معي :

y+=1 ما الذي سيحدث .؟ سيتم إنشاء قيمة جديدة في الذاكرة وهي ناتج العملية 3 ...

ثم يتم اسناد المؤشر y إليها ... وبالتالي يبقى x كما هو .. لأن التغيير لم يحدث على نفس الحجرة . .smile.gifsmile.gifوصلت ؟wink.gif

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

(أرجو التصحيح إن كنت قد أخطأت في شيء )

1

شارك هذا الرد


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

السلام عليكم

تمام مصطفى هذا ما كنت أريد أن أعرفه , بارك الله فيك

ولكن على ما أظن أنه لايتم الإحتفاظ بالقيم مادام ليس هناك ما يشير إلى هذا العنوان , وإلا لو يتم الإحتفاظ بالقيم في الذاكرة وقمنا بعمل حلقة تكرار كبيرة , ماذا سيحدث ؟!blink.gif

0

شارك هذا الرد


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

هذه مهمة الgarbage collector ... لا تقلق فقد كان mccarthy منتبها لفكرتك happy.gif

بالتوفيق

0

شارك هذا الرد


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

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

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