@@
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 수정됨. *를 ~로 바꿈.