프로그램 아키텍쳐/소프트웨어공학

개요 - 컴퓨터 프로그래밍이란

본클라쓰 2010. 6. 17. 14:28

 

본질적으로 컴퓨터는 켜져 잇거나 꺼져 있는 작은 전자 스위치가 많이 모여 있는 것일 뿐이다. 이러한 스위치의 조합을 다양하게 설정하여 컴퓨터에서 화면에 무언가 표시하거나 소리가 나도록 하는 등의 작업을 수행할 수 있다.

 

CPU는 간단한 수식 계산이나 시스템의 각종 장치로 데이터를 전송하는 것과 같은 중요한 작업을 할 수 있다. CPU는 메모리에서 데이터를 읽거나 레지스터의 값을 변경하는 동작 하나 하나를 명령어(instruction)라고 하며, 각각의 CPU는 자신만의 명령어 집합(instruction set)을 갖는다.

 

하지만 CPU 자체 만으로는 하드 드라이브의 파일을 읽는 것처럼 간단한 동작조차도 할 수 없다. 프로그램은 이런 하드웨어 요소가  수 있는 명령어 집합이며, 대개 하드웨어 자체만으로 해결할 수 없는 복잡한 작업을 수행하기 위해 프로그램을 작성한다. 즉, 프로그래밍의 가장 기본적인 개념은 컴퓨터가 해야 할 일을 알려주는 것이다.

 

하지만 컴퓨터 프로그램으로 디스크 드라이브, 메모리, 모니터 그리고 프린터를 사용하는 기본적인 동작들도 실제로는 매우 복잡합니다.  따라서 실제 프로그램의 동작을 구현하는데 소비하는 시간보다, 주변 장치들과 상호 작용하는데 더 많은 시간을 소비하게 됩니다. 하드웨어까지 직접 제어하면, 실제 계산은 몇 라인 밖에 되지 않지만, 디스플레이를 관리하는 등의 이슈들을 처리하느라 수백, 수천 라인을 허비해야합니다.

 

예전에는 이런 방식으로 프로그래밍을 했었습니다. 따라서 애플리케이션의 실제 목적을 구현하는데 충분한 시간을 투자할 수 없었기 때문에, 프로그래밍은 효율적으로 할 수가 없었습니다. 따라서 프로그래머가 자신의 작업에만 집중할 수 있도록 다른 세부사항을 자동으로 처리해 줄 수 있는 무언가가 절실했습니다.

 

 

 

운영체제(Operation System)의 역할

 

컴퓨터 하드웨어 위에서 기본적인 기능을 담당하는 레이어를 제공하기 위해 운영체제가 탄생했습니다. 운영체제도 컴퓨터 프로그램이지만, 메모리 관리, 디스크 입출력 그리고 낮은 레벨의 다른 작업을 처리하기 위해 존재합니다.

 

컴퓨터에 운영체제가 있으면 낮은 레벨의 세부사항에 대한 걱정없이 프로그램을 작성할 수 있습니다. 즉, 파일을 열거나, 디스크를 포맷해야 할 때 운영체제에게 그런 동작을 요청하기만 하면됩니다.

 

운영체제에서 더 많은 기능을 지원하게 되면서, 이들 시스템에 맞는 프로그램을 작성하기가 수월해졌습니다. 만약, Windows 운영체제를 사용하고 프로그래머가 대화상자를 화면에 표시하고 싶다면, 단순히 운영체제에게 대화상자를 표시하도록 요청하면서 표시할 메세지만 넘겨주면 됩니다.

 

프로그래머는 애플리케이션 프로그래밍 인터페이스(API, Application Programming Interface)를 통해서 운영체제가 지원하는 모든 기능을 사용할 수 있다. API는 운영체제가 표출하는 모든 기능을 대변하며, 독자의 프로그램에서 이 모든 기능을 사용할 수 있다는 뜻도 됩니다.

 

이런 발전으로 인해, 각각의 프로그램은 컴퓨터의 일반적인 동작에 더 적은 노력을 들이고, 프로그램의 실제 목적에 더 집중할 수 있게 되었습니다. 하드웨어가 종속된 코드를 애플리케이션에서 분리함으로써 얻는 다른 이점은 프린터나 하드 드라이브, 더 빠른 CPU처럼 하드웨어가 변하더라도 새 장치를 수용하기 위해 운영체제를 갱신할 필요는 있겠지만, 그 컴퓨터에서 돌아가는 프로그램은 영향을 받지 않는다는 것입니다. 따라서 운영체제는 하드웨어 장치와 프로그램 사이의 인터페이스가 되어서, 프로그래머가 하드웨어의 특정한 코드에 대해 신경쓰지 않도록 해줍니다.

 

 

 

프로그래밍 언어의 역할

 

컴퓨터 프로그램을 컴퓨터 하드웨어에 대한 명령어들의 집합이라고 정의했습니다. 하드웨어 자체는 비교적 간단한 동작만 처리할 수 있기 때문에, 명령어도 대개 간단합니다. 프로그램의 최종 결과물은 하드웨어가 이해할 수 있는 코드(기계어(Machine Language)) 혹은 원시코드(Native Code)라고 합니다.

 

운영체제에 의해 메모리로 로드된 명령어 집합은 메모리를 한 곳에서 다른 곳으로 옮기거나, 수식 계산을 하는 것과 같은 명령어로 이루어져 있습니다. 이렇게 수천 개의 명령어가 모여서 하나의 프로그램을 완성합니다. 물론, 원시 코드를 직접 이용해서 프로그램을 작성할 수도 있습니다. 단순히 디스크에 파일을 만들고, 명령어를 채우면 됩니다. 하지만 매우 간단한 프로그램을 만드는데 엄청난 시간을 들여야 할지도 모릅니다. 이런 노력을 피하고, 프로그래머로 하여금 프로그램 본연의 목적에만 집중할 수 있도록 하기 위해 고급 프로그래밍 언어가 태어났습니다.

 

고급 프로그래밍 언어를 이용해서 강력하고 복잡한 명령어를 사용할 수 있습니다. 이 명령어는 대응되는 기계어 명령어로 잘게 나뉘어집니다. 이렇게 작성된 고급 컴퓨터 언어에서 기계어로 번역하는 작업을 컴파일(Compile)이라고 하고, 이런 번역 작업을 하는 프로그램을 컴파일러(Compiler)라고 합니다.

 

컴파일 언어(Compiled Language)말고, 인터프린터 언어(Interpreted Language)라는 것도 있는데, 컴파일 언어는 실행하기 전에 소스 코드를 컴파일해 원시 코드를 생성하지만, 인터프린터 언어에서는 컴파일을 하지 않습니다. 대신 특별한 프로그램이 코드를 읽어가면서 적절한 동작을 수행하게 합니다. 따라서 소스를 읽어서 파싱하는 과정을 거쳐야 하기 때문에, 인터프리터 언어는 컴파일 언어보다 실행 속도가 느립니다.

 

이런 고급 언어의 사용이 발전함에 따라 통합 개발 환경(IDE, Integrated Development Environment)이 나타났습니다. IDE는 코드를 작성하고, 디버깅하며, 컴파일하는 소프트웨어 개발 단계를 프로그래머에게 하나의 통합된 인터페이스로 제공하는 것입니다. 인터페이스는 하나로 줄었지만, 실제로 사용하는 테크놀로지는 비슷합니다. 대부분의 경우 프로그래머는 텍스트 파일을 만들고, 컴파일해야 하지만, 작업 환경이 훨씬 사용자에게 친근하게 되었다는 점이 다릅니다.

 

하지만 IDE로 인해 어떤 것이 언어의 특징이고, 어떤 것이 IDE의 특징인지를 구분하는 것이 애매해졌습니다. IDE가 여러 언어를 지원할 수 있으며, IDE와 그 IDE 밑에서 돌아가는 언어의 차이점을 이해하는 것이 중요하다.

 

 

 

참조) http://www.infopub.co.kr/info/ebook/pdf/8054-467.pdf