اگر از کاربران دائمی وب سایت سورس باران باشید حتما مطلع هستید که طبق روند همیشگی هر هفته به معرفی زبان های برنامه نویسی میپردازیم. در این مطلب به معرفی زبان برنامه نویسی Lisp (لیسپ) خواهیم پرداخت. لیسپ یک زبان برنامه نویسی رایانه است که در سال ۱۹۵۸ به وسیلهٔ جان مککارتی ابداع شدهاست. این زبان، مانند زبان برنامهنویسی پرولوگ، بیشتر برای برنامه نویسی هوش مصنوعی مورد استفاده قرار میگیرد و با توجه به اینکه زبان لیسپ از نحو سادهای برخوردار است، تجزیه و پیادهسازی آن نسبتاً با سهولت انجام میشود.
این یک زبان Common است که می تواند به راحتی برای اجرای خاصی گسترش یابد. برنامه های نوشته شده در Common LISP وابسته به ویژگی های ماشین خاص، مانند طول کلمه و غیره هستند.
معرفی زبان برنامه نویسی Lisp (لیسپ)
زبان Lisp دومین و قدیمی ترین زبان برنامه نویسی سطح بالا پس از Fortran است و از زمان توسعه آن تغییر زیادی یافته و تعدادی از گویش ها در طول تاریخ در خود داشته است. امروزه، گویش های شناخته شده و همه منظوره ی Lisp عبارت اند از: Common Lisp و Scheme. زبان برنامه نویسی Lisp توسط John McCarthy در سال ۱۹۵۸ اختراع شد، در حالی که وی در موسسه فناوری ماساچوست (MIT) بود.
Lisp چیست؟
پس از ایجاد و توسعه زبان Lisp، اولین بار توسط استیو راسل در یک کامپیوتر IBM 704 اجرا شد. این زبان برای برنامه های هوش مصنوعی مناسب است، زیرا اطلاعات نمادین را به طور موثر پردازش می کند. در طی دهه های ۱۹۸۰ و ۱۹۹۰، تلاش هایی برای متحد کردن کار گروه های مختلف پیاده سازی که جانشینان Maclisp مانند ZetaLisp و NIL و غیره بودند. این یک زبان Common است که می تواند به راحتی برای اجرای خاصی گسترش یابد. برنامه های نوشته شده در Common LISP وابسته به ویژگی های ماشین خاص، مانند طول کلمه و غیره هستند.
ویژگی های زبان برنامه نویسی لیسپ
- مستقل از ماشین
- متدلوژی طراحی تکراری و گسترش پذیری آسان
- اجازه می دهد تا برنامه ها به صورت پویا به روز شوند
- دارای سطح بالای اشکال زدایی
- ارائه دهنده برنامه نویسی پیشرفته شی گرا
- ارائه سیستم ماکرو مناسب
- ارائه انواع گسترده داده مانند: اشیاء، سازه ها، لیست ها، بردارها، آرایه های قابل تنظیم، جداول هش، و نمادها
- مبتنی بر عبارت
- ارائه سیستم وضعیت شی گرا
- ارائه کتابخانه کامل I / O
- ارائه ساختارهای کنترل گسترده
- پیوستن به هوش مصنوعی
- ترکیب و معناشناسی
- عبارت های لاندا
- Cons ها و لیستها
- ارایهٔ لیست عبارت نمادین
- دستورالعملهای پردازش لیست
- تعامد
- معنائی بودن
- انتزاعی بودن
ساختار کلی زبان برنامه نویسی Lisp
متن برنامههای لیسپ عموماً از نمادها و فهرستهایی از نمادها تشکیل میشود و بدین خاطر است که زبان برنامه نویسی Lisp (مخفف پردازش فهرست) نامیده شدهاست. یکی از ویژگیهای جالب زبان لیسپ این است که خود برنامههای Lisp نیز فهرست هستند و بنابراین، میتوان با برنامهها به عنوان دادهها رفتار کرد یا دادهها را به عنوان برنامه ارزیابی نمود. لیسپ دارای گویشهای مختلفی است که بعضی از آنها دارای قابلیتهای شیءگرا نیز هستند. از این میان میتوان به کامن لیسپ اشاره کرد. در ابتدا لیسپ به عنوان علامتگذاری و نمادسازی ریاضیات و برای برنامهنویسی رایانه ابداع شد. زبان لیسپ به سرعت مورد توجه برنامه نویسان از جمله برای تحقیقات علمی هوش مصنوعی قرار گرفت. لیسپ یکی از ابتداییترین زبانهای برنامه نویسی میباشد و در علوم رایانه بر بسیاری از تفکرات و ایدهها پیشگام بود. لیسپ شامل ساختمان دادهٔ درخت، مدیریت نگهداری اتوماتیک، برنامهنویسی پویا، برنامهنویسی شیء گرا و کامپایلر مستقل میباشد.
اپلیکیشن های موفقی که با زبان برنامه نویسی Lisp ساخته شده اند
- Emacs
- G2
- AutoCad
- Igor Engraver
- Yahoo Store
حتما بخوانید : دانلود کتاب آموزش زبان برنامه نویسی لیسپ Lisp به زبان فارسی
پیشتازی زبان برنامه نویسی Lisp در علم کامپیوتر
زبان برنامه نویسی Lisp که یکی از اولین زبان های ساخته شده بود در بسیاری از زمینه های علم کامپیوتر پیشگام بود که در زیر بعضی از آن ها را مشاهده می کنید
- ساختمان دادهای درخت ( tree data structures)
- مدیریت ذخیره سازی اتوماتیک (automatic storage management)
- نوع داده ای پویا (dynamic typing)
- دستورهای شرطی (conditionals)
- تابع های سطح بالا ( higher-order functions)
- تابع های بازگشتی (recursion)
- self-hosting compile
داده های زبان برنامه نویسی Lisp (لیسپ)
همین طور که در مقدمه بررسی کردیم زبان لیسپ بیشتر برای کار های محاسباتی و هوش مصنوعی طراحی شده است ، در زبان های برنامه نویسی هوش مصنوعی ما بیشتر از بر نوع داده های عددی به سیمبول ها احتیاج داریم تا عبارات منطقی و گزاره ها را بررسی کنیم.به طور کلی نوع داده در زبان برنامه نویسی لیسپ به صورت زیر است :
- نوع داده های عددی
- نوع داده ای کاراکتر
- نوع داده های منطقی
- نوع داده ای سمبول
۱- داده های عددی در برنامه نویسی Lisp
نوع داده ای عددی در Lisp شامل اعداد صحیح ، ممیز شناور ، مختلط و کسری است.لیسپ معمولی از bignums برای نشان دادن مقدارهای عددی با دقت و اندازه دلخواه استفاده میکند. نوع کسری، کسرها را با دقت نشان میدهد، این ویژگی در بسیاری از زبانها وجود ندارد. لیسپ معمولی به صورت اتوماتیک مقدارهای عددی را بین این دادهها به صورت مناسب وارد میکند. در لیسپ می توان با اعداد خیلی بزرگ کار کرد بدون اینکه نگران سر ریز آن ها بود زیرا لیسپ یک رنج بزرگ را در اختیار می گذارد. در اسکرین شاتی که گرفتم انواع نوع داده ای عددی را در لیسپ می بینید
همین طور که در شکل بالا می بینید جذر عدد منفی چهار را به صورت عدد مختلط چاپ کرده است.
۲- داده های کاراکتر در برنامه نویسی Lisp
در برنامه نویسی Lisp نوع داده ی دیگری به نام کاراکتر داریم که فقط محدود به اعداد اسکی نیست و یونی کد ها را هم در بر می گیرد. برای تعریف داده های کاراکتری باید از \# استفاده کرد مانند تصویر زیر که چند نوع داده ی کاراکتری را مشخص کرده ام :
در بالا tab\# همان کاراکتر Tab است.
۳- داده های منطقی در برنامه نویسی Lisp
در Lisp نوع منطقی هم داریم که دو حالت درست و غلط را دارد.حالت درست را با true و حالت غلط را با NIL یا () نشان نی دهیم . در شکل زیر من تابع Listp را فرا خوانده ام که خروجی اش یک مقدار منطقی است و می گوید چیزی که تابع رویش فراخوانی شده است لیست است یا نه :
۴- داده های سمبول در برنامه نویسی Lisp
مهم ترین نوع داده ای در Lisp نوع سمبول است که در هوش مصنوعی , پردازش زبان های طبیعی و … از آن استفاده می کنیم. در شکل زیر لیستی از سمبول ها ساخته ایم :
مقایسه استفاده از عملگر ها در زبان LISP و سی پلاس پلاس
در زبان Lisp استفاده از عملگر ها به صورت Prefix یا پیش ترتیب است که با سایر زبان های برنامه نویسی فرق دارد در این روش ابتدا عملگر می آید و بعد در جلوی آن عملوند ها . مزیتی که این روش دارد این است که تعداد عملگر هایمان محدود نمی شود. در مثال زیر من ۵ عدد مختلف را در زبان لیسپ فقط با یک عملگر + ، جمع کرده ایم :
(+ 5 4 8 9 7)
در زبان سی پلاس پلاس عملگرها به صورت In order یا میان ترتیب استفاده می شوند و بین دو مقدار مختلف می آیند. در مثال زیر من پنج عدد بالا را در زبان سی پلاس پلاس جمع کرده ایم
int sum = 5 + 4 + 8 + 9 + 7;
دستورالعملهای پردازش زبان برنامه نویسی Lisp
لیسپ دستورالعملهای زیادی را برای دستیابی و کنترل لیستها فراهم میکند. لیستها میتوانند مستقیماً با پردازهٔ لیست ایجاد شوند. لیست هر تعدادی از آرگومان ها را میپذیرد و تعدادی از آرگومان ها را برمیگرداند
(list 1 2 ‘a 3); Output: (1 2 a 3) (list 1 ‘(2 3) 4); Output: (1 (2 3) 4)
به این دلیل راهی که لیستها ایجاد میشوند از جفتهای Cons (Car,Cdr) پردازهٔ Cons میتواند برای اضافه کردن یک عنصر به جلوی یک لیست استفاده شود. توجه کنید که پردازهٔ Cons در هدایت و به کار بردن آرگومانهای لیست نامتقارن است، بدین دلیل روشهای لیستها ایجاد میشوند.
(Cons 1 ‘(2 3)); Output: (1 2 3) (Cons ’(1 2) ‘(3 4)) Output: ((1 2) 3 4)
پردازهٔ Oppend دو یا چند لیست را با هم ادغام میکند و یک لیست واحد ایجاد میکند زیرا لیست لیسپ یک لینک لیست است و پیچیدگی زمانی الحاق کردن لیستها از مرتبهٔ پیچیدگی زمانی O(n) میباشد. ساختار اشتراکی: لیستهای لیسپ لینک لیستهای ساده میتوانند با یکی دیگر از لیستها در ساختمان مشترک باشند به عبارت دیگر دو لیست میتوانند دم یکسانی داشته باشند یا رشتهٔ پایانی از Consهای یکسانی داشته باشند مثلاً:
(setf foo (list 'a 'b 'c)) (setf bar (cons 'x (cdr foo)))
لیست foo و bar به ترتیب به صورت (a b c) و (X b c) هستند هرچند دم (b c) در هر دو لیست ساختار یکسانی دارند ولی مانند هم نیستند، خانههای Cons اشاره گر به b و c در محل حافظهٔ یکسانی برای هردو لیست قرار دارد. ساختار اشتراکی سریع تر از کپی کردن میتواند به صورت چشمگیری کارایی را بهبود بخشند. هرچند، این مهارت میتواند متقابلاً در راههای نامطلوب با عملکردهایی که تغییرات لیستهای گذشته روی آرگومانهای آن تأثیر بگذارد، اثر کند. تغییرات یک لیست از قبیل تغییر دادن C با یک goose روی دیگری نیز تأثیر میگذارد
setf (third foo) 'goose)
که این تغییر نتیجه را به صورت (a b goose) تغییر میدهد اما bar هم تغییر میکند (X b goose) که ممکن است یک نتیجهٔ غیرمنتظره باشد. زبانهای برنامه نویسی Lisp معمولاً از یک خط دستور محاورهای استفاده میکنند، که میتواند با یک محیط پیچیدهٔ گسترش یافته ترکیب شود. کاربر اصطلاحات و دستورها را در خط دستور وارد کرده یا با رهبری IDE آنها را به سیستم Lisp میفرستد. Lisp دستورها را میخواند، آنها را ارزیابی میکند و نتایج را چاپ میکند. به این دلیل است که خط دستور زبان Lisp به حلقهٔ Read-Eval-Print یا REPL معروف است. نمونهٔ سادهای از عملیات REPL در زیر آمدهاست. این یک شرح سادهاست که بسیاری از المانهای Lispواقعی در آن نمیآید مانند ماکروها و کوئتها. تابع read جملات متنی را به عنوان ورودی میپذیرد و آنها را به ساختار لیست تجزیه میکند. به عنوان مثال، وقتی شما رشتهٔ (+ ۱ ۲) را در اعلان تایپ میکنید، تابع read آن را به یک لیست پیوندی حاصل از ۳ المان ترجمه میکند: علامت +، عدد ۱ و عدد ۲. خیلی اتفاق میافتد که لیست قسمت مؤثری از یک کد Lisp باشد که قابل ارزیابی است. به همین دلیل است که یک قطار از لیست به یک تابع نام عملگر مع میدهد. تابع eval ساختار لیست را ارزیابی میکند و نوعی دیگر از ساختار را به عنوان نتیجه بازمیگرداند. ارزیابی کردن لزوماً تفسیر کردن معنی نمیدهد؛ بعضی سیستمهای Lisp هر عبارتی را به زبان ماشین تبدیل میکنند. خیلی سادهاست؛ به هر حال؛ برای تعریف ارزیابی به عنوان تفسیر: برای ارزیابی یک لیست که نام تابع دارد، eval ابتدا تمام آرگومانهای داده شده به cdr اش را ارزیابی میکند و سپس تابع را روی آن آرگومانها اعمال میکند. در این مثال، تابع عمل جمع است و به آرگومانهای (۱ ۲) اعمال میشود که نتیجه ۳ است. این نتیجهٔ ارزیابی است. این وظیفهٔ تابع print است که نتیجه را به کاربر نمایش دهد. برای نتیجهٔ سادهٔ ۳ این کار ناقابل است. یک عبارت که با قسمتی از ساختار لیست ارزیابی میشود میاز دارد که print لیست را به حرکت درآورد و در خروجی به شکل یک عبارت S نمایش دهد. برای اجرا کردن یک REPL در Lisp، تنها لازم است که این سه تابع را اجرا کنید و یک تابع حلقه بینهایت را. (بهطور طبیعی اجرای eval پس از اجرای عملگرهای ویژهای مانند if پیچیده خواهد شد) یک REPL ساده به خودی خود با یک خط کد انجام شد
(loop(print(eval(red)))
انتزاعی بودن (Abstraction) زبان برنامه نویسی Lisp
در Lisp امکان ساخت نوع داده ی جدید وجود دارد ولی مانند زبان سی پلاس پلاس امکان تعریف تابع در کلاس و اعضای Public و private را نداریم. در زیر تعریف یک کلاس را در استراکت را در لیسپ می بینید و همین طور ساخت یک شی از آن را :
(defstruct dog name breed age) (defparameter *rover* (make-dog :name "rover" :breed "collie" :age 5))
مثال و نمونه کدهای برنامه نویسی Lisp
An example of SxQL, a macro-based SQL DSL
(select (:title :author :year) (from :books) (where (:and (:>= :year 1995) (:< :year 2010))) (order-by (:desc :year))) ⇒ ((:title "Practical Common Lisp" :author "Peter Seibel" :year 2005) (:title "ANSI Common Lisp" :author "Paul Graham" :year 1995))
Functional
Functions are first class objects: you can pass them around, store them, call them dynamically. Build your application by composing small, functional building blocks.
(reduce #'- (reverse (list 1 2 3))) ⇒ 0 (mapcar #'string-downcase (list "Hello" "world!")) => ("hello" "world!")
Object-Oriented
Build reusable and extensible class hierarchies using the Common Lisp Object System. Design patterns disappear as you adapt the language to your problem domain.
(defclass book () ((title :reader book-title :initarg :title) (author :reader book-author :initarg :author)) (:documentation "Describes a book.")) (make-instance 'book :title "ANSI Common Lisp" :author "Paul Graham")لیست منابع : منبع ۱ منبع ۲
مشاهده جلسات قبل معرفی زبان های برنامه نویسی
- زبان برنامه نویسی سی و سی پلاس پلاس
- معرفی زبان برنامه نویسی پایتون
- Ruby چیست؟ بررسی زبان برنامه نویسی روبی
- زبان برنامه نویسی PHP چیست؟
- زبان برنامه نویسی Lua چیست؟
- کاتلین (Kotlin) چیست؟ توضیح زبان برنامه نویسی کاتلین
- Ada چیست؟ معرفی زبان برنامه نویسی Ada
- زبان برنامه نویسی COBOL چیست؟ شرح کامل COBOL
- معرفی زبان برنامه نویسی Cython
- زبان برنامه نویسی Elixir چیست؟ معرفی کامل Elixir (الیکسیر)
- کاملترین معرفی زبان برنامه نویسی Groovy
- زبان برنامه نویسی Rust چیست؟ کاملترین معرفی زبان برنامه نویسی Rust
- زبان برنامه نویسی Scala چیست؟ معرفی،ویژگی ها و کاربرد Scala
- معرفی زبان برنامه نویسی Haskell
The post معرفی زبان برنامه نویسی Lisp (لیسپ) appeared first on آموزش برنامه نویسی.