[language-agnostic] 다양한 접근 방식과 개념을 이해하는 데 도움이되는 중요한 언어는 무엇입니까? [닫은]

볼트 커터 한 쌍과 보드카 한 병만 있으면 Wolf Blitzer의 보트 하우스 문에 자물쇠처럼 보입니다. (xkcd를 읽지 않으면 망치와 못으로 교체하십시오)

현재 Clojure, Python, Java 및 PHP를 프로그래밍하고 있으므로 공백 및 C 및 LISP 구문에 익숙합니다. 나는 명령형, 기능성, 불변성, OOP 및 커플 타입 시스템 및 기타 것들을 알고 있습니다. 이제 더 원해!

다른 접근법을 사용하고 실제 도구 선택이나 이론적 이해에 유용한 언어는 무엇입니까?

다른 기능 언어 (Haskell) 나 다른 명령형 OOP 언어 (Ruby)를 배우고 싶지도 않고 Brainfuck과 같은 비현실적인 재미있는 언어를 연습하고 싶지도 않습니다.

내가 찾은 매우 흥미로운 것 중 하나는 Factor와 같은 모노 닉 스택 기반 언어입니다.

내가 대부분의 개념을 이해하고 모든 질문에 대한 답을 가지고 있다고 느낄 때만, 나는 개인적 선호를 모두 담을 수있는 장난감 언어에 대해 생각하기 시작합니다.



답변

실용성 문제는 매우 주관적이므로 다른 언어 패러다임을 배우면 더 나은 프로그래머가 될 수 있습니다. 그보다 더 실용적인 것은 무엇입니까?

기능적, Haskell- 나는 당신이 원하지 않는다고 말했지만 실제로는 재고해야합니다. Clojure와 심지어 Python으로 기능적 노출을 얻었지만 Haskell 없이는 완전히 경험하지 못했습니다. 실제로 Haskell에 반대하는 경우 ML 또는 OCaml이 좋은 타협입니다.

선언적, 데이터 로그 -많은 사람들이이 슬롯에서 프롤로그를 추천하지만, 데이터 로그는 선언적 언어의 명확한 예라고 생각합니다.

Array, J- 방금 J를 발견했지만 멋진 언어라는 것을 알았습니다. 그것은 당신의 마음을 프레첼로 비틀 것입니다. J에게 감사합니다.

Stack, Factor / Forth -Factor는 매우 강력하며 최대한 빨리 파고들 것입니다. Forth는 Stack 언어의 대부이며 추가 보너스로 쉽게 구현할 수 있습니다. 구현을 통한 학습에 대해 할 말이 있습니다.

Dataflow, OzOz 의 영향은 상승세에 있으며 앞으로도 계속 증가 할 것입니다.

프로토 타입 기반의 JavaScript / Io / Self -Self는 모든 프로토 타입 기반 언어에 큰 영향을 미칩니다. 이것은 클래스 기반 OOP와 같지 않으므로 그렇게 취급해서는 안됩니다. 많은 사람들이 프로토 타입 언어를 사용하여 특별 수업 시스템을 만들지 만, 목표가 마음을 넓히는 것이 실수라고 생각합니다. 언어를 최대한 활용하십시오. 수업없는 프로그램 정리를 읽고 아이디어를 얻으십시오.

전문가 시스템, CLIPS- 항상 권장합니다. Prolog를 알고 있다면 속도를 높이는 데 도움이 될 것 같지만 언어는 매우 다릅니다.

Frink -Frink는 범용 언어이지만 단위 변환 시스템으로 유명합니다. 나는이 언어가 최선을 다하기 위해 끊임없는 노력으로 매우 고무적인 것을 발견했다. 게다가 … 정말 재미 있어요!

Functional + Optional Types, Qi- 일부 유형 시스템에 대한 경험이 있지만 “스킨 가능 * 유형 시스템에 대한 경험이 있습니까? 아무도 없습니다 … Qi는 여러면에서 Lisp와 유사하지만 타입 시스템은 당신의 마음을 날려 버릴 것입니다.

Actors + Fault-tolerance, Erlang -Erlang의 프로세스 모델은 많은 화제가되지만 결함 허용 및 핫 코드 스왑 메커니즘은 게임 변경입니다. Clojure로 배우지 않을 FP에 대해서는 많이 배우지 않지만 FT 기능을 사용하면 더 많은 언어가 이것을 제대로 이해하지 못하는 이유가 궁금해집니다.

즐겨!


답변

프롤로그 (통합 / 역 추적 등), 스몰 토크 ( “모든 것이 메시지”인 경우), Forth (역 폴란드 인, 스레드 통역사 등), 스킴 (계속)은 어떻습니까?

언어는 아니지만 Metaobject Protocol의 기술 은 마음을 사로 잡는 것입니다.


답변

두 번째 Haskell입니다. “Lisp을 알고 있으므로 함수형 프로그래밍을 알고 있습니다”라고 생각하지 마십시오. 유형 수업에 대해 들어 본 적이 있습니까? 대수 데이터 타입? 모나드? “현대”(최소 50 세 이상은 아닙니다.) 기능 언어, 특히 Haskell은 매우 강력하고 유용한 새로운 개념을 많이 탐색했습니다. 타입 클래스는 임시 다형성을 추가하지만 타입 추론 (아직 아는 언어는없는 것)은 매력처럼 작동합니다. 대수 데이터 형식은 특히 트리와 같은 데이터 구조를 모델링 할 때 매우 훌륭하지만 열거 형이나 간단한 레코드에도 적합합니다. 그리고 모나드 … 음, 사람들이 그것들을 사용하여 예외, I / O, 파서, 목록 이해 등을 순전히 기능적인 방식으로 사용한다고 가정 해 봅시다!

또한 전체 주제는 몇 년 동안 바쁘게 유지할 정도로 깊습니다.)


답변

저는 현재 Clojure, Python, Java 및 PHP를 프로그래밍하고 있습니다. […] 다른 접근 방식을 취하는 언어는 무엇이며 실용적인 도구 선택이나 이론적 이해에 유용합니까?

있어 많은 주위에 거짓말을 C 코드는 확실히 실용적 —. 당신이 너무 ++ C를 배울 경우에, 거기에 큰 많은 더 많은 코드의 주위에 (당신은 C와 자바를 알고 한 번 도약은 짧다).

또한 몇 가지 이론적 문제에 대한 이해를 돕습니다. 예를 들어, 실행중인 각 프로그램은 어떤 의미에서 4GB 바이트 배열에 있습니다. C의 포인터는 실제로이 배열에 대한 지표 일 뿐이며 다른 종류의 정수일뿐입니다. 표면 레이어 아래에 숨겨진 것을 제외하고는 Java, Python, PHP에서 차이가 없습니다.

또한 C로 객체 지향 코드를 작성할 수 있습니다. vtables 등에 대해서는 약간의 매뉴얼이어야합니다. Simon Tatham의 Portable Puzzle Collection은 접근성이 뛰어난 객체 지향 C 코드의 훌륭한 예입니다. 또한 초급 / 중급 C 프로그래머가 읽을 수 있도록 상당히 잘 설계되어 있습니다. 이것은 Haskell에서도 발생합니다. 타입 클래스는 어떤 의미에서는 “단지 다른 vtable”입니다.

C에 관한 또 다른 큰 장점 : 숙련 된 C 프로그래머와 Q & A에 참여하면 C에 대해 하위 수준의 구조로 설명하는 많은 답변을 얻을 수 있습니다.

OP의 요점을 잃어 버렸을 수도 있습니다. 다른 답변으로 판단 할 수 있습니다.하지만 비슷한 질문이 있고이 글을 읽는 다른 사람들에게 유용한 답변이 될 수 있습니다.


답변

Peter Norvig 사이트에서 :

“최소 십여 개의 프로그래밍 언어를 배우십시오. 클래스 추상화 (Java 또는 C ++와 같은)를 지원하는 언어 하나, Lisp 나 ML과 같은 기능적 추상화를 지원하는 언어, 선언적을 지원하는 구문 추상화 (Lisp와 같은) “Prolog 또는 C ++ 템플릿과 같은 사양, Coroutine (아이콘 또는 구성표 등)을 지원하는 사양 및 병렬 처리 (Sisal 등)를 지원하는 사양”

http://norvig.com/21-days.html


답변

나는 6 개월 수백 표를 한 후에 아무도 SQL에 대해 언급하지 않은 것에 놀랐습니다 …


답변

이론 / 고급 유형 시스템으로 유형 : Coq (Agda 도이 범주에 있다고 생각합니다).

Coq는 기능적 프로그래밍 언어에 포함 된 증거 ​​보조자입니다.

수학적 증거를 작성할 수 있으며 Coq는 솔루션 구축을 돕습니다. 함수를 작성하고 그에 대한 특성을 증명할 수 있습니다.

그것은 의존적 인 유형을 가지고 있으며, 혼자서 내 마음을 날려 버렸습니다. 간단한 예 :

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

는 크기 n과 m의 요소의 두 배열을 연결하고 크기 배열 (n + m)을 반환하는 함수의 시그니처입니다. 함수가 그것을 반환하지 않으면 컴파일되지 않습니다!

귀납적 구조의 미적분학을 기반으로하며 그 뒤에 확실한 이론이 있습니다. 나는 모든 것을 이해할만큼 똑똑하지는 않지만, 특히 유형 이론으로 경향이 있다면 살펴볼 가치가 있다고 생각합니다.

편집 : 언급해야합니다 : Coq에서 함수를 작성한 다음 모든 입력에 대해 올바른지 증명할 수 있습니다.