Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

프로그램

프로그램은 자연계에서 흔하게 볼 수 있다. DNA에는 생명체가 자라고 살아나가기 위한 방식들에 대한 일련의 정보들이 구조화되어 있어서, 적당한 에너지가 주어진다면, 이 정보가 시키는대로 순차적으로 일을 실행한다.

자연에서 볼 수 있는 좀더 고도화된 프로그램은 식물의 씨앗에서 찾아볼 수 있다. 씨앗은 커다란 나무로 자라기 위한 완전한 프로그램을 갖추고 있다. 어떻게 뿌리를 내리고, 잎사귀를 만들것인지. 엽록소의 배치를 어떻게하고, 빛과 이산화탄소와 물을 어떻게 가공해서 녹말의 형태로 저장할건지 등등등.. 모든 내용이 프로그래밍 되어 있다.

이들 자연계의 프로그램들은 자연계의 여러가지 자원을 이용해서, 살아남고 번식하는데 그 목적이 있다고 하겠다.

컴퓨터 프로그램은 컴퓨터라는 환경에서, 컴퓨터환경에 제공하는 자원을 이용해서 주어진일을 하는데 목적을 두고있는 최소단위 실행 객체다. 컴퓨터계의 씨앗이라고 할만하다. 이 프로그램은 데이터와 데이터를 처리하기 위한 일련의 수행과정 정보를 담고 있는 알고리즘 그리고 프로그램에 데이터를 입력하거나 출력하기 위한 인터페이스로 구성이 된다.

데이터알고리즘은 프로그램이 가져야할 필수적인 요소이며, 때때로 인터페이스를 가지지 않는 프로그램도 있다.

적당한 조건에서, 씨앗이 자신의 DNA정보를 해석해서 싹을 튀우듯이, 프로그램은 적당한 조건이 되면, 자신에게 지시된 - 즉 프로그래밍된 - 역할을 수행하게 된다. 이들 프로그램은 원자와 분자로 구조화된 자연계에서 볼수 있는 프로그램과 달리, 순전히 bit(:12)정보로 구조화되어 있다. 프로그램을 구성하고 있는 데이터, 알고리즘, 인터페이스 모든 것은 최소단위인 bit로 구성된다.

프로그래밍

자연은 DNA를 프로그래밍 했다. DNA는 생명의 설계도면이다. 인간은 인공적인 프로그래밍 능력을 가지고 있다. 건축물을 만들기 위한 설계도면이 프로그래밍의 대표적인 예일 것이다.

이제 인간의 두뇌를 확장한 컴퓨터가 등장하자 컴퓨터를 이용한 프로그래밍 영역이 생겨나게 되었다. 컴퓨터 프로그래밍을 이용해서 달성하고자하는 궁극적인 목표는 인간의 의식을 프로그래밍 하는 것일 게다. 이른바 인공지능.

인간은 어느 한가지 일만할 수 있는 존재가 아니다. 다양한 일을 한다. 기계로 치자면 범용기계인 셈인데, 인간의 두뇌를 확장시킨 컴퓨터가 범용기계로써의 대접을 받는 이유일 것이다.

컴퓨터 프로그래밍은 소스코드를 만드는 일련의 과정을 통칭한다. 소스코드는 작성되고 테스트되고, 분석되고 때때로 재작성이 된다. 컴퓨터 프로그래밍을 하는 사람을 컴퓨터 프로그래머라고 하고, 최종적으로 만들어진 산물을 컴퓨터 프로그램, 줄여서 프로그램 혹은 소프트웨어라고 한다. 때때로 컴퓨터 프로그래머 대신 소프트웨어 프로그래머라고 부르기도 한다.

프로그램을 만들기 위해서는 언어를 사용한다. 이것을 프로그래밍 언어라고 한다. 언어라고 해서 인간의 언어와 같은 형태의 언어는 아니다. 인간의 언어는 무의식적으로 발화된다. 때문에 몇 가지 기본적인 틀이 있기는 하지만 틀에 얽매이지 않은 형태를 가지고 있다. 피카소의 그림 (그림도 언어다)이 분명 일정한 틀을 가지고 있지만 그 틀에 얽매이지 않는 것과 마찬가지다.

반면 프로그래밍 언어는 오로지 의식적인 것만 작용하며, 때문에 엄격한 논리적인 틀을 가진다. 엄격한 틀을 가지고 있기 때문에, 인간의 언어가 가지는 범용성을 갖지 못하게 된다. 때문에 용도에 맞는 다른 형식을 가지는 언어들이 존재하게 된다. 즉 수학/과학 문제를 풀기에 적당한 언어, 금융계산 문제를 풀기에 적당한 언어, 분산처리를 위해 적당한 언어등이 그것이다. 다음은 C(:12) 언어로 작성된 소스코드(:12)의 예이다.
int main(int argc, char **argv)
{
	printf ("hello world!!\n");
	return 0;
}

미디어로써의 프로그램

프로그램은 미디어의 특성을 가지고 있다. 미디어는 다음과 같은 특징을 가진다. 돈을 기준으로 특징을 설명해볼까 한다.

  • 저장 : 은 시간과 노동을 저장한다. 노동의 댓가로 돈을 받을경우 노동한 시간만큼이 돈으로 지급된다. 우리는 시간을 저장하고 있다가 필요할 때 사용할 수 있다. 많은 돈을 가진다는 것은 많은 시간을 저장하고 있는 것과 같다. 시간은 모두에게 평등하다는 말은 거짓말이다. 시간이 돈이다라고 말하면서 시간이 모두에게 평등하다고 하는 것은 논리오류다. 시간이 돈이라면, 많은 돈을 가질 경우 많은 시간을 가지는 것이 될테니 말이다. 간단한 저녁한끼에 3000원을 소비하는 사람이 있는가 하면 수십만원을 소비하는 사람이 있다. 물리적은 시간이 누구에게나 동일하다면, 상대적인 시간을 더 많이 소비하면 되지 않겠는가 ?
  • 변환 : 이라는 미디어는 노동을 상품의 형태로 변환을 시킨다. 혹은 시간을 상품의 형태로 변환하기도 하기도 한다. 내가 돈을 주고 어떤 상품을 구입한다는 것은 상품을 만드는데 들어가는 시간을 구매한 것이라고 볼 수 있기 때문이다.
  • 이동 : 을 이용하면 이쪽의 정보,노동,시간을 다른쪽으로 이동시킬 수 있다. 돈을 거래한다는 것은 시간,정보,노동력을 이동시키는 것이다. 과거 시간,노동력,정보를 가장 빨리 이동시키는 매체는 돈이였지만 지금은 전기/전자 매체에 그 위치를 넘겨줬다. 예컨데, 주식시장에서 돈에 우선해서 이동되는 것은 전자매체를 통한 정보의 이동이다.
그렇다면 미디어로써의 프로그램의 특징에 대해서 생각해볼 필요가 있을 것 같다.
  • 저장 : 프로그램은 정보를 저장한다. 이 정보는 워드프로세서를 이용해서 생성된 정보일 수도 있다. internet(:12)을 사용할 수 있는 기능이 내장된 프로그램이라면, 지구반대편에서 생성된 정보를 로컬컴퓨터에 저장할 수있다. 요즘에는 정보를 저장하는 위치로써의 로컬과 원격지라는 개념이 사라졌다. google(:12), daum, naver에서 제공하는 웹메일 프로그램을 사용할 경우 메일정보는 원격지에 저장이 되지만, 메일 사용자는 로컬.원격지의 구분없이 사용한다.
  • 이동 : 프로그램은 정보를 이동한다. 한 프로그램에서 다른 프로그램으로 이동시킬 수 있다. 최근의 프로그램은 로컬과 원격지를 구분하지 않고 정보를 이동시킨다. 거의 모든 컴퓨터가 인터넷에 연결되어 있기 때문이고, 거의 모든 프로그램들이 네트워크에 직접적으로 혹은 간접적으로 연결될 수 있기 때문이다.
  • 변환 : 프로그램이 정보를 변환한다는 것은 잘 알려진 사실이다. 대량의 웹로그정보는 웹로그분석프로그램을 거쳐서 고객구매패턴정보 혹은 페이지 네비게이션 정보로 변경이 된다. 웹브라우저는 텍스트로된 읽기힘든 HTML(:12) 정보를 이미지를 포함한 정보로 모니터에 출판한다. mp3 플레이어는 0과 1로된 정보를 오디오 정보로 변환시키고 스피커를 울린다.
프로그램은 각각이 하나의 미디어로써 작동한다. 현실세계에 다양한 종류의 미디어가 있듯이 프로그램의 종류또한 다양하며, 종류가 다양한 만큼 저장하고 이동시키고 변환하는 정보들 역시 다양하다.

툴지향 프로그램

프로그램도 스타일이 있다. 초기에 나타났던 프로그램은 툴지향적 프로그램이였다. 장인인 목수가 망치, 대패, 못, 끌 등 최소한의 툴을 이용해서 원하는 물건을 만들어 내듯이 초기의 프로그램들은 주어진일들만을 하는 최소한의 프로그램들을 여러개 모아서 사용해서 작업을 진행했다.

Unix 계열 운영체제(:12)에서 지금도 널리 사용되는 console 프로그램들이 그것이다. Unix(:12) 혹은 Linux(:12)환경의 개발자나 시스템관리자들은 여전히 이들 프로그램을 사용해서 업무를 수행한다.
# cat list1.txt list2.txt list3.txt | sort | uniq > list.final
위에서는 cat(1), sort(1), uniq(1)라는 3개의 프로그램을 사용해서 list 파일들을 붙이고 정렬하고 중복된 줄을 제거해서 그 결과물을 list.final에 저장하는 일을 하고 있다.
  1. cat : 파일의 내용을 출력하는 일만 한다.
  2. sort : 문자열을 정렬하는 일만 한다.
  3. uniq : 중복된 라인을 제거하는 일만 한다.
이들 업무지향적 프로그램은 주어진 일만을 하기 때문에, 간단한 작업을 하려고 하더라도 최소한 2개 이상의 프로그램을 다룰줄 알아야 한다. 목수가 그러하듯이 업무에 익숙하게 사용하려면 오랜시간이 걸리지만 일단 익히고 나면, 장소에 크게 관계없이 원하는 일을 매우 빠르게 처리할 수 있다.

컨테이너벨트에서의 작업과 매우 유사하다고 볼 수 있다.

업무지향 프로그램

객체지향적 프로그램이라고 해야 하나 망설여지긴 하지만 마땅한 용어가 생각나지 않아서 업무지향적이라고 했다. 이것저것 몽땅 가지고 있는 프로그램이라고 생각하면 된다. 예컨데 밀링머신이다. 주로 GUI(:12) 환경에서 사용하는 프로그램들이 이러한 형태를 가지는 경우가 많다. 이것도 하고 저것도 하고 그런가 하면, 게임까지 내장하고 있는 범용 프로그램들이다. 온갖기능을 가지고 있으며, 또한 이들기능을 다루어야 하는 복잡한 과정들은 잘 추상화되어 있기 때문에 초보자라고 하더라도 간단하게 원하는 일을 할 수 있다.

프로그래머와 프로그래밍

미디어를 기획하는 사람들이 있다. 주로 정치가, 철학자, 과학자들에 의해서 기획이 된다. 마찬가지로 프로그램을 기획하고 만드는 사람들이 있다. 우리는 이들을 프로그래머(:12)라고 부른다. 이들 프로그래머들은 프로그램을 만드는 언어를 이용해서 프로그램을 만든다. 프로그래머가 프로그램을 만드는 과정을 프로그래밍 이라고 하며, 프로그램을 만들기 위해서 사용하는 언어를 프로그래밍 언어라고 한다. assembly(:12), C(:12), python(:12), java(:12), lisp(:12), php(:12), perl(:12)등이 프로그래밍 언어다.

객체 지향 프로그래밍

프로그램은 엄격한 규격을 따르며, 인간의 언어와 같은 추상이 불가능 하다. 이래서는 인간의 문제를 푸는데 한계가 주어진다. 그래서 객체지향(:12)이란 프로그래밍 방법론을 만든다. 객체지향은 방법론이지 언어라는게 아니라는 걸 주의하자. 그러므로 객체지향 언어라는 것은 추상화된 개발방식을 적용할 수 있는 언어라는 의미로 받아들여야 한다.

프로그래밍 언어의 세대

프로그래밍 언어에도 세대가 있다. 지금은 세대를 가지고 프로그래밍 언어를 구분하지는 않는 것 같지만 재미 삼아서 한번 쯤 봐두기 바란다.

세대는 얼마나 인간이 사용하는 자연어에 가까운가를 기준으로 나눈다. 1세대는 기계어이고, 2세대는 어셈블리어, 3세대는 지금 우리가 일반적으로 사용하는 C,C++,Java등의 언어, 4세대는 SQL같은 언어다.