실제 응용 프로그램에 LISP를 사용 하시겠습니까? 어디서 그리고 왜? [닫은]


31

LISP (및 Scheme, Common LISP 및 Clojure와 같은 방언)는 꽤 괜찮은 프로그래밍 언어이지만 많은 업계 지원을 얻지 못했습니다. (지금은 약간의 견인력을 얻는 것처럼 보입니다).

이제 이것은 질문과 직접 ​​관련이 없습니다. 프로덕션 프로그램에 LISP 언어를 사용하는 것은 무엇입니까? 어떤 종류의 프로그램과 왜? 다른 코드 (예 : C)에 통합 된 종류의 사용법도 포함되어 있지만 답에서 의미하는 바입니다. 광범위한 개념이 선호되지만 특정 응용 프로그램에도 문제가 없습니다.


6
emacs는 "실제"응용 프로그램으로 간주됩니까? gnu.org/software/emacs/emacs-lisp-intro
S.Lott

1
@ S.Lott : 예. Emacs를위한 확장 기능을 만들기 위해 elisp를 사용한다면 괜찮습니다. 그리고 LISP 방언
Anto

GNU Guile은 바로이 목적을위한 것입니다.

1
흥미롭지 만이 질문이 더 이상이 사이트에 적합하지 않다고 생각합니다. 여러 가지 이유 : 1-너무 광범위, 2-답변 목록 초대, 3 "올바른"답변을 결정하는 명확한 방법 없음, 4-시간이 너무 현지화 된 ( "많은 업계 지원을받지 못한"), 5- 토론과 토론을 초대합니다.
Andres F.

답변:


18

프로덕션 프로그램에 LISP 언어를 사용 하시겠습니까?

전혀

어떤 종류의 프로그램과 왜?

Lisp는 범용 동적 언어입니다. 오늘날에는 Microsoft에서 게시하지 않은 다른 범용 동적 언어와 동일한 기본 어려움이 있습니다. 기본 스레드, GUI 통합, GC의 결정적인 작동 및 작은 메모리 공간.

네이티브 스레드는 LispWorks와 SBCL에 의해 달성됩니다. 아마도 다른 사람들? 나는 완전히 조사하지 않았다.

상용 제품인 LispWorks 및 Franz Common Lisp는 GUI에 통합되어 성공합니다. $$를 사지 않아도 제대로 작동하는지 모르겠습니다. 나는 그들이 잘 작동하는 것 같아요 ...

결정적 GC 작업은 (는 성공의 어떤 수준으로 자바로 이루어집니다) 할 수 있지만, 나는 기존의 리스프 시스템 (유지 것들) 그 작업을 수행하는 코드가 있다면 모른다.

내가 생각하는 작은 메모리 공간은 일부 Lisp에 의해 달성됩니다.

저의 기본 요점은 Common Lisp가 기술적으로 생산 시스템을 만들 준비가되어 있다는 것입니다. 그리고 그렇습니다 .

대부분의 개발자는 동적 언어, 매크로, 괄호, 선호하는 IDE 부족, 대학에서의 나쁜 경험, 많은 직업이 없음, 그리고 사용하지 않는 것에 놀라게됩니다.

개인적으로 팀 환경에서 Common Lisp의 본격적인 생산 시스템을 구축하는 데 뛰어 들었습니다.

편집 : 나는 다른 언어와 달리 왜 Lisp을 사용했는지 대답하지 않았습니다.

내 Lisp 경험에서-중요하지는 않지만 'hello world'보다 훨씬 더-나는 처음 "Argh new language"고통 후에 언어를 매우 유용하게 사용할 수 있음을 발견했습니다. 대부분의 언어는 다른 언어가 실제로 작동하지 않는 매우 규칙적이고 명백한 방식으로 함께 사용됩니다. 이것의 일부는 표현과 진술의 병합입니다. 이것의 일부는 핵심 목록 데이터 유형입니다. 이것의 일부는 타입 시스템입니다. 이것의 일부는 매크로 시스템입니다. 날 오해하지 마세요,하지만, 거기에 있는 고통을 가리 킵니다. 그러나 그들은 다른 언어의 어려움만큼이나 나를 쫓아 내지 않습니다.

간단한 예 중 하나는 파이썬의 길이 목록 루틴입니다. 파이썬 접근법은을 호출하는 것 len(mysequence)입니다. 그러나 우리가 생각하면 길이는 시퀀스의 속성입니다. 따라서 mysequence.len()더 적절한 아이디어입니다. 리스프는 본질적으로 그 구문 구분을 제거합니다. (length thing)함수 호출 구문과 메소드 구문입니다. 물론 어떤 사람들은 그 좌절감을 느끼고 구문상의 차이를 원합니다. 오히려 규칙 성을 갖고 싶습니다.

edit2 : 데스크탑에서 실행되는 MS 논문의 일부를 Common Lisp로 변환했으며 지금까지 함께 일하게되어 기뻤습니다.


2
내가들은 바에 따르면 LISP는 본격적인 프로덕션 시스템에서 사용되지만 일반적으로 다른 언어보다 LISP로 코딩하기 쉬운 특정 논리 처리에만 사용됩니다. 비디오 게임 AI와 통계 데이터 사전 처리는 예전에 나에게 인용 된 예입니다. 한 번은 "충분히 복잡한 시스템에는 LISP 구현이 내장되어있다"는 말을 한 관리자가있었습니다. 비슷한 말은 "충분히 부풀린 시스템에는 전자 메일 리더가 내장되어있다"는 것입니다.
FrustratedWithFormsDesigner

4
@Frustrated : 예, Greenspun의 n 번째 법칙과 jwz의 법칙입니다.
Paul Nathan

2
Clojure는 Java와 호환되도록 특별히 설계되고 대체하기 때문에 이러한 것들을 해결합니다. 물론 JVM에 대한 Scheme 및 CL 구현도 있습니다 (예 : Kawa, ABCL).
Jörg W Mittag

4
Clojure는 또 다른 단편화이기 때문에 나에게 모호합니다.
Paul Nathan

조각화는 나쁜 것이 아닙니다. Clojure에서 실제로 성가신 것은 점선 쌍이 없다는 것입니다. 그러한 근본적인 것없이 Lisp와 같은 언어로 계산 될 수 있습니까?
SK-logic

11

나는 개인적으로 런던의 두 투자 은행과 신생 기업에서 Clojure 형태의 Lisp를 사용하는 사람들을 알고 있습니다. 또한 Clojure를 제 자신의 스타트 업을위한 주요 개발 언어로 선택했습니다. 그래서 저는 입가에 돈을 넣겠습니다 :-)

지난 1 년 동안 (Java 및 C #에 대한 많은 경험을 쌓은 후) Clojure를 배우는 것이 매우 계몽적인 경험이라는 것을 알았습니다. 이에 대한 주요 이유는 다음과 같습니다.

  • 함수형 프로그래밍에 중점을두고 있습니다 (대부분의 다른 Lisp보다 더 중요합니다). 저자와 BDFL Rich Hickey는 Haskell을 언어 디자인에 대한 영감 중 하나로 자주 인용했습니다. 이는 완전히 불변의 데이터 구조 및 게으른 무한 시퀀스 등을 얻는다는 의미입니다.
  • 매크로 메타 프로그래밍-Lisp "코드는 데이터"라는 철학은 실제로 경험하지 않는 한 이해하기 어렵지만 Lisp가 표현력이 풍부하고 생산적인 이유 중 하나입니다. 기본적으로 문제 영역에 맞게 언어를 확장 할 수 있습니다.
  • 멀티 코어 동시성에 대한 환상적인 지원 -Clojure는 현재 동시 프로그래밍에 가장 적합한 언어 라고 생각 합니다. 이에 대한 깨달음 표현은 http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey 를 참조하십시오 .
  • REPL의 대화식 개발은 응용 프로그램을 작성하는 훌륭하고 생산적인 방법입니다. 실행중인 응용 프로그램 코드를 동적으로 수정하고 라이브 데이터 구조를 프로그래밍 방식으로 검사 할 수있는 진정한 힘을줍니다 .....

또한 다음과 같은 이유로 실제 프로덕션 용도로 실용적인 선택 인 것 같습니다.

  • 매우 쉬운 Java 상호 운용성으로 JVM에서 실행하면 Java 생태계의 모든 라이브러리 및 도구에 액세스 할 수 있습니다.
  • 엔터프라이즈 응용 프로그램을위한 검증 된 플랫폼 인 JVM에서 실행 중입니다 . Clojure는 뛰어난 GC 및 JIT 컴파일과 같은 모든 훌륭한 JVM 기능을 무료로 제공합니다.
  • 그것은의 동적 언어 거의 상용구와 개발 및 신속한 프로토 타이핑하기에 매우 편리합니다 기본적으로. 그러나 정적 유형 힌트를 추가하여 필요한 곳에서 꽤 좋은 성능을 얻을 수 있습니다.
  • 그것은의 실용적이고 도움이되는 사회 - 사람들이 일을 끝낼 문화의 종류 및 초점은 실제 문제를 해결하는 잘 설계된 솔루션이다
  • 여러 IDE에서 도구 지원 이 있습니다 . 개인적으로 Eclipse를 반 시계 방향 플러그인으로 사용하지만 (Java 통합이 필요하기 때문에) 다른 많은 옵션이 있습니다.

8

LISP가 최선의 선택 이었다면 LISP를 사용할 것입니다. "최선의 선택"에 영향을 미치는 몇 가지 사항 :

  • 공급 업체 지원. 우리가 사용하는 LISP 구현-문제가 발생하여 개발 및 마감일을 방해하는 경우 공급 업체가 우리와 함께 솔루션을 위해 노력할 것입니까?
  • 도서관 지원. 어떤 도서관이 있습니까? 문자열 조작, 수학, 데이터 액세스, 웹 서블릿 (또는 LISP 등가물), 윈도우 툴킷 등 ...이 내용을 처음부터 작성하고 싶지 않습니다.
  • 툴 지원-IDE가 얼마나 좋은가요? 단단하거나 안정적입니까? 훌륭한 에디터 지원? 통합 디버거? LISP에서 GUI dev를 수행 해야하는 경우 시각적 IDE가 있거나 GUI 레이아웃을 직접 코딩해야합니다 (그것을 싫어 합니다).
  • 개발자 구매 (팀원들에게 완전히 새로운 언어를 가르치는 데 너무 많은 시간을 소비하고 싶지는 않습니다)

LISP가 프로젝트에 적합한 지 결정할 때 이러한 모든 요소를 ​​고려해야합니다. 기업 세계에서 나는 그것을 경험 한 적이 없다.


생산성 자체가 언어 자체보다 사용 가능한 도구와 라이브러리에 더 많은 영향을 받는다는 점에 동의합니다 (언어가 기본 기능을 제공하는 경우).
Giorgio

6

전혀. Paul Graham 이 잘 설명합니다 .

... 1995 년에 우리는 경쟁 업체가 이해하지 못하고 지금도 거의 이해하지 못하는 것을 알고있었습니다. 자신의 서버에서만 실행되는 소프트웨어를 작성할 때 원하는 언어를 사용할 수 있습니다. ..

우리는 Lisp를 선택했습니다. 우선,이 시장에서 빠른 개발이 중요하다는 것이 명백했습니다. 우리는 모두 처음부터 시작 했으므로 경쟁 업체보다 먼저 새로운 기능을 수행 할 수있는 회사는 큰 이점을 갖습니다. 우리는 Lisp가 소프트웨어를 신속하게 작성하기에 정말 좋은 언어라는 것을 알고 있었고 서버 기반 응용 프로그램은 소프트웨어 개발이 완료되는 순간 소프트웨어를 출시 할 수 있기 때문에 빠른 개발의 효과를 확대했습니다.

다른 회사가 Lisp를 사용하고 싶지 않다면 훨씬 좋습니다. 그것은 우리에게 기술적 우위를 줄 수 있으며, 우리가 얻을 수있는 모든 도움이 필요했습니다 ...

Lisp를 사용하는 것이 실험이라고 말할 수 있습니다. 우리의 가설은 Lisp에서 소프트웨어를 작성하면 경쟁 업체보다 더 빠르게 기능을 수행 할 수있을뿐만 아니라 소프트웨어에서 할 수 없었던 작업을 수행 할 수 있다는 것입니다. 그리고 Lisp는 수준이 높기 때문에 대규모 개발 팀이 필요하지 않으므로 비용이 절감됩니다. 만약 그렇다면, 우리는 적은 돈으로 더 나은 제품을 제공 할 수 있으며 여전히 이익을 얻을 수 있습니다. 결국 모든 사용자를 확보하게되고 경쟁 업체는이를 얻지 못하게되고 결국에는 비즈니스를 중단하게됩니다. 어쨌든 그것은 우리가 희망했던 것입니다.

이 실험의 결과는 무엇입니까? 다소 놀랍게도 효과가있었습니다. 우리는 결국 20에서 30의 순서로 많은 경쟁자가 있었지만 그들의 소프트웨어는 우리와 경쟁 할 수 없었습니다. 우리는 wysiwyg 온라인 상점 빌더를 서버에서 실행했지만 데스크탑 애플리케이션처럼 느꼈습니다. 우리 경쟁자들에게는 cgi 스크립트가있었습니다. 그리고 우리는 항상 기능면에서 그것들보다 훨씬 앞서있었습니다. 때때로, 필사자들은 경쟁자들이 우리가 갖지 못한 기능들을 소개하려고 할 때가 있습니다. 그러나 Lisp를 사용하면 개발주기가 너무 빨라서 보도 자료에 발표 한 경쟁 업체 중 하루나 이틀 안에 새로운 기능을 복제 할 수있었습니다. 보도 자료를 다루는 언론인들이 우리에게 전화 할 때까지 우리는 새로운 기능을 갖게 될 것입니다.

우리는 경쟁사들에게 우리가 일종의 비밀 무기를 가지고있는 것처럼 보였을 것입니다. 사실 우리는 비밀 무기를 가지고 있었지만 그들이 생각했던 것보다 더 간단했습니다. 아무도 그들의 기능에 대한 뉴스를 우리에게 누설하지 않았습니다. 우리는 생각했던 것보다 소프트웨어를 더 빨리 개발할 수있었습니다 ...


8
"... 폴 그레이엄은 원래 커피를 기다리는 동안 냅킨 뒷면에 레딧을 썼다. 일반 컴퓨터가 이해할 수 있도록 파이썬으로 다시 써야 할 정도로 강력했다. 전체 내용을 다시 작성하려는 노력은 거의 없었으며, 두 번의 프로세서주기 사이에서 다시 작성이 완료되었습니다 .Paul Graham 자신도 이전 버전의 lisp로 작성되었습니다. 이전 버전의 lisp. lisp, paul graham, lisp, paul graham입니다. "
John Cartwright

5

어디에 : Emacs는 LISP를 사용하는 실제 응용 프로그램입니다.

이유 : 키 입력과 동작 간의 매핑을 표현하는 가장 좋은 방법이었습니다. 해석되고 빠르며 잘 정의되어 있으며 간단합니다.


나는 왜 케켓 스트로크와 액션 사이의 매핑을 표현하는 것이 좋았는지 말함으로써이 답변을 확장 할 것이다
Anto

@Anto : 내 경험에 의하면 Lisp를 사용 하면 에디터에서 할 수있는 모든 작업을 매우 일관된 방식으로 투명하게 표현할 수있는 강력한 추상화를 쉽게 만들 수 있습니다. . 이를 통해 편집기에서 수행 할 수있는 모든 작업을 키 스트로크 에 매핑 할 수 있습니다. 각 바인딩은 서로 바인딩과 비슷하게 보이고 쓰기와 유지 관리가 더 쉽습니다.
Tikhon Jelvis

4

MacsymaAutoCAD가 리스프의 방언을 기반으로합니다. 나는 그들을 Emacs뿐만 아니라 '실제 세계'로 분류 할 것입니다.


Mathematica는 Lisp를 기반으로하지 않습니다.
Rainer Joswig

2
AutoCAD는 AutoLISP를 API로 제공하지만 C ++ 및 .NET 관리 코드로 작성되었습니다.
CAD bloke

1
@RainerJoswig Macsyma는 Mathematica 대신에 의미가 있습니다.
user40989

2

물론 나는 그것을 고려할 것입니다. 특히 병렬 컴퓨팅 잠재력이있는 새로운 개발 작업에 적합합니다. 이러한 유형의 기능적 언어에는 좋은 곳인 것 같습니다.


2

Lisp는 컴파일러 구현을위한 최상의 선택 중 하나입니다. 그리고 DSL 및 eDSL 사용이 증가함에 따라 Lisp는 더욱 가치가 높아지고 있습니다. 모든 DSL 관련 작업에 Lisp 언어를 사용하고 있습니다.


0

지금은 개인 웹 사이트에서 Dragonfly 프레임 워크 를 통해 PhP 대신 newLisp를 사용하려고합니다 . Apache를 멋지게 재생하는 방법을 알 수 있다면 그것을 사용할 것입니다 (내장 웹 서버는 잘 작동하지만 Apache를 통해 훨씬 많이 작동합니다). 그리고 일단 그런 일이 발생하면 Php을 좋아하지 않고 newLisp를 좋아하기 때문에 Php를 사용하는 곳이면 어디서나 newLisp를 사용합니다.

현재 Clojure는 Android 앱에 적합하지 않지만 사람들이 그 일을하고 있음을 알고 있습니다. 그래서 그것이 이해된다면, 그것은 실제 응용 프로그램에 Lisp의 방언을 사용하는 또 다른 장소 일 것입니다 ...하지만 다시, 이것은 단지 Java를 좋아하지 않기 때문입니다.

그러나 솔직히, 나는 Lisp보다 Ruby를 선호하지만 ... 이것은 대부분 커뮤니티와 문서의 문제입니다.


0

저는 Microsoft Windows에서 기본 실행 파일로 실행되는 Tankan이라는 Common Lisp의 독점 상용 응용 프로그램을 구현했습니다 .

일본어 한자를 기억하도록 훈련시키는 프로그램입니다.

프로그램은 백그라운드 HTTP 서버로 실행됩니다. 이 서버의 실행 및 페이지 탐색은 Visual C ++를 사용하여 개발 한 작은 시스템 알림 영역 (일명 "Tray") 아이콘 응용 프로그램에 의해 조정됩니다.

작은 트레이 아이콘 응용 프로그램은 Lisp 기반 서버를 시작, 모니터링 및 중지하고 표준 입력 및 출력에 연결된 Win32 파이프를 사용하여 통신합니다. 파이프를 통해 Lisp 서버는 올바른 포트 번호를 사용하여 트레이 아이콘 응용 프로그램에 정확한 URL을 알리고 해당 트레이 아이콘 응용 프로그램은 셸 API를 통해 브라우저를 시작하여 해당 URL을 찾아 볼 수 있습니다. 사용자는 아이콘을 두 번 클릭하여 UI를 불러옵니다.

Lisp 프로그램은 사용자의 입력 이력과 다양한 객체 간의 다양한 관계를 포함하는 상당히 복잡한 세션 상태를 메모리에 유지합니다. *print-circle*변수에 의해 활성화 된 Lisp의 원형 객체 표기법 과 사용자 정의 CLOS print-object방법에서 작동하는 방식은 지속성을 구현하는 데 큰 도움이됩니다. 사용자는 디스크에 상태를 저장하고 중단 된 위치에서 다시 시작할 수 있습니다. UI 상태를 포함하여 모든 것이 저장됩니다. 사이클뿐만 아니라 객체 그래프에는 많은 공유 하위 구조가 있습니다. 또한 사전 입력 객체의 내용과 같이 지속될 필요가없는 정적 크래프트가 많이 있습니다. ANSI Common Lisp 사용자 정의 인쇄 개체 방법을 사용하면 기계를 읽을 수있는 개체에 대한 요약 인쇄 표현을 ​​만들 수 있습니다.

웹 UI에는 JavaScript가 거의 사용되지 않습니다. UI의 일부를 숨기고 표시하는 컨트롤조차 양식 제출 및 HTML을 다시 렌더링하여 수행됩니다. 따라서 UI 상태의 모든 세부 사항은 서버에 있으며 사용자가 저장할 때 유지됩니다. HTML 재생성이 매우 빠릅니다. HTML 생성 매크로를 제공하는 거대한 Lisp backquote 표현으로 이루어집니다. CCL (Clozure Common Lisp)에서 컴파일 한 코드를 사용하면 UI에서 [+] 버튼을 클릭하여 무언가를 열 때 서버에 요청을 제출한다는 사실을 거의 알 수 없습니다. 로컬 문서 요소의 가시성을 변경하기 위해 단순히 로컬 JavaScript를 실행하는 것이 아니라 전체 darn 페이지.

이 프로그램은 원래 CLISP로 개발되었습니다. ANSI CL이 표준 언어이기 때문에, 구현이 잘 정의되어 있고 언어에 너무 많은 함정 ( "정의되지 않은"또는 "구현 된 정의 된 동작")을 갖지 않는 구현으로 CCL에 쉽게 이식되었습니다.

CLISP는 포기되지 않았습니다. 여전히 동일한 공통 코드 기반을 사용하여 라이센싱 백엔드에 전원을 공급하는 데 사용됩니다.

IronClad 라이브러리에서 제공하는 타원 곡선 암호화를 사용하여 프로그램에 대한 원래 라이센스 시스템을 개발했으며, 라이센스 서버가 라이센스를 인증하기 위해 라이센스에 서명하는 데 사용합니다. (OpenSSL의 명령 행 프로그램을 사용하여 서버 키에 대한 EC 매개 변수를 생성했을 수도 있습니다.)

라이센스는 Lisp 객체로 표시됩니다. Clozure Common Lisp에 의해 컴파일 된 Windows 프로그램이 S- 표현 기반 라이센스를 생성 할 수 있다는 데 Lisp 이식성에 대한 찬사입니다. 서명을 확인할 수있는 Windows 프로그램

서버에서는 CGI 기반 라이센스 서비스 외에도 라이센스 관리를위한 간단한 명령 행 API가 있습니다. 라이센스를 나열하고 특정 라이센스를 찾고 속성을 편집 할 수 있습니다 (예 : 임시 라이센스의 만료 날짜를 편집하여 사용자에게 예외 부여). 라이센스 백엔드는 또한 전자 우편을 생성합니다. 서버 측에서 CGI 처리를 위해 라이브러리를 사용하지 않았습니다. 아파치 환경 변수와 명령 줄 인수를 처리하기위한 Lisp 코드입니다. (URL 인코딩 및 HTML 생성을 처리하는 데 라이브러리 코드가 사용되지만) 데이터베이스는 저장에 사용되지 않습니다. 라이센스는 파일이라는 파일로 정리되어 licenses.lisp있습니다.


-1

누군가 나에게 돈을 지불했다면.

아마도 언어를 아는 사람에게 돈을 지불하는 데 더 관심이있을 것입니다. 나는 elisp와 scheme으로 몇 번만 연주했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.