2013-10-30 2 views
5

나는 리스프 교과서에이 글을 읽고 오전 :Lisp의 탁월한 수학 성능은 무엇입니까?

리스프 특히 대부분의 다른 언어와 비교했을 때, 숫자와 몇 가지 놀라운 업적을 수행 할 수 있습니다. 예를 들어, 우리가 (53)의 쉰세번째 전력을 계산하는 기능 expt을 사용하고 있습니다 :

CL> (expt 53 53) 
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373 

대부분의 언어는 많은 수의 관련된 계산에 질식 것입니다.

네, 멋지지만 저자가 왜 다른 언어보다 더 쉽고 빠르게 이것을 할 수 있는지 설명하지 못합니다.

분명히 간단한 이유가 있습니다. 누구든지 설명 할 수 있습니까?

+8

오늘의 많은 언어는 하드웨어 종속적 인 모듈러스 연산으로부터 추상화를 시도하지 않았습니다. 많은 대중 언어는 여전히 그것을하지 않습니다 (Java 또는 C++). 그러나 많은 도서관에는 "bignum"또는 "biginteger"라이브러리가 있습니다. 2 등급 시민이기 때문에 이러한 라이브러리는 종종 Java에서의 복싱과 같은 오버 헤드를 발생시킵니다. –

답변

12

이 예는 "worse is not always better"입니다.

뉴저지 접근

은 "전통적인"언어, C/C++/자바처럼, 예를 들어, 하드웨어 기능에 따라 범위의 정수를 arithmetics을 제한, int32_t는 - 어떤 자동으로 오버 플로우하는 경우 32 비트의 부호 첨부 결과가 32 비트에 맞지 않습니다. 이것은 매우 빠르며 종종 실제적인 목적으로는 충분하지만 버그를 찾기가 어렵습니다.

MIT의/스탠포드 스타일은 리스프는 다른 접근 방식을했다.

그것은 "작은"언 박싱 된 정수 타입 fixnum 및 Fixnum이라는를 arithmetics의 결과가 fixnum에 맞지 않을 때 당신은 항상 수학적으로 정확한 결과를 얻을 수 있도록, 그것은 자동으로 투명, 임의의 크기 bignum로 승격되어있다. 이것은 컴파일러가 이 결과가 fixnum을 증명할 수 없다면 bignum이 할당되어야하는지 확인하는 코드를 추가해야한다는 것을 의미합니다. 실제로 이것은 근대 건축물에 대해 0의 비용을 가져야하지만 4 ~ 10 년 전에 만들어 졌을 때 중요하지 않은 결정이었습니다.

은 "전통적인"언어

, 그들은의 bignum를 arithmetics를 제공 할 때, "라이브러리"에 그것을 할 방법은, 즉,

  • 명시 적으로 사용자가 요청을 수있다;
  • bignums는 대신에 어색한 방식으로 BigInteger.add(a,b);
  • 실제 숫자가 작고 기계 int에 맞을지라도 비용이 발생합니다.

Lisp 방식은 Lisp 전통이 doing the right thing 인 것과 상당히 유사하지만 약간의 복잡성이 발생할 수 있습니다. 또한 현재 주류이지만 자동적으로 과거에 악의적 인 공격을당한 자동화 된 메모리 관리에서도 나타납니다.정수 연산에 대한 리스프 접근법은 다른 언어 (예 : 파이썬)에서 사용되고 있으므로 의 진행은입니다!

+1

위대한 헤드 라인! –

2

wvxvw에 쓴 내용에 bignum이 내장되어 있기 때문에 Lisp에서 더 쉽게 작성할 수 있습니다. C 또는 Java에서 int와 마찬가지로 많은 수의 juggle을 사용할 수 있습니다.