현재 C 는 저수준 언어로 간주 되지만 70 년대에 저수준 언어로 간주 되었습니까? 그때도이 용어가 사용 되었습니까?
80 년대 중반 이후까지 인기있는 고급 언어가 많이 없었기 때문에 저급의 특성이 몇 년 동안 어떻게 변했는지 궁금합니다.
현재 C 는 저수준 언어로 간주 되지만 70 년대에 저수준 언어로 간주 되었습니까? 그때도이 용어가 사용 되었습니까?
80 년대 중반 이후까지 인기있는 고급 언어가 많이 없었기 때문에 저급의 특성이 몇 년 동안 어떻게 변했는지 궁금합니다.
답변:
질문의 역사적 측면에 대답하려면 :
디자인 철학은 Brian Kernighan과 C 디자이너 Dennis Ritchie가 저술 한 "K & R"에 의해 작성된 C 프로그래밍 언어에 설명되어 있습니다. 초판 서문에 따르면
C는 "매우 높은 수준의"언어도 아니고 "큰"언어도 아닙니다.
그리고 소개는 말합니다
C는 상대적으로 "낮은 수준의"언어입니다. C는 문자열, 집합, 목록 또는 배열과 같은 복합 객체를 직접 처리하는 작업을 제공하지 않습니다. 전체 배열 또는 문자열을 조작하는 작업이 없습니다 ...
텍스트가 계속되기 전에 잠시 동안 목록이 계속됩니다.
이러한 기능 중 일부가 없으면 심각한 결함처럼 보일 수 있지만 언어를 적당한 크기로 유지하면 실질적인 이점이 있습니다.
(저는 1988 년부터 두 번째 판만 가지고 있지만 아래 주석은 인용 된 텍스트가 1978 년 초판과 동일 함을 나타냅니다.)
예, "고수준"과 "저수준"이라는 용어는 당시에 사용 되었지만 C는 그 사이의 스펙트럼 어딘가에 놓 이도록 설계되었습니다. 하드웨어 플랫폼에서 이식 가능한 코드를 C로 작성할 수 있었으며, 당시 언어가 높은 수준으로 간주되었는지 여부에 대한 주요 기준이었습니다. 그러나 C에는 고급 언어의 특징 인 일부 기능이 없었으며 이는 단순성을 선호하는 디자인 결정이었습니다.
이것은 고급 및 저급 언어의 정의에 따라 다릅니다. C가 개발 될 때 어셈블리보다 높은 수준의 것은 높은 수준의 언어로 간주되었습니다. 저것은 정리할 낮은 바입니다. 나중에이 용어는 오늘날 일부 사람들은 심지어 Java조차도 저수준 언어라고 생각할 정도로 전환되었습니다.
70 년대의 높은 수준의 언어 환경에서도 C가 상당히 낮은 수준임을 지적 할 가치가 있습니다. C 언어는 기본적으로 B + 단순 유형 시스템이며 B는 어셈블리를위한 편리한 절차 / 구조 구문 레이어 이상이 아닙니다. 타입 시스템은 타입이 지정되지 않은 B 언어 위에 개장 int
되므로 일부 장소에서는 타입 주석을 생략 할 수 있으며 가정합니다.
C는 당시에 이미 잘 확립 된 기능을 고가 또는 구현하기가 고의적으로 생략합니다.
C에는 몇 가지 흥미로운 기능이 있습니다.
C가 개발 될 당시에는 COBOL, Lisp, ALGOL (다양한 방언), PL / I, SNOBOL, Simula 및 Pascal과 같은 다른 혁신적인 언어가 이미 게시되었거나 특정 문제 영역에 널리 사용되었습니다. 그러나 기존 언어의 대부분은 메인 프레임 프로그래밍을위한 것이거나 학술 연구 프로젝트였습니다. 예를 들어 ALGOL-60이 처음으로 범용 프로그래밍 언어로 설계되었을 때이를 구현하는 데 필요한 기술과 컴퓨터 과학은 아직 존재하지 않았습니다. 이들 중 일부 (일부 ALGOL 방언, PL / I, 파스칼)도 저수준 프로그래밍을위한 것이었지만 더 복잡한 컴파일러를 사용하거나 너무 안전했습니다 (예 : 무제한 포인터 없음). 파스칼은 특히 가변 길이 배열에 대한 훌륭한 지원이 부족합니다.
이러한 언어와 비교하여 C는 저수준 개발에보다 실용적이기 위해 "우아한"고가의 기능을 거부합니다. C는 주로 언어 디자인 연구 프로젝트가 아니 었습니다. 대신 PDP-11 미니 컴퓨터에서 유닉스 커널 개발의 파생물로 비교적 리소스가 제한되었습니다. 틈새 시장 (포트하기 쉬운 단일 패스 컴파일러로 유닉스를 작성하기위한 미니멀리스트 저수준 언어)의 경우 C는 절대적으로 뛰어 났으며 45 년이 지난 후에도 여전히 시스템 프로그래밍 의 언어 입니다.
%r10
"정적 체인 포인터"로 정의 됩니다. C의 경우 호출 클로버 스크래치 레지스터 일뿐이지만 파스칼이 사용한다고 생각합니다. (GNU C 중첩 함수는 함수가 인라인되지 않을 때 포인터를 외부 스코프에 전달하는 데 사용합니다 (예를 들어 함수 포인터를 만들면 컴파일러가 스택에 기계 코드의 트램펄린을 생성하는 경우) : 일반 허용 r10 및 r11 사용 )
a = b;
ISO C89에서 할 수있는 방식으로 전체 구조체를 복사하려면 글쓰기 대신 멤버를 memcpy 또는 개별적으로 복사해야한다고 생각합니다 . 따라서 초기 C에서 사용자 정의 형식은 확실히 2 급이었으며 함수 인수로 참조로만 전달할 수있었습니다. 배열에 대한 C의 혐오감 및 C ++이 구조체 내에서 배열의 멤버 단위 할당을 지원하지만 왜 일반적으로 지원하지 않습니까?
1970 년대 초, C는 현대적인 구조를 사용하여 눈부신 신선한 공기를 마시고 있었기 때문에 전체 UNIX 시스템을 무시할 수있는 공간이나 성능 저하로 어셈블리 언어에서 C로 다시 쓸 수있었습니다. 당시 많은 현대인들은 그것을 고수준 언어라고 불렀습니다.
데니스 리치 (Dennis Ritchie)가 주로 사용했던 C의 저자들은 더 신중한 태도를 취했으며 벨 시스템 기술 저널 (Bell System Technical Journal) 기사에서 "C는 고급 언어가 아니다"고 말했다. 지친 웃음과 도발적인 태도로 Dennis Ritchie는 그것이 저수준 언어라고 말할 것입니다. C의 디자인 목표 중 가장 중요한 것은 언어를 기계에 가깝게 유지하면서 이식성, 즉 기계 독립성을 제공하는 것이 었습니다.
자세한 내용은 원본 BSTJ 기사를 참조하십시오.
고마워 데니스 평화롭게 쉬십시오.
누군가가 malloc / free 메모리 관리 패턴을 "저수준 프로그래밍"이라고 언급했을 때이 사이트의 다른 곳에서 썼습니다.
"낮은 수준"의 정의가 시간이 지남에 따라 어떻게 변하는 지 재미있다. 프로그래밍을 처음 배웠을 때 간단한 할당 / 무료 패턴을 가능하게하는 표준화 된 힙 모델을 제공하는 모든 언어는 실제로 높은 수준으로 간주되었습니다. 에서 낮은 수준의 프로그래밍, 당신은 메모리 자신의 트랙을 계속해야 (안 할당을하지만, 메모리 위치 자체!), 또는 당신이 정말로 멋진 느낌이 있다면 자신의 힙 할당을 쓸 것입니다.
맥락 상, 이것은 C가 나온 후 90 년대 초반이었습니다.
많은 답변에서 이미“C는 고급 언어가 아닙니다”와 같은 초기 기사를 언급했습니다.
그러나 말뚝 박기에는 저항 할 수 없습니다 : Algol, Algol-60, PL / 1, Pascal과 같은 당시 대부분 또는 전부의 HLL은 많지 않지만 배열 범위 검사 및 숫자 오버플로 감지를 제공했습니다.
마지막으로 버퍼와 정수 오버플로를 확인하여 많은 보안 취약점의 근본 원인이었습니다. ... 그래, 그래도 사건은 ...
동적 메모리 관리의 상황은 더 복잡했지만 여전히 C 스타일 malloc / free는 보안 측면에서 큰 발전이었습니다.
따라서 HLL에 대한 정의에 "많은 하위 수준 버그를 자동으로 방지"가 포함되어 있다면 C와 UNIX가 발생하지 않은 경우 사이버 보안의 미안한 상태가 매우 달라질 수 있습니다.
popcnt
.
C (1972)보다 오래된 이전 및 훨씬 더 높은 언어를 고려하십시오.
포트란-1957 (C보다 높지 않음)
리스프-1958
코볼-1959
포트란 IV-1961 (C보다 높지 않음)
PL / 1-1964
APL-1966
또한 RPG (1959)와 같은 중급 언어, 주로 플러그 보드 기반 장치 레코드 시스템을 대체하기위한 프로그래밍 언어입니다.
이러한 관점에서 C는 매우 낮은 수준의 언어처럼 보였으며 당시 메인 프레임에서 사용 된 매크로 어셈블러보다 약간 높았습니다. IBM 메인 프레임의 경우 데이터베이스 인터페이스가 Cobol (포트 당시)로 포팅되지 않았기 때문에 BDAM (기본 디스크 액세스 방법)과 같은 데이터베이스 액세스에 어셈블러 매크로가 사용되었습니다. 코볼 프로그램은 오늘날 IBM 메인 프레임에서 여전히 사용되고 있습니다.
귀하의 질문에 대한 답변은 질문하는 C 언어에 따라 다릅니다.
Dennis Ritchie의 1974 C 참조 매뉴얼에 설명 된 언어는 고급 언어의 프로그래밍 편의성을 제공하는 저급 언어였습니다. 그 언어에서 나온 방언도 마찬가지로 저수준 프로그래밍 언어 인 경향이 있습니다.
그러나 1989/1990 C 표준이 출판되었을 때, 실제 기계 프로그래밍에 널리 사용되는 저수준 언어를 설명하지는 않았지만 대신 고수준 언어를 설명했지만 낮은 수준의 용어로 구현됩니다.
C 표준 노트의 작성자로서, 언어를 유용하게 만든 것 중 하나는 많은 구현이 고급 어셈블러로 취급 될 수 있다는 것입니다. C는 다른 고급 언어의 대안으로도 사용되었으며 많은 응용 프로그램에서 고급 언어로는 할 수 없었던 작업을 수행 할 수있는 기능이 필요하지 않았기 때문에 표준 작성자는 구현이 임의의 방식으로 작동하도록 허용했습니다. 프로그램이 저수준 구조를 사용하려고 시도한 경우 결과적으로 C 표준에 의해 기술 된 언어는 결코 저수준 프로그래밍 언어가 아닙니다.
이 차이점을 이해하려면 Ritchie 's Language 및 C89가 코드 스 니펫을 보는 방법을 고려하십시오.
struct foo { int x,y; float z; } *p;
...
p[3].y+=1;
"char"가 8 비트 인 플랫폼에서 "int"는 16 비트 빅 엔디안이고 "float"는 32 비트이며 구조에는 특별한 패딩 또는 정렬 요구 사항이 없으므로 "struct foo"의 크기는 8 바이트입니다.
Ritchie 's Language에서 마지막 명령문의 동작은 "p"에 저장된 주소를 가져 와서 3 * 8 + 2 [예 : 26] 바이트를 추가하고 해당 주소의 바이트와 다음 바이트의 16 비트 값을 가져옵니다. , 해당 값에 1을 추가 한 다음 16 비트 값을 동일한 2 바이트에 다시 씁니다. 이 동작은 어떤 종류의 객체가 저장되어 있는지에 관계없이 주소 p의 바이트 다음에 오는 26 번째 및 27 번째 바이트에서 작동하는 것으로 정의됩니다.
C 표준에 의해 정의 된 언어에서 * p가 "struct foo []"의 요소를 식별하고 그 뒤에 해당 유형의 완전한 요소가 3 개 이상있는 경우 마지막 명령문은 1을 멤버 y에 추가합니다. * p 다음의 세 번째 요소 다른 상황에서는 표준에 의해 행동이 정의되지 않습니다.
Ritchie의 언어는 프로그래머가 편리 할 때 배열 및 구조와 같은 추상화를 사용할 수있게했지만 메모리에있는 객체의 기본 레이아웃 측면에서 동작을 정의했기 때문에 저수준 프로그래밍 언어였습니다. 대조적으로, C89 및 이후 표준에서 설명하는 언어는 더 높은 수준의 추상화 측면에서 사물을 정의하고 그와 일치하는 코드의 동작 만 정의합니다. 저수준 프로그래밍에 적합한 품질 구현은 표준에서 요구하는 것보다 더 많은 경우에 유용하게 작동하지만 그러한 목적에 적합한 구현을 지정하는 "공식"문서는 없습니다.
따라서 Dennis Ritchie가 개발 한 C 언어는 저수준 언어로 인식되었습니다. 그러나 C 표준위원회가 발명 한 언어는 표준의 요구 사항을 넘어서는 구현 제공 보장이없는 경우 결코 저수준 언어가 아닙니다.