C프로그래머가 알아야 할 것들 - 04 프로그램 언어

Posted by 엘키의 주절 주절 on January 10, 2002

왜 문법을 배워야 하는가?

한국어를 할 줄 모르는 독일인과, 독일어를 할 줄 모르는 한국인과 대화가 가능할까요? 바디 랭귀지로 하면 되지 않느냐는 분도 계시겠지만 그것도 어느 정도 한계가 있기에, 제대로 된 의사소통은 불가능할겁니다.

컴퓨터는 0과 1 (2진수)밖에 인식하지 못한다고 배웠습니다. 컴퓨터에게 명령을 내릴 때,

1
00001110 01010101

이런 식으로 모든 명령을 내려야 한다면 프로그램을 만드는 데에 드는 시간이 막대할 것입니다.

그래서, 기계어에서는 16진수 (2진수를 4개씩 묶어서) 표현하고 있습니다.

1
00001110 01010101 -> 0x0E55

2진수일 때보다 조금 나아졌지만, 과연 이걸로 프로그램을 만들 수 있을까요? 0x0E55가 무슨 뜻인지 알 수 있는 사람이 몇이나 될까요??

프로그램을 작성하는 사람이 이해하기 쉽고, 컴퓨터가 이해할 수 있는 언어가 필요했습니다.

그래서 나온 것이 어셈블리어였습니다. 어셈블리어로의 5와 6의 덧셈은 아래와 같습니다.

1
2
mov ax,5
add ax, 6

계산 결과는 ax레지스터에 담겨 있게 됩니다.

이진수나 16진수로 표현된 기계어보다는 어셈블리어가 이해하기 쉬웠지만, 규모가 큰 프로그램에는 적합하지 못했습니다.

게다가 어셈블리 언어는 기계어와 1:1대응이다 보니, 하드웨어에 종속적인 언어였습니다.

이 같은 문제들을 해결하기 위해, 프로그래머가 사용하기도 편하고 하드웨어에 상관없이 구동 될 수 있으며, 기능도(비교적) 우수한 구조 형 언어 (파스칼, 코볼, 포트란, C언어)등이 나오게 되었습니다.

프로그램 언어를 통해 컴퓨터에게 일을 시키기 위해선 어떻게 해야 할까요? “야 지금부터 시간 재라.” 혹은 “야 지금부터 음악 재생 좀 해봐.”

이렇게 컴퓨터에게 우리가 사용하는 말로 말하면 알까요? 컴퓨터가 알 수 있는 말로 해야 한다고 했는데 기계어로 말하는 건 사실상 불가능에 가까우니 프로그래밍 언어의 힘을 빌려야 합니다.

그 프로그래밍 언어에 해당하는 문법을 분석해주는 컴파일러도 만능이 아니다 보니, 자신이 알 수 있는 내용으로 말해주길 바라죠. 컴파일러가 이해할 수 있는 내용에 대한 규칙이 바로 문법입니다.

사용하는 프로그래밍 언어에 맞는 문법을 지켜야만 컴퓨터에게 원하는 일을 시킬 수 있기 때문에 문법에 대해 알아야 하는 건 당연하겠죠?

내가 이걸 배워서 과연 실전에 사용할 수 있을까?

많은 분들이 하시는 고민. 바로 그것이 과연 지금 배운 문법들로 프로그램을 만들 수 있겠는가 하는 것입니다. 결론부터 말하자면 “그렇다”는 것입니다.

왜 난 문법은 이해했는데 원하는 프로그램을 만들 수 없을까 하는 생각을 하시는 분들이 많은데, 그 이유는 프로그래밍에 대한 막연함, 프로그램을 구성하고 있는 기본 법칙이나 내부 원리에 대한 이해가 부족한 것 등의 이유가 있습니다.

프로그래밍에 대한 막연함이란, 입문서 혹은 문법 서에 나온 예제 정도만 작성해보았지, 실제 사용할 만한 프로그램 개발 경험이 전무하기 때문에 가지는 부담감이라 할 수 있을 겁니다.

추상화를 통해 이런 부분까지 알지 않아도 가능한 시대가 왔다는 사람들도 있지만, 여전히 이 것에 대한 이해는 중요합니다. 우리는 API를 사용함으로써 키보드 장치에 대한 직접적인 제어를 하지 않아도, 키보드 입력에 관한 정보를 얻을 수 있고, 어떤 식으로 화면이 점을 찍는지 내부원리를 알지 못해도, API에서 지원해주는 점 찍기 함수를 통해서 점을 찍을 수 있습니다. 이 것은 매우 유용하고 대다수의 프로그래머들이 이런 기능을 사용하고 있습니다. 그렇지만, 점을 어떤 식으로 화면상에 표시하는지에 대한 원리, 키보드 입력이 어떻게 하여 프로그램으로 메시지로 전달되는지에 대한 이해가 되어있는 사람과, 그렇지 않은 사람과의 실력차이는 분명합니다.

근본 원리를 알고 있는 사람은 좀 더 멀리 내다볼 수 있고, 신 기술에 대한 적응도 빠릅니다. 음악파일의 근본 원리를 아는 사람은, 새로운 포맷을 만들어 낼 수도 있고, 새로운 알고리즘을 만들어 낼 수 있고, 자신이 작성하는 프로그램을 구성할 때 사용할 효율적인 사용법을 알아 낼 수도 있지만, 원리는 모르고 라이브러리나, 컴포넌트 등에서 제공하는 함수의 사용법만으로 프로그램을 개발하는 사람은 그 함수가 지원하는 기능으로 프로그램을 구성하는 그 이상은 구현 불가능합니다.

프로그래밍을 잘하기 위해, 좋은 프로그램을 만들기 위해선, 프로그램 언어 이외에도 배워야 할 것들이 많고, 그것들을 놓치면 안 되겠죠?

최적화

프로그램을 만들 때에, 여러분이 생각하시는 최적화는 이 중에서 무엇인가요?

1
2
3
4
5
6
1. 유지보수가 쉬운 읽기 쉬운 코드
2. 빠른 속도
3. 메모리 사용의 효율
4. 유저 편의
5. 시스템 리소스 사용의 효율
6. 시간 투자 효율

최적화의 기준이란 프로그램에 목적에 따라 가장 중요하게 여겨질 것이 결정되는 것이지, 늘 우선되어야만 기준은 없습니다.

다만, 자신이 작성할 프로그램이 가지고 있는 특징을 잘 파악하여, 어떤 부분을 최적화 할지 정하는 것이 좋습니다.

예를 들어, 임베디드 프로그램에서의 최고의 가치는 주로, 빠른 속도와 메모리 사이의 효율이 중요합니다. 일반적인 응용 프로그램에서라면, 유지보수가 쉬운 코드와, 유저 편의 사이에서의 밸런스를 맞추는 것이 좋죠. 게임 클라이언트 프로그램이라면, 빠른 속도와 유저 편의를, 서버 프로그램이라면 메모리, 속도, 안정성이 중요하죠.

시간도 중요한 의미를 가질 때가 많습니다. 지금 당장 해야 할 일이 산더미인데, 발생 빈도가 매우 낮고 치명적이지 않은 버그를 잡기 위해 한 달을 투자 할 순 없습니다.

버그 없는 프로그램은 존재하지 않습니다. 완벽에 가까운 프로그램은 있어도, 완벽한 프로그램은 없습니다.

0.1%의 완성도를 향상 시키기 위해서, 10%의 완성도를 높일 수 있는 시간을 소요한다는 것은 비효율적이죠.

좋은 프로그램을 만들려는 노력은 프로그래머로서 당연한 과제이기에, 완성도를 높이려는 노력은 당연한 것이지만, 당장 눈앞에 놓인 문제 해결만을 생각하기 보다, 어떤 부분에 노력을 기울이는 것이 더 좋은 결과를 낳을지 고민해보는 것이 좋을 것입니다.

언어의 선택

지금 현재 가장 많이 사용되고 있는 언어로는 C (C/C++ 두 가지를 함께 지칭. C와 C++은 다른 언어이고, 다른 점이 굉장히 많지만, 여기서는 같은 의미로 사용하겠습니다)와 자바를 꼽을 수 있습니다. 여전히 델파이나, 비주얼 베이직도 많이 쓰이며, 웹 언어인 PHP, ASP, 스크립트 언어인 파이썬, 루아, 루비 등 다양한 언어가 있습니다.

모든 언어들은 각기 장, 단점이 있습니다. C언어는 메모리를 자유 자재로 다룰 수 있는 대신, 그 만큼의 위험 부담을 가지고 있고, 코딩의 자유로움을 가진 대신, 잘못된 코드가 작성 됐을 경우 코드 분석의 어려움 (유지 보수의 어려움)의 위험성을 갖고 있습니다. 자바는 JVM을 통해서 멀티 플랫폼 프로그램을 구현했지만, JVM이 지원하지 않는 Low Level 접근은 불가능 하고, C++에서 코드 분석에 어려움이나 오해의 소지가 있는 문법은 없앤 대신, 그 문법들이 가지고 있던 장점들도 함께 사라졌죠. 다른 언어들도 각기 장단점을 갖고 있습니다.

자신이 능숙한 언어로 프로그램을 작성할 때 얻을 수 있는 이점은, 새로운 언어를 습득하는 데에 걸리는 시간 단축, 익숙한 언어 이기에 새로운 언어를 사용할 때 실수가 발생할 여지가 줄어드는 장점 등이 있습니다.

하지만, 최적화를 위해서 어느 한가지 면만이 우선시 될 수는 없죠. 처리 속도가 우선시 되는 프로그램에서 비주얼 베이직을 사용하거나, 웹 언어로 화면 전환이 잦은 채팅 프로그램을 작성 하거나, 스크립트 언어로도 작성할 수 있는 문자열 해석기를 어셈블리어로 만들거나 하는 것들은 비효율적인 일입니다.

언어는 구현을 위한 도구이지, 언어 자체는 프로그래밍에서 중요한 가치가 아닙니다. 한가지 언어만 잘해서는 여러 가지 상황에 유연하게 대처하는 것이 불가능하기에, 특정 언어를 능숙하게 다루는 것은 매우 긍정적인 일이지만, 특정 언어에만 집착해서 만드는 프로그램의 완성도를 떨어뜨리는 일은 없어야겠습니다.