학부 학위는인지 과학과 인공 지능이었습니다. 그로부터 나는 한 코스의 Lisp에 대한 소개를 받았습니다. 나는 언어가 흥미 로웠다고 생각했지만 ( "우아한"에서처럼) 나중에 그린스펀의 10 번째 규칙을 만날 때까지는 그렇게 많이 생각하지 않았다.
충분히 복잡한 C 또는 Fortran 프로그램에는 Common Lisp의 절반을 임시로, 비공식적으로 지정하고, 버그를 해결하며, 느리게 구현 한 임시 프로그램이 포함되어 있습니다.
Greenspun의 요점은 많은 복잡한 프로그램에 내장 된 통역사가 있다는 것입니다. 인터프리터를 언어로 작성하는 대신 이미 인터프리터 (또는 컴파일러)가 내장 된 Lisp와 같은 언어를 사용하는 것이 더 합리적이라고 제안했습니다.
당시 나는 커스텀 언어에 대한 커스텀 인터프리터를 사용하여 사용자 정의 계산을 수행하는 다소 큰 앱을 작업하고있었습니다. Lisp에서 핵심 실험을 대규모 실험으로 다시 작성하기로 결정했습니다.
대략 6 주가 걸렸습니다. 원래 코드는 ~ 10 만 줄의 델파이 (파스칼 변형)입니다. Lisp에서는 ~ 10,000 줄로 줄었습니다. 그러나 더욱 놀라운 것은 Lisp 엔진이 3-6 배 더 빠르다는 사실입니다. 그리고 이것이 Lisp neophyte의 작품이라는 것을 명심하십시오! 그 모든 경험은 저에게 아주 눈에 띄었습니다. 처음으로 단일 언어로 성능과 표현성을 결합 할 수있는 가능성을 보았습니다.
얼마 후 웹 기반 프로젝트 작업을 시작했을 때 여러 언어를 오디션했습니다. 나는 믹스에 Lisp와 Scheme을 포함시켰다. 결국 나는 Scheme 구현 -Chez Scheme을 선택했다 . 나는 결과에 매우 만족했다.
웹 기반 프로젝트는 고성능 "선택 엔진" 입니다. 데이터 처리에서 데이터 쿼리, 페이지 생성에 이르기까지 다양한 방식으로 Scheme을 사용합니다. 많은 곳에서 우리는 실제로 다른 언어로 시작했지만 아래에서 간략하게 설명 할 이유로 Scheme으로 이주했습니다.
이제 귀하의 질문에 답변을 드릴 수 있습니다 (적어도 부분적으로).
오디션 동안 우리는 다양한 Lisp 및 Scheme 구현을 살펴 보았습니다. Lisp 측면에서 Allegro CL, CMUCL, SBCL 및 LispWorks를 살펴 보았습니다. Scheme 측면에서 우리는 Bigloo, Chicken, Chez, Gambit을 믿었습니다. (언어 선택은 오래 전에 이루어 졌기 때문에 약간 흐릿한 이유입니다. 중요한 경우 메모를 파낼 수 있습니다.)
우리는 a) 기본 스레드와 b) Linux, Mac 및 Windows 지원을 찾고있었습니다. 이 두 가지 조건이 모두에게 영향을 미쳤지 만 Allegro와 Chez는 모두 제압했습니다. 따라서 평가를 계속하려면 멀티 스레딩 요구 사항을 완화해야했습니다.
우리는 작은 프로그램들을 모아서 평가와 테스트에 사용했습니다. 그것은 많은 문제를 드러 냈습니다. 예를 들어, 일부 구현에는 일부 테스트가 실행되지 못하게하는 결함이있었습니다. 일부 구현은 런타임에 코드를 컴파일 할 수 없었습니다. 일부 구현에서는 런타임 컴파일 된 코드를 사전 컴파일 된 코드와 쉽게 통합 할 수 없었습니다. 일부 구현에는 가비지 수집기가 있었으며 다른 가비지 수집기가 다른 것보다 분명히 더 좋았습니다 (또는 더 나빴습니다). 기타
Allegro, Chez 및 Lispworks의 3 가지 상용 구현 만 주요 테스트를 통과했습니다. 세 가지 중 Chez만이 비행 색상으로 모든 테스트를 통과했습니다. 당시 나는 Lispworks가 어떤 플랫폼에서도 네이티브 스레드를 가지고 있지 않다고 생각합니다 (지금은 그렇게 생각합니다). Allegro는 일부 플랫폼에서만 네이티브 스레드를 가지고 있다고 생각합니다. 또한 Allegro는 "좋아요"런타임 라이센스 요금을 받았는데 그다지 마음에 들지 않았습니다. 나는 Lispworks에 런타임 비용이 없었고 Chez는 간단하고 매우 합리적인 배열을 가지고 있다고 생각합니다 (그리고 컴파일러를 런타임에 사용한 경우에만 시작되었습니다).
Lisp와 Scheme에서 상당히 중요한 코드 덩어리를 생성 한 것은 여기에 몇 가지 비교 및 대조 점이 있습니다.
Lisp 환경은 훨씬 더 성숙합니다. 당신은 돈을 더 강타합니다. (단, 코드가 많을수록 버그가 더 많다고합니다.)
Lisp 환경은 배우기가 훨씬 더 어렵습니다. 능숙 해지려면 더 많은 시간이 필요합니다. 커먼 리스프는 거대한 언어이며, 상용 구현이 추가 된 라이브러리에 도달하기 전에 있습니다. (Scheme의 구문 사례는 Lisp의 어떤 것보다 훨씬 미묘하고 복잡하다고 말했다.)
Lisp 환경은 바이너리를 생성하기가 다소 어려울 수 있습니다. 불필요한 비트를 제거하기 위해 이미지를 "흔들어야"하며, 해당 프로세스 중에 프로그램을 올바르게 실행하지 않으면 나중에 런타임 오류가 발생할 수 있습니다. . 이와 대조적으로 Chez를 사용하면 필요한 다른 모든 파일이 포함 된 최상위 파일을 컴파일합니다.
나는 우리가 원래 의도하지 않은 여러 곳에서 Scheme을 사용했다고 말했다. 왜? 나는 머리 꼭대기에서 세 가지 이유를 생각할 수 있습니다.
먼저 Chez (및 개발자 인 Cadence)를 신뢰하는 법을 배웠습니다. 우리는 도구에서 많은 것을 요청했으며 지속적으로 제공했습니다. 예를 들어, Chez는 역사적으로 사소한 결함이 거의 없었으며 메모리 관리자는 매우 훌륭했습니다.
둘째, 우리는 Chez의 성능을 사랑하는 법을 배웠습니다. 우리는 스크립팅 언어처럼 느껴지는 것을 사용하고 있었고, 네이티브 코드 속도를 얻었습니다. 문제가되지 않았지만 결코 아프지 않았으며 때로는 많은 도움이되었습니다.
셋째, 우리는 추상화 체계가 제공 할 수있는 추상화를 사랑하는 법을 배웠습니다. 난 그냥 매크로를 의미하지는 않습니다. 클로저, 람다, 테일 콜 등과 같은 것을 의미합니다. 일단 이러한 용어로 생각하기 시작하면 다른 언어는 비교에 의해 다소 제한적으로 보입니다.
구성표가 완벽합니까? 아니; 트레이드 오프입니다. 첫째, 개별 개발자의 효율성을 높일 수는 있지만 대부분의 언어 (예 : 루프)에 대한 푯말이 Scheme에 없기 때문에 개발자가 서로의 코드를 이해하기가 더 어렵습니다 (예 : 백만 가지 방법이 있음) for 루프). 둘째, 훨씬 더 작은 개발자 풀과 대화하고, 채용하고, 빌릴 수 있습니다.
요약하면 Lisp와 Scheme은 다른 곳에서는 널리 사용할 수없는 일부 기능을 제공합니다. 이 기능은 트레이드 오프이므로 특정 경우에 적합한 기능이 더 좋습니다. 우리의 경우 Lisp 또는 Scheme과 함께 갈 것인지의 결정 요인은 언어 또는 라이브러리 기능에서보다 기본 기능 (플랫폼 지원, 플랫폼 스레드, 런타임 컴파일, 런타임 라이센싱)과 더 관련이 있습니다. 다시 말하지만, 우리의 경우에도 절충안이었습니다. Chez를 사용하면 원하는 핵심 기능을 얻었지만 상업용 Lisp 환경에서 보유한 광범위한 라이브러리를 잃었습니다.
또한 우리는 오래 전에 여러 가지 리스프와 구성표를 살펴 보았습니다. 그들은 모두 진화하고 개선되었습니다.