일부 프로그래머는 왜 C, Python, C ++를 다르게 분류합니까? -레벨에 대하여


16

저는 파이썬에 대한 입문 과정을 밟고 있으며 강사는 파이썬이 고급 언어이고 C 및 C ++가 저급 언어라고 말합니다. 혼란 스럽습니다. C, C ++, Python, Java 등은 모두 고급 언어라고 생각했습니다.

C, C ++ 등에서 stackoverflow에서 질문을 읽고 있었으며 모두 해당 언어를 높은 수준으로 지칭하는 것으로 보입니다. 일부 프로그래머는 이러한 용어를 상호 교환 적으로 사용하는 것 같습니다.


1
많은 것들과 마찬가지로, 높은 수준과 낮은 수준은 단순화로 이해하기에 유용하지만 단순화라는 것을 잊어 버릴 경우 오도 할 수 있습니다. 다른 사람들이 말했듯이, 어느 수준이 상대적으로 상대적입니까. 그러나 반드시 선은 아닙니다. 추상화 할 수있는 다른 방향이 있습니다 (예 : 다른 패러다임). 머신 추상화에서 더 멀리 이동한다고해서 반드시 어플리케이션에 적합한 추상화로 나아가고있는 것은 아닙니다.
Steve314

출발점조차 다를 수 있습니다. 예를 들어 IMO ​​람다 미적분학은 추상화 수준이 매우 낮습니다. 기계에서 충분히 추상화되었지만 기능 언어가 추상화를 시작하기위한 출발점 역할을하는 매우 간단한 추상화입니다. 어쨌든 람다 미적분은 머신 코드보다 특정 응용 프로그램에 대한 이상적인 추상화에 가깝지 않습니다.
Steve314

답변:


31

상위 레벨과 하위 레벨은 상대적인 용어이므로 사용법이 시간이 지남에 따라 변경되었습니다. 70 년대 유닉스는 운영 체제가 주로 고급 언어로 작성 될 수 있음을 보여 주었기 때문에 파동을 일으켰습니다. C. 당시 C는 어셈블러와 달리 높은 수준으로 간주되었습니다.

현재 언어와 표준 라이브러리 모두 벡터, 사전, 반복자 등과 같은 빵 및 버터 데이터 구조를 제공하지 않기 때문에 C는 저수준 언어로 간주됩니다. C 프로그램에서 이러한 구조를 모두 가질 수는 있지만 직접 작성해야합니다. Python, Java 등은 표준 데이터 구조의 대부분이 언어에 내장되어 있거나 표준 라이브러리의 일부이기 때문에 C에 비해 높은 수준입니다. 즉시 사용할 수있게하면보다 추상적 인 수준에서 프로그래밍하기가 더 쉬워집니다.

C는 두 번째 의미에서 낮은 수준입니다. 컴퓨터 하드웨어를 직접 조작 할 수 있습니다 (적어도 OS가 허용하는 한 직접). Python, Java 등의 가장 일반적인 구현은 VM에서 실행되기 때문에 하드웨어에서 한 단계 이상 더 제거됩니다. Python에서 하드웨어를 조작하려면 일반적으로 C 또는 C ++로 Python VM에 대한 확장을 작성해야합니다.

C ++은 이상한 경우입니다. 표준 라이브러리의 일부로 멋진 데이터 구조를 제공하지만 하드웨어의 저수준 조작도 가능합니다.


3
C ++은 실제로 그렇게 이상하지는 않습니다. IMO는 단순히 혼합 수준의 언어입니다. 얻는 추상화 수준은 사용하는 기능에 따라 다릅니다.
Steve314

1
@ Steve314 : 예 및 아니오 : 일반적으로 추상화에는 정보가 숨겨져 있습니다. 즉 언어 나 라이브러리는 인터페이스를 제공하는 블랙 박스와 같으며 아무도 블랙 박스 안에 무엇이 있는지 알고 싶어하지 않습니다. C ++은 더 높은 수준의 구조를 제공하지만 프로그래머가 표현에 액세스하여 파괴하는 것을 막지 않기 때문에 조금 이상합니다. C ++은 다른 추상화 계층을 분리하지 않는 유일한 언어입니다 (그러나 내가 모르는 다른 언어가있을 수 있습니다).
조르지오

1
@Giorgio - C ++는 숨길 수 있는 구현 세부 정보 -이 클래스의 개인 내부의 일부는 그 클래스의 공용 인터페이스를 통해 유일한 공식적인 방법이 사용되도록 할 예를. 물론 규칙을 어 기고 원하는대로 메모리를 스크램블 할 수 있지만 실제로 는 실제 응용 프로그램 개발을 지원하는 모든 언어로 할 수 있습니다 .
Steve314

@Giorgio-Haskell을 예로 들어 보겠습니다. 이 경우 "안전하지 않은"은 참조처럼 투명하지 않은 것을 의미합니다 (처럼 unsafePerformIO). 있다 IORef유형 만의 동등한 없다 reinterpret_cast내가 알고, 포인터 연산없이 상당. 그렇다고해서 사람들이 메모리를 해킹하는 것이 안전하다는 의미는 아닙니다. 실용적인 언어가 되려면 Haskell은 실제 운영 체제 및 라이브러리와 인터페이스해야합니다. "외부 기능 인터페이스"가 있습니다. 정말로 그것을 파괴하고 싶다면 FFI를 사용하여 원시 Subversion 함수를 작성하면됩니다.
Steve314

@Giorgio-물론 메모리에서 손상시키고 싶은 값을 찾는 데 어려움을 겪을 수도 있지만, 숨어있는 정도에 따라 C ++에서도 동일하게 적용될 수 있습니다. 예를 들어, PIMPL을 사용할 수 있습니다 . 그런 다음 라이브러리의 객체 코드와 헤더 만 제공하면 해당 객체 코드를 이해하면 파괴 할 대상과 방법을 파악하기 위해 해당 객체 코드를 리버스 엔지니어링해야합니다.
Steve314

8

낮은 수준의 언어부터 높은 수준의 언어에 이르기까지 슬라이딩 스케일로 생각하십시오. 언어가 스케일을 높이면 (LOW에서 HIGH로) 컴퓨터와의 특정 인터페이스에서 점점 더 많은 추상화를 제공합니다.

저수준 언어는 컴퓨터를 명시 적으로 지시하기 위해 작성됩니다-기계 코드 및 어셈블리 코드를 생각하십시오.

고급 언어는 중요한 세부 사항 (특히 메모리 할당 및 메모리 해제)을 추상화하려고 시도합니다. 아이디어는 프로그래밍에보다 "자연적인"인터페이스를 제공하고 프로그래머가 디자인 및 생산에 집중할 수 있도록하는 것입니다.

요즘 C는 저급 언어로 간주됩니다. 여전히 머신 코드와 어셈블리 코드에서 중요한 추상화가 있기 때문에 기술적으로 '높은'것입니다. 그러나 여전히 직접 메모리 주소 지정을 제공하고 가비지 콜렉션을 제공하지 않습니다. 프로그래머가 디자인해야 할 세부 사항입니다.

이것을 파이썬, 루비 또는 하스켈과 같은 다른 언어와 비교하면 훨씬 모호한 인터페이스가 있습니다. 이러한 언어에는 대부분의 컴퓨터 명령을 추상화하는 큰 코드 라이브러리가 있습니다. 함수의 로컬 범위를 벗어나거나 삭제할 때 파이썬에서 변수에 어떤 일이 발생했는지 궁금한 적이 있습니까? 아마 옳지 않습니까? 그리고 그것은 고급 언어로 할 필요가 없기 때문입니다! 그들은 당신을 위해 메모리 할당 / 릴리스를 돌 봅니다.

고급 언어는 기능상의 이점이 있습니다. 그것들은 우리가 자유롭게 (그리고 안전하게) 디자인하고 개발할 수있게합니다.

낮은 수준의 언어는 대부분의 경우 속도 이점이 있습니다. 높은 수준의 코드를 해석하는 데 비용이 발생합니다. 또한 '컴퓨터 스파이'로 무언가를 쓰는 것이 좋습니다.

도움이 되었기를 바랍니다


5

높은 수준과 낮은 수준은 흑백이 아니라 연속적인 척도입니다. 이 용어는 프로그래밍 언어가 하드웨어에 얼마나 가까운 지 설명하는 데 사용됩니다. 레벨이 높을수록 하드웨어를 더 추상화합니다.

가장 낮은 수준은 분명히 바이너리 머신 코드입니다. 이것은 OS가 CPU에로드하고 피드하는 정확한 표현입니다. 어셈블리는 그 위에 구축 된 첫 번째 추상화 수준입니다. 이진 코드 대신 이진 기계 명령어를 나타내는 인간 판독 가능 기호 코드 인 니모닉을 씁니다. 이것이 사람들이 UNIX 이전의 시스템 프로그래밍에 사용했던 것입니다.

C는 추상화 체인의 다음 단계로, 공통 패턴을 흐름 제어 구조로 묶고 기계 별 명령어를 플랫폼에 구애받지 않는 구문으로 추상화합니다.이 마지막 추상화는 UNIX를 혁신적이고 크게 성공시킨 주요 요인 중 하나였습니다. 이는 큰 변경없이 모든 플랫폼에 대해 동일한 코드를 컴파일 할 수 있음을 의미했습니다.

C ++은 또 다른 추상화 계층을 추가합니다. 클래스 추가 (테이블 및 컨텍스트를 OOP 구문으로 전달) newdelete(메모리 할당 및 변수 초기화를 단일 구문으로 묶음), 컴파일 타임 유형 확인, 템플릿 (유형 안전 컴파일 타임) 메타 프로그래밍), 네임 스페이스, 함수 및 연산자 오버로드 등과 같은 컴파일 타임 구문 편의성.

파이썬은 하드웨어에서 또 다른 큰 발걸음을 내딛습니다. C ++은 여전히 ​​프로그래머에게 메모리 할당을 완전히 제어하고 RAM을 직접 조작 할 수있게합니다. 파이썬은 메모리 관리를 담당합니다. 또한 코드를 모든 기본 컴퓨터 명령어로 컴파일하는 대신 가상 컴퓨터에 대해 실행합니다. 이것은 성능 저하 (때로는 무겁지 만 일반적으로 걱정할만한 것은 아닙니다)를 수반하지만 C ++에서 까다 롭고 C에서 까다로울 수있는 깔끔한 것들을 허용합니다 (예 : 실행중인 함수 및 클래스 조작) 런타임에 임의의 객체 이름 가져 오기, 런타임에 이름별로 클래스 인스턴스화, 원숭이 패치 등

따라서 사람들이 언어를 "높은 수준"과 "낮은 수준"으로 나누면 어딘가에 임의의 선이 그려지며 그 선이 항상 같은 것은 아닙니다. 1970 년에이 라인은 어셈블리와 C 사이에있었습니다 (플랫폼 별 기계 명령어를 결정하는 핵심 요소 임). 1987 년에는 C와 C ++ 사이에 있었을 것입니다. 오늘날 C ++과 Java 사이에있을 수 있습니다 (자동 메모리 관리가 결정적 요소 임).

간단히 말해 : 높은 수준은 슬라이딩 스케일이며 세 언어의 경우 C <C ++ <Python입니다.


고수준 대 저수준은 하나의 척도가 아니라 대신 두 개의 별도 척도라고 말하고 싶습니다. 낮은 수준은 언어가 기계 동작과 얼마나 관련이 있는지, 높은 수준은 추상화를 제공하는 기능과 관련이 있습니다. C #을 더 C99 이상의 고급 언어이다되지만 또한 (A)에서 배열 두 프로세스 "짧은"값에 "INT"포인터를 사용하는 등의 문제 때문에, C 표준에서 정의 언어보다 낮은 레벨 시간은 C #에서는 정의되지만 C99에서는 정의되지 않습니다.
supercat

3

"낮은 수준의"언어와 "높은 수준의"언어 사이의 선은 때때로 바뀝니다.
예를 들어
, UNIX 시절에 C는 고급 언어였습니다.
오늘날 C에는 파이썬과 같은 오늘날의 고급 언어에있는 매핑 유형 (사전), 반복자 등과 같은 구조가 없습니다. 그래서 선이 바뀌었고 C는 이제 저수준 그룹으로 떨어졌습니다.

저수준 언어 :
이 언어는 기계가 실행할 수있는 언어와 가장 가깝습니다 (최저 수준 : 어셈블리 코드!).
이 언어로 작업 할 때 프로그래머는 메모리 관리와 같은 최하위 수준에 대해 생각해야합니다. 그런 의미에서 하드웨어와 밀접한 관련이 있으며 직접 작업해야합니다.

고급 언어 :
이 언어는 메모리 자체를 관리하므로 하드웨어에서 멀어지게합니다. 이러한 언어로 작업 할 때 메모리는 중요한 요소이지만 하드웨어를 직접 사용하지는 않습니다. 대신 언어는이를 관리하여 낮은 하드웨어 인터페이스에서 멀어지게 할 수 있습니다.

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