- C++ 과 C# 의 차이점 정리

1) C# 정의 및 장점

마이크로소프트에서 C++ 는 Naive Language 라 하고, C# 을 Managed Language 라고 표현한 것을 읽은 적이 있다. 분명 C# 은 개발자 입장에서 더 강력한 기능을 손쉽게 제공하고, 또 버그가 날 가능성을 줄여주는 파워풀한 현대적인 개발언어임에는 분명하다.

2) C# 단점

하지만 글에서 언급한 것과 같이 컴파일 한 바이너리가 커지는 문제, C++ 에 비해 느린 실행속도 등을 고려해 볼때 임베디드 시스템 개발용 언어로는 부적합 하다고 생각된다. 아무리 임베디드 시스템의 하드웨어 성능이 점점 좋아지고 있다고 해도... 리소스를 1byte 라도 절약하고 속도를 1milli sec 라도 줄여야 하는 상황에서 소프트웨어 개발 레벨에서 부터 이런 방식으로 리소스를 갉아먹는 건 매우 좋지 않다고 본다.

3) 개발자 생각

내가 아는 어느 팀에서는 임베디드 시스템의 OS 로 Windows CE 를 쓰고, 개발 언어로 C# 을 쓰는데, 여러가지 고민 끝에 선택한 결과겠지만, 내가 볼때 이 결정은 개발자가 편할수는 있지만 소비자나 회사의 입장에서는 불리하다고 판단된다.

4) Windows CE 장점

Windows CE 라는 플랫폼 자체가 제품 당 OS 라이센스를 지불해야 하는 금전적 부담이 있으며, Windows CE 가Linux 에 비해 갖는 장점은 개발자에게 친화적이고 소프트웨어 호환성이 좋다는 점 등인데, 진지하게 원가를 고려해 보고, 또 소프트웨어 변화가 적은 임베디드 환경을 생각해 본다면 좀 힘들더라도 Linux 에서 사용자가 편리한 UI 를 개발해서 서비스 하는 것이 맞다고 생각된다.

5) C++, C# 비교

개발언어 역시 마찬가지로, C# 으로 개발을 하게 되면 개발자 입장에서 최신 언어를 사용한다는 만족감과 개발의 편리성은 증대되겠지만 제품 입장에서 보면 리소스와 퍼포먼스 측면에서 손해를 보게 된다. 추가로, 디바이스 드라이버나 연동부분의 legacy code 는 대개 C/C++ 로 되어 있어 호환성에도 문제가 생기게 된다.

6) 결론

결론은... 상용화 과제에 있어서는 개발자가 유리한 방향으로 개발을 해서는 안되고 사용자가 유리한 방향으로 개발이 진행되어야 하는데... 그것이 사실 쉽지 않다. 사실, 만약 Windows 개발에 익숙한 나에게 Linux 환경에서 개발해야 하는 과제가 주어지면 나 역시 불평 불만이 많을 것이다... ㅋㅋ

사실, 개발 난이도의 증가에 따른 개발비용과 리스크의 증가등도 분명 중요한 고려사항이 될 수 있다. 하지만 기술적인 어려움을 논외로 하고, 비지니스 측면을 진지하게 고려한다면 힘들더라도 항상 사용자 위주로 생각하면서 개발을 해야 할 것이다.


'기타 > 객체지향언어특징' 카테고리의 다른 글

추상화  (0) 2009.08.28
캡슐화  (0) 2009.08.28
상속  (0) 2009.08.28
다형성  (0) 2009.08.28

- TinyOS와 NesC

TinyOS는 미국 UC Berkeley 대학에서 개발된 무선 센서 네트워크를 위한 전용 운영체제 이다.

이름에서도 알 수 있듯이, TinyOS 기반의 프로그램들은 매우 작은 용량의 크기(대부분 30Kbytes 이하)로 컴파일되며, 무선 센서 노드의 일반적인 특징(최소한의 하드웨어, 작은 메모리, 낮은 CPU 성능 그리고 한정된 에너지)를 고려하여 최적화된 운영체제이다. TinyOS는 보다 편리한 프로그램 개발을 위해 클래스 형태의 컴포넌트(Componet) 구조를 가지는 NesC 언어로 구현되어 있다.

- NesC

NesC와 같은 컴포넌트 모델 언어는 여러 개의 컴포넌트 블록(Block)들을 컴파일 시 연결[와이어링wiring)]하여 하나의 애플리케이션 형태로 조합한다. 또한 센서 노드에 올라갈 하나의 애플리케이션을 위해, 꼭 필요한 라이브러리 및 커널 컴포넌트들만을 선택하여 컴파일하기 때문에 매우 효과적으로 코드 크기를 줄일 수 있다. NesC의 문법은 기존에 많이 사용되고 있는 C 언어와 비슷하지만 표 1-1과 같은 차이점이 있다.

표 1-1 NesC의 특징 분석

NesC 특징

형태

컴포넌트 기반

개발

기존 C에 비해 편리함 - 필요한 컴포넌트들만 연결해 주면 원하는 프로그램 작성 가능

동시성 모델 지원 - “Task"와 "H/W Event Handler" 두 스레드(thread) 사용

데이터 경쟁 조건 - 두 종류의 스레드 사이의 선점(preemption)으로 발생할 수 있는 데이터 경쟁 조건(data race condition)을 컴파일 시에 감지 가능

코드크기

매우 작음 - 소규모 임베디드 장비에 최적화

제한점

동적 메모리 없음

컴포넌트는 어려운 개념이 아니고, C++나 자바와 같은 객체 언어에서 사용하는 클래스와 비슷한 의미라고 생각하면 이해하기 편할 것이다. NesC에서 사용하는 컴포넌트 관련 용어들은 표 1-2에 기술되어 있다.

표 1-2 NesC에서 사용하는 용어

용어 및 내용

application

하나 이상의 컴포넌트로 구성되며, 실제 센서노드에서 실행 가능한 하나의 프로그램

interface

2개의 컴포넌트 사이를 연결하기 위해 정의된 포트로, 컴포넌트는 여러 개의 interface를 사용할 수 있으며, 이 interface를 이용하여 command 및 event가 처리된다. 두 컴포넌트 사이의 연결 통로(인터페이스)를 연결하는 것을 와이어링(wiring)이라고 한다.

component

component - NesC application을 구성하는 기본 블록으로, 컴포넌를 정의하는 configuration과 module로 구분된다.

configuration - 하나의 NesC application에 사용되는 컴포넌트들을 선언하고, 이들 간을 연결(와이어링)을 어떻게 정의할 것인가에 대한 기술한다. configuration도 하나의 컴포넌트로서 정의된다.

module - 새로운 컴포넌트의 동작 및 다른 컴포넌트들과의 연동을 실제로 구현하는 곳이다.

- interface 일반적인 형태

interface identifier {

command result_t function_name prototype

event result_t function_name prototype

}

identifier : 이 인터페이스를 제공하는 컴포넌트의 이름을 의미한다.

function_name : 이 인터페이스가 제공하는 함수 이름을 의미한다.

command, event : 인터페이스 형태

인터페이스의 선언형

command

event

command로 정의된 함수는 현 컴포넌트의 module 부분에 구현된 함수로서, 현 컴포넌트를 사용하는 상위 컴포넌트에서 'call' 명령을 통해 호출된다.

event로 정의된 함수는 현 컴포넌트를 사용하는 상위 컴포넌트에 구현되어야 하는 함수로서, 특정 인터럽트나 조건이 만족되었을 경우, 현 컴포넌트가 어떤 정보를 상위 컴포넌트에게 전달하기 위해 'signal' 명령을 통해 호출된다.

- 컴포넌트 일반적인 형태

configuration identifire{

prvoides{

interface interface_name1

}

}

implementation{

components identifierM, com1, com2 ...

interface_name1 = identifierM.interface_name1

identifierM.interface_name2 -> com1.interface_name3

com1.interface_name3 <- identifierM.interface_name2

}

identifier : 선언된 컴포넌트 이름을 의미하며, 그 안에는 현 컴포넌트에서 제공하는 인터페이스(interface_name1)가 선언되어 있다.

implementation : 현 컴포넌트에서 사용할 하부 컴포넌트들(identifierM, com1, com2...)이 차례대로 선언된다. 그 중 identifierM이라는 이름의 컴포넌트는 현 컴포넌트의 실제 구현 부분인 module 파일을 나타내고 있는 것으로 다른 하부 컴포넌트인 com1, com2와 구별된다.

와이어링 : 와이어링은 모듈 사이의 인터페이스 간 연결 방법을 나타내는 것으로, 그들 간의 인터페이스 이름이 같아야 한다. 컴파일 시 인터페이스 함수의 매개변수가 다음 조건에 해당하면 에러가 발생한다.

1. 매개변수가 정수가 아닌 경우

2. 한쪽의 인터페이스만 매개변수를 가진 경우

3. 매개변수 값이 원하는 값보다 크거나 작은 경우

4. 타입이 맞지 않을 경우

일단 와이어링이 되면 인터페이스에 정의된 command, event 함수의 사용이 가능하게 된다.

interface1 = interface2

2개의 interface가 같음을 의미하며, 양쪽 interface가 서로 같은 제공자이거나 사용자인 경우와 한쪽은 제공자이고 다른 쪽은 사용자인 경우를 의미한다.

interface1 -> interface2

interface의 구성 함수가 링크되어 있음을 의미한다. 즉, interface1에서 사용한 함수가 interface2에 구현되어 있음을 나타낸다.

interface1 <- interface2

interface2 -> interface1과 동일한 표기 방법이다.


1. 멤버 변수 표기법 : m_

2. 헝가리안 표기법

 접두어 의미 
 b BOOL 형 변수 
 d  double 형 변수
 h  핸들(HANDLE)형 변수
 n  int 형 변수
 p 또는 lp  포인터 변수
 sz  널(NULL) 문자로 끝나는 문자열
 u  unsigned int 형 변수
 w  WORD (unsigned short) 형 변수
 dw  DWORD (unsigned short) 형 변수 
 str  CString 형 변수
 clr  COLORREF

3. 윈도우에서 정의된 상수

상수  정의된 값 
 TRUE
 FALSE

4. 윈도우에서 정의된 데이터 형

 데이터형 의미 
 BOOL 논리형, TRUE 또는 FALSE 값만 가질 수 있습니다. 
 BYTE  8 bit unsigned 정수형
 DWORD  32 bit unsigned 정수형 
 LONG  32 bit signed 정수형
 LONGLONG  64 bit signed 정수형
 ULONGLONG  64 bit unsigned 정수형
 FLOAT  float
 LPARAM  32 bit 메시지 파라미터
 LPSTR  널 문자로 끝나는 윈도우 문자열의 포인터
 LPCSTR  널 문자로 끝나는 윈도우 문자열 상수의 포인터(const LPSTR)
 LPTSTR  널 문자로 끝나는 유니코드 또는 윈도우 문자열의 포인터
 LPCTSTR  널 문자로 끝나는 유니코드 또는 윈도우 문자열 상수의 포인터
 TCHAR  유니코드 또는 윈도우 문자
 UNIT  32 bit unsigned 정수형
 WORD  16 bit unsigned 정수형
 WPARAM  16 bit 메시지 파라미터
 COLORREF  R,G,B의 조합으로 표현되는 컬러를 표현하는 32비트 정수
 POSITION  리스트에 저장된 항목을 가리키는 포인터




'기타 > 코딩의 규칙' 카테고리의 다른 글

Namming Rule  (0) 2009.08.20

리버스(Recerse)와 엔지니어링(Engineering)의 합성어인 리버스엔지니어링(reverse engineering)은 줄여서 리버싱(reversing)이라고 한다. 또, 리버스엔지니어링을 하는 사람을 리버스엔지니어(reverse engineer)라고 부르지만 줄여서 리버서(reverser)라고도 한다. 보안 분야에서의 리버싱은 보통 소프트웨어 리버스엔지니어링을 의미한다.

리버싱은 영어 의미 그대로 풀이하면 거꾸로 분석하는 것을 의미한다.

리버싱과 디컴파일을 하는 것은 다른 개념이지만 국내 법률에서는 동일하게 프로그램 코드 역분석으로 규정하고 있기 때문에 리버싱은 소스를 복원하는 과정으로도 여겨지고 있다.

우리가 주변에서 보게 되는 소프트웨어의 인증을 깨는 크랙(crack)들은 이러한 리버싱 과정을 통해서 개발자가 자신의 프로그램을 보호하기 위해 만든 장치들의 허점을 찾아내어 우회하는 툴이라고 보면된다.

'기타 > 리버스엔지니어링' 카테고리의 다른 글

네트워크 기초적 명령어 및 DLL 인젝션과 API 후킹 정리  (0) 2009.08.19
올리디버거  (0) 2009.07.29
리버싱 관련 툴  (0) 2009.07.29

+ Recent posts