개발관련 개념정리

게임 서버 개발시 C기반 언어(C,C++) VS java 에 대한 생각

devMarco 2018. 9. 10. 23:55

C계열 언어(C,C++) VS 자바에 대한 고찰

게임 서버 엔진을 설득하면서 시중에 나온 제품들을 검색해보니,
90% 이상의 제품들이 C 계열 언어로 개발됐고, C 계열 언어만 지원하는 엔진이었다.

이런 특징은 데이터베이스 제품을 검색할 때에도 발견했었다.

성능이 매우 중요한 제품들은 결국 C 계열 언어로 개발해야만 하는 것일까?
C와 자바에는 어떤 차이점이 있기에 이런 현상이 발생했을까?


아래 사이트들을 참고하고, 내 코딩 경험과 빗대어 생각해봤다.

오키에서의 토론

위키 자료 - C++ vs java

노프 팀장님의 글


1. 메모리 할당 방식

자바는 메모리 공간을 할당받은 뒤, Garbage Collector를 이용하여 자동으로 메모리를 관리한다.

C 언어는 포인터를 이용하여 프로그래머가 직접 메모리 공간을 할당받고, 반납한다.
단, C++에서는 스마트 포인터를 지원하여 GC와 유사하게 자동으로 메모리를 반납하도록 하였다.
(메모리를 반납하지 않음으로써 오는 잦은 실수 및 버그를 방지하기 위함) 

초창기에는, 자바는 자동으로 메모리 관리! C는 수동 관리! 개념으로,

마치 자동차의 오토매틱과 수동 기어의 차이처럼 생각했다.
하지만 C++에서도 자동으로 메모리를 관리할 수 있는 방법이 생기면서 
자바는 자동이요, C는 수동이라고 주장할 수는 없다.

다만 C는 수동으로 메모리를 컨트롤할 수도 있다고 생각하면 될 것 같다.

-> 글쎄? 자바에서도 포인터를 구현해서 쓸 수는 있겠으나... 포인터 고민 없이 
빠르게 객체를 찍어내 구동하는 자바의 객체지향 철학과는 맞지 않는듯.

2. 컴파일 방식

* C++은 보통 기계어로 직접 컴파일되고, 이를 운영 체제가 실행한다. 자바는 보통 바이트코드로 컴파일되고, 자바 가상 머신이 인터프리터 방식으로 실행하거나 
JIT 컴파일러 방식으로 기계어로 컴파일한 다음 실행한다. 

이론상 동적 재컴파일은 두 언어 모두에 적용할 수 있으며 특히 자바에 유용하다. 하지만 현재 동적 재컴파일은 거의 쓰이지 않게 되었다.


3. low-level의 접근

C++은 특정 메모리 위치에서 커널 데이터를 조작할 수 있다.
하지만 저수준 접근을 잘못한다면 프로그램에 크래시가 발생할 가능성이 높아질 것이다.
- 큰 힘에는 큰 책임이 따른다.

자바는 JVM 위에서 동작하기 때문에, 커널 데이터를 조작할 수 없다.


4. 언어별 성능 비교 및 결론


위 사이트에서 프로그래머들이 각 언어별로 동일한 벤치마크 과제를 구현하여, 
언어의 성능을 비교하였다.

결과를 보니 C 계열 언어들이 높은 성적을 보여주지만, 항상 1등을 하지는 않았다.
그래도 java는 항상 이겼다 -_-;;; 자바의 굴욕;;

확실히 성능에서는 C언어보다 자바가 밀리는 경향이 있다.
하지만 자바가 추구하는 가치는 쉬운 코딩으로 인한 생산성이라고 생각한다.

자세한 내용은 직접 서버 코딩을 해보면서 생각해보아야 할 것 같다.
항상 우월한 언어는 없음을 명심하자.