ANSI C와 K&R C의 주요 차이점은 무엇인가?
ANSI C의 위키백과 기사는 다음과 같이 말하고 있다.
ANSI C 표준화 프로세스의 목표 중 하나는 K&R C(최초 발표된 표준)의 상위 세트를 제작하는 것으로, 이후에 소개된 비공식적 특징의 많은 부분을 통합하였다.그러나, 표준 위원회는 기능 프로토타입(C++ 프로그래밍 언어에서 대여)과 더 유능한 전처리기 등 몇 가지 새로운 기능도 포함시켰다.파라미터 선언의 구문도 C++ 스타일을 반영하도록 변경했다.
그것은 나에게 차이점이 있다고 생각하게 만든다.그러나 K&R C와 ANSI C의 비교는 보지 못했다.그런 서류가 있는가.그렇지 않다면, 주요 차이점은 무엇인가?
편집: K&R 책에 표지에 "ANSI C"라고 적혀 있는 것 같아.적어도 나는 내가 집에 가지고 있는 버전은 그렇게 한다고 믿는다.그럼 이제 더 이상 차이가 없을까?
여기서 'K&R C'가 무엇인지에 대해 약간의 혼란이 있을 수 있다.이 용어는 "The C Programming Language"의 초판에 기록된 언어를 가리킨다.대략: 1978년경 Bell Labs C 컴파일러의 입력 언어.
Kernighan과 Ritchie는 ANSI 표준화 과정에 관여했다."ANSI C" 사투리는 "K&R C"를 대체했고 이후 판의 "The C Programming Language"는 ANSI 규약을 채택했다.'K&R C'는 일부 컴파일러가 여전히 레거시 코드를 받아들이는 정도를 제외하면 '죽은 언어'이다.
기능 프로토타입은 K&R C와 C89의 가장 분명한 변화였지만, 그 외 많은 것들이 있었다.C도서관을 표준화하는 데도 많은 중요한 작업이 들어갔다.표준 C도서관이 기존 관행을 코드화한 것이었음에도 불구하고 기존의 여러 관행을 코드화하여 더욱 어렵게 만들었다.P.J.플라거의 저서 <표준 C도서관>은 훌륭한 참고자료로, 도서관이 왜 그렇게 끝나게 되었는지에 대한 비하인드 디테일을 몇 가지 알려준다.
ANSI/ISO 표준 C는 대부분의 면에서 K&R C와 매우 유사하다.그것은 대부분의 기존 C 코드가 많은 변경 없이 ANSI 컴파일러를 기반으로 구축되어야 한다는 의도였다.그러나 결정적으로, 표준 이전의 시대에 언어의 의미론은 각 컴파일러 벤더에 의해 해석될 수 있었다.ANSI C는 모든 컴파일러를 동등한 지위에 두는 언어 의미론의 공통적인 설명을 가져왔다.약 20년이 지난 지금, 이것을 당연하게 받아들이기 쉽지만, 이것은 중요한 성과였다.
대부분의 경우 유지할 사전 표준 C 코드베이스가 없다면 걱정할 필요가 없다는 사실에 기뻐해야 한다.만약 그렇다면, 혹은 더 나쁜 것은, 만약 당신이 오래된 프로그램을 좀 더 현대적인 수준으로 끌어올리려고 한다면, 당신은 나의 동정을 받을 것이다.
- 기능 시제품
- 일정한 & 변동성이 있는 예선전
- 폭넓은 인성 지원 및 국제화
- 기능 포인터를 비참조 없이 사용할 수 있도록 허용한다.
ANSI C와 K&R C의 주요 차이점은 다음과 같다.
- 기능 시제품 제작
- 항상 및 휘발성 데이터 유형 한정자 지원
- 폭넓은 문자와 국제화를 지지하다.
- 기능 포인터를 비참조 없이 사용할 수 있도록 허용
ANSI C는 함수 정의와 선언에 함수 이름, 논쟁의 데이터 유형, 반환 값 데이터 유형이 포함된 c++ 함수 프로토타입 기법을 채택한다.기능 프로토타입은 ANSI C 컴파일러가 잘못된 인수 수나 호환되지 않는 인수 데이터 유형을 전달하는 사용자 프로그램에서 기능 호출을 확인할 수 있도록 한다.이는 K&R C 컴파일러의 큰 약점을 고친다.
예: 함수 foo를 선언하고 foo가 두 개의 인수를 취하도록 요구하려면
unsigned long foo (char* fmt, double data)
{
/*body of foo */
}
아직 언급되지 않은 중요한 차이점은 ANSI 이전에 C가 규격보다는 선례에 의해 정의되었다는 점이다. 특정 운영이 일부 플랫폼에 대해 예측 가능한 결과를 가져올 수 없는 경우(예: 관련 없는 두 개의 포인터에 관계형 운영자를 사용하는 경우) 선례는 플랫폼 보증을 사용할 수 있도록 하는 것을 강력하게 선호했다.프로그래머에게 능력있는.예를 들면 다음과 같다.
모든 객체에 대한 모든 포인터의 자연적인 순위를 정의하는 플랫폼에서 관계형 연산자를 임의 포인터에 적용하면 그 랭킹을 산출할 수 있다.
한 포인터가 "보다 큰"지 여부를 시험하는 자연적인 수단이 결코 참 또는 거짓 값을 산출하는 것 외에는 부작용이 없는 플랫폼에서, 임의의 포인터에 관계형 연산자를 적용하는 것도 마찬가지로 참 또는 거짓 값을 산출하는 것 외에는 결코 부작용이 없는 것에 의존할 수 있다.
둘 이상의 정수 유형이 동일한 크기와 표현을 공유하는 플랫폼에서, 그러한 정수 유형에 대한 포인터를 사용하여 동일한 표현을 가진 다른 유형의 정보를 읽거나 쓸 수 있다.
정수가 자연적으로 감싼 두 개의 완성 플랫폼에서, "int"보다 작은 서명되지 않은 값을 포함하는 조작은 결과가 INT_MAX+1u와 UINT_MAX 사이에 있을 경우 그 값이 서명되지 않은 것처럼 행동하고, 더 큰 유형으로 승격되지 않으며, 의 왼쪽 연산자로 사용될 수 있다.
>>
, 또한 의 피연산자도 아니다./
,%
또는 비교 연산자.우발적으로, 이 기준서의 논리는 서명되지 않은 소규모 유형이 서명하도록 촉진하는 이유 중 하나로 이를 제공한다.
C89 이전에는 위의 가정이 자연스럽게 유지되지 않는 플랫폼에 대한 컴파일러가 어쨌든 그러한 가정을 지지할 것으로 예상할 수 있는 길이에는 불분명했지만, 그러한 가정을 쉽고 저렴하게 지지할 수 있는 플랫폼 컴파일러가 그렇게 해야 한다는 데에는 거의 의심의 여지가 없었다.C89 Standard의 저자들은 다음과 같은 이유로 그러한 말을 굳이 하지 않았다.
작가들이 의도적으로 둔감해지지 않는 편찬자들은 실용적일 때 그런 일들을 계속 할 것이다(서명되지 않은 작은 가치들을 강하게 장려하기 위한 근거는 이러한 관점을 강화한다).
이 기준서는 오직 하나의 가능한 프로그램을 스택 오버플로 없이 실행할 수 있도록 구현만을 요구하였고, 둔한 구현이 다른 프로그램을 정의되지 않은 행동을 유발하는 것으로 취급할 수 있지만, "적합한" 구현을 작성하는 둔한 컴파일러 작성자에 대해서는 걱정할 가치가 없다고 생각했다.g" 그러나 소용없다.
비록 "C89"가 동시대에 "C89가 정의한 언어에 플랫폼이 제공하는 추가적인 특징과 보증"을 의미하는 것으로 해석되었지만, gcc의 저자들은 C89가 요구하는 것 이상의 특징과 보증을 배제하는 해석을 추진해 왔다.
약간의 차이는 있지만, K&R의 후판은 ANSI C를 위한 것이라 더 이상 실질적인 차이는 없다고 생각한다.
더 나은 용어가 없다는 이유로 "C Classic"은 함수를 정의하는 방법이 약간 달랐다.
int f( p, q, r )
int p, float q, double r;
{
// Code goes here
}
나는 다른 차이점은 기능성 프로토타입이라고 생각한다.프로토타입은 논쟁이나 유형의 목록을 작성할 필요가 없었다.ANSI C에서 그들은 한다.
또 다른 차이점은 함수 반환 유형과 매개변수 유형을 정의할 필요가 없었다는 것이다.그들은 내장으로 추정될 것이다.
f(x)
{
return x + 1;
}
그리고
int f(x)
int x;
{
return x + 1;
}
동일하다.
차이점은 다음과 같다.
- 프로토타입
- 폭넓은 인성 지원 및 국제화
- 항상 및 휘발성 키워드 지원
- 기능 포인터를 비참조로 사용할 수 있도록 허용
- 기능 프로토타이핑:ANSI C는 기능 정의 및 선언에 기능 이름, 주장 t, 데이터 유형 및 반환 값 데이터 유형이 포함된 c++ 기능 프로토타입 기법을 채택한다.기능 프로토타입은 ANSI ccompiler가 잘못된 인수 수 또는 비호환 인수 데이터 유형을 전달하는 사용자 프로그램에서 기능 호출을 확인할 수 있도록 한다.K&R C 컴파일러의 주요 약점 수정:사용자 프로그램의 잘못된 호출은 컴파일을 통과하지만 프로그램이 실행될 때 프로그램을 중단시키는 경우가 많다.
가장 큰 차이점은 기능 프로토타이핑과 기능 인수의 유형을 설명하는 구문이라고 생각한다.
상대적인 K&R에 대한 모든 주장에도 불구하고, 낮은 곳에서부터 높은 하드웨어에 이르기까지 어떤 종류의 것도 제공할 수 있다.지금 문제는 몇 백만 줄의 K&R C에 대해 문제를 일으키지 않고도 깔끔하게 컴파일할 수 있는 컴파일러(우선 무료)를 찾는 것이다.그리고 AMD 멀티 코어 프로세서 같은 것으로 실행한다.
내가 보기에 GCC 4.x.x 시리즈의 출처를 살펴본 결과, 기존 및 -cpp-전통적인 지연 기능을 내가 투입할 수 있는 것보다 더 효과적인 방법 없이 이전 작업 상태로 재활성화하는 간단한 해킹이 없다.그리고 처음부터 K&R 사전 컴파일러를 만드는 것이 더 간단하다.
참조URL: https://stackoverflow.com/questions/22500/what-are-the-major-differences-between-ansi-c-and-kr-c
'IT이야기' 카테고리의 다른 글
Vue.js: 프로그래밍 방식으로 기능 구성 요소 인스턴스화 (0) | 2022.05.06 |
---|---|
Intellij IDEA의 System.out.println() 바로 가기 (0) | 2022.05.06 |
문자열의 마지막 문자를 얻는 방법은? (0) | 2022.05.05 |
Java에서 servlet 필터를 사용하여 들어오는 servlet 요청 URL을 변경하는 방법? (0) | 2022.05.05 |
$emit를 동기식 모드로 실행하고 excast 이벤트에서 결과를 다시 얻을 수 있는가? (0) | 2022.05.05 |