기본적으로 저는 훌륭한 프로그래머가되기 위해 많은 프로그래밍 언어를 배우고 싶습니다. 나는 깊이 소수에 불과을 알고 나는 사람이 얼마나 많은에 정성 들여줬으면 클래스 또는 유형 이 있습니다 프로그래밍 언어 . 그룹으로 배워야한다면 어떻게 같이 묶을 수 있을까.
Java 배경에서 온 정적 타이핑에 익숙하지만 동적 타이핑 외에도 가능한 한 범주 형 분석을보고 싶은 사용 가능한 언어가 다양해야한다는 것을 알고 있습니다.
기본적으로 저는 훌륭한 프로그래머가되기 위해 많은 프로그래밍 언어를 배우고 싶습니다. 나는 깊이 소수에 불과을 알고 나는 사람이 얼마나 많은에 정성 들여줬으면 클래스 또는 유형 이 있습니다 프로그래밍 언어 . 그룹으로 배워야한다면 어떻게 같이 묶을 수 있을까.
Java 배경에서 온 정적 타이핑에 익숙하지만 동적 타이핑 외에도 가능한 한 범주 형 분석을보고 싶은 사용 가능한 언어가 다양해야한다는 것을 알고 있습니다.
답변:
언어 분류 방법에 따라 다릅니다. : 기본적으로 언어는 두 가지 유형으로 나눌 수 있습니다 필수적 컴퓨터에 지시하는 언어로 어떻게 작업을 수행하는 방법을, 그리고 선언적 컴퓨터에게 어떤 언어로 무엇을 할 수 있습니다. 선언적 언어로 더 세분화 될 수있다 기능 프로그램이 함수를 구성함으로써 구성되는 언어 및 로직프로그램이 논리적 연결 세트를 통해 구성되는 프로그래밍 언어. 명령형 언어는 레시피와 같은 문제를 해결하기위한 단계 목록과 비슷합니다. 명령형 언어에는 C, C ++ 및 Java가 포함됩니다. 기능적 언어에는 Haskell; 논리 프로그래밍 언어에는 Prolog가 포함됩니다.
명령형 언어는 때때로 C와 같은 절차 적 언어와 객체 지향 언어의 두 가지 하위 그룹으로 나뉩니다 . 객체 지향 언어는 객체 지향 기능 언어 (OCaml 및 Scala가 예제 임)가 있기 때문에 그룹화와 약간 직교합니다.
static 및 dynamic 을 입력하여 언어를 그룹화 할 수도 있습니다 . 정적으로 유형이 지정된 언어는 프로그램을 실행하기 전에 (일반적으로 컴파일 단계에서) 입력을 검사하고 일반적으로 적용되는 언어입니다. 동적 형식 언어는 형식 검사를 런타임에 지연시킵니다. C, C ++ 및 Java는 정적으로 유형이 지정된 언어입니다. Python, Ruby, JavaScript 및 Objective-C는 동적 유형 언어입니다. Forth 프로그래밍 언어를 포함하여 형식화되지 않은 언어 도 있습니다.
당신은 또한 그룹들이 타이핑에 의한 언어 분야 : 약한 암시 적 형식 변환을 지원하는 입력, 그리고 강력한 암시 적 형식 변환을 금지 입력. 두 용어 사이의 선은 약간 흐릿합니다. 일부 정의에 따르면 C는 약한 유형의 언어이고 다른 유형은 강한 유형의 것으로 간주됩니다. 징계를 입력하는 것이 어쨌든 언어를 그룹화하는 유용한 방법은 아닙니다.
이것들이 주요한 것들이지만, 거기에는 다른 많은 패러다임이 있으며, 그들 사이에는 많은 중복이 있습니다.
프로그래밍 언어 유형 (파라다임)은 여기를 참조하십시오 :
http://en.wikipedia.org/wiki/Programming_paradigm
프로그래밍 언어 (예 : 유형 시스템)의 다른 특성은 다음을 참조하십시오. http://en.wikipedia.org/wiki/Programming_language
피터 반 로이 (Peter Van Roy)가 모든 프로그래머가 알아야 할 것 : 인형에 대한 프로그래밍 패러다임을 살펴보아야 합니다. 외부에서 어떻게 진행되는지에 대한 개요를 제공합니다.
더 나아가려면 개념, 기술 및 컴퓨터 프로그래밍 모델을 읽을 수 있습니다 . 이런 방식으로 언어를 배우지는 못하지만 다른 종류의 언어 뒤에 놓인 패러다임을 배우게됩니다. 따라서 새로운 언어를 배우는 것이 더 쉬울 것입니다.
이에 대한 여러 가지 방법이 있지만 다음과 같이 분류 할 수 있습니다.
기계 언어 : 기계 언어는 저수준 프로그래밍 언어입니다. 컴퓨터에서는 쉽게 이해할 수 있지만 사람들이 읽기는 어렵습니다. 이것이 사람들이 더 높은 수준의 프로그래밍 언어를 사용하는 이유입니다. 고급 언어로 작성된 프로그램은 컴퓨터에서 실행할 수 있도록 기계 언어로 컴파일 및 / 또는 해석됩니다.
어셈블리 언어 : 어셈블리 언어는 기계 언어를 나타냅니다. 즉, 각 어셈블리 언어 명령어는 기계 언어 명령어로 변환됩니다. 어셈블리 언어 명령문을 읽을 수 있지만 명령문은 여전히 저수준입니다. 어셈블리 언어의 단점은 각 플랫폼에 특정 어셈블리 언어가 포함되어 있기 때문에 이식성이 없다는 점입니다.
고급 언어 : 고급 언어는 오늘날 대부분의 프로그래머가 사용하는 언어입니다. C, C ++ 및 Java와 같은 언어는 모두 고급 언어입니다. 고급 언어의 장점은 읽기 쉽고 이식 가능하다는 것입니다. 고급 언어의 단점은 어셈블리 언어보다 강력하지 않다는 것입니다. 고급 언어의 단일 명령문은 여러 기계어 명령문으로 변환되기 때문입니다.
고급 언어는 다음과 같이 더 분류 될 수 있습니다.
기능적 언어 : 기능적 언어에서 프로그램은 기능 정의로 나뉩니다. 기능적 언어는 일종의 선언적 언어입니다. 그것들은 대부분 상수가있는 입력 된 람다 미적분학을 기반으로합니다. 유명한 기능 언어 중 일부는 Scala, F #, Clojure 및 Lisp입니다.
절차 언어 : 절차 언어에서 프로그램은 결과를 생성하기 위해 따라야하는 일련의 단계로 작성됩니다. COBOL, FORTRAN 및 C는 일부 절차 언어입니다.
객체 지향 프로그래밍 언어 : OOP 언어에서 프로그램은 데이터와 데이터에서 작동하는 메소드를 포함하는 Object로 나뉩니다. Java, C # 및 C ++는 OOP 언어입니다.
논리 프로그래밍 언어 : 논리 언어는 컴퓨터가 논리적으로 추론 할 수있는 프로그램을 만드는 데 사용됩니다. 예 : 논리 언어
심층 연구를 위해 다음을 확인하십시오.
나는 기능 측면에서 생각하는 경향이 있습니다.
통사론:
C 기반 또는 무엇을했는지 Java에는 C 기반 구문이 있습니다. 파이썬이나 루비와 같은 것을 시도해 구문에서 빠져 나와 주어진 언어의 작동 원리에 대해 더 많이 생각하는 것이 좋습니다. C 기반보다 구문이 커질 필요가 없으며 공백 주위에 블록을 작성하는 데 아무런 문제가 없다고 생각합니다.
컴파일 된 vs. 해석 된 w. 빌드 프로세스와 해석 / 콘솔 :
컴파일 시간과 런타임 환경 문제에 대해서는 거의 익숙하지 않지만 거의 생각하지 않는 전체 문제가 있음을 알 수 있습니다.
마찬가지로 Java와 같은 가상 머신 내에서 실행하기위한 컴파일 과정이 여전히 많은 해석 된 언어가 있습니다. 변경 사항을 확인하려면 여전히 재구성해야합니다.
그리고 라이브 환경의 콘솔에서 명령으로 명령을 즉석에서 실행할 수있는 JavaScript와 Python이 있습니다. 세 가지 모두 코드 작성 방식이 매우 다를 수 있습니다.
동적 대 엄격한 타이핑 :
나는이 두 가지를 디자인의 절충점으로 보는 경향이있다. 수준이 훨씬 낮고 성능이 중요한 경우 정적 입력은 의미가 있습니다. 나는 "어떻게" "사파이어"라는 개념을 어떻게 든 이해하지 못했지만, 타이핑 시스템의 작동 방식과 기본적으로 예상되는 것을 배우는 매우 플라스틱 / 동적 언어로 나타났습니다. JS에서 유형 shenanigans는 거의 관심 대상이 아닙니다. 언어의 일부 구덩이에 대해 모르는 경우 좀 더 주니어 수준의 개발자를 위해 더 간결한 접촉이 있지만, 어떤면에서 유연성은 일을보다 견고하게 만들 수 있습니다.
블록 레벨 범위 대 기능 범위 대? :
블록 레벨이 가장 일반적입니다 (대부분의 c 기반 구문 언어에서 {} 사이의 모든 것). JavaScript 범위는 함수를 중심으로 구축되었습니다 (또한 객체를 효과적으로 구축하는 데에도 사용됨). 또한 내부 범위에서 외부 범위에 이르기까지 어떤 종류의 액세스 권한이 있는지에 따라 큰 차이가 있습니다. 다른 범위 지정 체계에는 익숙하지 않지만 해당 범위가 존재한다고 확신합니다.
클래식 OOP vs. 프로토 타입 OOP vs Al-OOP (C의 구조체) vs Non-OOP :
클래스 기반 OOP에서도 다양한 변형의 여지가 있습니다. 다중 상속 (ew, well over well, ew), 인터페이스 정의 등을 수행 할 수 있는지 여부 ...
JavaScript에는 객체가 훨씬 단순하고 변경이 가능한 일종의 스턴트 하이브리드 프로토 타입 OOP가 있지만, 인터페이스의 내부 문제 (IMO)는 캡슐화의 중요한 측면 인 인터페이스를 분리 할 수 있습니다.
OOP에 대한 것은 기술적으로 OOP가 아닌 본질적으로 OOP 지향적 인 많은 것들이 실제로 나올 수 있다는 것입니다. 물론 순수 주의자들도 있지만 하루가 끝날 무렵 디자인 패턴은 특정 상황에서 잘 작동하는 특정 추상화를 달성하는 것입니다. OOP 기반 언어의 아이디어가 더 절차 지향적 인 것을 사용하지 않는다고 가정하면 너무 빠르지 않습니다. 그리고 저는 JavaScript에 대해 이야기하고 있지 않습니다. 프로토 타입 기반 OOP 패러다임의 구피 버전에 의해 전혀 제한되지 않습니다.
일류 기능 :
언어로 이것들을 갖지 않는 것은 포기하기가 어렵습니다. 다른 컨텍스트에서 사용하기 위해 데이터처럼 함수를 전달할 수 있습니다. 따라서 이벤트 처리 체계를 구현하기가 매우 쉬워 지지만 원하는 방식으로 작동하도록 언어를 쉽게 조정할 수 있습니다. 자바 스크립트가 2 주 만에 설계되고 Java- 근사한 구문이 마케팅 체계로 도입 되었음에도 불구하고 JavaScript를 성공으로 이끈 것은 제가 생각하는 것 이상입니다.
마감 :
Java에 대한 논쟁이 어디인지는 확실하지 않지만, 1 ~ 2 년 전에 많은 Java 개발자들이이 기능을 요구하고 있음을 알고 있습니다. 클로저가 아닌 언어에서 함수가 닫히면 함수 내부에서 물건을 참조 할 수있는 것은 가비지 수집되었으므로 액세스 할 수 없습니다. 클로저에서 실행 컨텍스트는 반환 된 객체 또는 함수와 같은 다른 범위에서 닫힌 함수 내부의 내용을 참조 할 수 있으면 기본적으로 함수가 닫힐 때와 같은 변수를 얻습니다. 가비지 수집의 문에 발이 걸리는 것처럼 보이지만 참조 엔티티의 로컬 var로 작성된 var의 사본과 같이 구현 된 것으로 생각됩니다.
엄밀 / 엄격 / 안전 vs. 원하는 모든 로프 제공 :
JS 개발자와 Java 개발자는 서로를 전혀 이해하지 못하는 경향이 있으며,이 특정 디자인 스펙트럼의 거의 반대쪽에있는 두 언어와 관련이 있다고 생각합니다. 나는 당신이 나 자신이나 팀의 다른 개발자들로부터 나를 보호하기를 원하지 않습니다. 나는 훨씬 적은 코드로 훨씬 더 많은 일을하고 상황에 따라 매우 다른 (그러나 주어진 도메인에 대해 일관된) 방식으로 모든 것을하고 싶습니다. 둘 다에 대한 절충이 있으며 많은 언어가 중간에 더 많이 빠지는 경향이 있습니다.
나는이 모든 것들에 대한 지름길은 약간의 유용한 것들을하기에 충분한 Lisp를 배우는 것이라고 생각합니다. 이러한 패러다임의 대부분은 Lisp를 사용하는 방법으로 시작되었으므로 간단한 시도 방법입니다.
주변에는 여러 종류의 언어가 있지만 항상 새로운 언어가 나타날 수 있습니다. 기본적으로 언어의 목적은 아이디어, 개념 또는 요구 사항을 가능한 한 직접 인코딩하는 것입니다. 이를 위해 기존 패러다임이 필요한 상황이있을 수 있으며 새로운 패러다임이 필요할 수 있습니다.
보는 한 가지 방법은 표면 구조와 관련이 있습니다. 아이디어를 간결하게 인코딩 할 수있는 방법을 통해 원하는 내용에 대해 마음이 바뀌면 버그가 발생할 가능성이 거의없이 코드를 쉽게 변경할 수 있습니다.
그것을 보는 또 다른 방법은 제어 구조에 관한 것입니다. 언어가 실행되면 (있는 경우) 원하는 것을 달성하기 위해 어떤 일이 일어나는 순서입니까? 간단한 직선 실행, 재귀, 역 추적, 병렬 처리 등이 그 예입니다. 내가 발견 한 것 중 하나는 차등 실행 이었다.
또 다른 유용한 관점은 데이터 구조가 설계 될 때마다 언어가 탄생한다는 것입니다. 프로그램은 인터프리터가 작업을 수행하는 데 사용되는 데이터 (바이트 코드)와 마찬가지로 데이터를 결합하고 작업을 수행하는 응용 프로그램에 의해 "실행"됩니다.
특정 응용 프로그램에 대한 프로그래밍 언어가 있음을 추가해야합니다. 염두에 두어야 할 것은 공작 기계 제조에 사용되는 언어 인 APT (Automatic Programmed Tool)입니다.