Common Lisp یا Clojure؟


#1

تصمیم گرفتم در کنار پایتون یه زبان functional یاد بگیرم. میخواستم بدونم از بین common lisp و clojure کدوم رو انتخاب کنم؟ توی هر مورد کدوم زبان بهتره؟
یک. قدرت و سرعت در محاسبه.
دو. وسعت کاربرد.
سه. بازار کار.


#2

از لحاظ خانواده زبان های فانکشنال هردو لیسپ هستند کلوژر ابزار بهتر و کارایی بیشتری داره


#3

Clojure و Common Lisp دو پیاده سازی از یک پایه و اساس مفهومی - یعنی Lisp - هستند ولی Clojure روی JVM کار میکند در حالی که Common Lisp کامپایلر خودش را دارد (مثل sbcl).
در کل، به هدف شما و این که می‌خواهید در آینده چه کاری انجام دهید بستگی دارد. آیا برای توسعه وب می خواهید یکی از این دو را یاد بگیرید؟ یا برای فقط یادگیری یک زبان Functional جدید یا اهداف دیگر.

  • اگر Clojure را انتخاب کنید، درست است که مستقیماً با Java در ارتباط نیستید ولی به هر حال اگر بخواهید پروژه نسبتاً بزرگی را انجام دهید ناچار هستید که زبان Java را هم یاد بگیرید و ناچارا با JVM هم در ارتباط خواهد بود.

  • اما اگر Common Lisp را انتخاب کنید اینگونه نخواهد بود و فقط با کامپایلر خودش در ارتباط خواهید بود.

اما به هر حال هیچ کدام از این دو زبان به معنای کلمه و به صورت خالص Functional نیستند، اگر می خواهید یک زبان کاملاً Functional را تجربه کنید و عمیقا مفهوم Functional بودن رو درک کنید، Haskell انتخاب بهتری خواهد بود.

اما درمورد ۳ مورد شما:

  • قدرت و سرعت محاسبه:
    Clojure بر روی یک Virtual Machine کار میکنه ولی Common Lisp کامپایل میشه ولی من نمی توانم به طور قاطع بگم کدام سریع تر هستش ولی معمولا اینکه کدام سریع تر هستش سوال درستی نیست، سوال درست تر اینه که آیا برای پروژه من و به اندازه کافی سریع هستش یا نه؟ که معمولا جواب مثبت هستش.
  • وسعت کاربرد :
    بستگی به خود توسعه دهنده داره که در کجا و از چه ابزاری استفاده کنه، درمورد وسعت کاربرد قاطعانه نظری ندارم ولی در حال حاظر از Clojure بیشتر استفاده میشه. (که البته دلیلی بر برتری آن نیست از دید من)
  • بازار کار :
    در حال حاظر قطعا Clojure.

#4


If you chose C, you’re someone who wants it all: the power of ANSI CL and the mathematical beauty of Scheme. At this time, no Lisp dialect completely fits the bill, but that could change in the future. One language that might work for you (although it is sacrilege to make this claim in a Lisp book) is Haskell.


#5

اینو از کتاب land of lisp نقل قول کردم. گفتی haskell یاد این افتادم.


#6

۱۰۰٪ کلوژر رو پیشنهاد می کنم. Common Lisp اصلا نزدیک کلوژر هم نیست. هر دو لیسپ هستند اما امکاناتشون خیلی فرق داره.

بنده حدود ۴ سال می شه کلوژر کد می زنم و هنوز نیازی به جاوا پیدا نکردم. در همین حد بدونین که JVM چجوری کار می کنه کفایت می کنه. در ضمن ران شدن رو JVM اصلا چیز بدی نیست که هیچ یه خوبی هم بشمار میاد. دسترسی به کل اکوسیستم جاوا خودش یه خوبی هست


#7

من چیزی راجع به بدی یا خوبی و برتری نگفتم. سوال و جواب من درمورد انتخاب یک زبان برای یادگیری مفاهیم Functional بود.
درست است.
مزیتی که گفتید کاملا منطقی و واقعی هستش.


#8

به نظر من کلوژر بهتره.
روی jvm ران میشه یعنی ما دسترسی به تمام لایبرریها و ابزارهای جاوا رو داریم علاوه بر لایببریهایی که توی خود کلوژر نوشته شده. در حالی که تو common lisp ما فقط به ابزارهای خودش دسترسی داریم. بگذریم از محدودتر بودن کامیونیتی و کسانی که ازش استفاده میکنن. (که خودش باعث میشه لایبرریها کمتر باشن و خیلیاشون آخرین آپدیتشون واسه چند سال پیش باشه)

قدرت و سرعت رو که اصلا نمیشه حساب کرد. مگر با benchmark که اونم اصلا مطمئن نیست. من میتونم یه کد تو C بزنم که خیلی سریعتر از کدی که خودم توی Assembly میزنم اجرا بشه. دلیلش هم اینه که C بیشتر بلدم و راحتتره.
وسعت کاربرد فکر میکنم کلوژر خیلی بیشتر باشه. اصلا ندیدم و نشنیدم کسی از فلان پروژه رو با لیسپ نوشته باشه یا فلان شرکت با لیسپ کار کرده باشه یا فلان دیتابیس لایبرری برای لیسپ داده باشه.
بازار کار هم همینطور. کلوژر بازار کارش خیلی کمه (نسبت به زبانهای خیلی معروف) ولی لیسپ از اون هم کمتره. (حداقل یه شرکت ایرانی درخواست استخدام برنامه نویس clojure داده تو jobinja)


ویرایش

یه نکته‌ی دیگه هم باید اضافه کنم. deploy کردن پروژه‌ای که با کلوژر نوشته شده دقیقا مثل پروژه های جاوا هست.
یعنی اگه اپلیکیشن دسکتاپه، یه فایل .jar میدیم به مشتری.
اگه قراره بره رو سرور، همونطور که یه سایت java رو خیلی راحت میفرستیم روی heroku، همونطور میشه سایت کلوژر رو دیپلوی کرد.

اینا مزایای استفاده از پلتفورم جاوا (و جاوااسکریپت برای clojure-script) به عنوان زبان میزبان هست.


#9

مرسی. دیگه با کامنتایی که دیدم، کاملاً قانع شدم.
میشه محاسبه های سنگین رو سپرد به clojure برای مثال، و کد کلی برنامه رو با python نوشت؟
من تا اونجایی که میشه سعی میکنم کد رو با دستورای ابتدایی (جمع و تفریق و ضرب و تقسیم) بنویسم و از کتابخونه های آماده استفاده نکنم (حتی کد تقسیم و ضرب هم با استفاده از جمع و تفریق نوشتم).
چند وقت پیش چندتا تابع نوشتم که رو داده های اولیه یه سری محاسبه انجام میدادن، بعد سعی کردم همه رو با matplotlib نمایش بدم، ولی حدود یک دقیقه طول میکشید تا نمایش داده بشن (حدود 10 هزارتا عدد بودن که چنتا تابع جداگونه رو اینا محاسبه انجام میدادن و نتیجه رو تو چنتا list ذخیره میکردن). میشه این محسابه ها رو سپرد به clojure یا زبان های خانوادۀ lisp برای اینکار مناسب نیستن؟ اینو میگم چون ممکنه زبان دومی که یاد میگیرم هیچوقت نتونم باش پول دربیارم، پس حداقل چیزی انتخاب کنم که مکمل python باشه و بتونه یه جایی یه کارایی رو به جای اون سریعتر انجام بده.


#10

بله می شه. شما چند تا انتخاب دارید تو این زمینه. یکی graalVM هست و انتخاب بعدی اینه که بجای پایتون از jython استفاده کنین.


#11

یعنی از زبانهای خانوداۀ lisp استفاده نکنم؟ از jython به جای clojure استفاده کنم؟ خود clojure چون functional هست برای محاسبه بهتر نیست؟


#12

زیاد بلد نیستم ولی اصولا میشه.
اصلا چرا باید همچین کاری انجام داد؟ به نظر من بهتره با همون زبان کار رو انجام بدیم، مگر اینکه واقعا نیاز باشه.

این برای یادگیری عالیه. یه سر به وبسایت 4clojure.com بزنید. همچین تمرینهایی توش زیاد داره. مثلا گفته «اولین مورد این لیست رو پیدا کنید بدون استفاده از تابع first»
ولی واقعا بهتره این کار توی پروژه‌ی اصلی انجام نشه. سازنده‌های اون زبان خیلی بیشتر از من و شما تجربه و مهارت دارن. مطمئنا روشی که اونا برای انجام فلان کار استفاده میکنن از روش ما بهینه‌تره.
مگر اینکه سناریوی خاصی باشه.

هدف (من) از یادگیری زبان دوم اینه که با مفاهیم و روشهای جدید آشنا بشم.
اگه میخواید از یه زبان به عنوان مکمل پایتون استفاده کنید، پیشنهاد میکنم از C استفاده کنید. یه سری لایبرریها همین الآن دارن اینکارو میکنن. حداقلش اینه که jvm برای اجرا یه تاخیر حداقل ۱ثانیه ای داره!!!

خوب jython برای اجرای کد جاوا در پایتونه دیگه! کدهای کلوژر هم به جاوا تبدیل میشن.


#13

اوه. اشتباه گفتم. jython اون چیزی که فکر میکردم نیست. یه زبان برنامه نویسیه که بر پایه‌ی پایتون ساخته شده و در jvm ران میشه.

https://wiki.python.org/jython/


#14

نه منظورم این بود که jython استفاده کنی که بتونی راحت فانکشن هایی که با کلوژر می سازی رو کال کنی. اما در کل چرا کلا clojure نه ؟


#15

یعنی 0 تا 100رو با clojure انجام بدم؟ مشکلی با این قضیه ندارم که به عنوان زبان اصلی ازش استفاده کنم اگه جایگزین برای django یا matplotlib و برای بقیه چیزایی که python ارائه میده.


#16

چیزی شبیه django نداره. فریمورک های وبش همه minimalist و ساده هستند. اما قدرتمند.


#17

یعنی همون نتیجه ای که با django میگیری رو میشه با فریمورک وب clojure گرفت، منتها روش به دست آوردنش ساده تره؟ اگه اینجوریه که از فردا clojure میخونم :))


#18

به خوندن c هم فکر کرده بودم، ولی قبل از این بود که راجع به خانوادۀ lisp چیزی بشنوم. همینکه دستورشون خیلی فرق داره برام جذاب ترش میکنه نسبت به c.


#19

بیشتر شبیه flask و bottle هستن. فریموورک کامل نیستن که به آدم بگن فلان مدل باید اینکارو انجام بدی ولاغیر!
یه جورایی ابزارهایی هستن برای راحتتر شدن یه سری کار که کنار هم میچینیم و میشه تمام ابزاری که استفاده میکنیم. (فریموورک هم مجموعه‌ی یه سری لایبرریه دیگه!)

ساده تر نیست. برای کسانی که از زبونهای c based اومدن، درک کلوژر یه کم سخته. ولی به شما قول میدم simple تر و منطقیتر از زبانهای دیگست.


آقای John McCarthy سازنده‌ی lisp.
یه مقدار که با زبانهای خانواده‌ی lisp کار کنید، به این نتیجه میرسید که اینا منطقیتر از زبانهای خانواده‌ی C هستن :slight_smile:

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


#20

منظور از ساده، آسون نیست ها. منظور اینه که درکشون خیلی آسون هست و ساده کار می کنن. اگر دقیقا بگی می خوای چه کار کنی شاید بهتر بتونم کمک کنم