답변:
많은 차이가 있습니다. 일부는 기술적이고 일부는 사회 정치적입니다. 더 중요한 차이점을 먼저 두려고 노력했습니다.
SML은 정의와 표준이있는 언어입니다. 안정적입니다 (실제로 얼어 진화 할 수 없습니다). Objective Caml은 INRIA의 소규모 그룹에서 제어하는 구현입니다. 계속 진화하고 있습니다. (IMO 진화는 잘 관리됩니다.)
SML에는 많은 구현이 있습니다. Caml은 하나만 있습니다.
Objective Caml에는 여러 가지 추가 기능이 있으며 그중 가장 두드러진 기능은 아마도 객체 및 다형성 변형 일 것입니다.
두 언어는 극적으로 다른 레코드 유형 모델을 가지고 있습니다. 간단히 말해 Caml에서 레코드 필드의 이름은 고유해야합니다. SML에서는 동일한 범위에있는 두 개의 다른 레코드 유형이 공통 필드 이름을 가질 수 있습니다. 이 기이 한 점은 SML에서 Caml로 포팅하는 것을 약간 까다로울 수 있습니다.
구문상의 차이가 꽤 있습니다.
라이브러리와 표준 기능은 크게 다릅니다. Caml 라이브러리는 매우 필수적인 반면 SML Standard Basis Library는 더 기능적입니다. 예를 들어, 함수 구성은 SML의 최상위 기본 요소입니다. Caml 라이브러리의 일부가 아닙니다. Caml 문자열 라이브러리는 접기 기능을 제공하지 않습니다 (적어도 3.08 버전에서는 제공되지 않음). 많은 Caml List
함수 의 구현은 매우 긴 목록의 경우 안전하지 않습니다. 그들은 스택을 날려 버립니다.
타입 시스템은 미묘하게 다르다 :의 Caml에서, 표현의 유형 주석 e : ty
유형의 경우 허용됩니다 ty
통합하여 의 유형 e
. SML에서는 e : ty
유형 ty
이 유형 의 인스턴스 인 경우에만 허용됩니다 e
. 이 구분은 실제로 표현이 다형성이라고 주장하기 위해 타입 어노테이션을 사용하는 것이 불가능하기 때문에 Caml의 어노테이션을 실제로 덜 유용하게 만듭니다.
Caml은 SML보다 인터페이스 ( 모듈 유형 또는 서명 이라고 함 )와 (구체적인) 구현 ( 모듈 또는 구조 라고 함) 간에 훨씬 더 건전하고 합리적인 관계를 가지고 있습니다 . SML에서는 거의 모든 것이 진행되며 좋은 규칙을 수립하기 위해 프로그래머에게 의존해야합니다. Caml에서는 컴파일러가 좋은 규칙을 설정하고 적용합니다.
SML에서 산술 연산자는 부동 소수점 및 정수 데이터 모두에 적용되도록 오버로드됩니다. Caml에서 연산자는 과부하되지 않습니다. 부동 소수점 연산자는 추가 점으로 표시됩니다.
SML에서 프로그래머는 중위 연산자의 우선 순위와 연관성을 제어 할 수 있습니다. Caml에서 이들은 운영자 이름의 첫 번째 문자로 결정됩니다. 이 제한은 자신의 중위 표기법을 정의 할 수있는 이점을 제한합니다.
편집자 의견이 포함 된 더 자세한 분석을 보려면 Adam Chlipala의 비교 페이지를 참조하십시오 .
Norman Ramsey가 언급 한 구문상의 차이점에 대한 자세한 내용은 다음 두 개의 웹 페이지입니다.