Чи використовуєте ви (діалект) LISP для додатків у реальному світі? Де і чому? [зачинено]


31

LISP (і діалекти, такі як Scheme, Common LISP та Clojure) не набули значної підтримки в галузі, хоча вони є досить гідними мовами програмування. (На даний момент, здається, вони набувають певної тяги).

Тепер це не пов'язане безпосередньо з питанням, що б ви використовували діалект LISP для виробничої програми? Що це за програма і чому? Користувачі, які інтегруються в якийсь інший код (наприклад, C), також включаються, але зауважте, що саме ви маєте на увазі у своїй відповіді. Широкі поняття є кращими, але конкретні програми також є добре.


6
Чи вважається emacs додатком "реального світу"? gnu.org/software/emacs/emacs-lisp-intro
S.Lott

1
@ S.Lott: Так. Якщо ви використовуєте elisp для створення розширень для Emacs, це добре і застосування діалекту LISP
Анто,

GNU Guile призначений саме для цієї мети.

1
Хоча цікаво, я не вважаю, що це питання більше підходить для цього сайту. Кілька причин: 1– занадто широкий, 2 - він пропонує список відповідей, 3– немає чіткого способу вирішити, який є «правильний» варіант відповіді, 4 - занадто локалізований в часі («не отримали особливої ​​підтримки галузі»), 5- це запрошує дискусію та дискусію.
Андрес Ф.

Відповіді:


18

Чи використовуєте ви діалект LISP для виробничої програми?

Абсолютно

Що це за програма і чому?

Lisp - динамічна мова загального призначення. Сьогодні він має ті ж основні труднощі, що й інші динамічні мови загального призначення, які Microsoft не публікує: Native потоки, інтеграція графічного інтерфейсу, детермінована робота GC та невеликі сліди пам’яті.

Рідні нитки досягаються LispWorks і SBCL, я вважаю. Можливо, інші? Я не дослідив повністю.

LispWorks та Franz Common Lisp - комерційні продукти - інтегруються в GUI на рівні успіху. Не маючи $$, щоб придбати їх, я не знаю, наскільки добре це працює. Я підозрюю, що вони працюють досить добре ...

Детерміновану операцію GC можна зробити (це робиться в Java до певного рівня успіху), але я не знаю, чи є в існуючих системах Lisp (підтримуваних) який-небудь код для цього.

Малий слід пам’яті, на мою думку, досягнуто деякими Lisps.

Моя основна думка: Common Lisp технічно готовий до виготовлення виробничих систем. І це робить .

Переважна більшість розробників виходять з (виберіть одну) динамічних мов, макросів, круглих дужок, відсутності улюбленого IDE, поганого досвіду роботи в коледжі, не багато робочих місць у ньому, а потім не користуються ним.

Особисто я стрибну, будуючи повноцінну виробничу систему в Common Lisp з нуля в командному середовищі.

редагувати: Я не дуже відповів, чому Lisp на відміну від інших мов.

З мого досвіду Lisp - не суттєвого, але значно більше, ніж "привіт світ" - я знайшов мову надзвичайно корисною після перших болів "Argh new language". Більшість мов поєднуються дуже регулярно і досить очевидно, що я не знаходжу інших мов, як би діяти. Частиною цього є злиття виразів і висловлювань. Частина цього є основним типом даних списку. Частиною цього є система типів. Частиною цього є макросистема. Не зрозумійте мене неправильно, хоча є больові моменти. Але вони мене не б'ють в обличчя настільки, як больові точки інших мов.

Одним із спрощених прикладів є порядок тривалості списку Python. Підхід Python - це виклик len(mysequence). Але, якщо ми подумаємо над цим, довжина - це властивість послідовності. Отже, mysequence.len()є більш підходяща ідея. Лісп по суті видаляє це синтаксичне розрізнення. (length thing)є і синтаксисом виклику функції, і синтаксисом методу. Звичайно, деякі люди вважають це фрустраційним і хочуть синтаксичної різниці. Я б швидше мав регулярність.

edit2: Я перетворив частину моєї дипломної роботи, яка працює на робочому столі, у Common Lisp, і з цим було приємно працювати.


2
Як я чую, LISP все-таки звикає до повноцінних виробничих систем, але, як правило, лише для певної логічної обробки, яку легше кодувати в LISP, ніж інші мови. AI відеоігри та попередня обробка статистичних даних були мені прикладами, колись цитованими. Колись у мене був менеджер, який мав приказку "Будь-яка достатньо складна система має вбудовану реалізацію напівоспроможного LISP". Аналогічна приказка була "Будь-яка достатньо роздута система має вбудований зчитувач електронної пошти".
FrustratedWithFormsDesigner

4
@ Розчаровано: Так, це Закон Ґрінспуна та Закон jwz.
Пол Натан

2
Багато з них вирішує Clojure, просто завдяки спеціально розробленому для сумісності з Java і заміною. Але звичайно, є також схеми та схеми CL для JVM (наприклад, Kawa, ABCL).
Йорг W Міттаг

4
Clojure мені смутно дратує, бо це ще одна фрагментація.
Пол Натан

роздробленість - це не погана річ. Що насправді дратує в Clojure - це відсутність пунктирних пар. Чи можна вважати це мовою, що нагадує Лісп, без такої принципової речі?
SK-логіка

11

Я особисто знаю людей, які використовують Lisp у формі Clojure в парі інвестиційних банків та стартапів у Лондоні. Я також вибрав Clojure як основну мову розвитку для мого власного запуску, тому я готовий покласти свої гроші туди, де є рот :-)

Я вважав, що це дуже просвічуючий досвід вивчити Clojure за останній рік (після великого досвіду роботи з Java та C #). Основні причини цього:

  • Він робить досить сильний акцент на функціональному програмуванні (тим більше, ніж у більшості інших Lisps). Автор та BDFL Rich Hickey часто цитував Haskell як одне з його натхненників для мовного дизайну, що означає, що ви отримуєте такі речі, як повністю незмінні структури даних та ліниві нескінченні послідовності тощо.
  • Метапрограмування макросу - філософію Ліспа «код - це дані» важко зрозуміти, якщо ви насправді цього не пережили, але це одна з причин того, що Ліпс настільки виразний та продуктивний. Ви в основному можете розширити мову, щоб відповідати вашому проблемному домену.
  • Фантастична підтримка багатоядерної одночасності - я фактично думаю, що Clojure - найкраща мова для одночасного програмування. Дивіться http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey для просвітницької презентації про це
  • Інтерактивний розвиток в системі REPL - це чудовий, продуктивний спосіб створення додатків. Це дає вам справжнє відчуття сили динамічно змінювати свій запущений код програми та систематично перевіряти живі структури даних .....

Це також представляється практичним вибором для реального використання виробництва з наступних причин:

  • Запуск на JVM з дуже простою інтероперабільністю Java надає вам доступ до всіх бібліотек та інструментів екосистеми Java
  • Ви працюєте на JVM, яка є випробуваною платформою для корпоративних додатків. Clojure виграє від усіх приємних функцій JVM, таких як відмінна компіляція GC та JIT безкоштовно.
  • Це динамічна мова за замовчуванням, що робить її дуже зручною для розробки та швидкого складання прототипів майже з будь-якою панеллю котлів. Однак ви можете додати підказки статичного типу, щоб отримати досить хороші показники там, де вам це потрібно.
  • Це прагматична та корисна спільнота - культура, в якій люди роблять справи, а увага приділяється добре продуманим рішенням, що вирішують реальні проблеми
  • Існує підтримка інструментів у кількох IDE . Я особисто використовую Eclipse з плагіном проти годинникової стрілки (тому що мені потрібна інтеграція Java), але є багато інших варіантів.

8

Я б використовував LISP, якщо це був найкращий вибір для роботи. Лише деякі речі, які впливають на "кращий вибір":

  • підтримка постачальника. Ми використовуємо реалізацію LISP - якщо щось піде не так і заважає нашому розвитку, а отже, і нашим термінам, чи буде постачальник працювати над нами?
  • бібліотечна підтримка. Які бібліотеки доступні? Маніпулювання рядками, математика, доступ до даних, веб-сервлети (або еквіваленти LISP), набір інструментів вікон тощо, мені не хочеться писати цей матеріал з нуля.
  • підтримка інструменту - Наскільки хороша IDE? Твердий / стійкий чи лускатий? Хороша підтримка редактора? Вбудований налагоджувач? Якщо мені потрібно зробити графічний інтерфейс GUI у LISP, чи є візуальний IDE чи потрібно кодувати макет GUI вручну (я ненавиджу це робити).
  • вхід для розробників (я дійсно не хочу витрачати занадто багато часу, навчаючи своїх товаришів по команді зовсім новою мовою)

Усі ці фактори слід враховувати, вирішуючи, чи LISP підходить для проекту. У корпоративному світі я цього ніколи не відчував.


Я погоджуюся з вами, що на продуктивність часто впливають більше доступні інструменти та бібліотеки, ніж сама мова (за умови, що мова пропонує деякі основні функціональні можливості).
Джорджіо

6

Абсолютно. Пол Грехем це добре пояснює .

... Ще в 1995 році ми знали щось, що, на нашу думку, не розуміють наші конкуренти, і мало хто розуміє навіть зараз: коли ви пишете програмне забезпечення, яке має працювати лише на власних серверах, ви можете використовувати будь-яку мову, яку хочете. ..

Ми вибрали Лісп. З одного боку, було очевидно, що швидкий розвиток буде важливим на цьому ринку. Всі ми починали з нуля, тому компанія, яка могла б отримати нові функції раніше, ніж її конкуренти отримали б велику перевагу. Ми знали, що Lisp - це дійсно гарна мова для швидкого написання програмного забезпечення, і серверні програми збільшують ефект швидкого розвитку, оскільки ви можете випустити програмне забезпечення в ту хвилину, коли це зроблено.

Якщо інші компанії не хотіли використовувати Lisp, тим краще. Це може дати нам технологічну перевагу, і нам потрібна вся допомога, яку ми могли отримати ...

Тож можна сказати, що використання Lisp було експериментом. Наша гіпотеза полягала в тому, що якби ми написали наше програмне забезпечення в Lisp, ми зможемо зробити функції швидше, ніж наші конкуренти, а також зробити те, що в нашому програмному забезпеченні вони не могли зробити. А оскільки Лісп був настільки високого рівня, нам не потрібна була б велика команда розвитку, тому наші витрати будуть нижчими. Якби це було так, ми могли б запропонувати кращий продукт за менші гроші та все-таки отримати прибуток. Ми врешті-решт отримаємо всіх користувачів, а наші конкуренти не отримають жодного, і врешті-решт припинять свою діяльність. Це те, що ми сподівалися, що все-таки відбудеться.

Якими були результати цього експерименту? Дещо дивно, що це спрацювало. Зрештою, у нас було багато конкурентів, на замовлення їх двадцять-тридцять, але жодне їх програмне забезпечення не могло конкурувати з нашим. У нас був конструктор інтернет-магазинів wysiwyg, який працював на сервері і все ж відчував себе настільним додатком. У наших конкурентів були сценарії cgi. І ми завжди були набагато випереджали їх у особливостях. Іноді в розпачі конкуренти намагаються запровадити функції, яких у нас не було. Але з Lisp наш цикл розвитку був настільки швидким, що ми могли іноді копіювати нову функцію протягом дня або двох, коли конкурент оголосив про це у прес-релізі. На той час, коли журналісти, які висвітлювали прес-реліз, подзвонили до нас, ми також мали б нову функцію.

Нашим конкурентам, мабуть, здавалося, що у нас є якась таємна зброя-- що ми розшифровуємо їхній трафік Enigma чи щось таке. Насправді у нас була секретна зброя, але вона була простішою, ніж вони зрозуміли. Ніхто не просочувався до нас новинами про їхні особливості. Ми просто змогли розробити програмне забезпечення швидше, ніж хтось вважав можливим ...


8
"... Пол Грехем спочатку написав reddit, на листі, на звороті серветки, поки він чекав кави. Він був настільки потужним, що його потрібно було переписати на пітон, щоб звичайні комп'ютери могли це зрозуміти. Тому що це було написано на lisp, щоб переписати всю справу майже не було зусиль, і переписання було завершено між двома процесорними циклами. Сам Пол Грехем був повністю написаний у lisp, попередньою версією самого себе, також написаною на lisp, більш рання версія Lisp. Це Lisp, Paul Graham, Lisp, Paul Graham, аж донизу ".
Джон Картрайт

5

Де: Emacs - це програма в реальному світі, яка використовує LISP.

Чому: Це був чудовий спосіб виразити відображення між натисканням клавіші та дією. Це інтерпретується, і це швидко, він чітко визначений і простий.


Я би продовжив цю відповідь, сказавши, чому це було добре для висловлення карти між кетроударами та діями
Анто,

@Anto: З мого досвіду, Lisp робить дійсно простим створення потужних абстракцій, які можуть прозоро представляти будь-які дії, які ви можете зробити в редакторі дуже послідовно - після використання Emacs трохи, ви можете здогадатися, як майже все робиться . Це дає змогу відобразити все, що ви могли зробити в редакторі, на ключовий штрих, при цьому кожне прив'язування виглядає дійсно схожим між собою прив'язки, що робить його легше писати та легше підтримувати.
Тихон Єлвіс

4

І Macsyma, і Autocad засновані на діалекті Lisp. Я б класифікував їх як "реальний світ", а також Emacs.


Математика не заснована на Ліспі.
Rainer Joswig

2
AutoCAD пропонує AutoLISP як API, але він записується в керованому кодом C ++ & .NET.
CAD блокується

1
@RainerJoswig Macsyma, ймовірно, мався на увазі замість Mathematica.
user40989

2

Абсолютно я б це вважав. Особливо для нових розробок, які мали певний паралельний обчислювальний потенціал. Це здається приємним місцем для цих типів функціональних мов.


2

Lisp - один з найкращих варіантів для реалізації компіляторів. І, оскільки використання DSL та eDSL зараз збільшується, Lisp стає все більш цінним. Я використовую діалект Lisp для всіх своїх завдань, пов'язаних з DSL.


0

Зараз я намагаюся використовувати newLisp як заміну для Php на своєму особистому веб-сайті через структуру Dragonfly . Якщо я зможу зрозуміти, як змусити Apache грати добре, я буду використовувати його (вбудований веб-сервер працює дуже добре, але я б швидше працював через Apache). І як тільки це станеться, я буду використовувати newLisp де завгодно, коли б я використовував Php, тому що мені не подобається Php і мені подобається newLisp.

Наразі Clojure - не найкращий вибір для додатків для Android, але я знаю, що люди над цим працюють. Тож якщо це з’ясується, це було б іншим місцем, я б використовував діалект Lisp для додатків у реальному світі ... але знову ж таки, це тому, що мені просто не подобається Java.

Але чесно кажучи, я віддаю перевагу Рубі перед Ліспом ... але це здебільшого питання спільноти та документації.


0

Я реалізував власну, комерційну програму в Common Lisp під назвою Tankan, яка працює в Microsoft Windows як власний виконуваний файл.

Це програма для навчання себе запам'ятовувати японських персонажів канджі.

Програма працює як фоновий сервер HTTP. Виконання цього сервера та перехід на його сторінки координується крихітним додатком із значками системи (він же "Лоток"), який я розробив за допомогою Visual C ++.

Програма із крихітним значком лотка запускає, відстежує та зупиняє сервер на основі Lisp та спілкується з ним за допомогою труб Win32, прив'язаних до його стандартного вводу та виводу. Через трубу сервер Lisp повідомляє програмі піктограми лотка точну URL-адресу з правильним номером порту, і ця програма значка лотка може запустити браузер через API Shell для перегляду цієї URL-адреси. Користувач просто двічі клацне піктограмою, щоб відкрити інтерфейс користувача.

Програма Lisp зберігає в своїй пам'яті досить складний стан сеансу, який містить вхідну історію користувача та різні взаємозв'язки між різними об'єктами. Циркулярна нотація об'єкта Lisp (увімкнена *print-circle*змінною) та як вона працює у користувальницьких print-objectметодах CLOS є надзвичайно корисною для реалізації наполегливості: користувачі можуть зберегти стан на диску та відновити там, де вони зупинилися. Все зберігається, включаючи стан інтерфейсу користувача. В об’єктному графіку багато спільної підструктури, а також циклів. Крім того, багато статичної крихти, яку не потрібно зберігати, як вміст об'єктів введення в словник. Завдяки індивідуальним методам об'єкта друку ANSI Common Lisp ви можете створювати стислі друковані зображення для об'єктів, які все-таки машиночитаються,

Майже жоден JavaScript не використовується в веб-інтерфейсі. Навіть елементи контролю приховування та показу частин користувальницького інтерфейсу здійснюються шляхом подання форми та повторного відтворення HTML. Кожна деталь стану користувальницького інтерфейсу знаходяться на сервері та зберігається, коли користувач зберігає. Повторне покоління HTML відбувається дуже швидко. Це робиться за допомогою гігантського зворотного котирування Lisp, який подає HTML, що генерує макрос. Код, складений Clozure Common Lisp (CCL), робить це так швидко, що ви навряд чи знаєте, що натискаючи кнопку [+] в інтерфейсі, щоб щось відкрити, ви надсилаєте запит на сервер, який відновлює вся проклята сторінка, а не просто запуску локального JavaScript, щоб змінити видимість локального елемента документа.

Програма була спочатку розроблена разом з CLISP. Завдяки тому, що ANSI CL є стандартною мовою, з реалізаціями, які добре відповідають і не надто багато підступних мов ("не визначена" чи "визначена реалізацією" поведінка), він досить легко переноситься на CCL.

CLISP не відмовились; він все ще використовується для живлення заднього кінця ліцензування, використовуючи більшу частину тієї ж загальної кодової бази.

Я розробив оригінальну систему ліцензування програми, використовуючи криптовалюту еліптичної кривої, надану бібліотекою IronClad, яка використовується сервером ліцензування для підписання ліцензій для їх сертифікації. (Я, мабуть, пам’ятаю, що, можливо, я використовував програму командного рядка OpenSSL для створення параметрів EC для ключа сервера.)

Ліцензії представлені у вигляді об’єктів Lisp. Це належне портативності Lisp за те, що програма Windows, складена Clozure Common Lisp, може генерувати ліцензію на основі S-виразів, програма CLISP, що працює на сервері Debian, може заповнити відсутнє поле цифрового підпису в цьому об’єкті та відправити його назад на програма Windows, яка може підтвердити підпис.

На сервері, крім сервісу ліцензування на основі CGI, я простий API командного рядка для управління ліцензіями. Ви можете перераховувати ліцензії, знаходити конкретні та редагувати їх атрибути: наприклад, редагування дати закінчення терміну дії тимчасової ліцензії для надання користувачеві виключення. Ліцензійна підтримка також генерує електронні листи. Я не використовував жодної бібліотеки для обробки CGI на стороні сервера: просто прокатуваний код Lisp вручну для роботи зі змінними середовища Apache та аргументами командного рядка. (Хоча код бібліотеки використовується для кодування URL-адрес та генерування HTML.) Для зберігання не використовується база даних; ліцензії містяться у файлі, який називається, licenses.lispі це все.


-1

Якщо хтось заплатив мені, звичайно.

Вони, мабуть, були б більш зацікавлені у тому, щоб платити тому, хто знає мову. Я кілька разів грав лише з Elisp та схемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.