모든 언어가 기본적으로 동일합니까?


39

최근에, 내가 알지 못하는 언어로 작성된 작은 프로그램의 디자인을 이해해야했습니다 ( 알아야한다면 ABAP ). 너무 어려움없이 알아낼 수 있습니다.

새로운 언어를 마스터하는 것은 완전히 다른 볼 게임이지만, 이미 몇 가지 언어를 알고 있다면 (어쩌면 복잡하지는 않지만) 어떤 언어로든 코드의 의도 (특히 생산 표준 코드는 복잡하지는 않음)를 이해하는 것은 간단합니다. 하나의 절차 적 / OO 및 하나의 기능적).

이것은 일반적으로 사실입니까? 모든 프로그래밍 언어는 루프, 조건문 및 함수 간 메시지 전달과 같은 유사한 구문으로 구성됩니까? 전형적인 Java / Ruby / Haskell 프로그래머가 이해할 수없는 비 종교적 언어가 있습니까? 모든 언어의 공통 원점이 있습니까?


4
폴 그레이엄 (Paul Graham) 의 평균 을 타도록 지시합니다 . 전체 내용을 읽거나 원하지 않을 수도 있지만 관련 부분은 "The Blub Paradox"라는 제목으로 검색하십시오. Graham 씨는 그의 텍스트 벽에 앵커를 넣는 것을 귀찮게 할 수 없으므로 직접 연결할 수 없습니다.
kwatford

4
언어는 공통된 기원이 없습니다. 그러나 모든 언어는 어떤 문제를 해결하려고 노력합니다. 나는 그것이 말하는 언어와 다소 유사하다고 생각합니다. 목적은 자신을 표현하는 것입니다. 1 프로 시저 / OO / 기능에 대한 지식을 기반으로 언어를 이해하는 것이 간단하다고 말할 수는 없습니다. 나는 이것을하지 않았지만이 질문을한다면 괄호가 많은 펄이나 리스프를보고 모든 유형의 1 언어를 아는 것으로 충분하다고 말할 수는 없습니다.
shahkalpesh 2013

1
이 경우 : Lambda 미적분학. 아마도 '실제'언어는 아니지만 모든 프로그래밍 언어의 어머니입니다. 한 번은 기능적 언어를 구현하여 람다 식으로 컴파일 한 다음 직접 해석했습니다. 모든 관련 식별자를 유지하더라도 결과는 읽을 수 없었습니다. Y- 콤비 네이터를 사용하는 특히 재귀 함수. 일부 샘플 표현식이 무엇을했는지 알아내는 실질적인 방법은 직접 평가하는 것입니다. 피본 나치 및 병합 정렬과 같은 간단한 것은 읽을 수 없었습니다.
kwatford

2
기능적 언어를 알고 있다면 모든 언어에서 루프가 가능하지는 않다는 것을 알아야합니다.
jalf

Piet 는 꽤 다릅니다. :)

답변:


88

대부분의 절차 적 언어의 기본은 거의 동일합니다.

그들은 다음을 제공합니다.

  • 스칼라 데이터 유형 : 일반적으로 부울, 정수, 부동 및 문자
  • 복합 데이터 유형 : 배열 (문자열은 특수한 경우) 및 구조
  • 기본 코드 구성 : 스칼라에 대한 산술, 배열 / 구조 액세스, 할당
  • 간단한 제어 구조 : if-then, if-then-else, while, for 루프
  • 코드 블록 패키지 : 함수, 매개 변수가있는 프로 시저
  • 범위 : 식별자가 특정 의미를 갖는 영역

이것을 이해하면 지구상의 언어 중 90 %를 잘 이해하게됩니다. 이 언어들을 조금 더 이해하기 어렵게 만드는 것은 사람들이 동일한 기본 말을하는 데 사용하는 엄청나게 다양한 이상한 구문입니다. 일부는 홀수 구두점을 포함하는 간결한 표기법을 사용합니다 (APL은 극단적 임). 일부는 많은 키워드를 사용합니다 (COBOL은 훌륭한 대표자 임). 그다지 중요하지 않습니다. 중요한 것은 언어 자체만으로도 머리카락을 찢지 않고 복잡한 작업을 수행 할 수있을만큼 완벽하다는 것입니다. (Window DOS 쉘 스크립트에서 심각한 문자열 해킹을 코딩하십시오 : Turing은 가능하지만 모든 것이 실제로 나쁩니다).

보다 흥미로운 절차 적 언어 제공

  • 중첩 또는 어휘 범위, 네임 스페이스
  • 동적 스토리지 할당을 통해 한 엔티티가 다른 엔티티를 참조 할 수 있도록하는 포인터
  • 관련 코드 패키징 : 패키지, 메소드가있는 객체, 특성
  • 보다 정교한 제어 : 재귀, 연속, 폐쇄
  • 특수 연산자 : 문자열 및 배열 연산, 수학 함수

기술적으로 랭 게이지의 속성이 아니라 그러한 언어가 존재하는 생태계의 속성이지만 개발 도구의 일부로 언어에 쉽게 액세스하거나 제공되는 라이브러리입니다. 광범위한 라이브러리 기능을 갖추면 라이브러리가하는 일을 다시 만들 필요가 없기 때문에 애플리케이션 작성을 단순화 / 빠르게 할 수 있습니다. Java와 C #은 그 자체로는 좋은 언어로 널리 알려져 있지만, 실제로 유용한 것은 그것들과 함께 제공되는 거대한 라이브러리와 쉽게 구할 수있는 확장 라이브러리입니다.

이해하기 어려운 언어는 절차 적이 지 않은 언어입니다.

  • 과제 나 부작용이없는 순수하게 기능적인 언어
  • 기호 계산 및 통일이 발생하는 Prolog와 같은 논리 언어
  • 패턴 일치 언어-문제에 일치하는 모양을 지정하고 종종 동작에 의해 동작이 트리거됩니다.
  • 구속 조건 언어 : 관계를 지정하고 방정식을 자동으로 풀 수 있습니다.
  • 모든 것이 병렬로 실행되는 하드웨어 설명 언어
  • SQL, Colored Petri Nets 등과 같은 도메인 별 언어

언어에는 두 가지 주요 표현 스타일이 있습니다.

  • 식별자 이름 엔터티 및 정보 흐름이 식별자를 사용하여 엔터티 이름을 지정하는 수식 (Java, APL, ...)으로 암시 적으로 인코딩되는 텍스트 기반
  • 엔터티가 노드로 그려지고 엔터티 간의 관계가 해당 노드 사이의 명시적인 호로 그려지는 그래픽 (UML, Simulink, LabView)

그래픽 언어는 종종 텍스트 하위 언어를 노드와 원호의 주석으로 허용합니다. Odder 그래픽 언어는 노드와 호에 그래프 (텍스트 :)를 재귀 적으로 허용합니다. 정말 이상한 그래픽 언어를 사용하면 주석 그래프가 주석이 달린 그래프를 가리킬 수 있습니다.

이러한 언어의 대부분은 매우 적은 수의 계산 모델을 기반으로합니다.

  • 람다 미적분학 (Lisp 및 모든 기능적 언어의 기초)
  • 포스트 시스템 (또는 문자열 / 트리 / 그래프 재 작성 기술)
  • 튜링 머신 (상태 수정 및 새 메모리 셀 선택)

대부분의 산업계에서 절차 적 언어와 복잡한 제어 구조에 중점을두면,이 범주에서 더 흥미로운 언어 중 하나를 잘 배우면, 특히 객체 지향 유형이 포함 된 경우 잘 학습 할 수 있습니다.

나는 특히 훌륭한 책인 컴퓨터 프로그램의 구조와 해석 에서 체계를 배우는 것이 좋습니다 . 여기에는 이러한 모든 기본 개념이 설명되어 있습니다. 이 내용을 알면 구피 구문을 제외하고 다른 언어는 매우 간단 해 보일 것입니다.


3
좋은 답변입니다! 후속 조치 (SO에서 후속 질문을 할 수있는 방법이 있습니까?), 프로그래밍 소프트웨어의 모든 개념을 이해하고 마스터 할 수있는 언어가 있습니까? Lisp (또는 Scheme과 같은 방언)입니까?

@Anirudh : 공식적인 후속 메커니즘은 없지만 새로운 질문을 열 수 있습니다. 여기에 이론적 근거와이 질문에 대한 링크가 포함되어 있으면 닫히지 않을 수도 있습니다. ;) 당신의 후속 조치에 대답하기 위해, 나는 패러다임이 너무 다르기 때문에 단지 하나의 언어 만이 아니라고 진심으로 믿습니다.

@Anirudh : John Y와 동의 한 것은 하나뿐이 아닙니다. 그러나 현장에 비교적 익숙하지 않은 경우 절차 적 패러다임을 마스터하기 위해 상당한 에너지를 소비해야합니다 (OO는 전문 분야라고 생각합니다). 그들이 작동하는 방식을 이해하기 위해 다른 패러다임 (논리, ​​제약, 데이터 흐름)을 보는 것이 아프지 않을 것이지만, 대부분의 일상적인 산업 작업에서 절차 적 언어는 거의 왕입니다.
Ira Baxter

1
자연어와 마찬가지로 "이해하기 어렵다"는 주관적이고 배우는 첫 번째 언어에 의존합니다.
NullUserException

1
@NullUserException : 다른 언어를 쉽게 이해할 수 있도록 모국어를 신중하게 선택해야합니다. 이것이 Scheme의 요점, 특히 SICP 서적입니다.
Ira Baxter

6

하드웨어 설명 언어는 프로그래밍 언어이지만 개념 상 매우 다릅니다. VHDL 또는 Verilog를 사용해보십시오. FPGA 프로그래밍에 일반적입니다. (그래서 프로세서는 아니지만 범용 컴퓨팅 장치입니다. 컴퓨터 과학 주제에 유효한 하드웨어로 간주해야합니다.) 일이 연속적으로 발생하도록해야합니다. 완전히 다른 모델입니다. 병렬로 발생하는 것을 예외가 아닌 규칙으로 생각했습니다. Verilog의 For 루프는 병렬 하드웨어로 확장됩니다. 따라서 "예상 된"동작이 예상과 다를 수 있습니다.


그건 좋은 지적이야. Verilog / VHDL을 찾아 볼 것입니다.

나는 항상 기존의 프로그래밍 언어가 VHDL과 같이 자연스럽게 병렬 인 프로그램을 코딩하는 정말 어리석은 방법이라고 생각했습니다. 하드웨어 디자이너로 시작할 때 직렬 방식으로 발생하는 모든 것에 대한이 비트는 엄청나게 어색해 보입니다. (우리는 사람들에게 첫 번째 언어로 잘못된 프로그래밍 언어를 가르치고 있습니다. Verilog 여야합니다!).
Ira Baxter

4

"기본적으로"의 의미에 따라 다릅니다. 유연성이있는 모든 언어는 Turing-complete입니다. 그런 의미에서 : 예, 기본적으로 모두 동일합니다.

낮은 수준에서, 이들은 모두 유사한 작업 순서를 수행하며 모든 Windows, Linux 및 (최근) OS X 작업은 모두 동일한 명령 세트를 사용하여 Intel 호환 프로세서에서 실행됩니다. 그런 식으로 그들은 기본적으로 동일합니다.

나는 당신이 당신의 질문에 "기본적으로"정의되어 있다는 것을 알고 있지만 실제로 대답하기 위해서는 그 정의가 훨씬 더 정교 해져야합니다. 여러면에서 그들은 모두 비슷합니다. 여러면에서 그들은 구별됩니다. "그것은 달려있다"라고 말하기가 너무 쉽다. 어느 쪽이든 극단적으로 취하면 질문이 의도 한대로 답변하지 않을 수 있으므로 원하는대로 질문에 대답하는 것이 중요합니다.


3

언어는 의미를 암호화한다고 말합니다. 의미가 어떤 맥락에서 의미가 있다면, 의미를 표현할 수있는 모든 언어는 그 의미와 맥락에 의해 동등하게 제한되는 것으로 말할 수있다.

해당 컨텍스트를 표준 Von Neumann 머신으로 제한하면 CPU에서 메모리를 변경하고 컴퓨팅하는 컴퓨팅의 의미가 원점이라고 할 수 있으며 모든 언어가 공통적으로 갖는 유일한 의미 일 수 있습니다. 다른 모든 것은 이것에 기반한 추상화입니다.


1
존 폰 노이만 그리고 그것은 "noyman"과 같이 "newman"처럼 발음되지 않습니다.

정정 주셔서 감사합니다-발음하는 것은 당신이 말한 것과 같습니다.
Preet Sangha

누군가 수정을 제안하면 게시물을 수정하여 반영 할 수 있습니다.
Phil Miller

2

프로그래밍 언어는 또한 사고를위한 도구입니다. 또 다른 사고 관점에서 일부 문제는 사라지거나 관리하기 쉬운 다른 종류로 변형됩니다 (예 : Lisp에서 생각할 때 많은 C ++ 스타일 디자인 패턴이 사라집니다 (예 : Peter Norvik의 프리젠 테이션 참조 ). Erlang 은 생각을 자유롭게합니다. 낮은 수준의 동시성 또는 분산 컴퓨팅 구조 중 하나이며 응용 프로그램 논리에만 집중할 수 있습니다.

그러나 때때로 "새로운"패러다임은 "이전의"프로그래밍 언어에 부분적으로 적용될 수 있으며, 이는 예를 들어 Java 프로그래머를위한 기능적 프로그래밍을 가르치는 책을 가지고있는 이유를 설명합니다 . 그러나 언어 수준에서보다 강력한 패러다임을 기본적으로 지원하고 통합하면 패러다임을보다 자연스럽게 적용 할 수 있습니다. 따라서 다른 답변에서 알 수 있듯이 익숙하지 않은 패러다임을 지원하는 언어의 프로그램을 이해할 수 없습니다. 그리고 @kwatford는 Paul Graham 을 말합니다 ).


2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

가장 낮은 수준에서 모든 프로그래밍 언어는 "동일"하지만 실제로 상호 작용하는 수준에서 동일하다는 것을 의미하지는 않습니다. 그들은 당신에게 문제를 추상화합니다; 똑같은 문제를 추상화하거나 각 문제를 같은 방식으로 추상화한다는 의미는 아닙니다.


1

성숙한 언어는 일반적으로 몇 가지 목표가 있으며, 서로를 위해 희생하는 곳에서 절충합니다. 범용 언어는 무엇이든 사용할 수 있지만 모든 영역에서 언어가 뛰어난 것은 아닙니다. 몇 가지 예 :

C는 이상적인 시스템 프로그래밍 언어가 되려고합니다. 이를 위해 낮은 수준의 제어 및 속도를 위해 가독성과 안전성을 희생합니다.

파이썬은 이상적인 스크립팅 언어가되는 것을 목표로합니다. 이를 위해 생산성과 휴대 성을 위해 속도와 검증 성을 희생합니다.

하스켈은 안전하고 수학적으로 순수한 언어가 되려고 노력합니다. 이를 위해 검증 성과 신뢰성에 대한 학습 성과 관습을 희생합니다.

이러한 희생과 혜택 은 언어에 차이를 만듭니다 . 그렇습니다. 대부분의 프로그래밍 언어는 컴퓨터가 수행 할 수있는 모든 것에 사용될 수 있지만, 모든 언어에 동일한 언어 사용 해서는 안됩니다 . 위의 모든 언어는 특정 작업에는 선택하지만 다른 작업에는 사용하지 않는 언어입니다. 운영 체제를 프로그래밍하는 경우 C를 선택합니다. 웹 사이트의 백엔드를 작성하는 경우 Python을 사용합니다. 그리고 금융 시스템을 작성한다면 Haskell을 사용할 것입니다.

결국 프로그래머로서의 선택은 작업에 적합한 도구입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.