태그: C, ANSI C, ISO C, C99, C11, ISO/IEC C, C 표준화의 역사.

태생

C는 Bell Laboratories에서 Ken Thompson, Denis Ritchie 등이 개발한 UNIX 운영 체제 생성의 "공동 제품"입니다. Thompson은 DEC PDP-7에서 실행되는 원래 버전의 UNIX를 단독으로 작성했습니다. 이 버전은 주 메모리가 8K 단어에 불과한 최초의 미니컴퓨터 중 하나입니다(결국 1969년이었습니다).

당시의 다른 운영 체제와 마찬가지로 UNIX도 어셈블리 언어로 작성되었습니다. 어셈블리 언어 프로그램을 디버깅하는 것은 정말 고통스럽고 개선하기 어렵습니다. UNIX도 예외는 아닙니다. Thompson은 OS의 추가 개발을 위해 고급 언어가 필요하다고 판단하고 작은 언어 B를 생각해 냈습니다. Thompson은 BCPL 언어를 채택했습니다. 시스템 프로그래밍 60년대 중반에 개발. BCPL은 차례로 가장 초기(가장 영향력 있는) 언어 중 하나인 Algol 60에서 유래했습니다.

Ritchie는 곧 UNIX 프로젝트에 합류하여 B로 글을 쓰기 시작했습니다. 1970년에 Bell Labs는 프로젝트를 위해 PDP-11을 구입했습니다. B가 PDP-11에서 실행될 준비가 되었기 때문에 Thompson은 UNIX의 일부를 B로 다시 작성했습니다. 1971년에 B가 PDP-11에 적합하지 않다는 것이 분명해지면서 Ritchie는 B의 확장 버전을 만들기 시작했습니다. 처음에는 NB(New B)라고 불렀지만 언어가 B와 많이 달라져 C로 이름을 바꿨습니다. 1973년에는 UNIX가 다시 쓸 수 있을 정도로 언어가 안정되었습니다. C로의 전환은 이식성이라는 중요한 이점을 제공했습니다. Bell Labs의 각 머신에 대한 C 컴파일러를 작성함으로써 개발 팀은 UNIX를 해당 머신에 이식할 수 있었습니다.

표준화

C는 70년대, 특히 최초의 C 책이 출판된 1977년에서 1979년 사이에 계속 발전했습니다.Brian Kernighan과 Denis Ritchie가 작성하고 1978년에 출판한 C 프로그래밍 언어는 C 프로그래머의 바이블이 되었습니다. 공식적인 표준이 없는 상황에서 이 책은 K&R 또는 C 팬들이 즐겨 부르는 "화이트 북"으로 알려진 사실상의 표준이 되었습니다. 70년대에는 C 프로그래머가 거의 없었고 대부분이 UNIX 사용자였습니다. 그러나 80년대에 C는 UNIX 세계의 좁은 범위를 넘어섰습니다. C 컴파일러는 다양한 운영 체제를 실행하는 다양한 시스템에서 사용할 수 있게 되었습니다. 특히 C는 급속도로 발전하는 IBM PC 플랫폼에 확산되기 시작했다.

인기의 상승과 함께 문제가 발생했습니다. 새로운 컴파일러를 작성한 프로그래머는 K&R에 기술된 언어를 기초로 삼았습니다. 불행히도 K&R에서는 언어의 일부 기능이 모호하게 설명되어 컴파일러가 재량에 따라 해석하는 경우가 많습니다. 또한 이 책은 언어의 기능과 UNIX 운영 체제의 기능을 명확하게 구분하지 않았습니다. 설상가상으로, K&R이 출판된 후 C는 계속 발전했습니다. 새로운 기능이 추가되고 기존 기능이 삭제되었습니다. 곧 언어에 대한 포괄적이고 정확하며 최신의 설명이 필요하다는 분명한 필요성이 생겼습니다. 그런 기준이 없으면 언어의 가장 강한 면인 이식성을 방해하는 방언이 등장하기 시작했다.

American C 표준의 개발은 ANSI(American National Standards Institute)의 후원 하에 1983년에 시작되었습니다. 많은 수정을 거친 후 이 표준은 1988년에 완성되었고 1989년 12월 ANSI X3.159-1989로 공식 채택되었습니다. 1990년에 국제표준화기구(ISO)로부터 국제표준인 ISO/IEC 9899:1990으로 승인되었습니다. 이 버전의 언어는 일반적으로 K&R C라고 하는 원래 버전의 C와 혼동을 피하기 위해 일반적으로 C89 또는 C90이라고 합니다.

언어는 1995년에 약간 변경되었습니다(변경 사항은 일반적으로 수정 1이라고 하는 문서에 설명되어 있음). ISO/IEC 9899:1999 표준이 발표된 1999년에 더 중요한 변화가 일어났습니다. 이 표준에서 설명하는 언어는 일반적으로 C99라고 합니다. 한때 C99를 설명하는 데 사용되었던 "ANSI C", "ANSI/ISO C" 및 "ISO C"라는 용어는 두 가지 표준이 있기 때문에 모호합니다.

2011년에는 C++ 언어 개정과 함께 C11 표준이 출시되었습니다. 11 표준이 있음에도 불구하고 많은 컴파일러가 여전히 C99 버전을 완전히 지원하지 않으므로 C11 표준의 사용이 명시적으로 명시됩니다.

평판이 이익을 위해 작용할 때

커뮤니티 관리

음색의 생성. 브랜드를 대신하여 부정적인 의견과 긍정적인 의견을 신속하게 처리합니다. 주어진 시나리오에 따른 커뮤니케이션 관리. 문제의 순간을 고객에게 전달합니다.

영향력 있는 대리인

포럼 및 포럼에서 "가상"의 생성 및 구현 소셜 네트워크에서. 300개 이상의 사이트에 펌핑 및 라이브 계정 데이터베이스가 있습니다.

리뷰 작업

상위 사이트 및 리뷰 사이트에 브랜드 리뷰를 작성, 조정 및 게시합니다. 긍정적인 댓글과 부정적인 댓글을 처리하고 겹칩니다. 결과적으로 검색 결과네거티브는 점차 대체되고 있습니다.

소셜 미디어 모니터링

Youscan, IQbuzz, 브랜드 분석 시스템과 협력. 브랜드 언급 제어. 핵심 통찰력 식별, 부정에 대한 신속한 대응. 통제를 위한 필수 도구 피드백클라이언트로부터.

분석 및 연구

분석 정보 필드, 제품 카테고리 조사 및 브랜드의 주요 경쟁자. 이 도구는 평판 관리 및 실시간 마케팅에서 심층 연구에 이르는 작업을 다룹니다.

SERM

상세한 분석선택한 키워드에 대한 검색 결과. 소셜 네트워크, 포럼 및 뉴스 사이트에서 클라이언트에 대한 언급 모음. 부정적인 정보를 다루는 전략 개발. 클라이언트는 TOP10에서 완전히 통제된 문제를 수신합니다.

C 언어의 상태는 무엇입니까? 역사적으로 이 언어는 현재 재탄생을 경험하고 있는 Unix 운영 체제와 떼려야 뗄 수 없는 관계입니다. 60년대는 운영 체제와 고급 프로그래밍 언어가 형성되는 시대였습니다. 그 당시 OS와 컴파일러는 각 컴퓨터 유형에 대해 독립적으로 개발되었으며 종종 자체 프로그래밍 언어까지 개발되었습니다(예: PL/I를 기억하십시오). 동시에, 이 경우에 발생하는 문제의 일반성은 이미 명백해졌습니다. 이러한 공통점의 실현에 대한 반응은 보편적인 모바일을 만들려는 시도였다. 운영 체제, 그리고 이것을 위해 덜 보편적이고 모바일 언어프로그램 작성. C가 그 언어가 되었고 Unix는 거의 완전히 고급 언어로 작성된 최초의 운영 체제가 되었습니다.

유닉스와의 긴밀한 연관성으로 인해 C는 그 당시 다른 어떤 언어도 가질 수 없었던 테스트 기반을 제공했습니다. 시스템 프로그래밍 작업은 당시 업계에서 가장 복잡한 것으로 간주되었습니다. 대부분의 경우 너무 기계에 의존적이어서 많은 사람들이 어셈블러 이외의 다른 방식으로 솔루션을 생각조차 하지 않았습니다. 고급 언어는 응용 프로그래밍을 위해 만들어졌으며 필요한 기능만 매우 제한적으로 구현되었습니다. 시스템 작업, 그리고 종종 특정 유형의 기계에만 해당됩니다.

처음부터 C 언어는 시스템 작업을 작성할 수 있도록 설계되었습니다. C의 제작자는 언어 실행기의 추상 모델을 개발하기 시작하지 않았지만 시스템 프로그래밍 실행에 가장 필요한 기능을 단순히 구현했습니다. 우선, 이것들은 메모리, 구조적 제어 구조 및 프로그램의 모듈식 구성과 함께 직접 작업하는 수단이었습니다. 그리고 사실, 그 언어에는 다른 어떤 것도 포함되어 있지 않았습니다. 다른 모든 것은 런타임 라이브러리로 이관되었습니다. 따라서 악의를 품은 사람들은 때때로 C 언어를 구조적 어셈블러라고 말합니다. 그러나 그들이 무엇을 이야기하든 그 접근 방식은 매우 성공적이었습니다. 그 덕분에 언어의 단순성과 가능성의 비율이 새로운 차원에 도달했습니다.

그러나 언어의 성공을 결정짓는 또 다른 요소가 있습니다. 제작자는 매우 능숙하게 기계 종속 속성과 독립 속성을 구분했습니다. 덕분에 대부분의 프로그램은 보편적으로 작성할 수 있습니다. 성능은 프로세서 및 메모리 아키텍처에 의존하지 않습니다. 코드의 몇 가지 하드웨어 종속 부분은 다음으로 현지화할 수 있습니다. 개별 모듈. 그리고 전처리기를 사용하여 다음으로 컴파일할 때 모듈을 만들 수 있습니다. 다양한 플랫폼해당 기계 종속 코드를 생성합니다.

C 언어의 문법은 많은 논란을 불러일으켰는데, C 언어에 사용된 약어는 과도하게 사용하면 프로그램을 완전히 읽을 수 없게 만들 수 있습니다. 그러나 Dijkstra가 말했듯이 - 수단은 문맹으로 사용된다는 사실에 대해 책임이 없습니다. 실제로 C에서 제안하는 구문 약어는 실제로 가장 자주 접하게 되는 정형화된 상황에 해당합니다. 그러한 상황을 표현적이고 간결하게 표현하기 위한 관용구로 약어를 고려한다면, 그 유용성은 무조건적이고 명백해집니다.

따라서 C는 범용 시스템 프로그래밍 언어로 등장했습니다. 그러나 그는 이러한 한계에 머물지 않았습니다. 1980년대 말까지 C 언어는 Fortran을 선두에서 제쳐두고 전 세계 프로그래머들 사이에서 대중적인 인기를 얻었고 다양한 응용 작업에 사용되기 시작했습니다. 여기서 중요한 역할은 새로운 세대의 프로그래머가 훈련된 대학 환경에서 Unix(따라서 C)가 확산된 것입니다.

모든 언어와 마찬가지로 C는 시간이 지남에 따라 진화했지만 대부분의 개선 사항은 급진적이지 않았습니다. 이들 중 가장 중요한 것은 아마도 함수 유형에 대한 엄격한 사양의 도입으로 간주되어야 할 것입니다. 이는 C에서 모듈 간 상호 작용의 신뢰성을 크게 증가시켰습니다. 이러한 모든 개선 사항은 1989년 ANSI 표준에 포함되어 여전히 정의하고 있습니다. C 언어.

그러나 모든 것이 너무 구름이 없다면 다른 모든 언어가 계속 사용되는 이유는 무엇입니까? 그들의 존재를 뒷받침하는 것은 무엇입니까? C 언어의 아킬레스건은 90년대가 의제에 올려놓은 작업에 비해 너무 수준이 낮았다는 것입니다. 그리고 이 문제에는 두 가지 측면이 있습니다. 한편으로는 너무 낮은 수준의 도구가 언어에 내장되어 있었습니다. 우선 메모리와 주소 산술로 작업했습니다. 프로세서의 용량을 변경하는 것이 많은 C 프로그램에 매우 고통스러운 영향을 미치는 것은 헛된 것이 아닙니다. 반면에 C에는 추상 데이터 유형 및 개체, 다형성, 예외 처리와 같은 고급 도구가 없습니다. 결과적으로 C 프로그램에서는 작업을 구현하는 기술이 내용을 지배하는 경우가 많습니다.

이러한 단점을 보완하기 위한 첫 번째 시도는 1980년대 초반에 시작되었습니다. 그때도 AT & T Bell Labs의 Bjorn Stroustrup은 조건부 이름으로 C 언어의 확장을 개발하기 시작했습니다. 개발 스타일은 C 언어 자체가 만들어진 정신과 상당히 일치했습니다. 편리한 작업특정 사람과 그룹. C++라고 하는 새로운 언어의 최초 상용 번역기가 1983년에 등장했습니다. 프로그램을 C 코드로 번역한 것은 전처리기였지만, 1985년 Stroustrup의 책이 발표된 것은 실제 언어의 탄생이라고 볼 수 있습니다. 이때부터 C++가 전 세계적으로 인기를 얻기 시작했습니다.

C++의 주요 혁신은 클래스 메커니즘으로, 이를 통해 새로운 데이터 유형을 정의하고 사용할 수 있습니다. 프로그래머는 클래스 개체의 내부 표현과 이 표현에 액세스하기 위한 메서드 함수 집합을 설명합니다. C ++를 만들 때 소중한 목표 중 하나는 이미 작성된 코드의 재사용 비율을 늘리려는 것이었습니다. 클래스의 개념은 이를 위한 상속 메커니즘을 제공했습니다. 상속을 사용하면 원래(기본) 클래스의 컴파일된 코드에 영향을 주지 않고 확장된 표현과 수정된 메서드를 사용하여 새(파생된) 클래스를 만들 수 있습니다. 동시에 상속은 동일한 유형의 처리를 수행하기 위해 객체 지향 프로그래밍의 기본 개념인 다형성을 구현하는 메커니즘 중 하나를 제공합니다. 다른 유형데이터, 동일한 코드를 사용할 수 있습니다. 실제로 다형성은 코드 재사용을 보장하는 방법 중 하나이기도 합니다.

클래스의 도입은 C++ 언어의 모든 혁신을 소진시키지 않습니다. 그것은 완전한 구조적 예외 처리 메커니즘을 가지고 있습니다. C에서는 이 메커니즘이 없어서 안정적인 프로그램을 작성하는 것이 훨씬 더 어렵습니다. 템플릿 엔진, 언어에 깊이 내장된 정교한 매크로 생성 메커니즘, 코드 재사용 가능성에 대한 또 다른 경로를 열어줍니다. 그리고 훨씬 더.

따라서 일반적인 언어 개발 라인은 프로그래머가 실제로 메모리 및 시스템 종속 엔터티에 대한 직접 작업을 중단할 수 있도록 ANSI C 작업과의 완전한 호환성을 유지하면서 새로운 고급 구성을 도입하여 기능을 확장하는 것을 목표로 했습니다. 그러나 이 언어에는 개발자가 프로그램을 올바르게 구성하도록 하는 메커니즘이 포함되어 있지 않으며 저자는 다소 복잡한 구성의 사용에 대한 체계적인 권장 사항을 발표하지 않았습니다. 그들은 가장 일반적인 데이터 구조를 구현하는 표준 클래스 라이브러리를 만드는 데 시간과 노력을 기울이지 않았습니다.

이 모든 것이 많은 개발자가 언어 의미론의 미로를 스스로 탐색하고 성공적으로 작동하는 관용구를 독립적으로 찾아야 한다는 사실로 이어졌습니다. 예를 들어, 언어 개발의 첫 번째 단계에서 많은 클래스 라이브러리 작성자는 공통 기본 클래스인 Object를 사용하여 단일 클래스 계층 구조를 구축하려고 했습니다. 이 아이디어는 가장 유명한 객체 지향 언어 중 하나인 Smalltalk에서 차용했습니다. 그러나 C++에서는 완전히 실행할 수 없는 것으로 나타났습니다. 정교한 클래스 라이브러리 계층 구조가 유연하지 못한 것으로 밝혀졌고 클래스 작업이 명확하지 않았습니다. 클래스 라이브러리를 사용하려면 소스 코드로 제공해야 했습니다.

템플릿 클래스의 출현은 이러한 개발 방향을 완전히 반박했습니다. 상속은 기존 클래스의 특수 버전을 생성해야 하는 경우에만 사용되기 시작했습니다. 라이브러리는 별도의 클래스와 관련 없는 작은 계층으로 구성되기 시작했습니다. 그러나 C++에서는 독립 계층의 클래스를 다형성으로 사용하는 것을 허용하지 않기 때문에 코드 재사용이 감소하기 시작했습니다. 템플릿의 광범위한 사용은 컴파일된 코드의 양을 허용할 수 없을 정도로 증가시킵니다. 템플릿은 매크로 생성 방법을 사용하여 구현된다는 것을 잊지 마십시오.

C의 구문에서 상속된 C++의 최악의 단점 중 하나는 사용된 모든 클래스의 내부 구조에 대한 설명을 컴파일러에서 사용할 수 있다는 것입니다. 결과적으로 일부 라이브러리 클래스 표현의 내부 구조가 변경되면 이 라이브러리가 사용되는 모든 프로그램을 다시 컴파일해야 합니다. 이것은 현대화 측면에서 라이브러리 개발자를 크게 제한합니다. 새로운 버전, 이전 버전과 바이너리 호환성을 유지해야 합니다. 많은 전문가들이 C++가 대규모 및 초대형 프로젝트에 적합하지 않다고 생각하는 것은 바로 이 문제입니다.

그러나 나열된 단점과 언어 표준을 사용할 수 없음에도 불구하고(15년 넘게 사용한 이후입니다!) C++는 여전히 가장 인기 있는 프로그래밍 언어 중 하나입니다. 그 강점은 주로 C 언어와 거의 완벽하게 호환된다는 점입니다. 덕분에 C에서 이루어진 모든 성과는 C ++ 프로그래머가 사용할 수 있습니다. 동시에 C ++는 클래스를 사용하지 않고도 C 중요한 숫자 추가 기능많은 사람들이 단순히 개선 된 C로 사용하는 편의 시설.

에 관하여 개체 모델 C++의 경우 프로그램이 매우 커지지 않는 한(수십만 줄) 사용할 수 있습니다. 최근 컴포넌트로의 전환 경향 소프트웨어 C++의 위치를 ​​강화할 뿐입니다. 개별 컴포넌트를 개발할 때 C++의 단점은 아직 나타나지 않고 컴포넌트를 작업 시스템에 바인딩하는 작업은 더 이상 언어 수준이 아닌 운영 체제 수준에서 이루어집니다.

지금까지 언급한 모든 사항에 비추어 볼 때 C++의 전망은 암울해 보이지 않습니다. 프로그래밍 언어 시장의 독점은 그를 위해 빛나지 않지만. 아마도 우리는 이 언어가 또 다른 현대화 확장에서 살아남지 못할 것이라고 확신할 수 있을 뿐입니다. 이유 없이 Java가 등장했을 때 많은 관심을 기울였습니다. 구문이 C++에 가깝고 따라서 많은 프로그래머에게 친숙해 보이는 언어는 70년대부터 물려받은 C++의 가장 치명적인 단점을 면했습니다. 그러나 Java는 일부 사람들이 부여한 역할에 미치지 못하는 것 같습니다.

현대 프로그래밍에서 C/C++ 언어의 특별한 역할로 인해 인터넷에서 자료를 찾을 수 있는 특정 주소를 제공하는 것은 거의 무의미합니다. 이런 곳이 너무 많습니다. 그러나 C++의 진화에 대해 더 자세히 알고 싶다면 짧은 기사로 시작하십시오. http://citforum.syzran.ru/programming/prg96/76.shtml.

알렉산더 세르게예프, [이메일 보호됨]
BYTE/Russia 잡지 기사, 2000년 3월

실제로 설명된 언어의 사용을 시각적으로 보여주기 위해 표준 입력이나 파일에서 일련의 정수를 입력한 다음 홀수만 출력해야 하는 작업을 선택했습니다. 역순으로. 이것은 이를 해결하기 위해 배열, 루프, 분기 및 I/O에 대한 많은 작업이 필요한 가장 간단한 문제 중 하나이며 서브루틴 호출을 시연할 수도 있습니다. 동시에 그것은 눈에 보이고 쉽게 감지됩니다.

목록 1. C

1 #포함 /* I/O 함수 연결 */ 2 3 void main(void) 4 ( 5 int M; /* 0부터 세는 10개의 정수 배열 */ 6 int N; 7 for (N=0; N)<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* 역순으로 배열을 순환합니다. */ 12 if (M[N]%2) /* 순서대로 홀수를 인쇄합니다. */ 13 printf("%d\n", M[N]) ; 열네 )

  • 라인 3. C/C++에서 프로그램 실행은 항상 main 함수로 시작됩니다.
  • 7행과 11행.루프 헤더에는 초기 설정, 연속 조건 및 루프 매개변수 재계산 규칙을 ​​나타내는 세미콜론이 포함됩니다. 운영 ++ 그리고 -/- - C 언어의 가장 유명한 약어로서, 변수의 증감, 즉 값이 1씩 증가하거나 감소하는 것을 의미합니다.
  • 8행.기능 스캔첫 번째 매개 변수로 지정된 형식에 따라 주소가 나머지 매개 변수로 지정된 변수 값을 입력합니다. 여기서 값이 입력된 주소는 주소 산술을 사용하여 계산되어 배열 위치의 주소까지 오프셋이 추가됨 N집단. 작성하여도 동일한 효과를 얻을 수 있습니다. &M[N].
  • 12행.작업 % 나눗셈의 나머지를 계산합니다. 운영자 조건 만약에표현식의 숫자 값이 0이 아닌 경우 충족된 것으로 간주됩니다.
  • 13행.기능 인쇄- 형식별 인쇄는 유사하게 작동합니다. 스캔, 하지만 주소 대신 출력할 값을 전달합니다.
1 #포함 23 템플릿 class Array 4 ( 5 public: Array (T Size=1) : M (new T), N(Size), n(0) () 6 Array (void) ( delete M;) 7 T Count (void) const ( return n; ) 8 T operator (int i) const ( return M[i]; ) 9 void Add (T Data); 10 private: 11 T* M; // 분산 메모리 주소 12 int N, n; // N - 배포, n - 사용 13), 14 15 템플릿 무효 배열 ::Add(T Data) 16 ( if (N-n) // 할당된 모든 항목이 17이면 ( int* P = new T; // place가 사용되면 (int i=0; i에 대해 18을 더 할당) ㅏ; // 가변 크기 28의 정수 배열 while (1) // 무한 루프 29 ( int N; 30 cin >> N; // cin - 표준 입력 스트림 31 if (cin.eof()) break; // 종료 파일의 끝으로 루프 32 A.Add(N); // 입력된 숫자를 배열에 추가 33 ) 34 for (int N=A.Count()-1; N>=0; --N) // 루프 배열을 통해 35 if ( A[N]%2) 36 cout<, 메모리 확보
  • 3-13행.템플릿 클래스가 선언되었습니다. 정렬매개변수 포함 . 유형의 가변 크기 개체의 배열입니다. . 물론 우리 작업에서는 템플릿 클래스를 사용할 필요가 없습니다. 그러나 우리는 C++가 모든 유형의 요소와 작동할 수 있는 다형성 데이터 구조를 만드는 방법을 보여주고 싶었습니다.
  • 5행.클래스 생성자. 객체의 표현을 초기화합니다. 예를 들어 현장에서 연산에 의해 주문된 메모리 블록의 주소가 입력됩니다. 새로운 T.
  • 8행.작업 오버로딩의 예. 기능 운영자대괄호가 클래스 개체의 오른쪽에 나타날 때 호출됩니다. 정렬.
  • 9행.이 기능은 구현의 주요 기능입니다. 배열에 요소를 추가하여 필요에 따라 확장합니다. 다른 것보다 더 복잡하기 때문에 정의는 클래스 설명에서 제외됩니다. 클래스 본문에 설명된 함수는 호출에 의해가 아니라 인라인 대체에 의해 C++에서 구현됩니다. 이렇게 하면 크기가 증가하지만 프로그램 속도가 빨라집니다.
  • 15-24행.기능 정의 배열::추가(T)(그런데 그녀의 전체 이름입니다).
  • 27행.유형의 객체 생성 정렬. 주형 아가우유형별로 매개변수화 정수.

왜 C++인가

C++는 현재 상용 소프트웨어 제품 개발에 사용되는 지배적인 언어로 간주됩니다. 최근 몇 년 동안 Java와 같은 프로그래밍 언어의 유사한 주장으로 이러한 지배가 약간 흔들렸지만 여론의 추는 다른 방향으로 흔들렸고 Java용 C++를 포기한 많은 프로그래머는 최근 그의 이전 애정으로 돌진했습니다. 어쨌든 이 두 언어는 너무 비슷해서 둘 중 하나를 배우면 다른 언어의 90%를 자동으로 마스터하게 됩니다.

C#은 네트워킹 플랫폼을 위해 Microsoft에서 개발한 새로운 언어입니다. 본질적으로 C#은 일종의 C++이며, 여러 가지 근본적인 차이점에도 불구하고 C#과 C++ 언어는 약 90% 정도 일치합니다. C#이 C++의 심각한 경쟁자가 되기까지는 아마도 오랜 시간이 걸릴 것입니다. 하지만 그렇게 되더라도 C++ 언어에 대한 지식은 상당한 이점이 될 것입니다.

C++는 범용 프로그래밍 언어입니다. 그것의 자연스러운 범위는 가장 넓은 의미로 이해되는 시스템 프로그래밍입니다. 또한 C++는 지정된 범위를 훨씬 뛰어 넘는 많은 응용 분야에서 성공적으로 사용됩니다. C++ 구현은 이제 가장 작은 마이크로컴퓨터에서 가장 큰 슈퍼컴퓨터에 이르기까지 모든 시스템과 거의 모든 운영 체제에 적용됩니다.

C++ 언어의 출현과 진화

Bjorn Stroustrup은 C++ 언어의 개발자이자 최초의 컴파일러를 만든 사람입니다. 그는 Murray Hill(미국 뉴저지)에 있는 AT&T Bell Laboratories Research Computing Center의 직원입니다. 그는 Aarus 대학(덴마크)에서 수학과 컴퓨터 공학 석사 학위를, 영국 Cambridge 대학에서 컴퓨터 과학 박사 학위를 받았습니다. 그는 분산 시스템, 운영 체제, 모델링 및 프로그래밍을 전문으로 합니다. M. A. Ellis와 함께 그는 C++ 언어에 대한 완전한 안내서인 "A Guide to C++ with Notes"의 저자입니다.

물론 C++은 C 언어의 부분집합으로 보존된 C 언어에 많은 빚을 지고 있습니다. 시스템 프로그래밍의 가장 시급한 문제를 해결하도록 설계된 C 고유의 모든 저수준 도구도 보존됩니다. C는 차례로 이전 버전인 BCPL에 많은 빚을 지고 있습니다. BCPL 언어 주석이 C++로 복원되었습니다. 영감의 또 다른 원천은 SIMULA-67 언어였습니다. 클래스의 개념을 차용한 것은 그에게서 파생된 클래스 및 가상 함수와 함께 사용되었습니다. 연산자를 오버로드하는 C++의 기능과 연산자가 나타날 수 있는 모든 위치에 선언을 배치할 수 있는 자유는 Algol-68 언어를 연상시킵니다.

C with Classes라고 하는 이전 버전의 언어가 1980년부터 사용되었습니다. 이 언어는 작성자가 인터럽트 구동 시뮬레이션 프로그램을 작성해야 했기 때문에 생겨났습니다. SIMULA-67 언어는 효율성을 제외하고 이에 이상적입니다. "C with classes" 언어는 대규모 모델링 작업에 사용되었습니다. 그 당시에는 시간과 메모리 리소스가 중요한 프로그램 작성 가능성이 엄격한 테스트를 거쳤습니다. 이 언어에는 연산자 오버로딩, 참조, 가상 기능 및 기타 여러 기능이 부족했습니다. C++은 1983년 7월 저자가 일했던 연구 그룹을 처음으로 떠났지만, 당시에는 아직 많은 C++ 기능이 개발되지 않았습니다.

C++(C 플러스 플러스)라는 이름은 1983년 여름 Rick Maschitti에 의해 만들어졌습니다. 이 이름은 C 언어 변경의 진화적 특성을 반영합니다. 표기법 ++는 C 증분 연산을 나타냅니다. 약간 짧은 이름 C+는 구문 오류. 또한 이미 완전히 다른 언어의 이름으로 사용되었습니다. C 의미론자들은 C++가 ++C보다 나쁘다는 것을 발견했습니다. 언어는 C의 확장이기 때문에 D라고 부르지 않으며 C 기능을 삭제하여 문제를 해결하려고 시도하지 않습니다. C++ 이름에 대한 또 다른 흥미로운 해석은 부록에서 찾을 수 있습니다.

처음에 C++는 작성자와 그의 친구들이 어셈블리, C 또는 기타 현대 고급 언어로 프로그래밍할 필요가 없도록 고안되었습니다. 주요 목적은 개별 프로그래머를 위한 프로그래밍 프로세스를 단순화하고 더 즐겁게 만드는 것입니다. 최근까지 문서에 C++ 개발 계획이 없었습니다. 설계, 구현 및 문서화가 함께 진행되었습니다. "C++ 프로젝트" 또는 "C++ 디자인 위원회"는 없었습니다. 따라서 언어는 사용자가 직면한 모든 문제를 극복하는 방식으로 진화했으며 계속 진화하고 있습니다. 모든 문제에 대한 저자의 친구 및 동료와의 토론도 발전의 원동력이 됩니다.

이 책의 초판이 출간된 이후로 C++ 언어는 상당한 변화와 개선을 거쳤습니다. 이것은 주로 과부하 명확화, 연결 및 메모리 관리에 관한 것입니다. 그러나 C 언어와의 호환성을 높이기 위해 약간의 변경이 이루어졌으며 다중 상속, 정적 및 const 사양이 있는 멤버 함수, 보호된 멤버(보호됨), 형식 템플릿 및 특수 처리와 같은 일부 일반화 및 중요한 확장도 도입되었습니다. 상황. 이러한 모든 확장과 개선은 라이브러리를 만들고 사용할 수 있는 C++ 언어를 만드는 것을 목표로 했습니다. 모든 변경 사항은 에 설명되어 있습니다.

1985년과 1991년 사이에 도입된 기타 확장 (다중 상속, 정적 멤버 함수 및 순수 가상 함수와 같은) 다른 언어가 아닌 C++ 프로그래밍 경험의 일반화에서 등장했습니다.

이 6년 동안 만들어진 언어 확장은 주로 데이터 추상화 언어 및 일반적으로 객체 지향 프로그래밍으로, 특히 사용자 정의 데이터 유형을 사용하여 고품질 라이브러리를 만드는 수단으로서 C ++의 표현력을 높이는 것을 목표로 했습니다.

1987년 즈음에 C++ 표준화 작업이 임박했으며 이를 위한 기반이 즉시 시작되어야 한다는 것이 분명해졌습니다.

AT&T Bell Laboratories는 이 작업의 주요 기여자입니다. 약 20개 조직에서 약 100명의 대표자가 ANSI 표준화를 위한 참조 매뉴얼 및 소스 자료의 최신 버전이 된 것에 대해 연구하고 논평했습니다. C++. 마지막으로 1989년 12월 Hewlett-Packard의 주도로 ANSI 내에 위원회 X3J16이 구성되었습니다. ANSI(미국 표준)에서의 C++ 표준화 작업은 ISO(International Standards Organization) 표준화 작업의 필수적인 부분이 될 것으로 기대된다.

C++는 일부 기본 클래스의 개발과 함께 발전했습니다.

창조의 역사

이 언어는 1980년대 초 Bell Labs 직원인 Björn Stroustrup이 자신의 필요에 따라 C 언어에 대한 여러 개선 사항을 제시하면서 시작되었습니다. Stroustrup은 1970년대 후반 Bell Labs에서 대기 이론의 문제(전화 통화 모델링에 적용됨)에 대한 작업을 시작했을 때 당시의 기존 모델링 언어를 사용하려는 시도가 비효율적이며 고효율 기계어를 사용한다는 사실을 발견했습니다. ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​과도한 표현은 제한된 표현 때문에 너무 어려웠습니다. 예를 들어 Simula 언어는 대형 소프트웨어 개발에 매우 ​​유용하지만 너무 느리고 BCPL 언어는 충분히 빠르지만 저급 언어에 너무 가깝고 대형 소프트웨어 개발에는 적합하지 않은 기능이 있습니다.

논문의 경험을 회상하면서 Stroustrup은 Simula 언어에서 사용할 수 있는 기능으로 C 언어(BCPL의 후속 제품)를 보완하기로 결정했습니다. Bell 컴퓨터가 실행되는 UNIX 시스템의 기본 언어인 C 언어는 빠르고 기능이 풍부하며 이식성이 있습니다. Stroustrup은 클래스와 객체로 작업할 수 있는 기능을 추가했습니다. 결과적으로 실제 모델링 문제는 개발 시간(Simula 유사 클래스 사용으로 인해)과 계산 시간(C의 속도로 인해) 모두에서 접근할 수 있는 것으로 나타났습니다. C에 대한 첫 번째 추가 사항은 클래스(캡슐화 포함), 클래스 상속, 강력한 유형 검사, 인라인 함수 및 기본 인수였습니다. 원래 "C with classes"라고 불렸던 언어의 초기 버전은 1980년부터 사용 가능했습니다.

클래스가 있는 C를 개발하는 동안 Stroustrup은 클래스가 있는 C 소스 코드를 일반 C 소스 코드로 변환하는 컴파일러인 cfront 프로그램을 작성했습니다. 이를 통해 UNIX에서 이미 제공되는 인프라를 사용하여 새로운 언어로 작업하고 실제로 사용할 수 있습니다. C 개발을 위해. 예기치 않게 저자에게 새로운 언어로 그는 동료들 사이에서 큰 인기를 얻었고 곧 Stroustrup은 수천 개의 질문에 답하면서 더 이상 개인적으로 그를 지원할 수 없었습니다.

C++을 만들 때 Bjorn Stroustrup은
  • 정적 데이터 유형, C의 효율성 및 이식성을 갖춘 범용 언어를 얻으십시오.
  • 절차적 프로그래밍, 데이터 추상화, 객체 지향 프로그래밍 및 일반 프로그래밍을 포함한 많은 프로그래밍 스타일을 직접적이고 포괄적으로 지원합니다.
  • 프로그래머가 잘못 선택할 수 있는 기회를 주더라도 선택의 자유를 주십시오.
  • C와의 호환성을 최대한 유지하여 프로그래밍에서 C로 쉽게 전환할 수 있습니다.
  • C와 C++ 간의 불일치를 피하십시오. 두 언어에서 모두 유효한 구성은 각 언어에서 동일한 것을 의미해야 하며 동일한 프로그램 동작으로 이어집니다.
  • 플랫폼 종속적이거나 보편적이지 않은 기능은 피하십시오.
  • "사용하지 않는 것에 대해 비용을 지불하지 마십시오" - 어떤 언어 기능도 그것을 사용하지 않는 프로그램의 성능 저하를 일으키지 않아야 합니다.
  • 너무 복잡한 프로그래밍 환경을 요구하지 마십시오.

새로운 프로그래밍 언어를 만들기 위한 기초로 C를 선택한 것은 C 언어가 다음과 같은 사실에 의해 설명됩니다.

1. 다목적이고 간결하며 상대적으로 낮은 수준의 언어입니다.
2. 대부분의 시스템 문제를 해결하는 데 적합합니다.
3. 모든 곳과 모든 곳에서 실행됩니다.
4. UNIX 프로그래밍 환경과의 인터페이스.

— B. Stroustrup. C++ 프로그래밍 언어. 섹션 1.6

C 언어의 잘 알려진 여러 단점에도 불구하고 Stroustrup은 "C에는 문제가 있지만 처음부터 설계된 언어에는 문제가 있고 우리는 C의 문제를 알고 있기 때문에" 이를 기반으로 사용하기로 결정했습니다. 또한 추가된 구문 요소만 원래 C 언어로 번역한 컴파일러 프로토타입(cfront)을 빠르게 얻을 수 있었습니다.

C++이 개발됨에 따라 C 구문의 기능을 무시하는 다른 기능이 포함되었으며 더 이상 사용되지 않는 구문을 제거하여 언어 호환성을 포기하는 문제가 반복적으로 제기되었습니다. 그러나 다음과 같은 이유로 호환성이 유지되었습니다.

  • 원래 C로 작성되고 C++로 직접 이식된 현재 코드의 보존;
  • 이전에 C를 공부한 프로그래머를 재교육할 필요가 없습니다(새로운 C++ 도구만 배우면 됨).
  • 언어가 함께 사용될 때 언어 간의 혼동 제거("두 언어가 함께 사용되는 경우, 그 차이는 언어가 혼동될 수 없도록 최소이거나 너무 커야 합니다").

1983년까지 가상 함수, 함수 및 연산자 오버로딩, 참조, 상수, 여유 메모리 관리에 대한 사용자 제어, 향상된 유형 검사, 새로운 주석 스타일(//)과 같은 새로운 기능이 언어에 추가되었습니다. 결과 언어는 더 이상 클래식 C의 증강 버전이 아니며 클래스가 있는 C에서 "C++"로 이름이 변경되었습니다. 첫 상업 출시는 1985년 10월에 이루어졌습니다.

결과 언어 이름은 C++ 단항 후위 증가 연산자(변수 값을 1씩 증가)에서 가져옵니다.

공식 표준화가 시작되기 전에 프로그래밍 커뮤니티의 요청에 따라 주로 Stroustrup에서 언어를 개발했습니다. 표준 언어 기술의 기능은 Stroustrup의 C++에 대한 인쇄물(언어에 대한 설명, 참조 매뉴얼 등)에 의해 수행되었습니다.

표준의 역사

1985년에는 공식 표준이 없기 때문에 매우 중요한 언어에 대한 첫 번째 설명을 제공하는 C++ 프로그래밍 언어의 초판이 나왔습니다.


1989년에 C++ 버전 2.0이 출시되었습니다. 새로운 기능에는 다중 상속, 추상 클래스, 정적 멤버 함수, 상수 함수 및 보호된 멤버가 포함됩니다. 1990년에 "Commented Reference Guide to C++"가 출판되어 나중에 표준의 기초가 되었습니다. 최근 업데이트에는 템플릿, 예외, 네임스페이스, 새 캐스트 및 부울 유형이 포함되었습니다.

C++ 표준 라이브러리도 함께 발전했습니다. C++ 표준 라이브러리에 처음 추가된 것은 I/O 스트림으로, 기존의 C printf 및 scanf 기능을 대체하는 수단을 제공합니다. 나중에 표준 라이브러리의 가장 중요한 발전은 표준 템플릿 라이브러리가 포함된 것입니다.

1998년에 C++ 표준 위원회(ISO/IEC JTC1/SC22/WG21 작업 그룹)에서 언어 표준 ISO/IEC 14882:1998(C++98로 알려짐)을 발표했습니다. C++ 표준은 객체의 이름 지정 방법, 일부 예외 처리 세부 사항 및 기타 구현 관련 기능을 설명하지 않으므로 다른 컴파일러에서 생성된 객체 코드가 호환되지 않습니다. 그러나 특정 아키텍처 및 운영 체제에 대해 타사에서 많은 표준을 만들었습니다.

2005년에 라이브러리 기술 보고서 ​​1(약칭 TR1)이 발표되었습니다. 공식적으로 표준의 일부는 아니지만 보고서는 작성자가 C++ 언어의 다음 버전에 포함될 것으로 예상한 표준 라이브러리의 확장에 대해 설명합니다. 지원되는 거의 모든 C++ 컴파일러에서 TR1 지원이 개선되고 있습니다.

2009년부터 이전 표준을 업데이트하기 위한 작업이 진행 중이며 새 표준의 예비 버전은 첫 번째 C ++ 09였으며 1년 후 C ++ 0x, 오늘날 C ++ 11에 언어 코어 및 TR1의 대부분을 포함하여 표준 라이브러리에 대한 확장.

C++는 최신 요구 사항을 충족하기 위해 계속 발전하고 있습니다. C ++ 언어를 개발하고 개선을 위해 C ++ 표준화 위원회에 제안을 보내는 그룹 중 하나는 Boost이며, 메타프로그래밍 기능을 추가하여 언어의 기능을 향상시키는 데 참여합니다.

아무도 C++ 언어에 대한 권리를 소유하지 않으며 무료입니다. 그러나 언어 표준 문서 자체(초안 제외)는 무료로 제공되지 않습니다.