«بزرگترین زبان برنامه نویسی که تا کنون ساخته شده است«
- آلن کی، "در لیسپ"
هنگامی که مک کارتی Lisp را در اواخر دهه 1950 توسعه داد، به طور اساسی با زبان های موجود متفاوت بود، که مهمترین آنها این بود.
لیسپ XNUMX ایده جدید معرفی کرد:
1. شرایط. عبارات شرطی ساختارهای if-ther-else هستند. حالا ما آنها را بدیهی می دانیم. آنها بودند
2. یک نوع تابع. در Lisp، توابع اشیاء درجه یک هستند - آنها یک نوع داده هستند، درست مانند اعداد، رشته ها و غیره، و نمایش تحت اللفظی دارند، می توانند در متغیرها ذخیره شوند، می توانند به عنوان آرگومان ارسال شوند و غیره.
3. بازگشت. البته Recursion به عنوان یک مفهوم ریاضی قبل از Lisp وجود داشت، اما Lisp اولین زبان برنامه نویسی بود که از آن پشتیبانی کرد. (این ممکن است در ایجاد توابع به عنوان اشیاء درجه یک به معنای واقعی کلمه باشد.)
4. مفهوم جدیدی از متغیرها. در Lisp، همه متغیرها نشانگرهای موثر هستند. مقادیر آن چیزی است که انواع دارند، نه متغیرها، و تخصیص یا اتصال متغیرها به معنای کپی کردن نشانگرها است، نه چیزی که به آن اشاره می کنند.
5. مجموعه زباله.
6. برنامه هایی که از عبارات تشکیل شده اند. برنامههای Lisp درختهایی از عبارات هستند که هر کدام مقداری را برمیگردانند. (برخی عبارات Lisp می توانند چندین مقدار را برگردانند.) این با Fortran و بسیاری از زبان های موفق دیگر که بین "expressions" و "statement" تمایز قائل می شوند، در تضاد است.
طبیعی بود که این تمایز در فرترن وجود داشته باشد زیرا زبان خط محور بود (برای زبانی که فرمت ورودی آن یک کارت پانچ بود تعجب آور نیست). شما نمی توانید عبارات تودرتو داشته باشید. و تا زمانی که برای کار کردن به عبارات ریاضی نیاز داشتید، فایده ای نداشت که چیز دیگری مقداری را برگرداند زیرا ممکن است چیزی در انتظار بازگرداندن نباشد.
محدودیتها با ظهور زبانهای بلوکساختار برداشته شد، اما در آن زمان دیگر خیلی دیر شده بود. تمایز بین عبارات و عبارات قبلاً مشخص شده است. از فرترن به الگل و بعد از آن به نوادگان آنها گذشت.
هنگامی که یک زبان کاملاً از عبارات ساخته شده است، می توانید عبارات را هر طور که می خواهید بنویسید. شما می توانید هر یک را بنویسید (با استفاده از نحو
(if foo (= x 1) (= x 2))
یا
(= x (if foo 1 2))
7. یک نوع نماد. کاراکترها با رشته ها متفاوت هستند، در این صورت می توانید با مقایسه نشانگرها برابری را بررسی کنید.
8. یک نماد برای کد با استفاده از درختان نماد
9. کل زبان همیشه در دسترس است. هیچ تفاوت آشکاری بین زمان خواندن، زمان کامپایل و زمان اجرا وجود ندارد. میتوانید کد را در حین خواندن کامپایل یا اجرا کنید، یا هنگام کامپایل کد را بخوانید یا اجرا کنید، یا هنگام اجرا کد را بخوانید یا کامپایل کنید.
اجرای کد در حین خواندن به کاربران اجازه می دهد تا سینتکس Lisp را دوباره برنامه ریزی کنند. اجرای کد در زمان کامپایل اساس ماکروها است. کامپایل زمان اجرا مبنایی برای استفاده از Lisp به عنوان یک زبان پسوند در برنامه هایی مانند Emacs است. و در نهایت، خواندن زمان اجرا به برنامه ها اجازه می دهد تا با استفاده از s-expressions ارتباط برقرار کنند، ایده ای که اخیراً در XML ابداع شده است.
نتیجه
زمانی که Lisp برای اولین بار اختراع شد، این ایدهها با شیوههای برنامهنویسی مرسوم که توسط سختافزار موجود در اواخر دهه 1950 دیکته شده بود، فاصله زیادی داشتند.
با گذشت زمان، زبان پیشفرض، که با موفقیت زبانهای رایج تجسم یافته بود، به تدریج به سمت Lisp تکامل یافت. امتیاز 1-5 اکنون به طور گسترده پذیرفته شده است. نقطه 6 در جریان اصلی ظاهر می شود. پایتون دارای بند 7 به شکلی است، اگرچه نحو مناسبی وجود ندارد. مورد 8 که (با مورد 9) ماکروها را در Lisp ممکن می کند، هنوز فقط در Lisp وجود دارد، احتمالاً به این دلیل که (الف) به آن پرانتزها یا چیزی به همان اندازه بد نیاز دارد، و (ب) اگر این آخرین افزایش قدرت را اضافه کنید، می توانید دیگر ادعا نکنید که زبان جدیدی اختراع کردهاید، بلکه فقط گویش جدیدی از Lisp را توسعه دادهاید. -)
اگرچه این برای برنامه نویسان مدرن مفید است، اما توصیف Lisp از نظر تفاوت آن با تکنیک های تصادفی مورد استفاده در زبان های دیگر عجیب است. شاید مک کارتی به این فکر نمی کرد. Lisp برای تصحیح خطاهای فرترن طراحی نشده بود. بیشتر به عنوان محصول جانبی تلاش ظاهر شد
منبع: www.habr.com