스트로우 스트롭 할배의 천재성의 산물이 C++이다.
근데 현대 프로그래밍 언어의 많은 핵심 개념들 알고 보면 이 할배가 정립시키거나 만들었다.
현대의 oop는 거의 C++의 형태를 답습하고 있고 try-catch 형식의 exception handling도 거의 c++의 것에서 가져온 것이다.
그러다보니 현대 프로그래밍 언어의 새로운 파라다임 상당수가 C++에서 먼저 나왔던 것이다.
그 C++에서 파생된 대표적인 언어가 JAVA, C#, ...
JAVA는 원래 간단한 기기의 인베디드 시스템에서도 OOP를 해보자는 개념 하에 만들어진 언어다. 만들 당시에는 인터넷에서 이렇게 까지 사용될지는 모르고 개발되었다.
인베디드 시스템에 맞춰 C++에 비해 더 작고 빠른 코드를 만들어내는 것이 목표였고 그러다 보니 C++에서 크고 느린 실행 파일을 만들어내는 복잡한 문법들(대표적으로 다중 상속) 같은 건 빼고 메모리 관련 처리도 힙 메모리와 로컬 메모리 구분이 별로 없었던 인베디드에 적합하게 new하나로 최소화한 채로 그냥 개발되었다.
근데 정작 인베디드에서는 여전히 C가 쓰이고 JAVA는 주로 웹개발 언어 그것도 virtual machine 위에서 동작하는 언어로 널리 사용되고 있다.
근데 초기 인터넷 환경에서는 복잡한 프로그래밍이 불필요했기 때문에 JAVA가 딱이었고...
여기에 프로그래밍 언어가 미래라고 생각했던 동적 할당이 필요 없는 언어를 구현했다.
동적 할당은 C와 C++ 같은 기존의 언어에서 가장 악명 높은 골치거리였기 때문에 일명 가비지 콜렉션을 통해서 더이상 메모리에 신경 쓸 필요 없이 프로그래밍 할 수 있을 것이란 꿈을 담아서 말이다.
근데 여기에는 전제 조건이 있었다. 하드웨어가 어마어마하게 발전 중이므로 곧 가비지 콜렉션 따위의 부하는 큰 문제가 되지 않을 만큼 하드웨어 성능이 엄청나 질 것이라는 가정이었다.
실제로 하드웨어 성능은 놀랍게 성장하긴 했지만 가지비 콜렉션이 꿈꾸던 성능이 문제되지 않는 상황은 점점 멀어져만 갔다.
하드웨어 성능의 발전은 10년전 쯤부터 사실상 급제동이 걸렸고 CPU 클럭은 거의 늘어나지 않고 코어 수만 늘리기 시작했던 거다.
이건 JAVA의 가정을 빗나가는 상황이었다.
하지만 그에 반해 메모리 사용량은 지속적으로 기하급수적 증가를 했다.
메모리 사용량이 CPU 클럭 속도를 뛰어 넘은 지는 옛날이 됐고 이 의미는 동일한 CPU로 더 많은 메모리를 처리해야 한다는 것이었고 이는 더 많은 가비지를 만들어내고 관리해야 한다는 것을 의미했다. 한마디로 JAVA는 ㅈ된거다.
완전 ㅈ된 JAVA는 새로운 GC 알고리즘을 ㅈ나게 개선해서 stop the world라도 어떻게 좀 피해보자고 다양한 연구가 되었고
최근에 멀티 코어에 적응해보자고 g1gc가 등장했지만 GC는 여전히 골치거리가 되고 있다.
JAVA로 대규모 서버를 돌리는데는 엄청난 비효율이 따른다. 커지면 커질수록 그만큼 더 많은 메모리를 써야 하고 그럼 더 많은 GC부담이 늘어나 비효율이 증대되기 때문에 고부하 시스템이나 대용량 처리 시스템 용으로는 적합하지 않다. 애초에 그러라고 만든 물건이 아니란 의미다.
그니까 애초에 맞지도 않는 곳에 써 놓고 왜 GC가 이렇게 많이 늘어나나요 GC에 뭔가 버그가 있는 것 같아요 분석해 봅시다 이ㅈㄹ 하면서 찾는 게 멍청한 거다.
성능은 큰 문제가 아니라고 생각했기에 C++재끼고 JAVA로 만든 거 아니었나??
그래서 세계 유수의 대규모 인터넷 서비스 회사... 구글, 페이스북, MS 등등... 대규모 서비스가 필요한 시스템의 코어는 거의 대부분 C++로 작성이 되고 그 위에 빠른 비지니스적 대응이 필요한 로직을 JAVA나 스크립팅 성격의 언어로 개발한다. 또 필요에 딸 다양한 언어들도 만들어내고 공개도 한다.
하지만 대한민국은? 모조리 자바다. 대형이고 나발이고 다 필요 없고 닥치고 자바다.
네이버 카카오 묻지도 따지지 않고 코어 시스템도 모조리 JAVA로 만들어지고 있다.
그니까 JAVA가 대한민국 인터넷 서비스를 망치고 있다는 말까지 나오는 상황이다.
그럼 이런 대형 회사가 지금이라도 C++로 코어를 개발할 능력이 있냐?
단언컨데 없다. 현실이 그렇다. 알아도 이젠 바꾸기가 힘들다. 워낙에 개발 조직이 JAVA로 공고하게 굳어 있기 때문에 바꾸기는 늦었다는 것이다.
인프라의 코어를 JAVA로 할 때보다 C++로 하면 10배에서 100배 이상 효율이 차이가 나기도 한다. 근데도 이지롤을 하고 있는 거다.
하여튼 GC로 ㅈ된 JAVA와 반대로.... C++은 스트로우 스트럽 할배의 큰 그림에 따랐고...
소멸자의 역할을 끝까지 포기하지 않았고 그 결과... modern c++에서는 일명 RAII라는 기법이 표준화되며 C++도 더 이상 동적 메모리 해체를 고민하는 시대는 지나간 것이다.
즉 C++은 메모리 동적 할당의 고민은 사라지면서 태생적으로 ㅈㄴ 빠르고 게다가 필요하면 포인터의 이점까지 누릴 수 있는 언어가 되어 가고 있다는 것이다.
C++은 10여년간 시대에 뒤쳐진 죽어가는 언어였다.
99년에 마지막 표준 안의 개정 이후에 무려 10년이 넘는 동안 표준 안을 개정하지 못하는 공백기가 있었다.
엿 같은 C++위원들이 표준 안 합의를 못하고 계속 표준 안 제정을 연기하고 연기 하다 보니 무려 10년이 넘는 공백기 동안 아무런 업데이트를 하지 못했던 거다.
그러니 최신 프로그래밍 언어의 트렌드는 따라가지 못했고 죽어갔다.
그러다가 각성한 C++표준 위원회에서 모든 안이 다 합의 될 때까지 계속 연기할 것이 아니라 그냥 때가 되면 그때까지 합의한 안 만으로 발표를 하자고 방침을 바꾸게 되면서 드디어 2011년에 C++11의 개정이 발표가 되었다.
일명 C++11 이후 모던 C++로 최신 언어의 모든 트렌드들이 반영되기 시작했다.
앞에서 말한 RAII는 기본이고 하드웨어와 oS 변화에 따라 추가된 thread 관련 기능이나 비동기 처리 관련 기능들, 시간 관련 기능, 파일 i/o 등등이 모두 최신 언어 스타일로 개정안들이 나오면서 갑자기 어마 무시하게 발전해 나가고 있는 상황인 거다.
C++ SFINAE 개념을 사용해서 template meta programming이란 개념을 대폭 발전시키고
함수형 프로그래밍 개념도 받아 들이고...
기타 온갖 개념들의 짬뽕에 나서기 시작했다.
온갖 다양한 프로그래밍 언어적 실험들이 활발히 논의되며 엄청난 점프를 했다는 것이다.
덕분에 문법은 괴랄하게 복잡해지긴 했지만 그만큼 할 수 있는 것도 엄청나게 늘어났다.
기존에 실행 시간에 했어야 했던 일을 C++은 컴파일 시간에 할 수 있도록 하는 많은 문법들이 추가되었다.
C++11이후에도 C++14, C++17, C++20이 계속적으로 나오면서 큰 발전을 이뤘지만 지금은 발전이 다시 더뎌지고 있는 상황이다.
C++은 세계 거의 모든 유수 it회사의 개발자가 개정에 관여하고 있을 만큼 중요하고 관심이 많은 언어다.
C++11이 발표되며 다시 사용률이 늘고 나고 있는 추세기도 하다.
그에 반해 JAVA는 세계적으로는 사용률이 지속적으로 하락 하고 있는 상황이다.
JAVA는 대체 언어들도 많이 나온 상황인데다 어느 정도 언어적 한계에 다다랐으니까...
C는 대한민국에서도 인베디드 뿐만 아니라 많은 영역에서 사용하고 있지만
C++은 사실 게임 업계 외에는 잘 쓰고 있지 않아서 많이 사용되고 있지 않은 상황이다.
왜 이럴까? 이유는 간단하다.
C++은 주로 세계적으로 최상급 소프트웨어 회사들이 가장 많이 쓰는 언어다.
Microsoft windows, linux, oracle, sql sever, mysql, adobe photoshop 등등 우리가 쓰는 소프트웨어 대다수는 C++로 만들어지고 있다.
하지만 이런 걸 만드는 회사는 대한민국에 사실 단 하나도 없는 거나 마찬가지다.
있어도 아주 영세한 업체들 뿐이다.
대한민국에서 흥 하는 프로그래밍 회사는 순수 프로그래밍 회사가 아니라 '네카라쿠배'로 상징 되는 인터넷 서비스 회사들과 개발 하청 업체인 SI업체들 뿐이다.
이런 업체들이 대한민국 소프트웨어 산업의 대부분을 차지하고 있으니 당연히 JAVA 개발자들만이 판치는 세상이 된 거고 C++따위는 왜 쓰나요? 이런 말이 나오는 거다.
게임업계에서나 좀 있을까 일반 소프트웨어 업체에서는 제대로 된 C++ 개발자를 구하기도 쉽지 않다.
염병 나도 줮도 모를 땐 이렇게 생각 할 때가 있었지ㅋ 때에 따라 상황에 따라 알아서 다르게 쓰는 것일 뿐 절대적인건 없다 나 죽기전에 java?? 절대 안망하고 계속 발전한다 - dc App
그래 대한민국에서는 자바 안망할꺼야. 근데 자바만 하는게 문제라고. 당장 인프라 서비스들봐라 다들 ㅈㄴ 느리고 비효율적이란 거지. 구글은 검색 결과 0.6초 내에 응답을 목표로 한다는데.. 국내 최고란 ㅄ들은 훨씬 간단한 것도 8초 나와도 양호하다고 쳐 앉아 있으니까 문제란 거지.
그 지랄 하면서 MSA가 어쩌고 저쩌고 ㅄ같은 소리만 쳐하고 앉아서 시스템 더 쳐 느리게 만들고 난리니까 그런 ㅄ들이 연봉 억단위로 받고 다니는 대한민국이 ㅈ같은 거라고....
되지도 않는 인프라 설계하는데 kafka써서 msa로 스케일 아웃까지 구현 이지랄하길레 kafka는 느리다. 반응속도 많이 떨어진다고 했더니.. 충분히 빠르데... ㅋㅋㅋ 와 ㅅㅂ 진짜. 이런 인프라 C++로 훨씬 효율적이고 빠르게 만들 방법이 있는데도 싫다네 기준이 8초내에만 들어오면 된데... 와... 이러니가 나라가 이지랄이지 싶더라다. 알고보니까 C++로는 인프라 어떻게 구축하는지 노하우 자체가 전무하다는 거지.
한 때 호황이었던 빅데이터 때에 많이 사용하던 시스템들에 익숙해서 그렇지 구성 처음부터 잘 하면 절대 그런 속도 나올 수 없다 8초면 나 초급 때는 뒤통수 맞을 땐데.. - dc App
요즈음 MSA 한다고 난리고 좀만 딜레이 걸리면 8추 우수워 뭐가 뒷통수 맞아> 당장 카톡, 네이버 토스 뭐 인증같은거 한번 해봐 몇초만에 날아오나. ㅋㅋㅋ
kafka는 대규모의 메시징 처리를 하기 위해서 설계되서 throughput은 아주 우수한 것은 맞어. 근데 그런 대규모 throughput을 내기 위해 긴시간 gathering 처리하는 시간이 있다는 거지. 그렇다보니까 다단계에 msa를 구성하면 ㅈㄴ 느려지게 되어 있어. 게다가 web 기반 기술 자체가 다들 ㅈㄴ 느려. 그러니까 그 ㅈㄹ 나는 거다.
굳이 kafka 가 아니더라도 대용량 메시징 처리하는 솔루션은 많아 아니면 직접 구성해도 되고 근데 아키하다보니 주문은 직접 구성하는 시간 비용 보다 잘 알려진 솔루션 사용해서 시간 비용을 줄이자가 대부분이더라 그네들한테 그정도 느린건 상관이 없거든 Msa 구성에서 필요한게 그 사람들한테는 속도 문제만은 아니라는거지 메시징큐를 할 때에 필요한 보안적인 문제 시간 비용 이것들이 그정도 처리 시간보다 중요한거지 - dc App
kafka 말고 뭐? 쓸만한거 뭐 있는데? 그리고 뭐 쓰고 있는데 그럼? 난 그거 밖에 못봤어. 그리고 주문 같은 대응이 빨라야하는 비지니스 서비스 자바로 당연히 할수 있지 근데 인프라까지 빨리 개발하자? 아니 인프라는 안정적이고 지속적으로 서비스되는 기반이 되는데 이게 빨리 개발하는게 맞어? 그리고 솔까 빨리 개발하지도 않잖아.
MQ 는 rabbit 도 있고 ibm mq 도 있고 카프카만 있진 않지 난 그렇다?? 한번에 완벽한 시스템은 없어ㅋㅋ 어차피 보안 속도 안정성만 처음 주문대로 확보 된다면 다음은 sm 에서 할 일이지ㅋ 그리고 개발 속도는 제 날짜에 테스트할 수 있게 맞춰주기만 하면 되잖아 - dc App
종류야 많겠지 rabbit mq는 진짜 고전이고 나머지는 어차피 안쓰잖아. 하여튼 내가 본 것은 99% kafka였다.
주문대로 안정성 확보되면 SM에서 할일? 넌 SI쪽이냐? ㅋㅋㅋ
최근 5년은 SI 안하고 AA SWA 하고 있음 개발은 집에서 알바만ㅋㅋ - dc App
그건 인정 근데 그건 서비스 구성이나 설계 개발자의 ㅂㅅ같은 코드 때문인거지 절대 언어때문은 아니야 - dc App
그런면은 있지. JAVA 자체문제라기 보다도 너무 웹기반 기술과 해외 공개 소프트웨어 솔루션에만 의존들한다는 거지. 스스로 못만들어낸다는 거지. 또 언어적으로도 JAVA는 죽었다 깨어나도 안돼는 상황이 있어. i/o처리 없이 순수 CPU 처리만 있는건 10만배씩 성능 차이는 경우도 흔해. C++의 컴파일 단계에서 옵티마이제이션이 어마무시해.
나 이번에 네카라 c++ 경력으로 들어가는데..? 코어에 c++ 사용하는 팀 꽤 있음
최근에 시작한 거겠지.
ㄴㄴ 예전부터 꾸준히 있었음. 너가 직접 안찾아보면 모르는거지
'네'까지는 그나마 검색엔진부분에는 좀 있을지 몰라도... 카라쿠베는 아닐껀데... 그래서 그 팀에서 뭘 만들었는데? ㅋㅋㅋ
무지성으로 그냥 까고 싶은거임..? c++ 잘하는거 같은데 그렇게 불만이 많으면 너가 와서 한국 시장 좀 바꿔주셈
말나온 김에 이야기하면 네카라에서 검색, 클라우드, 그래픽스, 비전, 임베디드, 브라우저, 미디어, 딥러닝, 로보틱스 등 c++ 쓰는 조직 상당히 많음. 무지성 자바만 쓰는 것도 아닐뿐더러 c++ 잘쓰는 인력 수급도 어려워서 구현 언어로 사용 못하는 경우도 있음. 제조업에서 c++ 쓴다는 인력 태반이 모던도 제대로 안써본 인간들이라
임베디드와 로보틱스 이런건 C겠지. 클라우드도 대부분 JAVA 아니냐? 그래픽스는 조직이 있기나 해? 놀랍네 어차피 그런 조직에 간간히 C++ 있어도 어차피 C++로 인프라 구축 능력없잖아.
네카라 근처도 못가본거 같은데 ㅈ도 모르면서 구축 능력이 없니 뭐니 하고 있누ㅋㅋ
해당 댓글은 삭제되었습니다.
뭐가 틀린 내용임? 지적해보셈?
개념이야 로마시대에 있었을 수도 있겠지 근데 OOP자체는 원래 OOA에서 나온 것이고 일반적으로 small talk에서 현대 OOP의 초석이 놓인 것으로 보고 있으며... 확산은 제록스 알로팔토 연구소에서 개발되던 것을 스티브잡스가 끌고와서 objective-c를 만들면서 적용됐고... C++은 스트로스트럽에 의해 1980년대 개발된 것으로 알고 있음. 그것 말고 없으며?
핵심 주장이 뭐임? JAVA가 임베디드 언어로 개발된게 맞는데 내가 말한 무슨 주장이 틀렸다는 거임????
임베디드에 최적화되어 수정되지 않고 개발되었다??? 그런말이 어딨음?? ㅋㅋㅋ
당연히 메모리 관리 문법 똑같잖아? 원래 임베디드는 스택이랑 힙이랑 메모리가 특별히 분리되지 않고 통으로 된 경우가 많아서 구분없이 그냥 new였음. 그게 임베디드의 흔적임. 이해 못함?? C나 C++은 local memory는 stack에 힙에 할당되는 동적할당은 힙은 malloc나 new로 엄격하게 구분해서 사용했었음.
애초에 많건 적건 JAVA 자체가만든 사람이 C++를 기반으로 만든 거라고 하잖아. C++에서 복잡한 문법 제거해서 나온 거라고! 더빠르고 더 가볍게 동작하도록 복잡한 문법 제거하고... 임베디드에서는 힙메모리 없는 경우 많았으니까 변수 선언은 그냥 new로 퉁치도록 만들었다고 그래도 이해안감?? 그거 그대로 쓰고 있잖아. 뭐가 틀렸다는 거야 도대체...
아니 도대체 무슨 소리야 어휴... -_-; 그래서 그럼 말해봐 뭐가 바꼈는데 뭘 업그레이드 했는데?
아이고... -_-
박민준 판정패
박민준 판정패에 동의
민준게이가 졌노
민준 패배
아는척실패
둘 다 틀렸음. 할 얘기가 많지만 그렇게싸지 시간을 낭비하고싶진 않음.
이런글 뉴비 입장에서는 재밌네요 선생님. 앞으로도 훌륭한 글 많이 써주세요
뉴비한테 해로운글이다. 읽지마
틀린말은 아닌데 webflux 안쓰는 거 생각해보면 답 나올듯
그리고 RAII가 스마트 포인터 얘기하는 건지 모르겠는데 스마트 포인터 쓸 빠엔 자바 쓰는게 낫다고 봄
RAII 와 스마트 포인터는 관련 없음 그냥 C++ idiom 임
RAII가 별론데 JAVA는 왜 try with resource를 만들어 넣었냐? C++처럼 RAII 제대로도 아니고 한정적으로? (물론 소멸자 역할 문제 때문에 제대로된 RAII는 애초부터 구현하지 못하겠지만...) 또 스마트 포인터가 어때서???
어셈블리나 C가 모든언어의 기준이지 병신아
어차피 국내 좁은 파이 뺏어먹기 싸움인데 자바가 비즈니스적으로 맞지 ㅋㅋ
나 대학생인데 기업에서 나온분들이 자기 기업c++ 쓰는데 c++가르치는 대학이 없다더라 ㅋ - dc App
근본 찾으려면 오캐멀 하셈 ㅋㅋ 교수들이 제일 좋아하는 언어
"리눅스를 C++로 만들었다는 바보의 장황한 글"
이렇게 C++을 기준으로 삼는 책 하나만 본 애들이 제일 무서움
결함투성이 병신언어 std::async std::move
리눅스 c++ ?
ㅋㅋ
한국이 C++이 아닌 자바 투성이가 된 이유는 "빨리빨리" 문화 때문임. 메모리 관리 귀찮아, 복잡한 문법도 귀찮아, 유지보수 시간 많이 드는 건 못참마..... 이러니까 닥치고 자바 올인이 됨. 최근 국내에서 자바의 뒤를 이어 파이썬 광풍이 부는 이유도 바로 이 빨리빨리 문화 때문임 닥치고 개발속도 빨리빨리, 유지보수도 빨리빨리 이러니까 국내는 죄다 자바와 파이썬 투성이일 수밖에....
그게 그시기하네
국내 개발 시장의 주류가 자바를 쓰는 웹이고 effective해야 할 코어조차 자바로 퉁치는거에 진저리가 난 건 알겠습니다. 그래도 글 제목에는 어폐가 있어보입니다.
원래는 그게 아니었는데... C++,14,17,20으로 발전하면서 어떤 새로운 프로그래밍 컨셉들이 들어가고 다른 언어에 영향을 줬는지에 대해서 쓰고 싶었는데 글 쓰다보니 내용이 산으로 가버렸습니다. exception처리, Mixin, C++11의 RAII까지... => 이게 java에 try with resource 같은 걸로 영향을 미췄죠.)
말씀하시고자 한 바는 잘 이해했습니다. 재밌는 글 감사합니다.
C++14,17로 이어지면서 tmp가 엄청 강조되고 있고.... 네트워크와 여러 비동기 처리가 추가되면서 executor 개념에 대해서 논의하고 있는데 아직 결론이 나오지 않았죠. 기타 시간관련 처리나 뭐 그런 것도 C++ 표준에서 깔끔하게 정리해서 다른 언어에도 영향을 미치지 않을까 하는 생각입니다. 함수화 프로그래밍 문법도 논의되고 있고 static reflection도 논의 중이라고 합니다. C++표준함수들이 모두 class화 되고 있다는 것은 오히려 C++이 뒤늦게 따라가는 것으로 보이구요...
뭐야 국비 땔깜갤인줄 알았더니 고수들 있었네
ㅇㅈㅇㅈ
자바스크립트미만잡 - dc App