왜 그렇게 많은 프로그래밍 언어가 있습니까?


130

나는 C / C ++에 능숙하며 다양한 스크립팅 언어 (awk / sed / perl)를 둘러 볼 수 있습니다. 파이썬을 C ++의 멋진 측면과 awk / sed / perl의 스크립팅 기능과 결합하여 파이썬을 더 많이 사용하기 시작했습니다.

그러나 왜 그렇게 많은 프로그래밍 언어가 있습니까? 나는이 모든 언어가 같은 일을 할 수 있다고 생각합니다. 왜 하나의 언어를 고수하고 컴퓨터 프로그래밍에 사용합니까? 특히, 난 어떤 이유가 있어야 컴퓨터 프로그래머 등의 기능적인 언어를 알고있다?

관련 독서 :


2
OO와 비 OO 사이에도 차이가 있습니다. 또한 일부 언어에는 R, Maple, Matlab, Mathematica와 같은 멋진 패키지가 제공되며 다른 언어로는 부족합니다.
Artem Kaznatcheev


4
이미 프로그래머에 물어 programmers.stackexchange.com/q/7551/45322
alain.janinm

2
병렬 알고리즘을 구현하려면 일반적으로 변경 가능한 객체가있을 때 기능 프로그래밍이 더 좋습니다 .OO 패러다임을 사용하는 것이 좋습니다. 그렇지 않으면 ( 불변 객체를 처리하려는 경우 ) 기능 모델로 변경하는 것이 좋습니다. 이 시나리오는 병렬 처리에 널리 존재합니다. 또한 유창한 인터페이스 및 메서드 체인 과 같은 우수한 OO 패턴 중 일부는 기능적 패러다임처럼 작동합니다.

4
왜 그렇게 많은 차가 있습니까? 왜 그렇게 많은 비행기가 있습니까? 그리고 보트는 어떻습니까! 정말! 당신은 바다로 내려 가서, 같은 것들의 모든 종류가 있습니다! 모든 다른 종류의 것들 의 요점 이 무엇입니까 ?!?!? 비효율적입니다! 낭비입니다! 그리고 다른 모든 선택 의 기괴한 은 무엇입니까?!?!? 이런, 사람들을 현명하게! 유고, F-150, 해저 라이너 외에는 아무것도 필요 없습니다! 예, 비행기-MD-80은 거의 모든 것이 잘 작동합니다. 그곳에. 이제 그건 모두 ... :-) 정착
밥 자비스

답변:


116

프로그래밍 언어는 시간이 지남에 따라 발전하고 개선됩니다 (혁신).

사람들은 다른 언어에서 아이디어를 가져 와서 새로운 언어로 결합합니다. 일부 기능 (상속 메커니즘, 유형 시스템)이 개선되고 일부 기능 (가비지 수집, 예외 처리)이 추가되고 일부 기능이 제거됩니다 ( goto문, 저수준 포인터 조작).

프로그래머는 언어 구성에서 지원하지 않는 특정 방식으로 언어를 사용하기 시작합니다. 언어 설계자는 이러한 사용 패턴을 식별하고 이러한 사용 패턴을 지원하기 위해 새로운 추상화 / 언어 구성을 도입합니다. 어셈블리 언어로는 절차가 없었습니다. C에는 클래스가 없습니다. (초기) C ++에서는 예외 처리가 없습니다. 초기 언어로 새로운 모듈을 안전하게로드 할 수있는 방법이 없습니다 (Java에서는 쉬움). 내장 스레드가 없습니다 (Java에서는 쉬움).

연구원들은 계산을 표현하는 다른 방법에 대해 생각합니다. 이로 인해 언어 트리, Prolog 및 논리 프로그래밍 분기, Erlang 및 기타 행위자 기반 프로그래밍 모델의 Lisp 및 기능적 언어 분기가 발생했습니다.

시간이 지남에 따라 언어 설계자 / 연구자들은 이러한 모든 구문과 그 상호 작용 방식을 더 잘 이해하고, 널리 사용되는 여러 구문을 포함하도록 언어를 설계합니다. 이는 객체와 클래스 (단일 또는 다중 상속 대신 특성을 사용하여 표현됨), 함수형 프로그래밍 기능, 클래스 시스템 및 패턴 일치와 잘 통합 된 대수 데이터 유형 및 액터 기반 동시성을 갖는 스칼라와 같은 멋진 언어를 제공합니다.

정적 타입 시스템을 믿는 연구자들은 표현력을 향상시키기 위해 노력하고 있으며 자바로 타입 화 된 제네릭 클래스 (하스켈의 모든 훌륭한 것)와 같은 것들을 허용함으로써 프로그래머는 프로그램이 실행되지 않기 전에 더 많은 보증을받을 수 있습니다. 잘못. 정적 타입 시스템은 종종 프로그래머에게 큰 부담을 주므로 (타입을 입력하는) 연구는 그러한 부담을 경감시키는 데 들어갔다. Haskell 및 ML과 같은 언어를 사용하면 프로그래머가 까다로운 작업을 수행하지 않는 한 모든 유형 주석을 생략 할 수 있습니다. 스칼라는 프로그래머가 메소드 본문 내에서 유형을 생략하여 프로그래머의 작업을 단순화 할 수 있도록합니다. 컴파일러는 누락 된 모든 유형을 유추하고 프로그래머에게 가능한 오류를 알려줍니다.

마지막으로, 일부 언어는 특정 도메인을 지원하도록 설계되었습니다. 예를 들어 SQL, R, Makefile, Graphviz 입력 언어, Mathmatica, LaTeX가 있습니다. 이러한 언어의 기능을 범용 언어에 (직접적으로) 통합하는 것은 번거로울 것입니다. 이러한 언어는 특정 도메인에 특정한 추상화를 기반으로합니다.

프로그래밍 언어 디자인의 발전이 없다면 우리는 여전히 어셈블리 언어 또는 C ++를 사용하고있을 것입니다.

함수형 프로그래밍 언어아는 경우 : 함수형 언어를 사용하면 다른 프로그래밍 언어를 사용하는 것보다 더 간결하게 계산을 다르게 표현할 수 있습니다. C ++과 Python의 차이점에 대해 고려하고 4를 곱하십시오. 더 심각하게 다른 답변에서 이미 언급했듯이 함수형 프로그래밍은 문제에 대한 다른 사고 방식을 제공합니다. 이것은 다른 모든 패러다임에도 적용됩니다. 일부는 일부 문제에 더 적합하고 일부는 그렇지 않습니다. 그렇기 때문에 다중 패러다임 언어가 점점 더 대중화되고 있습니다. 언어를 변경하지 않고도 필요한 경우 다른 패러다임의 구문을 사용할 수 있으며, 한 가지 소프트웨어 내에서 패러다임을 혼합 할 수 있습니다.


1
전적으로 동의. 다중 패러다임 언어 (예 : 스칼라)가 몇 년 안에 어디에 있는지에 관심이 있습니다. 이들이 쉬운 DSL 통합을 허용한다면 언어 수의 점진적인 감소를 볼 수 있습니다.
Raphael

2
매우 자세한 답변! 우리는 대부분의 프로그래밍 언어가 Turing Equivalent 일 수 있음을 인정할 수 있지만, 이것이 지원하는 추상화가 모든 문제 영역에 적합하다는 것을 의미하지는 않습니다.
CyberFonic

어셈블리와 C ++ 를 같은 상자에 넣으면 내 마음이 아프다. C ++는 많이 진화했습니다 !! 특히 C ++ 11 이후부터.
Peregring-lk

66

tldr : 은색 불릿 언어가 없습니다.

나는 그들이 나를 고소하지 않기를 희망하지만, 여기는 스탠포드 프레젠테이션 중 하나의 그림입니다.

여기에 이미지 설명을 입력하십시오

언어를 선택하기로 결정하면 이 3 가지 기능 중 2 개만 선택할 수 있습니다 .

그렇기 때문에 사람들이 슬퍼하고 3 가지를 모두 다룰 수있는 초 언어를 발명하려고합니다.

실제로, 많은 요구 사항 목록이 있지만 (일부는 다른 답변에서 볼 수 있음) 핵심 기능에 세부 정보 만 추가합니다. 또한 한 언어를 다른 언어보다 선호하는 역사적, 정치적 이유가 있습니다.

이러한 요소의 조합으로 새로운 언어가 만들어집니다.

( 그리고 나는 모든 훌륭한 프로그래머가 자신의 새로운 언어를 만들어야한다고 들었습니다. )


11
시간이 지남에 따라 모서리가 점점 가까워지고 있다는 의미에서 삼각형이 줄어들고 있습니다.
Dave Clarke

1
성능과 일반성, 비교할 수는 없지만 언어에 대한 경험 이 특정 언어보다 더 많은 생산성을 제공 한다고 덧붙일 것입니다. 지식과 전문성의 가정이 필요하기 때문에 "언어의 생산성"만 비교하는 것은 불공평합니다. 그들 모두는 매우 가설이 아닐 것입니다.
Hernan_eche

이것은 흥미로운 진술이며 일종의 CAP 정리를 상기시킵니다. 이것은 단지 비공식적 인 주장입니까, 아니면 삼각형을 증명할 수 있습니까?
evnu

1
@evnu, 여기에 한 부분의 준거의 주장이 있습니다. 일반성이 가정하면 언어 L의 길이 n의 유효한 프로그램이 더 큰 문제 공간을 다루고 있다고 가정하면, 문제의 각 부분 공간은 길이 n 프로그램의 일부에 의해서만 다루어집니다. 특정 부분 공간 밖에서 길이 n의 프로그램이 대신 부분 공간 안에 있다면, 문제를 해결하는 더 짧은 프로그램을 찾을 확률이 더 높을 것입니다 (따라서 더 생산적 일 것입니다). 다른 하위 공간의 문제를 덜 잘 해결합니다 (예 : 더 긴 프로그램 사용).
Jonas Kölker

이것은 최소한 두 개의 프로그래밍 언어와 많은 도메인 특정 언어가 필요하므로 삼각형의 세면을 모두 포함한다는 좋은 주장입니다. 우리는 그것보다 많은, 많은, 많은 것을 가지고 있습니다. (그리고 나는 삼각형의 정점에 c를 넣었지만, 그것은 꽤 작은 문제입니다.)
Peter Shor

25

세계에는 워드 프로세서, 자동차, 가정 디자인, 음료, 사탕, 펜, 삽 등 다양한 변형이있는 것들이 가득합니다. 우리가 그렇게 많은 이유는 몇 가지 원칙으로 요약 될 수 있습니다.

  • 기존 제품을 개선 할 수 있다고 생각하는 사람
  • 현지 고려 사항에 따라 다른 설계가 필요합니다 (생각은 죽마의 집과 콘크리트 슬라브의 집).
  • 새로운 카테고리의 제품은 이전에 존재하지 않았던 요구를 충족시킵니다.

사무용품 점에 들어가서 "필기 도구"섹션을보십시오. 수백 가지 종류의 펜이 있습니다. 그들은 모두 거의 같은 일을한다 : 필기면에 잉크를 전달한다. 그러나 위의 세 가지 이유 중 하나 때문에 판매용으로 표시되는 각 펜이 있습니다.

  • 카트리지 만년필은 담금질 된 만년필의 개선점으로, 깃털 퀼의 개선점입니다.
  • NASA는 중력이 없을 때 쓸 수있는 펜이 필요했기 때문에 가압 롤러 볼 펜이 발명되었습니다.
  • 첫 번째 펜 자체는 타르 나 피에 담긴 뾰족한 막대기 였을 것입니다. 그 전에 사람들은 바위를 긁거나 모피로 벽에 색소를 묻히고있었습니다. (그냥 추측)

펜의 진화는 모든 사용자의 요구에 맞는 제품이 없기 때문에 계속 될 것입니다. 일부 펜은 저렴하고 일회용이며 일부 펜은 비싸고 고품질 재료로 만들어졌습니다. 일부는 겔, 일부는 잉크, 일부는 안료를 사용하고; 일부에는 트위스트 오프 캡이 있고 일부에는 전혀 캡이 없습니다. 넓은 배럴, 좁은 배럴, 둥근 배럴, 사각형 배럴; 짧고 길다. 빨강, 백색, 검정, 파랑. 등

그러나 펜에 대해서는 충분합니다.

우리의 현재 무수한 프로그래밍 언어는 첫 번째 언어 인 1940 년대 초기 컴퓨터의 숫자 기계 코드로 거슬러 올라갑니다. 원시적이고 사용하기가 어렵고 컴퓨터에 들어가기가 힘들지만 그들은 일을했습니다. 얼마 지나지 않아 프로그래머가 니모닉 단어 (예 : ADD, CALL, LOAD)를 기계어 코드에 할당하여 "조립 언어"라는 언어 클래스를 탄생 시켰습니다.

다른 프로세서 아키텍처는 기본 시스템의 특정 기능에 따라 다른 니모닉 코드를 요구했습니다. 이러한 차이점을 고려한다는 것은 다른 어셈블리 언어를 발명하는 것을 의미했습니다.

(아마 지금까지 이것이 어디로 가고 있는지 알 수 있습니다 ...)

프로그래머는 어셈블리 언어 프로그램을 살펴보고 패턴을 보았습니다. 동일한 명령 시퀀스를 사용하여 루프, 조건부, 변수 할당, 함수 호출 등을 만들 수 있습니다. 따라서 절차 적 프로그래밍 언어가 탄생했습니다. 이 언어는 "if", "while", "let"등과 같은 포괄적 인 용어로 명령어 그룹을 캡슐화했습니다.

컴퓨터 프로그래밍의 수학적 분석에서 기능적 언어가 등장했습니다. 완전히 새로운 계산 방식입니다. 더 나쁘지 않고 나쁘지 않고 단지 다릅니다.

그리고 객체 지향적, 정적으로 형식화, 동적 형식화, 후기 바인딩, 초기 바인딩, 낮은 메모리 사용량, 높은 메모리 사용량, 병렬화 가능, 특정 용도의 언어 등이 있습니다.

우리가 있기 때문에 궁극적으로 우리는 서로 다른 프로그래밍 언어를 원하는 다른 프로그래밍 언어. 모든 언어 디자이너는 "꿈"언어의 모양과 작동 방식에 대한 자체 아이디어를 가지고 있습니다. 다양성은 좋은 것입니다.


사람들이 어떤 이유로 든 원하는 것 외에 여러 언어를 사용해야하는 이유에 대한 설득력있는 이유는 없습니다.
Raphael

바로 그거야. 프로그래머는 본질적으로 문제 해결사입니다. 문제를 해결하려면 종종 프로그래밍 언어의 형태를 취하는 도구가 필요합니다. 도구가 원하는 방식으로 문제를 해결하는 데 도움이되지 않으면 새로운 도구를 발명합니다. 도구는 소프트웨어이고 새로운 소프트웨어는 새로운 문제를 해결하기 위해 작성되었으므로 도구 자체는 해결해야 할 문제가 될 수 있습니다. 이러한 문제는 새로운 도구를 만들어 해결합니다.
Barry Brown

단지 하나의 핵심 : 언어의 기능적인 부분은 오늘날 컴퓨터 "컴퓨팅 (computing)"을 표현하는 방법에 대한 수학자의 아이디어를 보여주는 것으로, 최초의 컴퓨터보다 50 년 전에 고려되기 시작했습니다. LISP (어떤 형태로든)가 여전히 두 번째로 오래된 언어이며, 첫 번째는 FORTRAN입니다.
vonbrand

20

함수형 프로그래밍 언어는 일반적으로 다른 (그러나 동등한 기능) 계산 모델 인 lambda-calculus를 기반으로 합니다. LISP, Scheme ( 컴퓨터 프로그램의 구조 및 해석 에 널리 사용되는 서적 / 코스)과 같은 형식화되지 않은 (파이썬과 같은 형식화) 언어와 Haskell, ML, F #과 같은 정적으로 형식화 된 언어가 있습니다.

SICP는 함수형 프로그래밍에 저를 가지고 무엇을하지만, 다른 사람들은 추천 이 논문 존 휴즈와 인터뷰 그와 함께합니다.

기능 프로그래밍은 현재 VS2010 및 11에 F # (. NET의 기능 언어)을 포함한 Microsoft에 의해 추진되고 있습니다. 또한 MSR, IIRC에서 일부 Haskell 개발자를 고용합니다.

패턴 일치 및 재 작성을 기반으로하는 Refal 과 같은 람다 미적분 함수형 프로그래밍 언어도 있습니다 .

함수형 언어의 추상화 수준이 다르기 때문에 함수형 프로그래밍 기술을 사용할 때 문제 해결에 대한 태도가 달라집니다. 어떤 사람들은 그것이 더 나은 프로그래머가 될 수 있다고 말합니다.


1
흥미로운 또 다른 언어 클래스는 Prolog와 같은 논리 프로그래밍 언어입니다. DataLog에 대한 경험이 매우 제한적이므로 다른 사람이 그에 대한 답변을 쓸 수 있습니까?
Daniil

2
나는 우리가 각 프로그래밍 패러다임에 대한 프로그래밍 언어가 필요하다는 것에 동의합니다.
다이

@ 다이, 우리 정말? 이론적 기초는 언어의 유일한 특징은 아닙니다. 예를 들어, Java 또는 C #의 주요 기능은 가상 머신 (C ++과 비교)이며, 이로 인해 Java가 크게 달라집니다.
Daniil

그러나 C #과 Java가 모두 가상 머신 개념을 사용하는 경우 두 언어에 동일한 구문을 사용하지 않는 이유는 무엇입니까? 모든 디자이너는 자신의 언어가 어떻게 생겼는지에 대한 강력한 아이디어를 가지고 있으며 자신의 표준을 만드는 경향이 있다고 생각합니다.
Dai

@Dai, C #과 Java 사이에는 많은 사소한 차이가 있습니다. 또한 Windows 용 Java VM이나 그와 비슷한 종류의 법적 분쟁이 있다고 생각합니다.
Daniil

19

특히, 컴퓨터 프로그래머로서 기능적 언어를 알아야 할 이유가 있습니까?

예. 하스켈은 내가 생각하는 방식을 바꿨 기 때문입니다. 생각하는 방식도 바뀔 수 있습니다.

이야기 : 나는 하루에 어떤 프로그래밍 언어 라도 배울 수 있다고 생각 했었다. 어느 날 나는 Haskell을 시작했습니다. 반나절 만에 모나드 앞에 온 모든 것을 완성했습니다. 지금은 그날부터 1 년이 지났고 나는 여전히 절망적으로 Monads에 갇혀 있습니다.

읽다:

  1. 언어와 생각 위키

  2. Kenneth E. Iversion, Turing Award 강의에서 생각하는 도구로서의 표기법

그러나 왜 그렇게 많은 프로그래밍 언어가 있습니까?

표기법은 생각을위한 도구입니다. 우리는 다른 생각을 편안하게 처리하기 위해 다른 맞춤형 표기법이 필요합니다. 그래서 우리는 새로운 언어를 만듭니다.

또한 읽어보십시오 . ;-)


5
재귀하는 것은 신성합니다!
Pratik Deoghare

4
반복하는 것은 인간입니까?
Suresh

1
그것이 하스켈에게 좋은 광고인지 확실하지 않습니다. ;)
Barry Brown

@Pratik Deoghare. 하스켈을 하루에 배우는 것은 좋은 생각이 아닐 것입니다. 버드와와 들러와 같은 함수형 프로그래밍에 관한 좋은 교과서를 읽고 시간을내어 말씀 드리겠습니다. 그렇다면 모나드는 그렇게 어렵지 않을 것입니다.
Uday Reddy

"나는 반나절 만에 모나드 이전의 모든 것을 완성했다." 정말? 반나절에 타입 클래스, 펑터, ADT, 종류 등을 배웠습니까? 불가능합니다. LYAH는 14 장 중 12 장에 모나드를 가지고 있습니다. RWH는 6 장까지 모나드를 가지지 않으며 매우 점진적으로 소개됩니다. 전체 정의는 14 장에 있습니다.
sdcvvc

13

어느 시점에서 사용하고있는 언어의 제약으로 인해 좌절하지 않고 자신의 가려움증을 긁기로 결정한 프로그래머는 거의 없을 것입니다. 따라서 새로운 언어 또는 기존 언어의 방언이 탄생합니다.

"객체 이론"의 Abadi와 Cardelli는 객체 지향 기반에서 프로그래밍 언어의 전체 제품군을 개발합니다. 그들은 함수형 프로그래밍이 OO의 특별한 경우이지만 그 반대는 아님을 증명합니다.

새로운 것을 만들어내는 것이 재밌기 때문에 사람들이 기존 언어를 개선하는 데 기여하는 것보다 다른 언어를 만들 가능성이 더 높습니다. 물론, 비전의 변화를 환영하지 않는 언어의 관리자가 있습니다. Common Lisp과 Scheme 지지자들 사이의 틈새가 가장 좋은 예입니다.


3
객체 이론은 사용 가능한 프로그래밍 언어의 전체 제품군을 제시하지는 않습니다. 클래스를 기반으로하지 않는 객체 지향 프로그래밍 언어의 기초를 제공합니다. "객체 이론"과 함수형 프로그래밍 사이에는 관련이 없습니다. 예를 들어 물체 미적분학은 게으름에 대한 개념이 없습니다. 기능 및 레코드 측면에서 OO 개념을 인코딩하는 연구도 있습니다 (예 : 90 년대 후반 Pierce의 작업).
Dave Clarke


11

왜 세계에 많은 나라가 있습니까? 우리가 단지 5-6 개의 초강대국, 또는 심지어 하나의 보편적 인 지구의 왕국을 가지고 있다면 더 쉽지 않을까요? 왜 다른 나라들이 경쟁을하게되는지에 대한 논쟁은 쉬운 일이다. 민주주의, 인권 등의 관점에서 보면 많은 나라들이 하나보다 낫다. -그러나 이것은 우리가 많은 나라를 가지고 있는지 설명하지 않습니다 . 많은 국가들이 더 나은 이유를 설명 뿐입니다 .

마찬가지로, 왜 그렇게 많은 인간 언어가 필요한가? 폴란드어, 아랍어, 만다린 ... 하나의 언어 만 있으면 쉽지 않을까요? 당신은 어느 쪽이든 논쟁 할 수 있지만, 인생이 한 쪽이든 다른 쪽이든 더 나은 이유에 대한 이유가 될 것입니다. 많은 다른 언어가 존재 하는 원인을 설명하지는 않습니다 .

문제는, 지구상에 많은 사람들이 있고, 우리 모두는 우리의 일을하고 있습니다. 우리 모두는 의견을 가지고 있습니다. 우리 모두는 책임을지고 있고 자신의 나라 나 프로그래밍 언어를 갖고 싶어하며, 종종 우리가 더 잘 알고 있다고 생각합니다 다른 사람들보다, 또는 다른 사람들이 무엇을 제공해야하는지 이해하지 않아도됩니다.

이 매우 계몽 블로그 게시물, 읽기 왜 이렇게 많은 파이썬 웹 프레임 워크를? 분명히 파이썬 에는 약 50 개의 웹 프레임 워크가 있습니다. 이것은 말도 안됩니다. 그것에 대한 합리적인 합리적인 이유는 전혀 없습니다. 그러나 게시물의 작성자는 다음과 같이 답변합니다. 파이썬 웹 프레임 워크 는 너무 쉽게 만들 수 있기 때문에 너무 많습니다 . 더 많은 파이썬 웹 프레임 워크 또는 더 많은 프로그래밍 언어가있는 합리적인 이유는 필요하지 않습니다. 사람들은 이미 무엇을 구할 수 있는지 알지 못하거나 돈을 벌 수 있기를 희망하거나 새로운 것을 만드는 것이 재미있어서 새로운 것을 계속 만들 것입니다!

개인적인 예를 설명하겠습니다. 약 10 년 전에 저는 핀란드 회사를위한 C ++ 코드를 작성했습니다. 핀란드에는 장거리를 여행하고 한 곳에서 다른 곳으로 많은 물건을 배달하는 거대한 트럭이 있습니다. 미국에도 그런 트럭이 있다고 확신합니다. 따라서 일반적인 문제는 24 개 정도의 타이어가 모두 괜찮은지 확인하는 것입니다. 물론 시간에 따라 테스트 된 기술이 있습니다. 압력과 온도를 모니터링 할 수 있으며 급격한 변화로 인해 문제가 발생했음을 나타냅니다. 물론,이 모든 기술은 독점적이며 특허를 받았으며 모든 의미를 갖습니다. (기억하십시오 : 특허는 혁신을 장려해야합니다!) 그래서이 핀란드 회사는 소리로 타이어의 상태를 감지하고 싶었습니다. 모든 타이어에서 나오는 소리를들을 수있는 마이크를 설치하고 타이어 중 하나에 어떤 종류의 문제가 있는지 확인하기 위해 그 소리에 대해 일종의 신호 처리 마법을 수행하고 프로토 타입을 만드는 것이 었습니다. 이 광기의. (샘플 사운드를 녹음하기위한 전용 실험실도 있었는데, 5 ~ 10 톤의 압력을 받고 샘플 온도를 높인 후 샘플 타이어를 폭발시킬 때 특별한 상황에 대한 인상적인 비디오 기록을 보내주었습니다. .) 분명히 재미 있고 일부 사람들은 돈을 벌기를 원한다는 점을 제외하고는이 발전에 대한 특별한 합리적 이유는 없었습니다. 또한 누군가가 새로운 프로그래밍 언어를 개발하기 시작하는 이유는 여러 가지가 있음을 이해하십시오. 그것들을 모두 배울 필요가 있거나 심지어 가능성도 없습니다. (샘플 사운드를 녹음하기위한 전용 실험실도 있었는데, 일단 5 ~ 10 톤의 압력을 받고 샘플 온도를 높인 후 샘플 타이어를 폭발시킬 때 특별한 상황에 대한 인상적인 비디오 기록을 보냈을 때 .) 분명히 재미 있고 일부 사람들은 돈을 벌기를 원한다는 점을 제외하고는이 발전에 대한 특별한 합리적 이유가 없었습니다. 또한 누군가가 새로운 프로그래밍 언어를 개발하기 시작하는 이유는 여러 가지가 있음을 이해하십시오. 그것들을 모두 배울 필요가 있거나 심지어 가능성도 없습니다. (샘플 사운드를 녹음하기위한 전용 실험실도 있었는데, 일단 5 ~ 10 톤의 압력을 받고 샘플 온도를 높인 후 샘플 타이어를 폭발시킬 때 특별한 상황에 대한 인상적인 비디오 기록을 보냈을 때 .) 분명히 재미 있고 일부 사람들은 돈을 벌기를 원한다는 점을 제외하고는이 발전에 대한 특별한 합리적 이유가 없었습니다. 또한 누군가가 새로운 프로그래밍 언어를 개발하기 시작하는 이유는 여러 가지가 있음을 이해하십시오. 그것들을 모두 배울 필요가 있거나 심지어 가능성도 없습니다. 일단 그들이 5 또는 10 톤의 압력을 가하고 어리석은 온도까지 가열 한 후 샘플 타이어를 폭발시킬 수있는 특별한 경우에 대한 인상적인 비디오 기록을 보냈을 때, 분명한 것은 합리적이지 않았습니다. 재미 있고 일부 사람들은 돈을 벌기를 원한다는 점을 제외하고는 이러한 발전의 이유. 또한 누군가가 새로운 프로그래밍 언어를 개발하기 시작하는 이유는 여러 가지가 있음을 이해하십시오. 그것들을 모두 배울 필요가 있거나 심지어 가능성도 없습니다. 일단 그들이 5 또는 10 톤의 압력을 가하고 어리석은 온도까지 가열 한 후 샘플 타이어를 폭발시킬 수있는 특별한 경우에 대한 인상적인 비디오 기록을 보냈을 때, 분명한 것은 합리적이지 않았습니다. 재미 있고 일부 사람들은 돈을 벌기를 원한다는 점을 제외하고는 이러한 발전의 이유. 또한 누군가가 새로운 프로그래밍 언어를 개발하기 시작하는 이유는 여러 가지가 있음을 이해하십시오. 그것들을 모두 배울 필요가 있거나 심지어 가능성도 없습니다.

물론,이 모든 것은 진화를 믿는 경우에만 적용됩니다. 당신이 어떤 형태의 지적 설계를 믿는다면, 하나님 께서 모든 프로그래밍 언어를 창조 하셨다면,이 무리 뒤에있는 목적을 찾아야 할 것입니다. 아마도 신은 소프트웨어 개발 기술이 가능한 가장 높은 상태에 도달 할 수 있도록 다른 프로그래밍 언어들 사이의 경쟁을 촉진하기를 원했을 것입니다.

결론적으로 많은 사람, 많은 국가, 많은 프로그래밍 언어가 있습니다. 이것은 인생의 본질입니다! 감사합니다 : 이것은 단지 프로그래밍 / 컴퓨터 과학 분야가 매우 활기차고 번 성함을 의미합니다.


매우 완벽한 답변, 왜 받아 들여지지 않았는지 모르겠습니다!
Am_I_Helpful

8

왜 그렇게 많은 프로그래밍 언어가 있습니까?

선택해야 할 사항이 있기 때문에 :

  • 사양 모드 : 명령 대 기능
  • 입력 : 정적 유형과 동적 유형
  • 평가 순서 : 값별 호출 및 이름 별 호출
  • 모듈성 : 클래스 기반 및 추상 데이터 유형 기반
  • 실행 모델 : 순차 vs. 동시

다행스럽게도, 마지막 두 가지는 본질적인 이분법입니다. 즉, 하나의 프로그래밍 언어로 두 가지 선택을 모두 할 수 있습니다. 그러나 처음 세 가지 이분법은 8 가지 조합으로 나타납니다. 따라서 이상적인 세상에서도 최소한 8 개의 프로그래밍 언어가있을 것입니다. 드릴 다운 할 때 특정 패러다임 내에서 더 미묘한 디자인 선택이있을 것입니다. 예를 들어, 클래스 기반의 정적으로 유형화 된 언어를 수행하기로 결정한 경우, 유형 시스템을 설계하는 다른 방법이 있습니다. 아직 정식 방법은 없습니다. 동시 프로그래밍 언어를 사용하기로 결정한 경우 동시성을 나타내는 여러 가지 방법이 있습니다 : 세마포어, 조건부 임계 영역, 모니터, 메시지 전달 (동기 대 비동기). 동기식 메시지 전달 내에서

우리가 프로그래밍 언어 이론에서 수행하는 연구의 일부는 이러한 이분법을 해결하는 데 전념합니다. 예를 들어, 나는 " 응용 언어에 대한 할당 "이라는 논문에서 명령형과 기능적 프로그래밍 사이의 이분법을 해결하기 위해 노력했으며 우리의 방법은 Haskell에 의해 채택되어 기능적 및 명령형 언어로 만들어졌습니다. 이분법이 완전히 해결되었다는 의미는 아닙니다. 하스켈 프로그래머는 여전히 문제를 기능적으로 또는 명령 적으로 해결할지 여부에 대한 선택에 직면 해 있습니다. Luca Cardelli는 정적 및 동적 타이핑 이분법을 해결하는 작업을했습니다. Paul Levy는 가치 별 통화 대 이름 별 이분법해결하기 위해 노력했습니다 . 이러한 결과가 모두 실제 프로그래밍 언어로 구현 된 것은 아닙니다.


이러한 모든 언어가 동일한 작업을 수행 할 수 있다면 하나의 언어 만 사용하여 컴퓨터 프로그래밍에 사용하는 것이 어떻습니까?

현실 세계의 프로그래머에게는 무언가를하는 것만으로는 충분하지 않기 때문입니다. 또한 수행 방법도 중요합니다. 올바르게 수행되면 문제 영역이 프로그램에서 충실하게 표시되고 문제의 모듈성이 유지되며 프로그램을 이해하고 수정하고 유지하기가 쉬워집니다. 이 모든 것은 프로그램 개발 및 유지 관리 비용 에 영향을 미칩니다 . 또한 소프트웨어의 안정성과 보안에 영향을줍니다.

예를 들어 많은 사람들 이 금융 계정에 " Quicken " 이라는 프로그램을 사용 합니다. 원래 프로그램은 일부 자체 버전의 Visual Basic에서 개발되었으며 상당히 훌륭했습니다. 그러나이를 확장하고 유지하기가 어려웠습니다. 수년에 걸쳐 회사가 새로운 기능을 위해 프로그램을 확장하려고 시도함에 따라이 프로그램은 전세계의 수백만 명의 불만족스러운 고객으로 인해 버그가 커졌습니다. 아마도 강력한 형식의 객체 지향 프로그래밍 언어로 소프트웨어를 다시 엔지니어링하면 도움이 될 것입니다.


특히, 컴퓨터 프로그래머로서 기능적 언어를 알아야 할 이유가 있습니까?

역사적으로 "기능 프로그래밍"은 표준 수학적 실습에 따라 Godel, Kleene 및 Church에 의해 발명되었으며, Turing은 "계산 프로그래밍"을 발명하여 기계 계산 개념을 찾아 냈습니다. Turing 이전에는 수학이 명령형 프로그래밍 아이디어를 분석 한 증거가 없습니다. (전통적인 수학적 알고리즘은 모두 "제국 스타일"로 표현되었지만 필수 내용은 여전히 ​​기능적이었습니다.) 따라서 명령형 프로그래밍은 인간 문명에 매우 새롭고 수학은 여전히 ​​잘 이해되지 않습니다. 모든 사람들이 함수형 프로그래밍을 알아야하는 첫 번째 이유는 프로그래밍이 어떻게 수학적인지 이해하는 것입니다. (나는 명령형 프로그래밍이 수학적이지 않다는 것을 인정하지 않습니다. 기능 프로그래머가 믿게 될 것입니다. 그러나 저는 현재의 최첨단 기술을 통해 명령형 프로그래밍을 수학적으로 수행하는 방법을 아직 모른다는 데 동의합니다. 우리 중 많은 사람들이 그 문제를 정확하게 연구하고 있습니다.)


1

당신은 그것을 진화로 볼 수 있습니다.

처음에는 컴퓨터가 순수하게 이진 코드로 프로그래밍되었습니다. 그 후 니모닉이 도입되고 어셈블리 언어가 도입되었으며, 주로 사용 된 CPU에 따라 다릅니다.

그 이후에 고급 (3 급) 언어 (파스칼, C, ADA, 코볼)가 도입되었으며, 일부는 매우 일반적인 (C와 같은), 일부는 데이터 처리 (Cobol), 일부는 계산 (Fortran)에 더 적합합니다.

그 후 논리 언어 (예 : Prolog)와 같이 4 단계 언어가 발생했습니다. 가장 일반적인 언어는 3 단계 언어의 후속 언어입니다. 그들 중 일부는 Java, C #입니다.

또한 ASP.NET, PHP와 같은 인터넷 / 웹 전용 언어도 볼 수 있습니다.

특정 도메인 (DSL) 언어는 대부분 일반 언어와 함께 작동합니다.

그런 다음 로고와 같이 아이들이 프로그래밍을 배울 수있는 언어가 있습니다.

또한 Python, Ruby 등과 같은 코드를 빠르게 작성하기위한 언어, XML (XSLT) 처리를위한 언어도 있습니다.

그리고 아마도 많은 언어와 심지어 언어 범주를 잊어 버렸을 것입니다.


1
당신의 연대기는 혼란 스럽다. 프롤로그는 1972 년으로 Ada (1983)보다 젊습니다. "제 3 단계 언어의 후임자"가 무슨 뜻인지 모르겠습니다. C와 Pascal (Ada에 해당)을 포함하여 Fortran의 자손이 아닌 언어는 거의 없습니다.
prosfilaes

1
@prosfilaes, 방법 혼동. FORTRAN은 여전히 ​​사용중인 최초의 언어였으며 LISP, COBOL이되었습니다. Algol은 Pascal과 이후 C로 인해 기계 사용이 아닌 알고리즘을 게시하도록 정의되었지만 (어쨌든 일종의 컴파일러가되었습니다) PL / 1은 FORTRAN과 COBOL이 Algol-ish 제어 구조와 이상한 조합이었습니다.
vonbrand

1

다른 답변이 좋으면 몇 가지 새로운 각도가 추가됩니다. DC 쓰기 언어 는 실제 인간 언어처럼 진화 합니다! 그들은 실제 인간 언어처럼 서로 개념과 구문을 다시 빌려옵니다. 다시 말해 컴퓨터 언어 의 어원 에 대한 상당히 실제적인 연구가있다 .

이것은 또한 1930 년대 람다 미적분학 으로 시작된 오랜 역사타임 라인 이 있음을 의미 합니다.

프로그래밍 언어를 사용한 이론과 응용 사이에는 강력한 상호 작용 / 시너지 / 공포가 있습니다. 새로운 이론으로 이어지고 그 반대의 새로운 응용 프로그램이 발명되었습니다. 프로그래밍 언어는 여러 가지면 에서 이론과 응용 사이의 다리 입니다.

역사에서 흥미로운 사례 연구는 포트란입니다. 잘 알려져 있지는 않지만 이전 버전의 Fortran (대부분 Fortran77 이전)에는 모호한 문법 이있었습니다 . 이는 여러 개의 유효한 "해석"이 있기 때문에 컴파일러 가 동일한 명령을 합법적으로 "해석"/ 컴파일 할 수 있음을 의미합니다 ( "해석 된"언어의 기술적 의미는 동일하지 않음).

그래서 공식적인 문법 에 대한 이론은 포트란이 발명 된시기에 개발되었고 언어 모호성 문제가 발견 될 때 작은 위기였습니다. Fortan 구문은 이러한 모호성을 피하기 위해 재구성되었으며 이후 언어는 문법 모호성에 더 민감합니다. OOP 는 또한 많은 기존 언어로 "충돌"하거나 "리플"하는 프로그래밍 언어에서 이론적 개념 / 고급의 매우 중요하고 중요한 예입니다.

다른 사례 연구는 새로운 기술의 발명입니다. 예를 들어 관계형 데이터베이스 의 발명은 컴퓨터 언어, 예를 들어 SQL 및 컴퓨터 언어 인터페이스 (예 : java, "JDBC")와 같은 컴퓨터 언어에 큰 영향을 미쳤습니다 . 마찬가지로 훨씬 더 큰 영향을 미치는 월드 와이드 웹 . 제 1 차 세계 대전 의 초기 성장과 대체로 일치하는 진화 적 폭발 과 비교 될 수 있는 닷컴 붐 주변의 언어 폭발이있는 것 같았다 .

또한 무 어스 법 의 처리 능력이 기하 급수적으로 증가하는 것과 관련하여 새로운 프로그래밍 언어에서 오랜 경향이 나타나고있는 것으로 보인다 .

프로그래밍 언어의 현재 장거리 트렌드는 MapReduce 와 같은 빅 데이터병렬화에 대한 것으로 보입니다 . 폐쇄 에도 관심이있다 .

언어의 또 다른 주요 측면은 언어 의 추상화 수준이 높아진다는 것입니다 . 더 낮은 수준의 추상화를 기반으로 높은 수준의 추상화를 만듭니다 (피라미드와 유사). 이런 식으로 컴퓨터 언어 진화의 진행은 끝이 없을 것입니다. 우리는 중요한 새로운 언어가 미래에도 오랫동안 발명 될 것이라고 확신 할 수 있습니다. 이것은 아마도 청크 (chunking) 라고하는 심리학의 비슷한 개념과 비슷할 것입니다.

많은 컴퓨터 언어를 연구 한 사람은 무리의 사고 방식이 과장된 유행으로 판명 될 수 있음을 인정해야합니다. 핵심 아이디어 / 변경 사항 중 일부는 남아 있지만 과대 광고는 사라집니다. 이런 의미에서 프로그래밍 언어는 유행빠졌다 . 마지막 반 10 년 동안 실제로 유용 하지만 과장된 두 가지 경우 :

많은 주요 언어에 걸쳐 점점 더 많은 자기 유사성 이 관찰 될 수 있습니다. 즉, 모든 유사한 언어를 자체 방식으로 구현하는 경향이 있습니다.


종종 언어를 교차하고 언어로 구현되는 디자인 패턴 을 참조하십시오 . 언어 학습 / 기능의 또 다른 주요 측면은 라이브러리
vzn

FORTRAN은 문법적 모호성을 유발할 수있는 표현의 복잡성을 훨씬 덜 공식적으로 설명하지 못했습니다. 문법은 문법으로 정의 된 첫 번째 언어 인 Algol을 사용했습니다.
vonbrand

원래 / 초기 FORTRAN으로 작성되었지만 이후 버전은보다 엄격한 문법 정의로보다 공식화되었습니다. 언어 이론과 함께 언어의 진화 를 보여주는 사례 연구 .
vzn

FORTRAN은 문법을 억지로 먹었지 만 한 번도 설계되지 않았습니다. Algol은 Pascal, Modula family, Oberon, C에 의해 계속되는 트렌드를 시작했으며, 이는 PL / 1, Ada 등의 문제로 이어졌습니다. 문맥 자유 문법 기술과 구문 분석에 대한 이해를 감안할 때 오늘날 문법을 정의하고 오류가없는 구문 분석기로 변환하는 것은 거의 사소한 일이며, 더 이상 새로운 언어가 없으면 없습니다.
vonbrand

부록, 새로운 언어 / 신흥 언어로 된 사례 연구 : Google go , node.js , Apple swift
vzn

-3

그것들은 단지 마케팅의 특수 효과가 아니 었습니다. 언어를 "C"처럼 보이게 만들면 진입 장벽이 낮아집니다.

C, 전혀 영향을 미치지 않는 일부 : SQL, Pascal, Delphi, FORTRAN, COBOL, Ada, PowerBuilder, HyperTalk, Lisp, Simula, FOCAL, BASIC, PL / I, Algol, Algol-68, SNOBOL, Modula, Visual BASIC, 교사, 로고, Forth, DIBOL, Helix, AppleScript, Python, Erlang, Ruby, Pick, 영어, RPG, PL / SQL, ASP, 프롤로그, SmallTalk, Perl, bash, Wand BASIC, REXX, DOS 배치 언어.

C와 비슷하지만 JavaScript, Java, C #, Objective-C와 거의 공통점이없는 것들.

모든 마케팅, Java, C ++ 및 JavaScript는 C처럼 보이지만 덮개 아래에서는 거의 다를 수 없습니다.


5
"그들은 아니었다"-무엇이 아니 었습니까? 어쨌든 이것이 어떻게 질문에 대답하는지 알 수 없습니다. 그것은 단순히 언어 목록과 함께 마케팅이 어떻게 든 관련되어 있다는 확실한 근거가 없습니다.
David Richerby

2
"C에 전혀 영향을 미치지 않는 사람들 : ... Algol, Algol-68, ..."-C가 Algol에서 일어났다는 점을 유감스럽게 생각해야합니다. "만약 당신이 언어를"C "처럼 보이게한다면, 이것은 진입 장벽을 낮추는 것입니다."-iirc, 이것은 잘못된 것으로 판명되었습니다. 프로그래밍에 미리 노출되지 않은 학생들은 다른 언어로 더 빨리 배우게됩니다 (저는 그 연구에서 Haskell을 사용했다고 생각합니다).
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.