2012년 12월 3일 월요일

[프로그래머 유머] C Perl GNOME Java

왠만한 프로그래머라면 고전 유머로 이해될 만한 내용이겠지만, 이 글은 비 프로그래머 일반인 혹은 현대적인(?) 프로그래머를 위해 그냥 풀어보는 썰이다. ;-)

원래 유머는 이렇다.
프로그래머가 소매치기를 당하면 이렇게 말한다고 한다:
"C Perl GNOME Java" (씨 펄 그놈 자바)
발음을 보면 일반인도 무슨 말인지 잘 알 수 있을 것이다. "씨X 그놈 잡아!" ... 하지만 왜 저런 단어들을 쓰는지는 모르는 사람이 더 많을 것이다.

각 단어를 하나하나 풀어보자.

C (C Programming Language)

C는 프로그래밍 언어 중 하나로 지금은 크게 쓰여지지 않고 있다. 거의 뭐 '구세대 유물' 취급일지도 모른다.

C언어는 함수와 구조체, 포인터와 동적 메모리 할당 등을 지원하는 절차형 언어이다. 요즘 처럼 OOP나 함수형 언어와는 다른 2세대 언어인데, 어셈블리(Assembly) 언어의 난해함을 해결하여 사람이 좀 더 인식하기 편한 문자형 언어화가 주된 특징이라고 생각한다.

여전히 하드웨어와 밀접하거나 속도를 요구하는 프로그램을 작성하기 위해서는 필수적으로 쓰여지고 있다. 윈도우 등의 OS의 핵심인 커널(Kernel) 또한 C 위주로 구현되고 있다. 위에서 크게 쓰여지지 않는다고 했느데 이는 표면상의 이야기로 사실은 아직도 많이 쓰이고 있다. 정말 많이 쓰인다!!

결론적으로 하드웨어를 다루는 분야에 있어서 가장 우선시 되는 언어이다. 또한 그 만큼 코딩을 잘못하면 시스템이 위험해지는 무시무시한(?) 언어이기도 한다.

일반적으로 기계어나 어셈블리어가 1세대 언어라면 그 보다 사람이 이해하기 쉽기 때문에 2세대 언어 등등으로 불리기도 한다. 기준에 따라서 3세대로 가기도 하지만...

C는 포인터(Pointer)라 불리우는 연산자 겸 개념 때문에 악명이 높긴 한데, 솔직히 익숙해지면 별거 아니다. 아니, 포인터는 굉장히 소중하다. 어셈블리어 부터 공부를 시작한 사람이라면 포인터가 없다는 건 있을 수 없는 일일 정도로 중요한 것이니깐.

구세대 유물이라 칭하는 건 더 이상의 C언어 능력자(?)가 국내에서 양산(?)되지 않고 있기 때문이다. 내가 대학을 다닐 때만 해도 C는 모든 학문에서 쓰이는 대표 프로그래밍 언어였지만 지금의 대학 전산학과에선 그 어디서도 C를 아예 가르치지 않거나 맛만 보는 수준으로 교육하고 있다. (아마 전자과에서는 아직도 쓰이고 있을거라 생각된다)

OS(커널)이나 임베디드 분야 등에 관심이 있다면 반드시 익혀두자.

Perl

Perl 또한 프로그래밍 언어 중 하나이다. 주로 스크립트 제작에 많이 쓰였는데 컴파일 과정이 필요없이 코드를 바로 실행시킬 수 있기 때문에다. (주. 이런 경우를 인터프리터 언어라고 표현하기도 한다)

C 같은 2세대 언어에 비하면 굉장히 문법이 간단하면서도 다양하고 굉장히 많은 라이브러리 모듈을 제공한다. 그래서 복잡한 일을 C보다 훨신 적은 양의 코드로 구현해 내는 것이 가능하다.

스크립트 언어들의 특징이겠지만, 이런 언어들은 C에 비하면 엄청 느리다. 컴파일 과정도 없어서 코드를 읽어서 분석하고 실행하는 과정이 포함되서이기도 하겠지만, 그 외에 자동(?) 메모리 관리 혹은 다양한 범용 자료구조 등 코딩의 편리성을 제공하기 위해 펄 엔진 내부에서 많은 작업을 처리한다.

다만 현대적인 추세를 볼 때 스크립트 언어는 대세이다. C에 비하면 느리지만 덕분에 개발 속도가 빨라졌다. 나머지 약점인 퍼포먼스는 하드웨어를 좋게 함으로써 우회적으로 해결하는 경향이 강하다. 어차피 개인용 PC도 퍼포먼스가 너무나 좋아져서 퍼포먼스 문제로 딴지를 걸기에는 힘든 세상이다.

Perl은 정규표현식 즉 텍스트를 분석하고 이를 변조하는 것에도 상당히 특화되어서 이런 분야에서도 많이 쓰인다. 물론 지금은 굉장히 다양한 분야에서 활약하고 있다.

Perl은 기호에 따라고 선호도가 굉장히 갈린다. 참고로 나는 PHP와 함께 '$' 기호가 많이 쓰인다는 이유로 싫어하는 언어이다. ('$'는 '돈'이라는 의미가 아니다!) 그 외에도 이상한 구루(guru) 들의 이상하고 변태적인 코드에 치가 떨린 적도 있다. -_-;;;

이런 부문(스크립트/인터프리터 류)에서는 Python이나 Ruby와 경쟁상대라고도 할 수 있다.

하여간 이런 펄이나 파이썬, 루비 등의 스크립트 언어는 개발 뿐만 아니라 개인적인 용도의 스크립트로써 활용하기 좋다. 공부하기도 쉽고 알아두면 여러 곳에서 써 먹을 수 있을 것이다.

GNOME


굳이 스크린샷을 우겨 넣을 정도로 이 GNOME(그놈) 이라는 녀석은 다른 단어들과는 많이 다르다. 위 화면이 바로 최신 그놈3의 화면이다. 리눅스를 써 보지 않은 개발자도 많아서 이 단어는 프로그래머라도 생소할지도 모른다.

GNOME은 GNU Network Object Model Environment의 약자인데 뭔가 이해 할 수 없을 것이다. 단순하게 말하자면, 윈도우 같은 OS의 겉모양을 만들어 주는 프로그램이다. 리눅스 같이 전용 그래픽 데스크탑이 없는 OS에서 데스크탑 환경을 만들어 주는 소프트웨어라는 말이다.

GNU는 'GNU is Not UNIX' 라 불리는 어이없는 말의 약자이다. 그런데 의미 안에 의미가 있어서 이거 뭔 말인지 도저히 이해 할 수 없는게 사실 정답이다. 프로그래머라면 Recursive 라는 표현은 많이 들어봤을 건데 바로 그 의미와 비슷하다. 재귀적인 개념을 통해 참 프로그래머 답게 이름을 지었다. -_-;;; 하여간 GNU의 의미는 주로 공짜(?) 혹은 오픈소스 UNIX 라고 표현하기도 하는데 비슷한 말이긴 하다.

리눅스나 UNIX에는 그래픽 UI(데스크탑)를 제공하기 위한 X11 혹은 오픈소스 버전 X-org 서버가 탑재되고 이 X서버와 연동되는 껍데기(GUI)로 구성된다. 그래서 리눅스에는 데스크탑이 한두가지가 아니였다. 과거 KDE(K Desktop Environment)와 그놈 사이의 경쟁이 제법 있었는데 이는 QT와 GTK 사이의 경쟁이기도 하였다. 뭐 그런 사이다. -_-;;; 참고로 나는 그놈이 너무 무거워서 가벼운 윈도우메이커나 XFCE를 종종 사용하였지만...

QT나 GTK는 X서버에서 동작하는 GUI 프레임워크이다. QT는 라이센스 문제 때문에 한 때 훅 가기도 했지만 다시 제대로 오픈소스로 돌아온 듯 하지만 난 리눅스를 더이상 사용하지 않기 때문에 최근에는 어떻게 되었는지 전혀 모르겠다.

리눅스를 쓰지 않는다면 그냥 이런게 있었다 라고 생각하고 넘어가면 된다.

Java

개발자라면 굳이 설명할 필요가 없는 범용 프로그래밍 언어. OOP를 제대로 성공시킨 사례이자 VM(가상머신) 방식을 통해 크로스플랫폼(즉 OS를 가리지 않고 같은 코드 동작이 가능)을 구현해낸 최초의 성공사례가 아닐까.

OOP(Object Orient Programming - 객체 지향 프로그래밍)는 절차형 구조와 비교되는 설계 및 코딩 방식 중 하나이다. 주로 실제로 하는 일을 순서대로 나열하는 방식으로 구성되는 절차형 언어와는 다르게, OOP용 언어는 객체를 디자인 하는 것을 중점으로 하는 언어이다.

뭐 좋아보이긴 한데, OOP는 대형 시스템에선 중요한 것일진 모르지만 소형 시스템에선 오히려 방해가 되는 요소이기도 하다. 소프트웨어 엔지니어가 없는 환경이라면 차라리 절차형으로 쫙 풀어버리는 것이 단순하기도 하니깐.

지금 대학의 전산관련과에서는 아마도 C를 밀어내고 이 자바라는 언어가 모든 학문의 기초 수단으로 사용되고 있을 것 같다.

현재로써는 너무나 많고 광범위한, 하지만 시스템에 밀접한 초고속 연산이 필요하지 않은 부분에 한정해서 가장 많이 쓰이고 있는 언어라고 생각한다.

하지만 난 Java를 광적으로 싫어하는 사람이다. Perl 보다도 PHP보다도 더 싫어하는 사람이다. 왜냐하면... 코드가 가로로 너무 길어져서..................... -_- (다만 Java보다도 더 싫어하는 C++이 존재한다 하하)

댓글 없음 :