[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계Sungkyun Kim
이미 많은 개발자들이 C#의 장점을 누리고 있으나, 본 PT에서는 높은 성능과 생산성을 동시에 달성하기 위해 C/C++로 개발된 native 게임 코드에 스크립트 언어로서 C#을 통합 할 수 있는 방법을 제시한다. 이를 위해 오픈소스 .Net 프레임웍인 Mono의 사용방법과 모바일 플랫폼에서의 특이사항들을 자세히 설명한다.
또한, C/C++언어에 C#을 비롯한 다양한 스크립트 언어를 효율적으로 혼합하여 게임을 구현할 수 있는 아키텍처를 제시한다. clang과 reflection을 이용하여 서로 다른 언어 간 인터페이스 노출을 자동화하고, 게임 내 오브젝트의 생명주기를 자동으로 관리할 수 있는 기법에 대해 설명한다.
여러 언어에서 null 안전성을 주요 마케팅 쟁점으로 내세우면서 null 안전성이 관심을 많이 받고 있습니다.
자바에서도 null을 잘 다루어야 소프트웨어 결함을 줄이고 견고하게 만들 수 있는데 null의 위협에서 코드를 안전하게 지키는 설계 지침을 정리하고 안전하다고 확인하는데 도움이 되는 도구를 소개합니다.
boost라이브러리 중에서 가장 많이 사용하는 기능인 BOOST_FOREACH()와 shared_ptr의 내부 구조를 분석합니다. 그리고 boost의 내부 구현에 사용된 이 기능을 프로그래밍에 응용하는 방법을 제시합니다.
* BOOST_FOREACH 구조 분석 및 응용
* shared_ptr 구조 분석 및 응용
여러 언어에서 null 안전성을 주요 마케팅 쟁점으로 내세우면서 null 안전성이 관심을 많이 받고 있습니다.
자바에서도 null을 잘 다루어야 소프트웨어 결함을 줄이고 견고하게 만들 수 있는데 null의 위협에서 코드를 안전하게 지키는 설계 지침을 정리하고 안전하다고 확인하는데 도움이 되는 도구를 소개합니다.
boost라이브러리 중에서 가장 많이 사용하는 기능인 BOOST_FOREACH()와 shared_ptr의 내부 구조를 분석합니다. 그리고 boost의 내부 구현에 사용된 이 기능을 프로그래밍에 응용하는 방법을 제시합니다.
* BOOST_FOREACH 구조 분석 및 응용
* shared_ptr 구조 분석 및 응용
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
이 발표는 이전에 발표했던 내용에서 일부 사례 추가 및 최신 내용으로 갱신한 버전입니다.
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
Let's make APM by instrumenting Nodejs through the knowledge gained through tracing. Creating clues that facilitate tracking becomes a milestone for latecomers, like a snow-footprint.
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Item 14 : Declare functions noexcept if they won't emit exceptions. +윤석준
Item 15 : Use constexpr whenever possible. +이동우
Item 16 : Make const member functions thread safe. +제한재
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석GangSeok Lee
2014 CodeEngn Conference 11
DTrace를 보안 관점에서 활용해보자!
DTrace 프레임워크는 솔라리스 기반으로 개발된 동적 추적 프레임워크로 현재 Solaris, Mac OS X, BSD 등에 적용되고 있다. 프레임워크는 운영체제 개발 시점에 커널에 통합된 프레임워크로 사용자 및 커널 레벨의 다양한 정보(메모리나 CPU, 파일시스템, 네트워크 자원의 모니터링이나 특정 함수의 인자 추적 등)를 동적으로 분석할 수 있게 하여 애플리케이션 테스팅에 주로 활용되고 있다. 이러한 장점을 활용하여 최근에는 보안 관점에서 프레임워크를 사용하는 경우가 늘어나고 있다. 퍼징 모니터링이나, 바이너리 동적 분석과 같은 취약점 분석, 악성코드 동적 분석, 루트킷 개발이 한 예이다. 본 발표에서는 DTrace가 무엇인지 살펴보고, 윈도우의 filemon의 기능을 구현해보도록 한다. 이 발표를 통해 분석가에게 생소할 수 있는 Mac OS X의 바이너리 분석에 도움이 될 것이라 생각한다.
http://codeengn.com/conference/11
http://codeengn.com/conference/archive
The document discusses analyzing crashes using WinDbg. It provides tips on reconstructing crashed call stacks and investigating what thread or lock is causing a hang. The debugging commands discussed include !analyze, !locks, .cxr, kb to find the crashing function and stuck thread.
5. 생성자와 할당 연산자
The Big Three
소멸자, 복사 생성자, 할당 연산자
이중 하나를 정의하면 일반적으로 나머지도 따라온다.
기본 생성 함수 제어 (C++11)
class NonCopyable {
public:
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator = (const NonCopyable&) = delete;
};
5
6. const 메서드
객체의 상태를 변경하지 않음을 명시
논리적 관점에서 변화가 없는 경우 변경할 수 도 있음
mutable 키워드
6
7. mutable 키워드
Class HashTable{
int HashTable::GetSize() const {
// 성능을 위해 캐싱
public:
void Insert(const std::string &str);
if (mSizeIsDirty)
int Remove(const std::string &str);
{
bool Has(const std::string &str) const;
// Error!!
int GetSize() const;
mCachedSize = CalculateSize();
...
mSizeIsDirty = false;
private:
}
int mCachedSize;
bool mSizeIsDirty;
return mCachedSize;
}
};
7
8. mutable 키워드
Class HashTable{
int HashTable::GetSize() const {
// 성능을 위해 캐싱
public:
void Insert(const std::string &str);
if (mSizeIsDirty)
int Remove(const std::string &str);
{
bool Has(const std::string &str) const;
// OK!
int GetSize() const;
mCachedSize = CalculateSize();
...
mSizeIsDirty = false;
}
private:
return mCachedSize;
mutable int mCachedSize;
mutable bool mSizeIsDirty;
}
};
8
10. const 리턴 값
// return by value
std::string GetName() const
{
return mName;
}
// return by const reference
const std::string &GetName() const
{
return mName;
}
리턴값이 객체의 내부를 변경할 수
없으므로 안전
더 나은 성능
필히 const 선언 필요
리턴된 값의 수명주기 확인 필요
가급적 return by value를 이용하자
10
12. 암시적 인스턴스화
헤더파일에 템플릿 클래스의 구현 코드를 모두 포함
API 사용자가 원하는 어떤 타입이라도 인스턴스화 할 수 있음
구현 소스가 헤더에 모두 노출됨
12
13. 암시적 인스턴스화
소스의 노출을 최소화 하기 위해 헤더가 아닌 별도의 파
일에 구현
// stack.h
template<typename T>
class stack {
T Pop();
...
};
#include "stack_priv.h”
// stack_priv.h
template<typename T>
T Stack<T>::Pop() {
...
}
13
14. 명시적 인스턴스화
API개발자가 미리 지정해둔 타입만 생성 가능
// stack.h
template<typename T>
class stack {
T Pop();
...
};
// stack.cpp
template<typename T>
T Stack<T>::Pop() {
...
}
// 명시적 인스턴스화
template class Stack<int>;
template class Stack<double>;
template class Stack<std::string>;
14
17. extern template
// source2.cpp
#include "header.h“
extern template ReallyBigFunction<int>(); // 현재 오브젝트에서 인스턴스화 금지
void something2() { ReallyBigFunction<int>(); }
source1.o
void something1() void ReallyBigFunction<int>() // Compiled first time
source2.o
// No ReallyBigFunction<int> here because of the extern
컴파일 타임 감소
오브젝트 사이즈 감소
정적 lib 형태로 라이브러리 배포할때 lib안에서 쓰면 유용할 듯
17
18. 함수 기본 파라미터의 단점
class Circle {
public:
Circle(double x = 0, double y = 0, double radius = 10.0);
...
};
Circle c1();
// x만 입력하고 y는 없는 논리적 모순
Circle c2(2.3);
// 반지름이 변경되면 Client Code 재컴파일 필요
Circle c3(2.3, 5.6);
Circle c4(2.3, 5.6, 1.5);
18
19. 기본값 대신 함수 오버로드
class Circle {
public:
Circle();
Circle(double x, double y); // 반지름 정보가 cpp에 숨겨짐
Circle(double x, double y, double radius);
...
};
19
20. #DEFINE 상수 사용 금지
#define MORPH_FADEIN_TIME 0.3f
#define MORPH_IN_TIME 1.1f
#define MORPH_FADEOUT_TIME 1.4f
20
21. #DEFINE 상수 사용 금지
타입이 없음
#define MAX_VALUE 1 // 정수형
#define MAX_VALUE 1f // 부동 소수형
실수의 여지가 있음
21
22. #DEFINE 상수 사용 금지
범위가 없음
#define max(a, b) a > b ? a : b
class Array {
public:
Array();
int max(); // Compile error!
...
}
전역 네임스페이스를 오염시킴
22
23. #DEFINE 상수 사용 금지
접근 제어 불가능
public, protected, private 설정 안됨
항상 public
심볼이 없음
매크로는 전처리 과정에서 사라지기 때문에 디버깅 어려움
23
26. friend 사용 금지
class Node {
public:
...
friend class Graph;
private:
void ClearVisited();
void SetVisited();
bool IsVisited() const;
...
bool is_visited;
};
#include "node.h"
// 이름이 같은 별도의 Graph 클래스
Class Graph {
public:
void ViolateAccess(Node *node) {
// Graph는 node의 friend이므로
// private 멤버 호출 가능
node ->SetVisited();
}
};
26
27. friend 사용 금지
캡슐화의 구멍을 허용함 (여기까지 저자의 생각)
반면,
인터페이스는 전역에 공개되지만 friend는 한정된 공개이므로 더
캡슐화 될 수도 있음.
27
28. friend는 정말 나쁜가
class Node {
public:
...
friend class Graph;
private:
void ClearVisited();
void SetVisited();
bool IsVisited() const;
...
};
#include "node.h"
Class Graph {
public:
void ViolateAccess(Node *node) {
if (node -> IsVisited ()) {
……
}
}
};
28
29. friend는 정말 나쁜가
class Node {
public:
...
friend class Graph;
bool IsVisited() const; // 전역 공개
private:
void ClearVisited();
void SetVisited();
bool IsVisited() const;
...
};
#include "node.h"
Class Graph {
public:
void ViolateAccess(Node *node) {
if (node -> IsVisited ()) {
……
}
}
};
29
30. 더 나은 구조
#include "node.h"
// 이름이 같은 별도의 Graph 클래스
Class Graph {
public:
void ViolateAccess(Node *node) {
if (visited_nodes_.find(node) != visited_nodes_.end()) {
……
}
}
std::set<Node *> visited_nodes_;
};
30
31. 꼭 나쁘기만 한 건 없다
a : 어차피 멤버에 접근이 필요하다면 get/set 보다 낫지 않냐?
b : 하지만 애초에 그럴 수 밖에 없는 구조가 나쁜건 아닐까?
a : 그럼 구조를 뒤집어야 되는데?
더 나쁜 설계에서 더 좋은 설계로 개선해 가는 리펙토링의
중간 단계로서 의미는 있음. (개인적 의견)
31
33. CPP도 안전하지 않다
// 우리 라이브러리를 가져다 쓰는 Client Code.cpp
extern void FreeFunction();
extern const int INTERNAL_CONSTANT;
extern std::string Filename;
FreeFunction();
std::cout << "Constant " << INTERNAL_CONSTANT << std::endl;
Filename = "different.txt";
// 추가로 이름 충돌 문제도 있음.
const int MAX_VALUE = 100; // link time error!! (이름 중복)
33
35. 코딩 규칙
C++은 강력하지만 아주 복잡
C++을 잘 활용하려면 필요한 만큼 언어의 기능을 제약해야 함
복잡하지만 쓰고 싶은 만큼 덜어 쓸 수 있는게 장점
코딩 규칙의 첫 번째는 일관성
google c++ style guide
35
36. Refference
API design for C++, Martin Reddy
template : http://stackoverflow.com/questions/8130602/using-externtemplate-c0x
friend : http://ikpil.com/1036
36