@@

1@ C/C++의 역사

+1@ C++의 표준과 표준제정

2@C/C++ 특징

+1@ 이 언어가 빠른 이유

+2@ 컴파일러 종류

3@마무리

@@@


사실 나도 자세하게는 모르나, 최대한 아는, 도움이 될 만한 것들을 설명하겠음.


@@1@중요하지 않은 C/C++ 역사 


 C는 약 1970년대 후반에 탄생한 언어임. 그러니까 좀 구식닥다리겠지? 그럼에도 불구하고 그 당시엔 어셈블리어~1~언어가 현역으로 날 뛰고있던 시대이기 때문에 고급언어로서 칭송받았지. 하지만 지금은 그저 대학생 1학년들을 고문시키고 자신의 지능을 한탄하게 

만드는 언어가 되었어.

 더 쉽게 할 수 있었을 텐데.....

 어쨌든 그렇게 세기말쯤 C++이 태어났어, 처음에는 그저 클래스 얻어서 객체?지향? 어리둥절해하는 C에 불과했지만 요즘은 성능은 거의 C와 같게 유지시켜주면서 수많은 기능을 탑재했지. (그리고 사람마다 쓰는 안 쓰는 기능이 다 달라서 혼란스러운)


@@1@1@중요하지 않은 지난날의 표준제정들


 C는 몰라도 C++은 2011년부터 3년마다 버전을 바꿔가며 계속 기능의 추가가 일어나고 있어. 각각의 년도마다 추가된 기능들엔 C++11/14/17/20의 이름이 붙지. 높은 숫자는 낮은 버전의 기능과 호환되지만 반대는 안돼. 그렇다고 해서 낮은 버전을 쓸 수 없게 된다는 건 아니니까 걱정하지 말고.

 만약 C++11 이라 적혀있는 곳이 있다면 

1. 이 버전에서 나온 기능을 사용하거나,

2. 아니면 이 버전 이상의 기능은 지원되지 않는다는 뜻

이니 조심해야 해. 버전 별 정보는 여기서 한번 "잘" 찾아봐.

->~2~

 

@@2@C/C++ 특징 


@@2@1@C/C++ 빠른 이유

 C/C++의 코드는 대부분의 다른 언어(JAVA, Python)등과 달리


1. CPU가 바로 해석할 수 있는 기계어로 변환되고, 

2. 굳이 실행할 동안 안 해도 되는 명령은 코드를 기계어로 변환할 때 미리 최적화하거나 "프로그래머가 할 수 있게" 하는 특징을 가지고 있어. (도시락은 미리 만드는 게 이미 소풍가고나서 만드는 것보다 빨리 먹을 수 있지.)


그래서 다른 언어에 비해 속도가 빠르지. 그리고 사람들에게 배포시 보안 상의 이점도 있어. 파이썬 같이 쌩으로 쓰여있는 

코드들보단 이해하는데 시간과 어려움이 들테니까.


@@2@2@C/C++ 

컴파일러 춘추전국시대에서 삼국지로

 그리고 C/C++은 컴파일러의 종류가 많아. JAVA는 한 기업(오라클, ORACLE)이 각잡고 관리함과 동시에 여러 운영체제에서도 코드를 돌려줄 수 있는 프로그램, 동적 라이브러리 등을 배포하기 때문에 어느 운영체제든 깔아주기만 하면 자바코드에서 컴파일된 실행파일을 바로 실행할 수 있게 해주지. 파이썬도 비슷한 방식이고. 

 하지만 C/C++은 공식적인 컴파일러 제공자가 없어. 정확히는 C++위원회에서 내놓은 "표준"만 지키면 누구든지 컴파일러를 만드는 자가 될 수 있지. 현재 지분이 가장 큰 컴파일러의 종류를 나열하면 


 마이크로 소프트의 MSVC 컴파일러


 오픈소스 진영 GNU 재단의 GCC(여러 언어 컴파일러 모음)가 있는데 그중 윈도우 전용의 c/c++컴파일러는 mingw로 불리고

mingw도 그냥 mingw(32bit)와 mingw64(64bit)로 나뉘어.


 오픈소스지만 구글 애플의 푸쉬를 받고 있는 Clang. 

필자는 사용해본 적 없지만 도전해보길 바래


메이저 컴파일러들은 대충 이 세개야. 

옛날에는 표준을 잘 안 지켜서 코드호환이 안되는 컴파일러들이지만 요즘은 대부분은 호환되게 바뀌었어.

MSVC 컴파일러는 유명한 IDE인 VisualStudio와 함께 기본으로 제공되어서 윈도우에서의 프로그램 작성에 엄청 많이 쓰이고

GCC도 좀 늙은.. 감이 있지만 절대 하자는 없고, 딱 깔끔한 표준이야.

Clang도 GNU를 대체하는 게 목적인 놈이라서 기능은 절대로 뒤지지 않는다 들었어. 그리고 GCC와 달리 소스코드 공개의무가 없다네.

 미안하지만 필자의 경우엔 GNU의 GCC->mingw->mingw64만 써서 이것 중심으로 설명할 수 밖에 없을 것 같아.

그래도 기초 개념은 어떤 컴파일러든 다 지원하기 때문에 계속 진행할게.

 

@@3@마무으리

더 궁금한게 있으면 질문해줘, 느리긴 하지만 내용에 추가할게. 야발 개 힘드네 생각보다 안 힘들어서 다행이라 생각해.




@@@

*1*  어셈블리語, Assembly Language를 그대로 번역

 기계어와의 1대1 대응되는 언어. 적어도 그 명령어가 정확히 무엇을 하는진 알려주는 언어. 

CPU가 한 회사가 만드는 것도 아니고 점점 발전하다보니 작성한 코드가 다른 종류/계열의 하드웨어에서 컴파일~3~ 했을 때 작동 안 될 수 있음. 이를 하드웨어 종속적인 코드 라고 함. 파이썬처럼 다양한 곳에서 작동 못 한단 이야기야.

 참고로 C/C++은 언어 자체가 일종의 "지켜야 할 표준"이기도 하기 때문에 각 운영체제나 CPU제조 회사들은 같은 C/C++ 코드가 어느 환경에 놓여있든 최대한으로 프로그래머가 원하는 동일한(연산 시간 제외) 결과를 낼 수 있도록 보장해야함. 

 쉽게 말해서 C/C++이 C Type usb이고 CPU가 Q,A,D,G,E,Z 타입의 단자라면 CPU제조회사는 C to Q,A....으로 단자를 변환하는

컨버터를 미리 제공해야 해. (안그러면 운영체제회사에서 자사의 CPU 지원을 안해줌 ㅋㅋㄹㅃㅃ)

 이는 제공받은 컴파일러~3~ 그 자체가 해결해 줄 수도 아니면 운영체제나 CPU제조회사가 제공하는 정적, 동적 라이브러리일 수도 있어. 아이고 이걸 어디서부터 설명하냐? 나중에 차차 알게될거임. 아직은 여기는 아냐.....

나무위키의 어셈블리어 문서

*2*

링크

*3* 컴파일, 코드를 "미리"(C/C++에선) 기계어로 변환하는 것.

컴파일러, 위의 과정을 수행하는 프로그램. 여러 프로그램이 순차적으로 처리하기도 한다. JAVA는 실행전 바이트코드(우리가 작성하는 코드 아님)로 컴파일, Python은 미리가 아닌 실행 할 동안 코드를 바로바로 해석하기 때문에 컴파일러라고 불리지 않고 인터프리터라 불림.


2022_10_11_20 수정됨. *를 ~로 바꿈.