زبان برنامه نویسی لیسپ بخاطر رویکرد بسیار خاصی که درباره ساختار کدها و روش کار با آن‌ها انتخاب کرده مشهور شده است. کلمه «لیسپ» (Lisp) مخففی از عبارت «List Processing» به معنای «پردازش لیست» است. زبان لیسپ یکی از قدیمی‌ترین زبان‌های سطح بالایی است که در حال حاضر استفاده می‌شود. زیربنای این زبان به شکلی طراحی شده که کدها را به عنوان داده در نظر بگیرد. این اصل به طرز چشم‌گیری بر روی سیتنکس یکتا و مدل برنامه‌نویسی آن تاثر گذاشته است. از روی زبان لیسپ چندین نسخه مدرن مانند Common Lisp و Emacs Lisp (Elisp) و Clojure و Racket و Scheme و Fennel و GNU Guile به‌وجود آمده‌اند. این زبان کاربردهای بسیار حرفه‌ای دارد که باعث شده هنوز برنامه نویسان برای آموزش آن اقدام کنند.

فهرست مطالب این نوشته
997696

در این مطلب از مجله فرادرس به بررسی زبان برنامه نویسی لیسپ پرداخته‌ایم. ابتدا با این زبان آشنا شده و سپس چند مورد از قواعد ساده‌ کدنویسی آن را بیان کرده‌ایم. در نهایت با مشهورترین نسخه مدرن آن یعنی Common Lips آشنا شده و درباره مهم‌ترین ویژگی‌ها و مزیت‌های استفاده آن صحبت کرده‌ایم. زبان لیسپ جایگاه خود را در بین برنامه‌نویسان حرفه‌ای حفظ کرده و همیشه آماده انجام پروژه‌های بزرگ است.

زبان برنامه نویسی Lisp چیست؟

زبان برنامه نویسی لیسپ، عضوی از خانواده زبان‌های برنامه نویسی است که از «روش پیشوندی با پرانتزگذاری» (Parenthesized Prefix Notation) استفاده می‌کند. این زبان بعد از زبان فرترن، دومین زبان برنامه‌نویسی قدیمی سطح بالایی است که هنوز به صورت گسترده‌ای به کار برده می‌شود. زبان لیسپ در سال ۱۹۵۸ میلادی توسط «جان مک کارتی» (John McCarthy) در دانشگاه MIT توسعه داده شد. نام این زبان، یعنی «Lisp» از عبارت «List Processing» مشتق شده است. زیرا لیست‌های پیوندی یکی از مهمترین ساختارهای داده‌ای در این زبان هستند. این ساختار به برنامه‌ها کمک می‌کند تا با کدهای منبع خود به عنوان داده کار کنند.

زبان لیسپ بخاطر ویژگی‌های بی‌همتایی که دارد، شناخته می‌شود. این ویژگی‌ها بر روی تعداد زیادی از زبان‌های ساخته شده بعد از آن نیز موثر بوده‌اند. لیسپ زبان برنامه نویسی تابعی است که به منظور انجام عملیات ساده بر روی داده‌های رشته‌ای ساخته شده. این زبان به مدت طولانی یکی از زبان‌های محبوب در حوزه تحقیقات مربوط به «هوش مصنوعی» (Artificial Intelligence | AI) بود. لیسپ در بسیاری از ایده‌های مربوط به علوم کامپیوتر مانند ساختار‌های داده درختی، «توابع مرتبه بالاتر» (Higher-Order Functions)، مفاهیم بازگشتی و «کامپایلرهای خودمیزبان» (Self-Hosting Compiler) پیشگام بوده است.

فضای نمادین درون کامپیوتر و کدهایی که اجرا می‌شوند. - زبان برنامه نویسی لیسپ

امروزه مشهورترین نسخه‌های مختلف زبان لیسپ با هدف طراحی همه‌منظوره برنامه‌ها شامل Common Lisp و Scheme و Racket و Clojure می‌شوند. معمولا زبان لیسپ را در حوزه‌های مختلفی به‌خصوص هوش مصنوعی به کار می‌برند. در حوزه هوش مصنوعی، زبان لیسپ با روش‌‌های نمادینی مانند «شبکه‌های عصبی» (Neural Networks) و تکنیک‌های ماشین لرنینگ ادغام شده است. اگرچه جزئیات بیشتر چنین عملیاتی معمولا به صورت محرمانه باقی می‌مانند. یکی دیگر از حوزه‌های فعالیت لیسپ در محیط‌های آکادمیک است. از کاربردهای مربوط به برنامه نویسی ابتدایی گرفته تا محاسبات کوانتومی را می‌توان با کمک لیسپ انجام داد. علاوه بر موارد بیان شده، از لیسپ در سیستم‌های نهفته نیز به عنوان زبان اسکریپت نویسی استفاده می‌شود. همچنین در تیم‌های برنامه‌نویسی کوچک هم لیسپ، کاربردهای خاص خود را پیدا کرده است.

آموزش های برنامه نویسی فرادرس از مقدماتی تا پیشرفته

زبان‌های برنامه‌نویسی از زمان اختراع کامپیوتر، همراه با آن به‌وجود آمدند و به مرور زمان با پیشرفت‌ کامپیوتر، آن‌ها نیز پیشرفت کردند. هرچه زندگی بشر بیشتر با کامپیوترها ادغام شد، زبان‌ها نیز متنوع‌تر و پیشرفته‌تر شدند. همچنین فرصت‌های شغلی متنوع‌تر و زیاد‌تری نیز به‌وجود آمدند. به همین‌ دلیل کم کم برنامه‌نویسی از تخصص بسیار انحصاری مربوط به مهندسین شرکت‌های بزرگ و مخترعین کامپیوتر به دانشی عمومی تبدیل شد که در سراسر جهان، دانشگاه‌ها و مدارس به افراد آموزش می‌دادند. هنوز هم هر روز کامپیوترها بیشتر وارد زندگی انسان می‌شوند و بنابراین زبان‌های برنامه‌نویسی استفاده‌های عمومی و تخصصی بیشتری پیدا می‌کنند.

مجموعه آموزش برنامه نویسی از مبتدی تا انتها
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش برنامه نویسی هدایت شوید.

کشور ما به عنوان یکی از کشورهای درحال توسعه، نیاز روزافزونی به مهارت‌های برنامه‌نویسی دارد. از طرفی داشتن این توانایی امکان کار به صورت آزاد و فریلنسری را نیز برای افراد محیا می‌کند. به همین منظور فرادرس تلاش کرده تا بهترین آموزش‌ها را با تنوع زیاد در حوزه‌های مختلف برای همه افراد تهیه و منتشر کند. بنابراین، فیلم‌های آموزشی فرادرس با کیفیت بالا و هزینه‌های مقرون به صرفه تبدیل به یکی از بزرگترین مراجع آموزش برنامه‌نویسی در کشور‌ شده‌اند. در ادامه فیلم آموزش چند زبان مختلف را معرفی کرده‌ایم. در صورت تمایل با کلیک بر روی تصویر بالا به صفحه اصلی این مجموعه آموزشی رفته و با فیلم‌های بیشتری آشنا شوید.

آموزش استفاده از زبان برنامه نویسی لیسپ

تعدادی زیادی از برنامه‌های نوشته شده با زبان لیسپ در پایگاه‌های کد بزرگ وجود دارند و برای انجام پروژه‌های حرفه‌ای به کار برده می‌شوند. پس هوشمندانه است که با این کدها آشنا شویم. اشخاص علاقه‌مند به طراحی زبان‌های برنامه‌نویسی، اغلب از زبان لیسپ تقدیر می‌کنند. زیرا سینتکس و داده‌های زبان لیسپ دارای ساختار یکسانی هستند. کدهای لیسپ به صورت پایه‌ از لیستی تشکیل شده‌اند که خود شامل لیست‌های دیگری می‌شود. به همین دلیل نام این زبان «List Processing» است.

اگرچه افرادی که بر روی ظاهر زبان‌های برنامه‌نویسی تمرکز می‌کنند، اغلب زبان لیسپ را دوست ندارند. زیرا این زبان از تعداد زیادی پرانتز استفاده می‌کند. طنز رایجی در این‌باره وجود دارد که می‌گوید، کلمه LISP سرنامی از واژه‌های عبارت «Lots of Irritating Superfluous Parentheses» به معنای «تعداد زیادی پرانتز زائد رنج‌آور» است.

فرقی نمی‌کند که نسبت به تعداد پارانترهای لیسپ چه حسی داشته باشیم، زیرا میزان استفاده از کدهای لیسپ در «پایگاه‌های کد» (Codebases) بزرگ در صنایع مختلف هیجان‌انگیز است. بنابراین بهتر است که با روش نوشتن کدهای این زبان‌ هم آشنا باشیم.

روش نصب زبان برنامه نویسی Lisp چیست؟

پیاده‌سازی‌های زیادی برای زبان برنامه نویسی لیسپ وجود دارند. نسخه‌های متن‌باز و مشهور این زبان شامل SBCL و GNU Lisp و GNU Common Lisp یا GCL می‌شوند. با استفاده از Package Manager توزیع زبان لیسپ می‌توان هر کدام از این موارد را نصب کرد. اما در این مطلب از نسخه «clisp» استفاده می‌کنیم.

کلمه lisp در وسط تصویر اتصالات نورانی و کوچک - زبان برنامه نویسی لیسپ

نصب لیسپ در لینوکس فدورا

برای نصب این زبان در توزیع لینوکس نسخه فدورا، می‌توانیم کد زیر را در ترمینال نوشته و سپس دکمه اینتر را فشار دهیم.

$ sudo dnf install clisp

نصب لیسپ در لینوکس دبیان

برای نصب این زبان در سیستم عامل لینوکس نسخه دبیان، می‌توانیم کد زیر را در ترمینال نوشته و سپس دکمه اینتر را فشار دهیم.

$ sudo apt install clisp

نصب لیسپ در سیستم عامل macOS

برای نصب این زبان در سیستم عامل macOS، می‌توانیم از MacPorts یا Homebrew استفاده کنیم. فقط کافیست کد زیر را در ترمینال نوشته و سپس دکمه اینتر را فشار دهیم.

$ sudo dnf install clisp

نصب لیسپ در ویندوز

برای نصب نسخه «clisp» از زبان برنامه نویسی لیسپ در ویندوز هم باید ابتدا فایل نصب کننده مربوط به لیسپ را دانلود کرده و سپس آن را اجرا کنیم. برای دانلود فایل نصب لیسپ می‌توان از سایت Cygwin (+) و هم از منبع سایت lagoon (+) اقدام کرد. بعد از دانلود کردن GCL binary این زبان را نصب می‌کنیم.

با اینکه در حال استفاده از دستورهای «clisp» هستیم اما ایده‌های اصلی مطرح شده در این مطلب به تمام نسخه‌های زبان لیسپ مرتبط‌اند. اگر از سایر نسخه‌های زبان لیسپ مانند gcl یا sbcl استفاده کنید، فرامین مربوط به اجرای کدها تغییر خواهند کرد اما تمام موارد دیگر به صورت ثابت باقی می‌مانند.

List processing

به کوچک‌ترین واحد قابل اجرا در کدهای منبع لیسپ، «عبارت» (Expression) گفته می‌شود. عبارت‌ها به صورت لیست نوشته می‌‌شوند. برای نمونه در کادر زیر کد مربوط به لیستی را نوشته‌ایم که شامل عملگر +  و دو عدد صحیح 1  و 2  است.

کد بالا عبارت لیسپی است که از نماد +  برای ارزیابی تابع جمع و دو آرگومان 1  و 2  استفاده می‌کند. این عبارت و سایر کدها را می‌توانیم در محیط تعاملی لیسپ نسخه Common نیز استفاده کنیم. به محیط Common برای کدنویسی REPL گفته می‌شود. REPL سرنامی از واژه‌های «Read-Eval-Print Loop» است. اگر با محیط کدنویسی IDLE زبان برنامه نویسی پایتون آشنا باشید، محیط REPL هم برای شما آشنا خواهد بود.

برای استفاده از REPL باید Common Lisp را راه‌اندازی کنیم.

به عنوان پرامپت REPL، چند عبارت ساده زیر را وارد کنید.

1[1]> (+ 1 2)
23
3[2]> (- 1 2)
4-1
5[3]> (- 2 1)
61
7[4]> (+ 2 3 4)
89

توابع

تا اینجای کار با ساختار پایه عبارت‌های زبان لیسپ آشنا شده‌ایم. اکنون می‌توانیم از توابع لیسپ به روش مفیدی استفاده کنیم. تابع print  هر آرگومانی را که فراهم کنیم، دریافت کرده و در ترمینال نمایش می‌دهد. در حالی که تابع pprint  به صورت «زیبا» (Pretty) آن را چاپ می‌کند. p اضافه از کلمه Pretty گرفته شده است. انواع دیگری هم از تابع print  در لیسپ وجود دارند اما pprint  در REPL به خوبی کار می‌کند.

1[1]> (pprint "hello world")
2
3"hello world"
4
5[2]>

برنامه‌نویسان می‌توانند تابع خود را با کمک کلمه کلیدی defun  ایجاد کنند. کلمه کلیدی defun  نیاز به نامی برای تابع و پارامترهای احتمالی دارد، که تابع طراحی شده باید بپذیرد.

1[1]> (defun myprinter (s) (pprint s))
2MYPRINTER
3[2]> (myprinter "hello world")
4
5"hello world"
6
7[3]>

متغیرها

با استفاده از کلمه کلیدی setf  می‌توانیم در زبان لیسپ متغیر ایجاد کنیم.

1[1]> (setf foo "hello world")
2"hello world"
3[2]> (pprint foo)
4
5"hello world"
6
7[3]>

همچنین می‌توان عبارت‌ها را درون عبارت‌های دیگری به صورت تودرتو استفاده کرد. برای این کار نیاز به استفاده از ساختاری شبیه به Pipeline داریم. برای نمونه، بعد از فراخوانی تابع string-upcase  برای تبدیل کردن کاراکترهای مقدار متغیر به حروف الفبای بزرگ، به راحتی می‌توان محتوای متغیر تعریف شده را در ترمینال چاپ کرد.

1[3]> (pprint (string-upcase foo))
2
3"HELLO WORLD"
4
5[4]> 

زبان برنامه نویسی لیسپ از نوع زبان‌های با نوع‌دهی خودکار است. به این معنا که در زمان تعریف متغیرها نیازی به مشخص کردن نوع آن‌ها نداریم. لیسپ به صورت پیش‌فرض با متغیر حاوی اعداد صحیح، مانند اعداد صحیح رفتار می‌کند. یعنی نوع متغیر را از روی مقدار تخصیص داده شده به آن می‌شناسد.

1[1]> (setf foo 2)
2[2]> (setf bar 3)
3[3]> (+ foo bar)
45

در این زبان اگر بخواهیم که عدد صحیحی توسط مفسر از نوع رشته در نظر گرفته شود، باید آن‌ را با علامت‌های کوتیشن محصور کنیم.

1[4]> (setf foo "2")
2"2"
3[5]> (setf bar "3")
4"3"
5[6]> (+ foo bar)
6
7*** - +: "2" is not a number
8The following restarts are available:
9USE-VALUE      :R1      Input a value to be used instead.
10ABORT          :R2      Abort main loop
11Break 1 [7]>

در سشن ساده REPL بالا، هر دو متغیر foo  و bar  با اعداد محصور در کوتیشین مقداردهی شده‌اند. بنابراین زبان لیسپ آن‌ها را مانند رشته تفسیر می‌کند. عملگرهای ریاضی را نمی‌توان برای داده‌های رشته استفاده کرد. بنابراین REPL وارد حالت دیباگ کننده می‌شود. برای خروج از حالت عیب‌یابی باید دکمه‌های «Ctrl+D» را از صفحه کلید فشار دهیم.

انفجاری در فضا که نورهای قرمز به اطراف پخش شده‌اند - زبان برنامه نویسی لیسپ

با استفاده از تابع typep  می‌توانیم به بررسی ماهیت اشیاء بپردازیم. این تابع بررسی می‌کند که آیای شیء مورد نظر از نوع داده خاصی هست یا نه. در زبان لیسپ توکن‌های T  و NIL  به ترتیب نشان‌دهنده True و False هستند.

1[4]> (typep foo 'string)
2NIL
3[5]> (typep foo 'integer)
4T

استفاده از کوتیشن یگانه  قبل از استرینگ و Integer باعث می‌شود که لیسپ این کلمات کلیدی را به اشتباه به عنوان متغیر در نظر نگیرد.

1[6]> (typep foo string)
2*** - SYSTEM::READ-EVAL-PRINT: variable STRING has no value
3[...]

این روش، میانبری برای مراقبت از عبارت‌های زبان است که معمولا با استفاده از تابع quote  انجام می‌‌شود.

1[7]> (typep foo (quote string))
2NIL
3[5]> (typep foo (quote integer))
4T

لیست ها

بسیار طبیعی است که بتوانیم در زبان لیسپ از ساختار داده لیست هم استفاده کنیم. در کادر زیر نمایش ساده‌ای از پیاده‌سازی این ساختار را ارائه داده‌ایم.

1[1]> (setf foo (list "hello" "world"))
2("hello" "world")

در ضمن می‌توان لیست‌ها را با استفاده از تابع nth  ایندکس‌گذاری کرد. روش استفاده از این تابع را در کد زیر نمایش داده‌ایم.

1[2]> (nth 0 foo)
2"hello"
3[3]> (pprint (string-capitalize (nth 1 foo)))
4
5"World"

خروج از REPL

برای به پایان رساندن سشن‌های REPL کافی است که ترکیب دکمه‌های «Ctrl+D» را در صفحه کلید فشار دهیم. همچنین می‌توان از کلمه کلیدی quit  در لیسپ نیز استفاده کرد. روش استفاده از این کلمه را در کادر زیر پیاده‌سازی کرده‌ایم.

اسکریپت نویسی

لیسپ را هم می‌توان کامپایل کرد و هم می‌توان به عنوان زبان اسکریپتی مفسری استفاده کرد. احتمالا مورد دوم ساده‌ترین گزینه در زمان شروع به کار با لیسپ است. بخصوص اگر از قبل با زبان پایتون یا اسکریپت‌نویسی در شل آشنا باشید. هر دوی این روش‌ها برای ترجمه کدهای سطح بالا به کدهای زبان ماشین – قابل فهم برای کامپیوتر – به‌ کار برده می‌شوند. اما در صورتی که نسبت به تفاوت این دو روش اطلاعات کافی ندارید پیشنهاد می‌کنیم که مطلب تفاوت کامپایلر و مفسر چیست؟ از کاربرد تا مزایا و معایب را از مجله فرادرس مطالعه کنید.

در کادر زیر کدهای مربوط به استکریپت تاس چرخانی را در GNU مربوط به لیسپ نسخه Common نوشته‌ایم.

1#!/usr/bin/clisp
2
3(defun roller (num)
4  (pprint (random (parse-integer (nth 0 num))))
5)
6
7(setf userput *args*)
8(setf *random-state* (make-random-state t))
9(roller userput)

تمام خطوط کد در کادر بالا را به ترتیب در فهرست پایین توضیح داده‌ایم.

  • خط اول در کد بالا: به ترمینال POSIX می‌گوید که برای اجرای اسکپریت‌ها از چه برنامه قابل اجرایی استفاده کند.
  • در خطوط ۳ و ۴ و ۵: تابع roller  که توسط defun  ساخته شده، برای چاپ عدد شبه‌رندم از تابع random  استفاده می‌کند. این عدد از بین همه اعداد لیست num  انتخاب شده اما شامل عنصر اول لیست نمی‌شود. یعنی همه عناصر لیست num  به غیر از عنصر اول لیست. البته در این اسکریپت لیست num  هنوز ایجاد نشده است. این مسئله باعث بروز مشکل نمی‌شود. زیرا تابع فقط بعد از فراخوانده شدن اجرا می‌شود.
  • در خط هفتم: تمام آرگومان‌های فراهم شده برای اسکریپت در زمان اجرای برنامه، به متغیری به نام userput  تخصیص داده می‌شود. متغیر userput  از نوع لیست است. وقتی که این لیست به تابع roller  ارسال شود به متغیر num  تبدیل می‌شود.
  • خط یکی مانده: به آخر در اسکریپت، «Seed» تصادفی ایجاد می‌کند. «Seed» تصادفی برای لیسپ به اندازه کافی «بی‌نظمی» (Entropy) به‌وجود می‌آورد تا عددی با احتمال تصادفی بودن زیاد تولید شود.
  • خط نهایی: با فراهم کردن لیست Userput  به عنوان تنها آرگومان، تابع سفارشی‌شده roller  را فراخوانی می‌کند.
تصویری از جریان های داده در فضا با رنگ‌های مختلف - زبان برنامه نویسی لیسپ

با استفاده از کد زیر، فایل خود را با نام dice.lisp  ذخیره کرده و به عنوان فایل قابل اجرا علامت‌گذاری می‌کنیم.

در نهایت هم با فراهم کردن عددی به عنوان بیشینه محدوده انتخاب برای اعداد تصادفی، استکریپت نوشته شده خود را اجرا می‌کنیم. در کدهای زیر سه بار این فایل را فراخوانی کرده و کدهای آن را با دادن مقدار دلخواه اجرا کردیم.

1$ ./dice.lisp 21
2
313
4$ ./dice.lisp 21
5
67
7$ ./dice.lisp 21
8
920

مفاهیم و ویژگی های کلیدی زبان برنامه نویسی لیسپ

برای آموزش زبان برنامه نویسی لیسپ دوره‌های زیادی وجود ندارند، اما فرادرس تلاش کرده که بهترین دوره ممکن را از لحاظ کیفیت و محتوا آماده کرده و در اختیار مخاطبین خود قرار دهد. در صورت تمایل به استفاده می‌توانید فیلم آموزش زبان برنامه نویسی لیسپ Lisp را در فرادرس مشاهده کنید. برای کمک به مخاطبین مجله لینک مربوط به این فیلم را در پایین نیز قرار داده‌ایم.

در این بخش به بررسی سینتکس زبان لیسپ پرداخته‌ و به این منظور تمرکز خود را بر روی ویژگی‌های یکتا و اصول بنیادین زبان قرار داده‌ایم. همچنین انعطاف‌پذیری زبان لیسپ را در زمان استفاده از «عبارات S» یا (S-Expressions) نشان دادیم.

سینتکس و ساختار زبان برنامه نویسی لیسپ

سینتکس زبان لیسپ بخاطر سادگی و یک‌شکل بودن، قابل توجه است. برای اینکه بدانیم روش نوشتن کدها در زبان برنامه نویسی Lisp چیست باید با سینتکس جالب این زبان آشنا شویم. در لیسپ برنامه‌ها به عنوان عبارت‌های نمادین نشان داده می‌شوند. این نوع از کدها به صورت رایج به عنوان عبارت‌های S یا «Sexps» شناخته می‌‌شوند. عبارت‌های Sexp شامل لیست‌های تودرتویی هستند که توسط پرانتزهای باز و بسته محصور شده‌اند. در این نوع از عبارت‌ها هر عنصری در لیست می‌تواند اتم یا لیست دیگری باشد.

برای مثال، مسئله ریاضی ساده‌ای مانند جمع دو عدد در زبان لیسپ به شکل نمایش داده شده در کد زیر، نوشته می‌‌شود.

در کد بالا، عملگر جمع +  نشان دهنده عملیات بعلاوه کردن است. اعداد ۲ و ۳ هم عملوند‌های آن‌ هستند که درون پرانتزهای باز و بسته محصور شده‌اند.

اهمیت وجود Sexp ها

S-expression-ها به عنوان نمایش اولیه‌ای از هر دو مفهوم کد و داده در لیست به کار برده می‌شوند. به این همشکلی کدها و داده‌ها در زبان لیسپ «همسانی» (Homoiconicity) گفته می‌شود. استفاده از همسانی به کسب توانایی‌های قدرتمند «فرا برنامه‌نویسی» (Metaprogramming) کمک می‌کند. در واقع با این تکنیک می‌توانیم کدها را طوری تغییر دهیم که انگار با داده‌ها کار می‌کنیم. از آنجا که برنامه‌های نوشته شده را می‌توان مانند ساختارهای داده در نظر گرفت و برعکس، دستکاری برنامه‌ریزی شده کدها به شکل ساده‌ای انجام می‌شود. به بیان ساده‌تر، به کمک ویژگی Metaprogramming می‌توان کدهایی نوشت که قادر به تولید و نوشتن کدهای دیگری هستند. این ویژگی دلیل اصلی محبوبیت استفاده از زبان لیسپ در حوزه‌هایی مانند هوش مصنوعی، پردازش زبانی و محاسبات نمادین است. زیرا در چنین حوزه‌های وجود کدهای منعطف و خودمختار امتیاز محسوب می‌شود.

الگوهای برنامه نویسی تابعی در لیسپ

زبان برنامه نویسی لیسپ، از نوع زبان‌های تابعی است. به این معنا که محاسبات را مانند توابع ریاضی در نظر می‌گیرد. این زبان بر روی داده‌های تغییرناپذیر تمرکز کرده و از «توابع مرتبه بالاتر» (Higher-Order Functions) پشتیبانی می‌کند. توابع در زبان لیسپ می‌توانند مانند هر متغیر دیگری مورد استفاده قرار بگیرند. یعنی به عنوان آرگومان به تابع دیگری ارسال شوند یا از تابع دیگری به بیرون برگشت داده شوند. حتی می‌توان توابع را به متغیرها تخصیص داد.

فضای نمادینی از محیط کامپایل کدها در درون کامپیوتر با راه پله‌ای که به بالا می‌رود. - زبان برنامه نویسی لیسپ

این رویکرد تابعی از طریق استفاده بیشتر از فرایند‌های بازگشتی به‌جای حلقه‌ها و اجتناب از تغییردادن داده‌های تثبیت شده، کاربران را به نوشتن کدهای مختصر و تاثیرگذار تشویق می‌کند. این شکل از برنامه نویسی، درک و مدیریت برنامه‌ها را ساده‌تر کرده است.

قابلیت لیسپ برای گسترش و انعطاف پذیری

یکی از تقاط قوت مهم زبان لیسپ، قابلیت بی‌نظیر آن برای گسترش و انعطاف‌پذیری است. زبان لیسپ برای تعریف کردن سینتکس جدید، ایجاد «زبان‌های خاص دامنه» یا «زبان‌های خاص یک دامنه مشخص» (Domain-Specific Languages | DSL) و پیاده‌سازی «کلان‌دستور‌ها» (Macros) ابزارهای قدرتمندی را فراهم کرده است. Macro-ها از طریق کمک به ساخت ساختارهای زبانی بر اساس حوزه مسائل خاص، امکان گسترش سینتکس لیسپ را برای توسعه‌دهندگان فراهم می‌کنند. بنابراین توسعه‌دهندگان می‌توانند کدهایی بنویسند که هم مختصر است و هم کامل.

نسخه Common در زبان برنامه نویسی لیسپ

درک سینتکس و ساختار کدهای لیسپ، بینشی درباره نسخه‌های متنوع آن ارائه می‌دهد. در این بخش از مطلب بر روی زبان لیسپ رایج تمرکز می‌کنیم. این گویش لیسپ به عنوان یکی از مشهورترین نسخه‌های استاندارد این زبان برنامه‌نویسی منعطف شناخته می‌شود.

مهمترین نسخه Common زبان لیسپ

Common Lisp نسخه رایجی از لیسپ است که بیشترین استفاده را هم بین کاربران دارد. این گویش یا نسخه در سال ۱۹۸۰ میلادی معرفی شده‌ و اکنون در بسیاری از حوزه‌ها در حال استفاده است. Common Lisp توسط «سازمان استانداردهای ملی آمریکا» (American National Standards Institute | ANSI) تایید شده است. همچنین وجود تعداد بسیار زیادی از ویژگی‌ها و کتابخانه‌ها باعث شده که به زبان برنامه‌نویسی قدرتمند و انعطاف‌پذیری تبدیل شود.

تفاوت‌های نسخه Common Lisp با سایر نسخه های آن

نکته مهم، قبل از نگاه کردن به انواع مختلف لیسپ این است که ببینیم چرا Common Lisp از بقیه متمایز است. در این بخش از مطلب به بررسی ویژگی‌هایی در نسخه Common Lisp می‌پردازیم که باعث شده آن در میان سایر نسخه‌های لیسپ برجسته دیده شود.

یکی از دلایل برجسته‌تر بودن نسخه Common Lisp استاندارد‌سازی کامل این زبان است. با کمک این اتفاق، توسعه‌دهندگان پایه قابل اتکایی را برای کارکردن بدست آورده‌اند. این نسخه شامل ویژگی‌های زیر است.

  • نسخه Common Lisp شامل تعداد زیادی ابزار و تابع به صورت درونی و از پیش تعریف شده است.
  • Common Lisp دارای CLOS برای برنامه نویسی شیء گرایانه است. CLOS از سرنام واژه‌های عبارت «Common Lisp Object System» گرفته شده است.
  • این نسخه دارای سیستم شرطی خاص خود برای مدیریت خطاها و استثناهاست.
  • همچنین شامل سیستم کلان‌دستوری مناسبی است که از Metaprogramming پشتیبانی کرده و باعث گسترش زبان برنامه نویسی می‌شود.
مکعب مربع‌های رنگارنگ که در محیط انتزاعی شناور هستند. - زبان برنامه نویسی لیسپ

یکی دیگر از فواید استانداردسازی زبان این است که امکان انتقال برنامه‌ها بین پیاده‌سازی‌های مختلف نسخه Common فراهم شده و باعث ثبات برنامه در محیط‌های مختلف برنامه‌نویسی بدون نیاز به اعمال تغییرات خاص می‌شود.

موارد کاربرد Common

قبل از اینکه به سراغ بررسی کاربردهای عملی زبان برنامه نویسی لیسپ برویم، باید اهمیت و ارزش نسخه Common Lisp را درک کنیم. این نسخه از زبان لیسپ با استفاده از دامنه وسیعی از ویژگی‌های استانداردی که دارد، انعطاف‌پذیری و قدرت این زبان برنامه‌نویسی را نمایش می‌دهد.

نسخه Common لیسپ بخاطر قدرت و تطبیق‌پذیری بالا، در بسیاری از حوزه‌ها کاربرد دارد. این زبان یکی از مشهورترین گزینه‌ها برای توسعه سامانه‌های نرم‌افزاری پیچیده‌ای مانند موارد فهرست شده در پایین است.

  • اپلیکیشن‌های «یادگیری ماشین» (Machine Learning) و هوش مصنوعی
  • «ریاضیات نمادین» (Symbolic Mathematics)
  • سیستم‌های خبره
  • پردازش زبان طبیعی یا NLP
  • و غیره

علاوه بر موارد بالا، کتابخانه بزرگ و ابزارهای پشتیبانی که Common Lisp ارائه می‌دهد، به توسعه‌دهندگان برای ساخت سریع نمونه‌های اولیه از برنامه خود کمک می‌کند. در نتیجه به گزینه ساده‌ای برای پیاده‌سازی ایده‌های جدید و ارتقا سریع راه‌حل‌ها تبدیل شده است. این امکانات Common Lisp را به انتخاب قدرتمندی برای انجام عملیات تحقیقاتی و اجرای پروژه‌های نرم‌افزاری بزرگی تبدیل کرده که در هر دو زمینه دانشگاهی و صنعتی ارزشمند هستند.

فیلم های آموزش پروژه محور برنامه نویسی

آموزش زبان‌های برنامه‌نویسی یکی از آموزش‌هایی است که علاقه‌مندان به آن باید صبر و تمرین زیادی داشته باشند. یکی از مهم‌ترین نکات قابل توجه در برنامه‌نویسی این است که محصولات مربوط به دنیای واقعی فقط بر اساس یک تکنولوژی یا یک زبان ساخته و پرداخته نمی‌شوند. تقریبا تمام نرم‌افزارها ترکیبی از چندین تکنولوژی مختلف هستند. به همین منظور شاغلین این صنعت باید توانایی استفاده از زبان‌های برنامه‌‍‌نویسی مختلف را در کنار یکدیگر داشته باشند. برای کسب این توانایی بهترین روش، استفاده از دوره‌های آموزشی پروژه محوری است که سناریو‌های رایج در دنیای واقعی را دنبال می‌کنند. فرادرس برای برطرف کردن این نیاز در بین آموزندگان برنامه‌نویسی، مجموعه فیلم‌های آموزشی پروژه محور را تولید کرده‌ است که در پایین چند مورد از آن‌ها را معرفی کرده‌ایم.

در صورت تمایل بر روی تصویر زیر کلیک کرده و از فیلم‌های آموزشی بیشتری دیدن کنید.

مجموعه آموزش پروژه محور برنامه‌ نویسی – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش پروژه محور برنامه‌ نویسی هدایت شوید.

ویژگی ها و مزایای خاص زبان برنامه نویسی لیسپ

در این قسمت از مطلب می‌خواهیم نگاه دقیق‌تری به ویژگی‌ها و مزایای استثنایی لیسپ داشته باشیم که باعث تفاوت بارز آن با سایر زبان‌های برنامه‌نویسی شده است. این ویژگی‌ها امکان ساخت نرم‌افزارهای پیچیده و کدنویسی سازگار با محیط را افزایش می‌دهند.

تاکید لیسپ بر نگاه به کدها به عنوان داده و متن

تاکید لیسپ بر نگاه به کدها به عنوان داده و متن، یکی از مفاهیم بنیادینی است که باعث شده با سایر زبان‌های برنامه‌نویسی تفاوت داشته باشد. در این ایده منحصر بفرد لیسپ با کدها مانند داده و متن رفتار می‌شود. به این معنا که برنامه‌ها در لیسپ به روشی ساخته می‌شوند که شبیه به سینتکس آن است. بخاطر وجود این دیدگاه، برنامه‌نویسان می‌توانند کدهای خود را به‌سادگی و به صورت خودکار تغییر داده، منتقل کرده و اجرا کنند. به این ایده «همسانی» (Homoiconicity) گفته می‌‌شود و مسئله بسیار مهمی برای وجود امکان انعطاف‌پذیری بالا و توانایی اجرای تکنیک «فرا برنامه‌نویسی» (Metaprogramming) است.

مزایای همسانی در زبان برنامه نویسی لیسپ

طبیعت Homoiconic مزایای چشمگیری را درباره نگهداری از برنامه، انعطاف‌پذیری و سلیس بودن کدها به وجود آورده است. زیرا کدها به شکلی هستند که زبان می‌تواند آن‌ها را خوانده و تغییر دهد. همچنین توسعه‌دهندگان می‌توانند ابزارها و موارد انتزاعی قدرتمندی را ایجاد کنند. این خاصیت فرایند ساخت زبان‌های اختصاصی‌سازی شده را به منظور انجام وظایف مشخص، ساده‌تر کرده و به نوشتن ساده کدهایی با قابلیت استفاده چندباره و سازگاری بالای کمک می‌کند.

سیستم Macro

یکی دیگر از ستون‌های قدرت‌مندی که لیسپ بر روی آن پایه‌گذاری شده امکان استفاده از تکنیک Macro است. این تکنیک به توسعه‌دهندگان کمک می‌کند که سینتکس و ویژگی‌های زبانی جدیدی را ایجاد کنند. استفاده از تکنیک Macro امکان ایجاد زبان‌های اختصاصی‌سازی شده را با استفاده از لیسپ فراهم می‌کند. در نتیجه برنامه‌نویسان می‌توانند با توجه به مسائل خاص در دست اقدامی که دارند، زبان برنامه‌نویسی خود را سفارشی‌سازی کنند. این توانایی به برنامه‌نویسان کمک می‌کند که لیسپ را با نیاز‌های خود‌ سازگار کرده و در نتیجه راه‌حل‌های شفاف و موثری را برای مسائل پیچیده ارائه دهند‍‍‍‍‍.

تصویر زیبایی از نورهای نئونی و محو در فضا - زبان برنامه نویسی لیسپ

کاربردها و اپلیکشن های زبان برنامه نویسی Lisp چیست؟

در این قسمت از مطلب به بررسی رویکرد منحصربه‌فرد زبان لیسپ و کاربردهای متنوع آن در حوزه‌های مختلف می‌پردازیم.

هوش مصنوعی و یادگیری ماشین

از زمان پیدایش زبان برنامه نویسی لیسپ، این زبان نقش مهمی را در زمینه تحقیق و توسعه «هوش مصنوعی» (Artificial Intelligence | AI) و «یادگیری ماشین» (Machine Learning | ML) ایفا کرده است. انعطاف‌پذیری و توانایی زیاد لیسپ در کار با لیست‌ها باعث شده که به یکی از گزینه‌های محبوب در این رشته‌ها تبدیل شود. ویژگی‌های لیسپ که در زیر فهرست کرده‌ایم باعث شده‌اند که الگوریتم‌های هوش مصنوعی و «سامانه‌های خبره» (Expert Systems) موفقی توسط توسعه‌دهندگان به وجود بیایند.

  • محاسبات نمادین
  • «تطابق الگو» (Pattern Matching)
  • تولید کد به صورت پویا
  • و غیره

توسعه نرم‌ افزار و ساخت سریع پیش نمونه

بخاطر اهمیتی که زبان لیسپ در هوش مصنوعی دارد، به میزان گسترده‌ای در حوزه‌های توسعه نرم‌‌افزار و ساخت سریع پیش‌نمونه‌های اولیه نیز استفاده شده است. طبیعت انعطاف‌پذیر این زبان باعث شده که توسعه‌دهندگان ایده‌های خود را به‌سادگی پیاده‌سازی کرده و در صورت نیاز به سرعت تغییر دهند. لیسپ می‌تواند زبان‌های اختصاصی‌سازی‌ شده‌ای را برای انجام وظایف خاص ایجاد کند. سامانه Macro لیسپ از طریق افزایش بهره‌وری و خلاقیت، فرایند توسعه نرم‌افزار را به شکل روان‌‌تری ممکن کرده است.

فضاهای دانشگاهی و تحقیقاتی

هنوز هم لیسپ اهمیت خود را در فضا‌های آکادمیک و تحقیقاتی حفظ کرده است. تمرکز لیسپ بر روی نگاه به کدها به عنوان داده و ویژگی‌های قدرتمندی مانند Metaprogramming باعث شده که به گزینه بسیار خوبی برای امتحان کردن ایده‌ها و آزمایشات جدید در حوزه علوم تبدیل شود. لیسپ فقط برای کاربردها عملی استفاده نیست، بلکه برای مطالعه و طراحی زبان‌های برنامه نویسی جدید نیز به کار برده می‌شود.

جمع‌بندی

زبان برنامه نویسی لیسپ در سال ۱۹۵۸ میلادی در دانشگاه MIT معرفی شد. در واقع دومین زبان قدیمی برنامه‌نویسی کامپیوتر است که معرفی شده ولی هنوز زنده و مشغول به فعالیت است. نسخه‌های مدرنی مانند Common Lisp و Emacs Lisp (Elisp) و Clojure و غیره از روی این زبان ‌ساخته شده‌اند که هر کدام بر روی انجام وظایف خاصی تمرکز دارند. ساختار عجیب، منحصر‌به‌فرد و پُر از پرانتز لیسپ باعث شده که قادر به انجام کارهایی باشد که با سایر زبان‌ها به سختی انجام‌پذیر است. برای مثال می‌شود به طراحی و ساخت زبان‌های برنامه‌نویسی سفارشی با استفاده از لیسپ اشاره کرد.

source

توسط expressjs.ir