게임업계 뿐만 아니라 c++이나 네이티브에서 예외처리 쓰는 산업이 있나?
애초에 예외처리는 현대의 언어 기능 디자인 중에서 가장 실패한 쓰레기 같은 문법임
제로코스트라고 하더라도 예외처리가 오버헤드가 있건 없건 사실 그건 크게 중요한게 아님.
게임 쪽에서는 오류를 잡는데 오버헤드는 크게 신경 안 씀.
애초에 그 무거운 그래피컬 디버거도 내부적으로 구현하고, 로깅도 쓰는데
퍼포먼스에 문제가 된다면 최종적인 배포판에서만 컴파일 안 하면 되는 거지
디버깅하는데 있어서 어느 정도의 퍼포먼스 저하는 크게 중요한 것은 아님
문제는 예외처리는 그냥 if로 처리하면 될 것을 프로그램 가독성을 떨어트리기만 하고 유지보수는 더더욱이 힘들게 하는 기능임
그리고 프로그래머가 자신이 원하는 범위 외의 상황을 미리 예상하고 코드를 짠다는 것부터가 그런 케이스가 몇이나 있을 지 궁금함
대부분은 프로그래머가 예측도 못했던 버그가 튀어나오지
또 게임 업계는 굉장히 보수적이고 입증되지 않는 현대 언어들을 아예 사용하지 않는데 실제로 소프트웨어가 하드웨어에 종속되어 있다 보니까 종종 있는 일임
시스템이 폐쇄적인 콘솔 쪽은 c++11 버젼도 강제로 써야하는 경우도 있음. 그래서 RTTI, 예외처리, 대부분의 메타프로그래밍 기능들 전부 금지임
예외처리를 아예 안 쓴다고 하면 STL 컨테이너에서 내부적으로 던지는 예외처리는 어케하냐? 라고 물어보면 게임 쪽 에서는 STL도 안 씀
컴파일 시간이 길 수 밖에 없는 네이티브에서 예외처리는 절대로 성공할 수 없는 모델이다. 실시간 디버깅이 중요한 거지
"게임 쪽 에서는 STL도 안 씀" EASTL: ?
내장 c++ 스탠다드 라이브러리 말하는 거임
넥슨에서는 표준 STL 잘만 쓰더만 무슨
STL은 씀... 콘솔쪽도 랩핑해서 쓰더라고
서드파티 c++ 주도하는 언리얼엔진 자체가 stl을 안 쓰고, 쓰지말라고 권고하고 있는데. 자체엔진 만드는 회사들은 EA, 유비 죄다 지들 자체STL 쓰지. 유일하게 STL 쓰는 애들이 크라이 쪽하고, 럼버야드임
"프로그래머가 자신이 원하는 범위 외의 상황을 미리 예상하고 코드를 짠다" 이걸 보면 예외의 개념이나 동작에 대해 좀 오해를 하는 것 같다. 예외가 의미 있는 건 우선 정상 흐름과 구분되는 분기를 명시할 수 있다는 거고, 메서드의 반환 값 또한 예외 상황과 분리해서 명확히 한다는거다. 위에서 가독성을 떨어뜨린다고 if로 처리하라고 했는데, 예컨대 프레임워크 위에서 돌아가는 비즈니스 코드 같은 거 스택 트레이스는 50 계층 쯤은 우습게 넘어간다. 그걸 다 if로 처리한다면? 프레임워크, 라이브러리 마다 반환값에 사용하는 예외 코드 같은 건 다 다른데 그 때마다 변환하고 if 처리해서 로그 남길까?
프로그램의 분기를 try catch 하는 것부터가 말이 안 되고, 문법에 코드가 종속적이게 되는 건데 말이 되는 소리를 해야지. 그리고 프레임워크와 라이브러리의 함수마다 반환이 다르다고 하는데 래핑이 괜히 있는게 아니지? 그리고 라이센스에 따라 다르겠지만, 서드파티 라이브러리를 수정할 수 있으면 직접 하면 되는 거고
위에도 적었지만, 니가 근본적으로 예외에 대해 오해를 하고 있는 거다. 니 생각처럼 예외라는 걸 쓴다고 호출하는 쪽에서 무슨 오류 발생할지 미리 알아서 일일이 try catch해서 분기해야 하고 그런게 아니야. 그리고 래핑이니 소스 수준에서 라이브러리를 고치느니 하는데, 한 번 라이브러리 의존성은 우습게 100개 넘어가고 호출 스택 50 단계 씩 되는 코드에서 한 번 해보면 그게 왜 말이 안되는지 알거다. 특정 분야에서 통용되는 상식이 다른 분야에서 다 성립하는 건 아니야.
또 예외는 정상 실행 분기를 자동으로 끊어주는데 그걸 일일이 각 계층에서 if로 나눠야 한다면? 어떤 메서드 내부 어느 코드에서 예외가 발생하면 그 시점에 코드는 호출자로 튕기고 더 실행되지 않는다. 호출 계층이 50개라도 알아서 다 튕김. 그걸 일일이 if 처리 하는 것도 일이지만 만일 빼먹으면? 그럼 예컨대 특정 값을 가져올 때 오류가 생겼는데 튕기지 않아서 그 구문 아래 그 값을 가지고 수행하는 다른 줄에서 또 다른 오류가 생기는 식으로 파생 오류가 줄줄이 생길 수 있다. 예외는 반환값과 다르게 정확하게 어느 호출 계층의 몇 라인에서 무슨 문제가 발생했는지 정보를 제공해주는데, 위와 같은 경우엔 답이 없다.
평소에 모오던하지 않은 틀딱 C++이라고 뭐라 하던 사람들이 조용한게 신기함
그리고 게임 업계는 기본적으로 유지보수가 상대적으로 크게 안 중요하고 (비즈니스 시스템은 십 년 넘게 여러 명이 유지 보수하는 경우가 흔한데 게임 타이틀은 보통 발매하고 잠깐 패치하면 끝나니까) 반면 성능에 목숨을 거는 측면이 있다. 그러다 보니 예외 아니라도 기본적으로 유지보수 위한 복잡한 프레임워크니 설계 패턴이니 그런 거 기피하는 경향이 있음. 그런 동네에서 예외를 잘 안 쓴다면 그건 그 동네의 특수성을 감안한 관행이라고 봐야지 언어의 개념이 구리다고 해석하는 건 잘못이라고 본다.
게임 업계에서 유지보수가 안 중요하다는 건 말도 안 되는게. 소프트웨어의 생명주기가 상대적으로 짧은 패키지게임의 경우에도 더 이상 DLC나 부속 판매 때문에 발매를 하고 손을 뗄 수가 없다는게 문제다. 그리고 현대 어느 게임회사도 밑바닥에서 게임을 만드는 회사는 없음. 기존에 만들었던 프레임워크나 작업 코드들, 에셋 모두 재활용해서 만들지. 그런 코드에 과감하게 모던 c++이나 예외처리, RTTI를 넣는다? 동네 관행이 아니라, 게임업계 전반적으로 예외처리를 죄악시한다. 임베디드에서 oop를 쓰겠다는 거랑 비슷한 소리인데
그리고 복잡한 설계 패턴을 기피한다고 니가 말했지만. 이미 게임업계는 이미 획일화된 게임로직이나 엔진 패턴을 갖고 있으니까 의미가 없지. 게임 업계에서 무슨 깃갤처럼 뽕에 취해서 프로그래밍의 패러다임이 나뉘어서 자기가 옳다고 하는 줄 아냐? 오로지 ecs 하나로만 통일되어 있는데
상대적인 이야기야. 어셋 재활용은 완전 다른 이야기고, 기본적으로 개발 방법론이니 이런 저런 설계 기법이니 그런 건 보통 백오피스 같은 거 십 년 넘게 유지보수 하는 게 일상인 동네에서 나온게 예외가 아니다. 그런 동네하고 같은 팀에서 예전 프로젝트 끄집어 내서 소스 차원에서 부분적으로 갖다 쓰는 건 차원이 다른 이야기지.
애초에 왜 ECS 같은 걸로 천하 통일 했는지는 생각해봤음? 극단적으로 말하면 함수형이고 DI고 FPS 안 늘려주는 거면 관심없고, 다 겉 멋이란 식의 인식이 있으니까 그런 측면도 있지. 니가 "뽕"이라고 무시하는 패러다임이 그런 부류고.
"동네 관행이 아니라, 게임업계 전반적으로 예외처리를 죄악시한다"라는데, 그게 바로 동네 관행이란 소리야; 게임 말고도 소프트웨어 분야가 얼마나 다양한데 그러냐? C++ 같은 언어가 게임 개발만 하라고 만든 것도 아니고. 그리고 게임 동네야 말로 이런 저런 국룰이 많다. 엔진이나 MMOG 서버 개발 같은 건 어떤지 모르겠다만 게임 엔진 가지고 하는 개발 동네에선 극단적으로 소프트웨어 공학 관행 같은 거에 무지하거나 무시하는 성향이 있는데, 그건 그 동네가 특이한 거지, 그런 개념들이 후진게 아니다.
님 예외 안써봤죠
이건 뭔 개소리야.. 그럼 스택 한꺼풀 벗길때마다 If로 분기처리 해야돼?
우리게이는 10년에서 왔노 - dc App
이건 뭐하는 샊기임ㅋㅋㅋㅋㅋㅋ