태그 보관물: ocaml

ocaml

OCaml이 왜 더 인기가 없습니까? 언어가 어셈블러보다

나는 항상 C가 임베디드 시스템에 사용 되는 언어 또는 최대 속도로 실행 해야하는 언어 라고 들었습니다 . 나는 포인터 산술을 좋아하지 않고 언어가 어셈블러보다 약간 렁이기 때문에 C에 대한 애정을 개발하지 못했습니다.

반면에 ML 언어는 기능적이고 가비지 수집 언어이며 OCaml도 객체 모델을 가지고 있지만 C만큼 빠른 것으로 유명합니다. 코드는 고성능 응용 프로그램을 작성하는 데 필요한 속도를 유지합니다.

특히 OCaml은 임베디드 장치, 그래픽 드라이버, 운영 체제 등과 같이 C가 일반적으로 사용되는 모든 곳에서 사용할 수 있습니다. 사용했습니다.

이것은 주관적인 질문이지만 왜 OCaml과 ML의 다른 언어가 그토록 모호한 반면 C와 다른 언어가 인기를 얻었습니까?



답변

첫 번째 대답은 언어가 왜 대중화되는지 아무도 모른다는 것이며, 다른 말을하는 사람은 대담하거나 의제를 가지고 있습니다. (언어 가 인기를 얻지 못하는 이유를 쉽게 식별 할 수는 있지만 또 다른 질문입니다.)

그 면책과 함께, 다음은 가장 암시적인 요점입니다.

  • 최초의 성숙한 C 컴파일러는 1974 년에 등장했습니다. 최초의 성숙한 OCaml 컴파일러는 1990 년대 후반에 등장했습니다. C의 헤드 스타트는 25 년이다.

  • C는 가장 큰 “킬러 앱”인 Unix와 함께 제공되었습니다. 오랫동안 전 세계의 모든 CS 부서에는 Unix가 있어야했으며, 이는 모든 강사와 CS 과정을 수강하는 모든 사람들이 C에 노출 될 기회를 가졌음을 의미합니다. OCaml과 ML은 여전히 ​​첫 킬러 앱을 기다리고 있습니다. (MLdonkey는 멋지지만 Unix는 아닙니다.)

  • C는 틈새 시장을 잘 채우므로 시스템 프로그래밍 에만 사용 되는 다른 저수준 언어가 절대 없을 것 입니다. HOPL II의 C 역사에 대한 Dennis Ritchie의 논문을 읽어보십시오. OCaml의 틈새 시장이 무엇인지 명확하지 않으며 Standard ML의 틈새 시장이 조금 더 명확합니다. 따라서 Caml과 ML에는 경쟁자가 거의없는 반면 C는 유일한 경쟁사 (BLISS)를 죽였습니다.

  • C의 가장 큰 장점 중 하나는 비용 모델 이 매우 예측 가능하다는 것입니다. C 코드의 작은 조각을 쉽게 볼 수 있으므로 해당 코드를 실행하기 위해 수행 할 기계 작업에 대한 정확한 아이디어를 즉시 얻을 수 있습니다. 특히 메모리 할당 때문에 OCaml의 비용 모델이 훨씬 명확하지 않습니다.훨씬 덜 명시 적이며 전체 메모리 할당 비용 (가비지 수집 중에 발생하는 할당 비용 + 비용과 동일)은 객체의 수명 및 다른 객체를 참조하는 객체와 같은 응급 속성에 따라 달라집니다. 결과적으로 성능을 예측하기가 어렵고 사실 이후에도 분석하기가 어렵습니다. (OCaml의 메모리 프로파일 링 도구는 꼭 필요한 도구가 아닙니다.) 결과적으로 OCaml은 임베디드 시스템과 같이 성능을 예측할 수 있어야하는 응용 프로그램에는 적합하지 않습니다.

  • C는 표준 및 많은 컴파일러가있는 언어입니다. OCaml은 소프트웨어 아티팩트입니다. 유일한 컴파일러는 단일 소스에서 온 것이며 컴파일러 표준입니다. 그리고 그 표준은 모든 릴리스마다 바뀝니다. 안정성과 이전 버전과의 호환성을 중시하는 사람들에게 단일 소스 언어는 용납 할 수없는 위험을 나타낼 수 있습니다.

  • 중간 정도의 학부생 컴파일러 과정과 많은 지속성을 가진 사람은 어느 정도 작동하고 적절한 성능을 가진 C 컴파일러를 작성할 수 있습니다. OCaml 또는 ML의 구현을 시작하려면 훨씬 더 많은 교육이 필요하고 순진한 C 컴파일러에 필적하는 성능을 얻으려면 훨씬 더 많은 작업이 필요합니다. 즉, OCaml과 같은 언어를 사용하는 애호가가 훨씬 적으므로 커뮤니티를 악용하는 방법에 대한 깊은 이해가 어렵습니다.


답변

OCaml의 문제점은 “즉시 사용하기에는”너무 유용하지 않다는 것입니다. 사람들이 언어를 사용하는 최종 이유는 필요한 라이브러리가 있기 때문입니다. 그러나 “즉시 사용 가능한 것”이 없으면 아무도 라이브러리를 작성해야한다는 것을 깨닫기 위해 프로젝트에 충분히 들어 가지 않습니다. 결과적으로 라이브러리가없는 언어가되어 “실제 앱”을 작성하기가 어렵습니다.

나는 이것이 OCaml이 겪는 문제라고 생각합니다. 프로그래밍 언어가 있기 때문에 아무도 “실제 프로젝트”를 시작하지 않아도됩니다. 예, 2와 2를 더하고 결과를 인쇄 할 수 있습니다. 그 결과 대부분 학계 이탈자 (저자가 박사 학위를 받았고 이동) 인 라이브러리의 모음으로 프로그래머를 연습하는 데 너무 도움이되지 않습니다.

( “배터리 포함”과 같은 프로젝트를 통해이를 변경하는 작업이 진행되고 있음을 알고 있습니다. 5 년 후에 다시 오면 OCaml이 더 인기가있을 것입니다.)

이 규칙에는 몇 가지 예외가 있습니다. 자바는 도서관없이 시작했지만 썬은 사람들에게 모두 집안으로 쓰라고 돈을 지불 한 다음 그 책을 내놓았다. Java 인증, Java 전용 하드웨어, Java 서적, Java 클래스 등. 심지어 프로그래밍 학습에 사용하기에 매우 좋은 언어는 아니지만 대부분의 대학에서 독점적으로 가르치도록 설득했습니다.

결과는 인기였습니다. 돈은 많은 문제를 해결할 수 있습니다.

기능적 언어 영역에서 Haskell이 인기를 얻고 있음을 알 수 있습니다. 나는 대부분의 인기는 유용한 도서관을 쓰는 돈과 같은 사람들에 의한 것이라고 생각하며, 언어를 마케팅하는 것을 멈추지 않습니다. 매일 Reddit 프로그래밍에 관한 Haskell 기사가 몇 개 있습니다. 이것은 사람들이 “하스켈을 시도 할 것”이라고 최종적으로 결정할 때까지 사람들의 마음에 붙어 있습니다. 그렇게하면 웹 프레임 워크, 객체 데이터베이스, OpenGL 라이브러리 및 XML 처리 라이브러리와 같은 유용한 것들을 보게됩니다. 이것은 그들이 실제로 “지금 바로”유용한 것을 할 수 있다는 것을 의미합니다. 따라서 생산성과 생산성에 대한 가능성 사이에서 Haskell은 많은 인기를 얻었습니다.

CL은 Haskell과 동일한 라이브러리를 많이 가지고 있으며 거의 ​​빠르지 만 아무도 그것에 대해 이야기하지 않으므로 “죽은 느낌”입니다. 실제로 #lisp는 #haskell보다 훨씬 조용하지만 Lisp는 여전히 많은 라이브러리가있는 매우 생산적인 언어입니다. 다른 언어에는 SLIME이 없습니다. 그러나 마케팅은 매우 중요하며 Haskell은 Lisp 또는 OCaml보다 더 잘 수행하며 동일한 사용자 기반을두고 경쟁합니다.

마지막으로, 어떤 사람들은 프로그래밍을 “받지”않을 것이므로 그들의 정신 모델을 깨는 것 (변수는 값을 가진 상자, 코드는 위에서 아래로 실행)은 언어를 사용하지 않도록합니다. 이 유형의 프로그래머는 프로그래밍 인구의 비율이 높기 때문에 Lisp, Haskell 및 OCaml과 같은 추상 언어의 사용자 기반을 더욱 제한합니다.


답변

나는 언어로서 OCaml 을 많이 좋아 합니다. 그러나…

도구 지원은 존재하지 않습니다. 디버거는 정상적으로 작동하지만 Windows에서는 작동하지 않으며 (마지막으로 확인한) 사용할 수있는 개발 도구가 많지 않습니다.

타입 시스템이 때때로 너무 강하다. 타입 추론이 어떻게 작동하는지 또는 일반적으로 ML 타입 시스템을 이해하지 못하는 사람에게, 부동 소수점에 정수를 추가 할 수 없다는 사실은 바로 큰 손실입니다.

표준 라이브러리는 때때로 일관성이없는 느낌을 가질 수 있습니다.

객체 모델은 다소 고정되어있는 것으로 보이며 표준 라이브러리는 거의 사용하지 않고 모듈 기반 라이브러리를 선택합니다.

기본적으로 “광택 된”느낌이 들지 않는 언어에 상당하고 언어를 집어 들고 마음에 드는지를 결정하려고 할 때 매우 중요한시기에 사람들을 멀어지게하는 다른 많은 것들이 있습니다.

가장 중요한 유산은 다른 ML 방언과 함께 다른 기능적 언어에 매우 큰 영향을 미쳤다는 것입니다. 현재 세대 기능 언어의 대부분은 ML 방언에서 최고의 요소를 취하고 일부 성가심을 개선합니다.


답변

임베디드 시스템에는 종종 속도와 결정 성이라는 두 가지가 필요합니다. OCaml은 속도를 제공 할 수 있지만 가비지 컬렉터가 있다는 사실은 본질적으로 비 결정적이며 간단한 시스템으로는 불가능합니다.


답변

이것은 약간의 사과 대 오렌지 비교입니다. OCaml은 상당히 젊은 언어이며 [1] 주류로 밀어 넣기위한 진지하고 지속적인 노력은 없었습니다 (Microsoft의 현재 F # 작업 제외). C와는 달리 가장 널리 지원되고 모방 된 엔터프라이즈 운영 체제 (예 : UNIX) 의 언어 가 아닙니다 . Java와 달리, 차세대 컴퓨팅 플랫폼으로 추진하고있는 주요 기업은 없었습니다. Perl, Python 및 Ruby와 달리, 영향력이 큰 영향력을 행사하는 틈새 시장에는 적용되지 않았습니다. 즉, 틈새 시장은 프로그래밍 언어이며 자동화 된 추론 연구 (웹 개발과 비교할 때 매우 유명하지는 않습니다)입니다. 따라서 그것은 인기가 없습니다.

[1] 공평하게, 원래 ML 언어는 70 년대 이래로 존재 해 왔습니다. 그러나 OCaml은 1996 년까지 나타나지 않았으며 표준 ML 라이브러리를 상속하지 않았습니다. 실제로 C, C ++, Java, Python, Haskell 또는 Ruby보다 더 어린 언어입니다.


답변

OCaml 커뮤니티는 응용 프로그램 개발을 용이하게하는 크고 안정적인 표준 라이브러리 (오늘 OCaml과 함께 제공되는)를 개발하지 못했습니다. 문제를 해결하기위한 몇 가지 시도가 있지만 누락 된 사항을 보려면 Python 또는 Ruby를 살펴보십시오. OCaml은 XML, 네트워킹, 데이터 계산 등과 같은 고급 표준 모듈과 상호 작용 해야하는 알고리즘 문제를 해결하려는 경우 훌륭한 언어입니다.

문제의 일부는 모듈이 OCaml에 의해 파일에 매핑되는 방식입니다. 개념적으로 모든 * .ml 파일은 동일한 네임 스페이스에 있으며 디렉토리는 의미가 없습니다. 이것은 공동체가 도서관을 발전시키기 어렵게 만든다. 컴파일러가 디렉토리 계층을 모듈 계층으로 매핑하면 표준 라이브러리가 발전 할 가능성이 높아집니다. 그러나 핵심 컴파일러 개발자는 상당한 노력을 기울여야합니다. (모듈 포장에 대해 알고 있지만 이것이 문제라고 생각합니다.)

또 다른 라이브러리 문제는 컴파일러 릴리스 간의 이진 호환성입니다. 컴파일러 업그레이드 후에 모든 라이브러리 코드를 다시 컴파일해야한다고 말하는 것이 안전합니다. 이로 인해 모듈 또는 라이브러리의 이진 릴리스를 제공하기가 어렵습니다.


답변

아마도 너무 많은 사람들이 유형에 대한 이상하고 혼란스러운 이론적 인 것들에 대한 소개의 일부로 ML을 배웠기 때문일 것입니다. 그것이 저에게 일어난 일입니다.

ML과 스몰 토크가 같은 시간에 나타났습니다. 스몰 토크 차갑게 보였고 , OO의 목적과이 환경에서 예쁘고 인터랙티브 한 물건을 만드는 방법을 즉시 이해할 수있었습니다. ML은 내가하고 싶었던 것과 관련이없는 추상적 수학적 일에 관한 것이었다. 그리고 C와는 달리 16 비트 마이크로에서 빠른 게임을 만들 수 있다고 약속하지 않았습니다.

물론 이것은 매우 불공평하고 주관적입니다. 그러나 그것은 대부분의 사람들에게 진정한 이야기 ​​일 것입니다.

요즘 나는 그 질문이 될 것이라고 생각합니다. 이제 유형에 대해 이상하고 혼란스러운 이론적 인 것들을 알아야한다고 생각합니다. 왜 Haskell 또는 Erlang보다 ML을 선택해야합니까?