C++ native 개발자에게도 생산성 문제때문에 스크립트 언어를 하나 정도 배워두면 좋다.

나는 개인적으로 파이썬을 선호한다. 기존 레거시 시스템들 중에서는 Perl이나 Erlang 등을 사용하 것들이 있지만, 최근 새롭게 시작하는 프로젝트에서 스크립트 언어를 선택하라면 파이썬을 선택하겠다.

특히 2.7 버전. 다행히 2.7 버전의 지원은 2020년까지로 연장되었다.


여하튼 파이썬으로 개발할 때 내가 바라는 파이썬 IDE의 기능은 다음과 같다.

  • breakpoint
  • syntax highlighting
  • callstack
  • 인텔리센스 기능(있으면 좋은 기능)

개인적으로 몇가지 IDE를 사용해 보았지만, 그닥 만족스러운 결과를 얻지는 못했다.
그래도 회사에서는 Komodo를 구매해서 사용하였다.
최근 다시 관련 도구를 사용하면서 PTVS(Python Tools for Visual Studio)가 2.x로 버전업한 것을 알게되었다.

PTVS는 생각보다 많은 기능을 제공한다.
  • CPython 이외에도 윈도우라서 IronPython까지 지원한다.
  • 장고앱 개발 가능.
  • 성능 프로파일링.
  • 원격 리눅스/맥 디버깅을 지원한다고 한다.(테스트 해보지 못했다.)
  • VirtualEnv를 지원하여 특정 버전의 파이썬으로 작성중인 코드를 테스트할 수 있다.

IPython 코드를 실행한 VSIPython 코드를 실행한 VS




나의 조합은 VS + PTVS+Anaconda이다.
  • PTVS 홈페이지: http://pytools.codeplex.com/
  • Anaconda: https://store.continuum.io/cshop/anaconda/
    • 아나콘다 패키지는 [User's Home]\Anaconda 폴더에 설치된다. 
    • conda.bat를 이용하여 conda와 ipython을 최신 버전으로 업데이트 한다. conda.bat는 Scripts 폴더에 있다.
      • conda update conda 실행
      • conda update ipython 실행
  • VS를 실행한 후 Tools>Options>Python Tools>Environment Options에서 방금 설치한 아나콘다의 파이썬 경로를 추가한다.
  • IPython을 사용하고 싶다면 Interactive Options에서 Interactive Mode를 Standard가 아닌 IPython으로 변경한다.
  • 참고) IronPython: http://ironpython.net/

몇가지 핫키
  • 파이썬 환경 창: Ctrl+K, `
  • 인터랙티브 파이썬 창: Alt+I
  • 선택된 코드를 인터랙티브 파이썬 창으로 보내기: Ctrl+E, Ctrl+E
  • 편집창 코드를 인터랙티브 파이썬 창에서 실행하기: Shift+Alt+F5

기타 관련 문서 



Folly의 3월달 커밋에서 본 몇가지 사항 정리.


1.

gcc를 많이 사용하지 않다보니 __PRETTY_FUNCTION__을 깜빡할때가 많다.

이것은 signature까지 포함된 함수명을 넘겨주는 매크로이다.

VC++에서는 비슷하게 __FUNCTION__, __FUNCDNAME__, __FUNCSIG__ 등이 제공된다.


2.

VC++에서 테스트한 결과이다.

람다함수 내에서 __FUNCTION__을 사용하면 "원래함수::<lambda_{hash hex}>::operator()"가 전달된다.


3.

결국 저 커밋은 간단하게  NULL체크를 수행한 후, NULL이면 예외를 던지는 코드이다.


char * pTest = nullptr;
int i = pTest ? 1 : [] {
         throw logic_error(" null point");
         return 0;
     } ();


람다함수식 뒤의 ()는 람다함수를 바로 호출하는 것을 의미한다.



4.

NULL을 nullptr로 사용하기.


5.

대소문자 구별하지 않는 알파벳 비교.

보통은 주어진 문자를 대문자 또는 소문자로 변환해서 같은지를 비교한다.

그런데 folly에서 개선한 방법은 비트연산자를 이용하는 것이다.

결국 영문 알파벳의 경우 대소문자가 처음 4비트값만 다르다. 0x4?/0x5?이면 대문자, 0x6?/0x7?이면 소문자영역다.

개선된 알고리즘은 다음과 같다.


struct AsciiCaseInsensitive {
  bool operator()(char lhs, char rhs) const 
  {
    char k = lhs ^ rhs; 
    if (k == 0) return true;// 같은 글자였다면 XOR연산값이 0일 것이다.
    if (k != 32) return false; // 만약 대소문자가 다르다면 XOR연산값이 32가 되어야 한다.
    k = lhs | rhs; // 32가 되더라도 특수문자 영역일 수 있으므로 OR연산을 수행한다. 이제 K는 무조건 소문자로 변환된다.
    return (k >= 'a' && k <= 'z'); // 변환된 글자가 알파벳 소문자 영역인지 확인한다.
  }
}

테스트케이스 주석문에 따르면 예제 텍스트에 대해 기존의 toupper()를 사용하는 방식은 9.04초가 걸린 반면 이 방식은 2.96초가 걸려 시간이 1/3로 단축되었다.

+ Recent posts