C 프로그래밍 언어가 나왔을 때 저수준 언어로 간주 되었습니까?


151

현재 C저수준 언어로 간주 되지만 70 년대에 저수준 언어로 간주 되었습니까? 그때도이 용어가 사용 되었습니까?

80 년대 중반 이후까지 인기있는 고급 언어가 많이 없었기 때문에 저급의 특성이 몇 년 동안 어떻게 변했는지 궁금합니다.


13
하나의 데이터 포인트로서, 1978 년경 일부 프로그래밍 멘토들은 C를 영광스러운 어셈블리 언어로 설명했습니다.
벤 크로 웰

7
@ BenCrowell 나는 당신의 진술의 맥락에서“예찬”이 무엇을 의미하는지 확신하지 못하지만 C를 보편적 (= 플랫폼 독립적) 어셈블리 언어 라고 부릅니다 .
Melebius

13
흥미롭게도 C는 저수준 언어가 아니며 C의 추상 기계가 PDP-11보다 현대 하드웨어에서 훨씬 멀리 떨어져 있기 때문에 70 년대보다 지금 은 더 적습니다 .
Tom

5
유닉스는 C로 작성되고 c는 유닉스에서 실행되며 유닉스를 다른 플랫폼으로 크로스 컴파일합니다. 유닉스를 컴파일하는 데 필요하지 않은 것은 불필요한 오버 헤드였으며 C의 주요 목표는 컴파일러를 가능한 한 쉽게 작성 / 이동할 수 있도록하는 것이 었습니다. 이 목적을 위해서는 정확한 수준이었습니다 .C를 높거나 낮은 수준으로 생각하지 않습니다. 유닉스를 거의 모든 유닉스 도구와 마찬가지로 많은 문제에 매우 적합하게 포팅하는 도구로 생각합니다.
Bill K

4
lisp가 1958 년
Prime

답변:


144

질문의 역사적 측면에 대답하려면 :

디자인 철학은 Brian Kernighan과 C 디자이너 Dennis Ritchie가 저술 한 "K & R"에 의해 작성된 C 프로그래밍 언어에 설명되어 있습니다. 초판 서문에 따르면

C는 "매우 높은 수준의"언어도 아니고 "큰"언어도 아닙니다.

그리고 소개는 말합니다

C는 상대적으로 "낮은 수준의"언어입니다. C는 문자열, 집합, 목록 또는 배열과 같은 복합 객체를 직접 처리하는 작업을 제공하지 않습니다. 전체 배열 또는 문자열을 조작하는 작업이 없습니다 ...

텍스트가 계속되기 전에 잠시 동안 목록이 계속됩니다.

이러한 기능 중 일부가 없으면 심각한 결함처럼 보일 수 있지만 언어를 적당한 크기로 유지하면 실질적인 이점이 있습니다.

(저는 1988 년부터 두 번째 판만 가지고 있지만 아래 주석은 인용 된 텍스트가 1978 년 초판과 동일 함을 나타냅니다.)

예, "고수준"과 "저수준"이라는 용어는 당시에 사용 되었지만 C는 그 사이의 스펙트럼 어딘가에 놓 이도록 설계되었습니다. 하드웨어 플랫폼에서 이식 가능한 코드를 C로 작성할 수 있었으며, 당시 언어가 높은 수준으로 간주되었는지 여부에 대한 주요 기준이었습니다. 그러나 C에는 고급 언어의 특징 인 일부 기능이 없었으며 이는 단순성을 선호하는 디자인 결정이었습니다.


42
이것은 훌륭한 답변입니다! 검증 가능한 역사적 증거 + OP가 언급하는 기간에 낮은 수준과 높은 수준의 의미를 가장 잘 알고있는 배우의 증언. 그건 그렇고, 나는 인용문이 이미 1978 판에 있음을 확인합니다.
Christophe

157

이것은 고급 및 저급 언어의 정의에 따라 다릅니다. C가 개발 될 때 어셈블리보다 높은 수준의 것은 높은 수준의 언어로 간주되었습니다. 저것은 정리할 낮은 바입니다. 나중에이 용어는 오늘날 일부 사람들은 심지어 Java조차도 저수준 언어라고 생각할 정도로 전환되었습니다.

70 년대의 높은 수준의 언어 환경에서도 C가 상당히 낮은 수준임을 지적 할 가치가 있습니다. C 언어는 기본적으로 B + 단순 유형 시스템이며 B는 어셈블리를위한 편리한 절차 / 구조 구문 레이어 이상이 아닙니다. 타입 시스템은 타입이 지정되지 않은 B 언어 위에 개장 int되므로 일부 장소에서는 타입 주석을 생략 할 수 있으며 가정합니다.

C는 당시에 이미 잘 확립 된 기능을 고가 또는 구현하기가 고의적으로 생략합니다.

  • 자동 메모리 관리
  • 중첩 함수 또는 클로저
  • 기본 OOP 또는 코 루틴
  • 보다 표현적인 유형 시스템 (예 : 범위 제한 유형, 레코드 유형과 같은 사용자 정의 유형, 강력한 타이핑 등)

C에는 몇 가지 흥미로운 기능이 있습니다.

  • 재귀 지원 (모든 변수가 전역 수명을 갖는 언어와 비교할 때 스택 기반 자동 변수의 결과로)
  • 함수 포인터
  • 사용자 정의 데이터 형식 (구조 및 공용체)은 C의 최초 릴리스 직후 구현되었습니다.
  • C의 문자열 표현 (포인터-문자)은 실제로 여러 문자를 하나의 기계어로 인코딩 한 B보다 크게 개선되었습니다.
  • C의 헤더 파일은 컴파일 단위를 작게 유지하는 효율성 해킹이지만 간단한 모듈 시스템을 제공합니다.
  • 안전한 참조와 비교할 때 어셈블리 스타일의 무제한 포인터 및 포인터 산술. 포인터는 본질적으로 안전하지 않은 기능이지만 저수준 프로그래밍에 매우 유용합니다.

C가 개발 될 당시에는 COBOL, Lisp, ALGOL (다양한 방언), PL / I, SNOBOL, Simula 및 Pascal과 같은 다른 혁신적인 언어가 이미 게시되었거나 특정 문제 영역에 널리 사용되었습니다. 그러나 기존 언어의 대부분은 메인 프레임 프로그래밍을위한 것이거나 학술 연구 프로젝트였습니다. 예를 들어 ALGOL-60이 처음으로 범용 프로그래밍 언어로 설계되었을 때이를 구현하는 데 필요한 기술과 컴퓨터 과학은 아직 존재하지 않았습니다. 이들 중 일부 (일부 ALGOL 방언, PL / I, 파스칼)도 저수준 프로그래밍을위한 것이었지만 더 복잡한 컴파일러를 사용하거나 너무 안전했습니다 (예 : 무제한 포인터 없음). 파스칼은 특히 가변 길이 배열에 대한 훌륭한 지원이 부족합니다.

이러한 언어와 비교하여 C는 저수준 개발에보다 실용적이기 위해 "우아한"고가의 기능을 거부합니다. C는 주로 언어 디자인 연구 프로젝트가 아니 었습니다. 대신 PDP-11 미니 컴퓨터에서 유닉스 커널 개발의 파생물로 비교적 리소스가 제한되었습니다. 틈새 시장 (포트하기 쉬운 단일 패스 컴파일러로 유닉스를 작성하기위한 미니멀리스트 저수준 언어)의 경우 C는 절대적으로 뛰어 났으며 45 년이 지난 후에도 여전히 시스템 프로그래밍 의 언어 입니다.


17
기존 ALGOL 제품군 및 파스칼 언어에 필요한 것을 모르는 사람들을위한 간단한 추가 사항 : 해당 언어에는 외부 함수로 선언 된 (로컬) 변수에 액세스 할 수있는 어휘 중첩 함수가있었습니다. 즉, 함수 호출 및 리턴 (어휘 레벨이 변경됨) 에서 외부 어휘 범위에 대한 포인터 배열 인 "디스플레이"를 유지해야 하거나 어휘 범위를 스택과 각 변수 액세스에 연결해야했습니다. 스택을 찾으려면 스택을 여러 번 간접적으로 홉해야했습니다. 비싼! C는 그 모든 것을 제압했다. 나는 아직도 그것을 그리워한다.
davidbak

12
@davidbak : x86-64 System V ABI (일명 Linux / OS X에서 호출 규칙)는 %r10"정적 체인 포인터"로 정의 됩니다. C의 경우 호출 클로버 스크래치 레지스터 일뿐이지만 파스칼이 사용한다고 생각합니다. (GNU C 중첩 함수는 함수가 인라인되지 않을 때 포인터를 외부 스코프에 전달하는 데 사용합니다 (예를 들어 함수 포인터를 만들면 컴파일러가 스택에 기계 코드의 트램펄린을 생성하는 경우) : 일반 허용 r10 및 r11 사용 )
Peter Cordes

2
@PeterCordes 매혹적인! Pascal은 System V가 나왔을 때 여전히 널리 사용되었습니다 (공식 SysV ABI가 언제 정의되었는지는 모르겠지만). 연결된 답변은 매우 유익합니다.
davidbak

3
C에는 사용자 정의 유형 (struct / union)이 있습니다. 언어를 단순하고 표현력있게 유지하려는 목표에서 벗어나기 때문에 나머지 "기능"은 제외되어 있다고 생각합니다. .
jamesqf

6
@ jamesqf : 초창기 C에는 구조체 할당이 없었습니다. a = b;ISO C89에서 할 수있는 방식으로 전체 구조체를 복사하려면 글쓰기 대신 멤버를 memcpy 또는 개별적으로 복사해야한다고 생각합니다 . 따라서 초기 C에서 사용자 정의 형식은 확실히 2 급이었으며 함수 인수로 참조로만 전달할 수있었습니다. 배열에 대한 C의 혐오감C ++이 구조체 내에서 배열의 멤버 단위 할당을 지원하지만 왜 일반적으로 지원하지 않습니까?
Peter Cordes

37

1970 년대 초, C는 현대적인 구조를 사용하여 눈부신 신선한 공기를 마시고 있었기 때문에 전체 UNIX 시스템을 무시할 수있는 공간이나 성능 저하로 어셈블리 언어에서 C로 다시 쓸 수있었습니다. 당시 많은 현대인들은 그것을 고수준 언어라고 불렀습니다.

데니스 리치 (Dennis Ritchie)가 주로 사용했던 C의 저자들은 더 신중한 태도를 취했으며 벨 시스템 기술 저널 (Bell System Technical Journal) 기사에서 "C는 고급 언어가 아니다"고 말했다. 지친 웃음과 도발적인 태도로 Dennis Ritchie는 그것이 저수준 언어라고 말할 것입니다. C의 디자인 목표 중 가장 중요한 것은 언어를 기계에 가깝게 유지하면서 이식성, 즉 기계 독립성을 제공하는 것이 었습니다.

자세한 내용은 원본 BSTJ 기사를 참조하십시오.

고마워 데니스 평화롭게 쉬십시오.


3
기본적으로 PDP 어셈블리 용으로 타이핑되고 멋진 구문 래퍼입니다.
einpoklum


2
@einpoklum 나는 그것에 동의하는 경향이 있습니다. 나는 1980 년경 PDP-11 / 34a에서 대학에서 C를 배웠으며, 교수 중 한 명이 "휴대용 어셈블리 언어"라고 설명했습니다. PDP-11 외에도 실험실에 C 컴파일러가있는 Superbrain CP / M 머신이 여러 대 있었기 때문일 수 있습니다. en.wikipedia.org/wiki/Intertec_Superbrain
dgnuff

2
또한 검증 가능한 역사적 증거를 바탕으로 한 훌륭한 답변입니다 (와! K & R의 사전 버전이 있습니다!).
Christophe

7
@einpoklum 이것은 어느 정도는 아니지 않습니까? 80 년대 중반에 어셈블러 (Z80 및 M68K), M (추상 16 비트 레지스터 및 명령어 세트가있는 PDP11 구문) 및 C라는 "휴대용 어셈블러"에서 시스템 및 응용 프로그램 코드를 작성할 기회가있었습니다. C는 확실히 고급 언어입니다. C 프로그래밍의 생산성은 어셈블러보다 훨씬 높습니다! 물론 문자열 (SNOBOL), 기본 데이터 파일 지원 (COBOL), 자체 생성 코드 (LISP), 고급 수학 (APL), 객체 (SIMULA)가 없으므로 매우 높지 않다는 것에 동의 할 수 있습니다.
Christophe

21

누군가가 malloc / free 메모리 관리 패턴을 "저수준 프로그래밍"이라고 언급했을 때이 사이트의 다른 곳에서 썼습니다.

"낮은 수준"의 정의가 시간이 지남에 따라 어떻게 변하는 지 재미있다. 프로그래밍을 처음 배웠을 때 간단한 할당 / 무료 패턴을 가능하게하는 표준화 된 힙 모델을 제공하는 모든 언어는 실제로 높은 수준으로 간주되었습니다. 에서 낮은 수준의 프로그래밍, 당신은 메모리 자신의 트랙을 계속해야 (안 할당을하지만, 메모리 위치 자체!), 또는 당신이 정말로 멋진 느낌이 있다면 자신의 힙 할당을 쓸 것입니다.

맥락 상, 이것은 C가 나온 후 90 년대 초반이었습니다.


80 년대 말 표준화 이후 표준 라이브러리 만이 문제가 아니 었습니까 (기존의 Unix API를 기반으로 함)? 또한 커널 프로그래밍 (C의 원래 문제 영역)은 당연히 수동 메모리 관리와 같은 저수준 요소를 필요로합니다. 당시 C는 심각한 커널이 작성된 최고 수준의 프로그래밍 언어 였어야합니다 (현재 NT 커널은 상당한 양의 C ++을 사용한다고 생각합니다).
amon

6
@hyde, 나는 1970 년대에 Algol 60, 두 개의 다른 FORTRAN 방언과 몇 가지 다른 BASIC 방언을 사용했으며, 그 언어들 중 어느 것도 포인터 나 힙 할당자를 가지고 있지 않았다.
Solomon Slow

7
엄밀히 말하면, 결과 메모리 malloc()를 직접 호출 brk(2)하거나 직접 mmap(2)관리하여 프로그래밍없이 프로그래밍 할 수 있습니다 . 그것은 malloc와 같은 것을 구현 하지 않는 한 상상할 수있는 이점이없는 거대한 PITA 이지만 그렇게 할 수 있습니다.
Kevin

1
@amon-ALGOL로 프로그래밍 된 놀라운 버로우즈 스택 기반 머신을 제외하고 유닉스보다 훨씬 빠릅니다. 아, 그리고 Multics는 Unix에 영감을주었습니다 : PL / I로 작성되었습니다. ALGOL과 유사하며 C보다 높은 수준입니다.
davidbak

6
실제로 오늘날 더 많은 Multics를 사용하지 않는 이유는 아마도 값 비싼 메인 프레임에서만 실행되었다는 사실과 관련이있을 것입니다. 보안을 통해 가상 메모리를 구현하는 특수 하드웨어. VAX-11과 같은 32 비트 미니 컴퓨터가 은행과 정부를 제외한 모든 사람들이 나와서 IBM과 Seven Dwarfs에서 탈피하여 대규모 처리를 "미니"컴퓨터로 가져갔습니다.
davidbak

15

많은 답변에서 이미“C는 고급 언어가 아닙니다”와 같은 초기 기사를 언급했습니다.

그러나 말뚝 박기에는 저항 할 수 없습니다 : Algol, Algol-60, PL / 1, Pascal과 같은 당시 대부분 또는 전부의 HLL은 많지 않지만 배열 범위 검사 및 숫자 오버플로 감지를 제공했습니다.

마지막으로 버퍼와 정수 오버플로를 확인하여 많은 보안 취약점의 근본 원인이었습니다. ... 그래, 그래도 사건은 ...

동적 메모리 관리의 상황은 더 복잡했지만 여전히 C 스타일 malloc / free는 보안 측면에서 큰 발전이었습니다.

따라서 HLL에 대한 정의에 "많은 하위 수준 버그를 자동으로 방지"가 포함되어 있다면 C와 UNIX가 발생하지 않은 경우 사이버 보안의 미안한 상태가 매우 달라질 수 있습니다.


7
인텔 MPX 및 포인터 / 바운드 검사 컴파일러의 구현에 관여했기 때문에 성능에 관한 논문을 참고할 수 있습니다. 본질적으로 5-15 %입니다. 그 중 대부분은 1970 년대와 1980 년대에 거의 불가능했던 컴파일러 분석과 관련이 있는데, 이는 50 % 느려질 수있는 순진한 검사와 비교됩니다. 그러나 C와 UNIX가 20 년까지 이러한 분석 작업을 다시 시작했다고 말하는 것이 타당하다고 생각합니다.
Krazy Glew

9
@jamesqf 또한 C 이전의 많은 시스템은 경계 검사 및 정수 오버플로에 대한 특별한 하드웨어 지원을 가지고있었습니다. C는 HW를 사용하지 않았으므로 결국 폐기되어 제거되었습니다.
Krazy Glew

5
@jamesqf 예 : MIPS RISC ISA는 원래 파스칼로 작성된 스탠포드 벤치 마크를 기반으로했지만 나중에 C로 이동했습니다. 2010 년경 나는 MIPS에서 일하고 있었고, 상사는 MIPSr6에서 사용되지 않는 명령을 제거하고 싶었고 연구에 따르면 오버플로 검사는 거의 사용되지 않았다. 그러나 Javascript는 그러한 검사를 수행했지만 OS 지원 부족으로 저렴한 지침을 사용할 수는 없습니다.
Krazy Glew

3
@KrazyGlew-C / C ++에서 부호없는 정수 오버플로로 인해 "정의되지 않은 동작"에 대한 사용자와 컴파일러 작성자 간의 싸움이 뜨거워지고 있다는 사실이 매우 흥미 롭습니다. 오늘날 컴파일러 작성자는 오래된 만트라를 취했기 때문에 "잘못된 만들기 나쁜 프로그램은 죄 "입니다 및 유래에 게시물 11. 많음에 그것을 설정하고 다른 곳에서이를 반영 ...
davidbak

2
Rust에 C와 같은 SIMD 내장 함수가 있다면 거의 현대적인 휴대용 어셈블리 언어 일 수 있습니다. C는 공격적인 UB 기반 최적화로 인해 이식 가능한 어셈블리 언어로 점점 더 나 빠지고 있으며 현대 CPU가 지원하는 새로운 원시 작업 (popcnt, 선행 / 트레일 링 0, 비트 리버스, 바이트 리버스, 포화 등)을 이식 가능하게 노출하지 못하는 경우 수학). HW를 지원하는 CPU에서 C 컴파일러가 이러한 CPU를 효율적으로 만들도록하려면 종종 이식 할 수없는 내장 함수가 필요합니다. 컴파일러가 대상에서 popcnt를 에뮬레이트하는 것이 관용구 인식보다 얻는 것이 좋습니다 popcnt.
Peter Cordes

8

C (1972)보다 오래된 이전 및 훨씬 더 높은 언어를 고려하십시오.

포트란-1957 (C보다 높지 않음)

리스프-1958

코볼-1959

포트란 IV-1961 (C보다 높지 않음)

PL / 1-1964

APL-1966

또한 RPG (1959)와 같은 중급 언어, 주로 플러그 보드 기반 장치 레코드 시스템을 대체하기위한 프로그래밍 언어입니다.

이러한 관점에서 C는 매우 낮은 수준의 언어처럼 보였으며 당시 메인 프레임에서 사용 된 매크로 어셈블러보다 약간 높았습니다. IBM 메인 프레임의 경우 데이터베이스 인터페이스가 Cobol (포트 당시)로 포팅되지 않았기 때문에 BDAM (기본 디스크 액세스 방법)과 같은 데이터베이스 액세스에 어셈블러 매크로가 사용되었습니다. 코볼 프로그램은 오늘날 IBM 메인 프레임에서 여전히 사용되고 있습니다.


2
더 오래된 언어를 나열하려면 LISP를 잊지 마십시오 .
중복 제거기

@ 중복 제거기-목록에 추가했습니다. 저는 IBM 메인 프레임에 사용 된 것에 중점을 두었습니다. LISP가 그 인기를 끌었던 것은 기억 나지 않지만 APL은 IBM 메인 프레임 (시간 공유 콘솔을 통해) 및 IBM 1130의 틈새 언어였습니다. LISP와 유사하게 APL은 예를 들어, APL의 현재 버전 ( youtube.com/watch?v=a9xAKttWgP4)으로 Conway의 삶의 게임을 만드는 데 필요한 코드가 얼마나 작은 지 살펴보십시오 .
rcgldr

2
적어도 COBOL-85 이전에는 아니지만 RPG 또는 COBOL을 특히 높은 수준으로 간주하지 않습니다. COBOL 표면을 긁으면 본질적으로 매우 고급 어셈블러 매크로의 모음임을 알 수 있습니다. 우선, 기능, 절차 및 재귀뿐만 아니라 모든 종류의 범위가 부족합니다. 모든 스토리지는 프로그램 상단에 선언되어 극도로 긴 서곡 또는 고통스러운 변수 재사용을 유발해야합니다.
idrougge

Fortran IV를 사용한 것에 대한 나쁜 기억이 있습니다. C보다 상당히 높은 수준이라고 생각하지 않습니다.
DaveG

@idrougge-COBOL 및 RPG와 메인 프레임 명령어 세트에는 미국과 같은 국가의 금융 소프트웨어 요구 사항 인 포장 또는 포장 풀기 BCD에 대한 완벽한 지원이 포함되어 있습니다. "이동 해당"과 같은 관련 기본 연산자는 높은 수준으로 간주합니다. RPG는 원시 입력 필드와 형식화 된 출력 필드 및 / 또는 누산기 사이에 연결을 지정했지만 교체 된 플러그 보드 프로그래밍과 유사하게 작업 순서는 그렇지 않은 경우가 드 unusual니다.
rcgldr

6

귀하의 질문에 대한 답변은 질문하는 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 표준위원회가 발명 한 언어는 표준의 요구 사항을 넘어서는 구현 제공 보장이없는 경우 결코 저수준 언어가 아닙니다.

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