ما الذي جعل لسب مختلفة
ديسمبر 2001 (مراجعة مايو 2002)
(جاء هذا المقال استجابة لبعض الأسئلة على قائمة بريد LL1. تم دمجه الآن في Revenge of the Nerds.)
عندما صمم مكارثي لسب في أواخر الخمسينيات، كان ابتعادًا جذريًا عن اللغات الموجودة، أهمها Fortran.
جسدت لسب تسع أفكار جديدة:
1. الشروط. الشرط هو بناء if-then-else. نأخذ هذه الأشياء كأمر مسلم به الآن. اخترعها مكارثي أثناء تطوير لسب. (كان لدى Fortran في ذلك الوقت فقط goto شرطي، يعتمد بشكل وثيق على تعليمات الفرع في الأجهزة الأساسية.) مكارثي، الذي كان في لجنة Algol، أدخل الشروط في Algol، ومنها انتشرت إلى معظم اللغات الأخرى.
2. نوع الدالة. في لسب، الدوال هي كائنات من الدرجة الأولى - إنها نوع بيانات مثل الأعداد الصحيحة والسلاسل النصية وما إلى ذلك، ولها تمثيل حرفي، ويمكن تخزينها في متغيرات، ويمكن تمريرها كوسائط، وما إلى ذلك.
3. العودية. كانت العودية موجودة كمفهوم رياضي قبل لسب بالطبع، لكن لسب كانت أول لغة برمجة تدعمها. (يمكن القول إنها ضمنية في جعل الدوال كائنات من الدرجة الأولى.)
4. مفهوم جديد للمتغيرات. في لسب، جميع المتغيرات هي مؤشرات فعليًا. القيم هي التي لها أنواع، وليس المتغيرات، وتعيين أو ربط المتغيرات يعني نسخ المؤشرات، وليس ما تشير إليه.
5. جمع القمامة.
6. البرامج تتكون من تعبيرات. برامج لسب هي أشجار من التعبيرات، كل منها يعيد قيمة. (في بعض لهجات لسب، يمكن للتعبيرات أن تعيد قيمًا متعددة.) هذا على عكس Fortran ومعظم اللغات اللاحقة، التي تميز بين التعبيرات والجمل.
كان من الطبيعي وجود هذا التمييز في Fortran لأن (ليس من المستغرب في لغة كان تنسيق الإدخال فيها بطاقات مثقوبة) كانت اللغة موجهة بالأسطر. لم يكن بإمكانك تداخل الجمل. ولذلك، بينما كنت بحاجة إلى تعبيرات لكي تعمل الرياضيات، لم يكن هناك فائدة من جعل أي شيء آخر يعيد قيمة، لأنه لم يكن هناك شيء ينتظرها.
اختفى هذا القيد مع ظهور اللغات ذات البنية الكتلية، ولكن بحلول ذلك الوقت كان الأوان قد فات. أصبح التمييز بين التعبيرات والجمل راسخًا. انتشر من Fortran إلى Algol ومن ثم إلى كلا سلالتيهما.
عندما تتكون اللغة بالكامل من تعبيرات، يمكنك تكوين التعبيرات كيفما تشاء. يمكنك القول إما (باستخدام صيغة Arc)
(if foo (= x 1) (= x 2))
أو
(= x (if foo 1 2))
7. نوع الرمز. تختلف الرموز عن السلاسل النصية في أنه يمكنك اختبار المساواة عن طريق مقارنة مؤشر.
8. تدوين للكود باستخدام أشجار من الرموز.
9. اللغة بأكملها متاحة دائمًا. لا يوجد تمييز حقيقي بين وقت القراءة، ووقت الترجمة، ووقت التشغيل. يمكنك ترجمة أو تشغيل الكود أثناء القراءة، وقراءة أو تشغيل الكود أثناء الترجمة، وقراءة أو ترجمة الكود في وقت التشغيل.
يتيح تشغيل الكود في وقت القراءة للمستخدمين إعادة برمجة صيغة لسب؛ وتشغيل الكود في وقت الترجمة هو أساس وحدات الماكرو؛ والترجمة في وقت التشغيل هي أساس استخدام لسب كلغة امتداد في برامج مثل Emacs؛ والقراءة في وقت التشغيل تمكن البرامج من التواصل باستخدام s-expressions، وهي فكرة أعيد اختراعها مؤخرًا باسم XML.
عند اختراع لسب لأول مرة، كانت كل هذه الأفكار بعيدة كل البعد عن ممارسة البرمجة العادية، والتي كانت تمليها إلى حد كبير الأجهزة المتاحة في أواخر الخمسينيات.
مع مرور الوقت، تطورت اللغة الافتراضية، المجسدة في سلسلة من اللغات الشائعة، تدريجيًا نحو لسب. أصبحت 1-5 منتشرة على نطاق واسع الآن. بدأ 6 في الظهور في التيار الرئيسي. لدى Python شكل من أشكال 7، على الرغم من أنه لا يبدو أن هناك أي صيغة لها. 8، الذي (مع 9) هو ما يجعل وحدات الماكرو في لسب ممكنة، لا يزال فريدًا للسب حتى الآن، ربما لأن (أ) يتطلب تلك الأقواس، أو شيء سيء بنفس القدر، و (ب) إذا أضفت تلك الزيادة النهائية في القوة، فلن تتمكن بعد الآن من الادعاء بأنك اخترعت لغة جديدة، بل فقط بتصميم لهجة جديدة من لسب ؛ -)
على الرغم من فائدتها لبرامج اليوم، إلا أنه من الغريب وصف لسب من حيث اختلافها عن الحلول العشوائية التي اعتمدتها اللغات الأخرى. ربما لم يفكر مكارثي في الأمر بهذه الطريقة. لم يتم تصميم لسب لإصلاح الأخطاء في Fortran؛ بل جاءت بشكل أكبر كمنتج ثانوي لمحاولة تأصيل الحساب.