C 프리 프로세서의 기원은 무엇입니까?


30

C 전처리 기는 C에 연결되어 있지만 주요 언어와는 완전히 다른 구문을 사용합니다.

  • 구문 상으로 중요한 공백 (행 끝이 명령문을 종료하고 매크로가 대체 목록의 시작을 판별 한 후 간격)

  • 키워드 기반 대신 보강 블록의 블록 elif대신else if

  • 선언-반사-사용 대신 키워드 중심 정의, =값 정의 없음

  • 대체 문자열 구문의 힌트 ( #include <>vs #include "")

  • 게으른 평가 (C의 명백한; 그러나 6.10.3.1 은 중요한 몇 가지 장소에서 매크로 확장의 특정 순서를 암시 하는 것으로 읽을 수 있습니다 )

실제로 C처럼 보이지 않습니다! 기술적으로 자체 언어이지만 항상 C의 거의 통합 부분으로 사용되었으며 구문 적으로 통합되지 않는 것은 매우 이상합니다.

Wikipedia는 역사에 대해 이야기하지 않습니다. 포틀랜드 패턴 리포지토리 (Portland Pattern Repository) 는이를 언급 하지만 C의 역사를 가진 다른 C가 아닌 다른 사람들에 의해 설계되었다는 사실을 넘어서서 자세히 설명하지는 않습니다. 더 오래 사용할 수 있습니다.

매크로 엔진으로, 그것은 분명히 매우 다른 설명 할 런타임 언어에서 의미가 일부 그것은 원래 것으로 의도 여부를 현대 눈도 불분명 (차이가 있지만 시각적 디자인 측면을 할 수종류의재미 자사의 대체 시스템을 사용하면 강력한 옵티 마이저 이전에 기능을 인라인하는 편리한 방법 일 수 있습니다. C와 같은 의미론이 실제로 시작점 이었다면 결국 C ++ 템플릿이 된 것에 더 가까운 것이 매크로에 대한 논리적 진화라고 생각되지만 구문에 대한 것보다 이것에 대한 구체적인 증거는 적습니다.

왜 이런 식으로 디자인되었는지 또는 제작자의 영향이 무엇인지에 대한 기록이 있습니까?



@Mike omg 고맙습니다 . 사이트에 탐색 가능한 항목이 없기 때문에 사이트 내용이 영원히 손실되었다고 생각했습니다.
Leushenko

답변:


17

에서 http://www.jslint.com/chistory.html을 (데니스 M. 리치에 의해 "는 C 언어의 개발") :

다른 많은 변화들이 1972-3 년경에 일어 났지만, 가장 중요한 것은 Alan Snyder를 촉구하면서 전 처리기의 도입이었다 [Snyder 74]BCPL 및 PL / I에서 사용 가능한 파일 포함 메커니즘의 유용성을 인식합니다. 원래 버전은 매우 단순했으며 포함 된 파일과 간단한 문자열 대체 (#include 및 #define of parameterless macro) 만 제공했습니다. 그 후 곧 Mike Lesk와 John Reiser가 인수와 조건부 컴파일을 사용하여 매크로를 통합하도록 확장되었습니다. 전처리 기는 원래 언어 자체에 대한 선택적 보조 장치로 간주되었습니다. 실제로, 소스 프로그램이 처음에 특별한 신호를 포함하지 않는 한 몇 년 동안 호출되지도 않았습니다. 이러한 태도는 지속되었으며, 전 처리기의 구문과 나머지 언어의 불완전한 통합 및 초기 참조 매뉴얼의 설명에 대한 부정확성을 모두 설명합니다.

Alan Snyder가 휴대용 (오늘날 "대상 변경 가능"이라고 말할 수 있음) C 컴파일러에서 작업 한 것은 위 인용문에 링크 된 [Snyder 74] 참조의 섹션 4의 계정에서 나타납니다. 아마도 이것은 전처리기를 요구하는 동기였습니다.

그러나 C 전 처리기 자체의 디자인에 대한 추가 세부 사항은 언어로 찾을 수 없었습니다.


1
Snyder는 MIT에서 Bell Labs에 왔으며 MIDAS 어셈블러에는 DEFINE, IFDEF 및 IFNDEF 문이 있습니다. 일치?
Lars Brinkhoff

0

어셈블리 언어에서 CPP와 매우 유사한 매크로 어셈블러 프리 프로세서를 사용하는 것이 매우 일반적이라고 덧붙일 수 있습니다.

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