프로그래밍이란 무엇인가?

우리는 무엇을 다룰 것인가?
컴퓨팅의 전문용어에 대한 소개와 컴퓨터 프로그램의 구조에 관한 약간의 이야기와 간략한 개관.

BASICs으로 돌아감

컴퓨터 프로그래밍은 컴퓨터가 여러분이 원하는 일을 하도록 하는 기술이다.

가장 단순한 수준에서 그것은 일련의 명령어들을 컴퓨터에게 제시하여 목적을 달성하는 것이다. 마이크로소프트의 세계에서 도스 사용자는 BAT라고 부르는 명령어의 목록을 가진 텍스트파일을 작성하곤 했다. 이것들은 일련의 한 묶음으로 명령어들을 단순히 실행시켰다, 그러므로 그런 이름(BATCH)이 붙은 것이다. 여러분은 오늘날에도 여전히 윈도우 환경에서는 이런 것들을 만들 수 있으나 실제로는 많이 보이지는 않는다.

예를 들어 여러분은 (이 지침서와 같이) 많은 별개의 파일들로 구성된 문서를 만들수 있을지도 모른다. 여러분의 워드 프로세서는 각 파일들의 백업 복사본을 만들수도 있고 그렇게 새로이 만들어진 버젼을 저장한다. 하루 일과가 끝나고 여러분은 그 문서의 현재 버전(가장 최근의 모든 파일들)을 백업 디렉토리/폴더에 넣기를 원한다. 결국에는, 말끔히 정리하고, 모든 백업파일들을 지우고 다음날의 작업을 시작할 준비를 한다. 이런 일을 하는 단순한 BAT파일은 다음과 같을 것이다:

COPY *.HTM BACKUP
DEL *.BAK

만약 그 파일들을 SAVE.BAT 라고 부른다면 하루 일과가 끝나고 나는 도스 프롬프트상태에서 단순히 'SAVE'라고 타이프할 수가 있고 그 파일들은 저장되고 백업파일들은 삭제될 것이다. 이것이 프로그램이라고 하는 것이다.

Note: 리눅스 사용자나 혹은 다른 운영체제의 사용자들도 자신들만의 쉘스크립트Shell scripts라고 부르는, 이런 파일들의 버젼을 가지고 있다. 유닉스 쉘스크립트는 도스의 배치파일보다는 훨씬더 강력하며, 그리고 우리가 이 강좌에서 다루게 될 대부분의 프로그래밍 기술들을 지원한다.

다시 말해보자

여러분이 그것 때문에 약간 겁을 먹었다면, 위축되지 마라. 컴퓨터 프로그램은 단순히 명령어의 집합에 지나지 않아서 컴퓨터에게 특정한 작업을 어떻게 수행하는가를 지시해 줄 뿐이다. 그것은 오히려 조리법 같은 것이다: 특정한 요리를 하는 법을 요리사에게 지시하는 명령어의 집합같은 것이다. 그것은 요리재료(데이타)를 기술하고 그리고 요리재료들을 케이크나 혹은 다른 어떤것으로 변환하는데 필요한 각 단계(처리과정)를 기술한다. 프로그램은 개념상으로 대단히 이와 유사하다.

약간의 이야기

하나의 언어로 친구들에게 여러분이 이야기 하듯이 여러분은 컴퓨터에게 하나의 언어로 '이야기한다' 컴퓨터가 이해하는 유일한 언어는 이진binary파일이라고 부른다 그리고 몇개인가의 서로 다른 사투리들이 있다 - 그것이 바로 멋진 맥 프로그램이 여러분의 컴퓨터에서 작동하지 않으며 그 반대도 마찬가지가 되는 이유이다. 이진파일은 불행하게도 인간이 읽고 쓰기에는 대단히 어려워서 우리는 간접적인 언어를 사용해야만 하고 그것을 우리를 위하여 이진파일로 번역해야만 한다. 이것은 약간은 클린턴과 옐친이 정상회담에서 대화하는 것과 같다 - 클린턴은 말하고, 그리고는 통역사가 말하여진 것을 러시아어로 반복한다. 옐친은 대답하고 통역사는 또 다시 그 문장을, 이번에는 영어로 반복한다.

놀랍게도 우리의 간접언어를 이진언어로 번역하는 자를 또한 인터프리터라고 부른다. 그리고 여러분이 일반적으로 아랍어를 러시아어로 번역하는 자보다는 영어를 러시아어로 번역하기 위한 통역사가 필요한 것 같과 마찬가지로, 여러분은 베이직을 이진파일로 번역하는 자보다는 파이썬을 이진파일로 변환하기 위한 컴퓨터 인터프리터가 필요하다.

초창기의 프로그래머들은 실제로 이진 코드를 직접 입력해야만 했다, 이것을 일컬어 기계어 코드machine code라고 하며 믿을 수 없을 만큼 어렵다. 다음 단계는 이진 코드와 일대일 대응되는 영어를 이진파일로 단순히 변환하는 번역기를 만드는 것이었다. 그래서 코드 '001273 05 04'이 4에다 5를 더하라는 의미를 가진다는 것을 암기할 필요없이 프로그래머들은 이제 'ADD 5 4'라고 쓸 수 있게 되었다. 이 대단히 단순한 개선만으로도 삶은 더욱 편안해졌으며 이러한 코드 시스템들은 실제로 각 형태의 컴퓨터에 하나씩, 첫 번째의 프로그래밍 언어가 되었다. 그것들은 어셈블러assembler언어로 알려졌으며 어셈블리 프로그래밍Assembler programming은 오늘날 아직도 특별한 프로그래밍작업에는 사용되고 있다.

이것은 대단히 원시적이고 여전히 하드웨어 수준에서 컴퓨터에게 무엇인가를 하라고 명령함에도 불구하고 - 바이트를 이 메모리 위치에서 저 위치로 옮기고, 이 바이트를 저 바이트에 더하고 등등. 그것은 여전히 매우 어려웠고 쉬운 작업조차도 완성하기 위하여는 많은 프로그래밍 노력이 필요하였다.

점차적으로 컴퓨터 과학자들은 더 높은 수준의 컴퓨터 언어를 개발하여 일을 더 쉽게 처리했다. 이것은 또한 같은 시기에 컴퓨터 사용자들이 더 복잡한 일들을 만들어 내어 컴퓨터가 해결해야만 하였기 때문이기도 하였다! 컴퓨터 과학자들 사이에 이러한 경쟁이 계속되었고 사용자들은 계속해서 일을 만들어내고 새로운 언어들이 모습을 나타나고 있었다. 이것으로 인하여서 프로그래밍은 재미있어졌을 뿐만 아니라 더욱 중요하게 된것은 프로그래머로서 여러분은 프로그래밍의 개념을 이해할 뿐만 아니라 하나의 특별한 언어로 작업을 하는 실용성을 이해하는것이 중요하게 되었다.

그러한 일반적인 개념에 관하여는 나중에 다시 논의할 것이지만, 우리는 우리가 쭉 따라왔던 그 주제로 다시 돌아올 것이다.

모든 프로그램들의 공통적 사양

오래전에 에드가 다익스트라라는 사람이 있어서 구조적 프로그래밍structured programming이라는 개념을 다루었다. 이것에 의하면 모든 프로그램은 다음과 같은 네가지 방식으로 구조화 될 수 있다고 한다:

이러한 구조 말고도 프로그램이 좀 더 유익하려면 또한 몇 개의 사양이 더 필요하다:

여러분이 그러한 개념들을 한번 이해하고 하나의 특정한 프로그래밍언어가 어떻게 그것들을 구현했는지 이해하기만 하면 여러분들은 그러면 그 언어로 프로그램을 작성할 수가 있다.

몇가지 전문용어를 확실하게 해보자

우리는 이미 프로그래밍이란 컴퓨터에게 여러분이 원하는 바를 시키는 기술이라고 말했다, 그러나 무엇이 프로그램인가?

사실은 프로그램에는 두가지의 완연한 개념이 존재한다. 첫 번째는 사용자에 의해서 인지되는 개념이다 - 하나의 작업을 수행하기 위하여 설치되고 반복적으로 실행될 수 있는 실행파일. 예를 들어 사용자들은 그들의 워드 프로세서를 실행하는 것에 관하여 프로그램이라고 말한다.
다른 개념은 프로그래머에 의해서 보여지는 프로그램이다, 이것은 컴퓨터에게 내리는 명령어들로 이루어진 텍스트 파일이며, 어떤 프로그래밍언어로 씌여진 것으로써, 실행파일로 번역되어질 수 있는 것을 의미한다. 그래서 여러분이 프로그램이라고 말할 때는 항상 어떤 개념을 뜻하는지를 명료하게 하라.

기본적으로 프로그래머는 프로그램을 상위 언어로 작성하여 그 컴퓨터가 이해하는 바이트들로 번역을 한다. 기술적으로 말해서 프로그래머는 소스코드source code를 작성하고 인터프리터는 오브젝트코드object code를 작성한다. 때때로 오브젝트 코드들은 다른 이름을 갖는다 다음과 같이: 이진 코드P-Code, binary code 또는 기계코드machine code.

인터프리터는 많은 수의 이름을 가진다, 하나는 인터프리터interpreter 그리고 다른 이름은 컴파일러compiler. 이러한 용어들은 실제로는 소스 코드로부터 오브젝트 코드를 생성하는 두 개의 다른 기술을 지칭한다.
컴파일러가 오브젝트 코드를 생산하고 그 코드는 스스로 실행될 수 있는 경우도 있지만,(다른말로는 - 실행파일) 반면에 인터프리터는 프로그램을 실행시키고 그 프로그램이 진행되는 동안 존재해야만 한다. 그렇지만 이러한 용어들의 차이점이 이제 는 색바랜 감이 있다. 왜냐하면 어떤 컴파일러들은 이제 인터프리터가 존재하여서 마지막 변환작업을 해주기를 요청하기도 하고 어떤 인터프리터는 소스코드를 임시 오브젝트 코드로 단순히 컴파일하고서는 그것을 실행시키기 때문이다.

우리가 고찰한 바에 의하면 그것은 실제적인 차이는 없다, 우리는 소스코드를 작성하고 그리고 도구를 사용하여 컴퓨터가 그것을 읽고 실행하도록 해주면 된다.

프로그램의 구조

한 프로그램의 정확한 구조는 프로그래밍언어와 여러분이 그것을 실행시키는 환경에 달려 있다. 그렇지만 여기에도 일반적인 원리는 있다:

대부분의 프로그램은 두 가지의 구조중 하나를 따른다:

배치 프로그램

이것들은 전형적으로 명령어 라인에서 시작한다( 혹은 자동적으로 스케쥴러 유틸리를 통하여 시작한다.) 그리고 아래와 같은 패턴을 따르는 경향이 있다:

사건 주도형 프로그램

대부분의 구이 시스템(그리고 이식된 제어 시스템 - 여러분의 전자레인지, 카메라 등등)은 사건 주도적이다. 그것은 운영체제가 사건을 그 프로그램에 보내고 그 프로그램은 이러한 사건들이 도착하는 즉시 반응하는 것이다. 사건은 사용자가 일으킨 일을 포함할 수도 있다. - 마우스를 클릭하거나 키를 누르거나하는 것과 같은 - 또는 시계를 갱신한다든가 혹은 화면을 갱신하는 일등과 같은 시스템 자체가 만드는 일들을 포함할 수도 있다.

사건 주도형 프로그램은 일반적으로 다음과 같은 형태이다:

기억해야할 요점
  • 프로그램은 컴퓨터를 제어한다
  • 프로그래밍 언어로 우리는 컴퓨터가 '생각하는' 방식보다 인간이 '생각하는' 방식에 더 가까운 수준에서 컴퓨터에게 '말할 수 있다'
  • 프로그램은 데이타처리한다
  • 프로그램은 배치 지향적일수도 있고 사건 주도적일 수도 있다.
Previous  Next  Contents


질문이 있거나 이 웹페이지에 대하여 제안사항이 있으면 나에게 전자메일을 보내라: agauld@crosswinds.net