IT 지식

알고리즘은 이상, 프로그래밍은 현실

OIIUOI 2022. 8. 20. 01:49

알고리즘은 추상적이고 이상적인 절차를 기술한 것으로, 구현에  필요한 세부 사항과 현실적인 고려 사항을 무시한다. 알고리즘은 정확하고 명료한 레시피이다. 의미가 완전히 알려져 있고 구체적으로 명시된 기본 연산으로 표현된다. 이러한 기본 연산을 사용하여 각 단계를 상세히 설명하고 모든 가능한 상황을 다룬다. 그리고 알고리즘은 결국 멈춰야 한다.

 이와 대조적으로 프로그램은 추상적인 것과는 거리가 멀다. 프로그램은 실제 컴퓨터가 과제를 완료하기 위해 수행해야 하는 모든 단계를 구체적으로 서술한다. 알고리즘과 프로그램 간의 차이는 청사진과 건물 간의 차이와 비슷하다. 한쪽은 이상적인 것이고, 다른 쪽은 실재하는 것이다. 

 프로그램을 하나 이상의 알고리즘이 컴퓨터가 직접 처리할 수 있는 형태로 표현된 것이라고도 생각해 볼 수 있다. 프로그램은 알고리즘과 달리 실질적인 문제도 신경 써야 한다. 불충분한 메모리, 제한된 프로세서 속도, 유효하지 않거나 악의적으로 잘못된 입력 데이터, 하드웨어 결함, 네트워크 연결 불량, 그리고 (배후에서 작용하고 종종 다른 문제를 악화시키는) 인간적인 약점 등의 문제가 포함된다. 따라서 알고리즘이 이상적인 요리 레시피라고 하면, 프로그램은 적군의 공격을 받는 동안 군인들이 먹을 1개월치 식사를 로봇에게 준비하도록 하는 상세한 명령어 모음이라고 할 수 있다.

 비유는 이정도로 충분하다. 이제 실제 프로그래밍에서 무슨 일이 일어나는지 여러분이 이해할 수 있을 만큼 상세하게 설명하려고 한다. 그렇다고 전문적인 프로그래머가 되기에 충분하지는 않을 것이다. 누군가에겐 프로그래밍이 어렵게 느껴질 수도 있다. 신경 써야 하는 세부 사항도 많고, 작은 실수가 큰 오류로 이어질 수도 있기 때문이다. 하지만 프로그래밍은 결코 불가능한 영역이 아니며, 매우 재미있을 뿐만 아니라 취업 시장에서 유리하게 만들어 주기도 한다.

 세상에는 아직 프로그래머가 충분히 많지 않아서, 우리가 원하고 필요로 하는 모든 것을 컴퓨터가 수행하도록 프로그래밍할 수 없다. 그래서 컴퓨팅 분야에서 계속 거론되는 화제 중 하나는 컴퓨터가 프로그래밍 세부 사항을 더욱 많이 처리하도록 하는 것이다. 이는 프로그래밍 언어에 대한 논의로 이어진다. 프로그래밍 언어는 컴퓨터가 어떤 과제를 수행하는 데 필요한 계산 단계를 사람에게도 어느 정도 자연스러운 형태로 표현하도록 해주는 언어다.

 

최초로 진정한 프로그래밍이 가능했던 전자식 컴퓨터에서 프로그래밍은 힘든 과정이었다. 프로그래머는 명령어와 데이터를 이진수로 변환하고, 카드나 종이테이프에 구멍을 뚫어서 그 수를 기계가 판독할 수 있게 만든 다음, 컴퓨터 메모리에 적재해야 했다. 이러한 방법으로는 매우 작은 프로그램을 작성하는 일조차 믿기 힘들 정도로 어려웠다. 우선 처음에 코드를 제대로 작성하는 것부터 힘들었고, 실수를 발견하여 수정해야 하거나 명령어와 데이터를 변경 또는 추가해야 하는 경우에 프로그램을 바꾸기 어려웠다

 앞서 인용된 모리스 월크스의 말은 프로그래밍할 때 직면하는 어려움을 드러낸다. 윌크스는 첫 번째 프로그램 내장식 디지털 컴퓨터 중 하나인 에드삭을 설계하고 구현했으며, 에드삭은 1949년에 작동 가능해졌다. 월크스는 이 공로로 1967년에 튜링상을 받았고 2000년에 영국 기사 작위를 받았다.

 1950년대 초, 프로그래밍할 때 수반되는 단순한 반복 작업을 처리하기 위한 프로그램이 몇 가지 만들어졌는데, 이 덕분에 프로그래머들은 명령어에 의미 있는 단어를 붙이고 특정 메모리 위치를 나타내는 이름을 사용할 수 있었다. 다른 프로그램을 처리하기 위한 프로그램이라는 강력한 아이디어는 소프트웨어에서 가장 중요한 발전을 이루는 데 핵심적인 기여를 했다.

 이처럼 특정한 처리를 수행하는 프로그램을 어셈블러라고 한다. 원래는 다른 프로그래머가 사전에 작성했던 프로그램에서 필요한 부분을 모으는 역할을 하기도 했기에 붙은 이름이다. 이 프로그램 작성에 사용되는 언어는 어셈블리 언어라고 하고, 이 수준의 프로그래밍은 어셈블리 언어 프로그래밍이라고 한다. 모형 컴퓨터를 기술하고 프로그래밍하기 위해 사용했던 언어가 바로 어셈블리 언어다. 어셈블러는 프로그램을 수정하는 일을 훨씬 쉽게 해 준다. 프로그래머가 명령어를 추가하거나 삭제할 때 변경 기록을 직접 관리하는 대신 어셈블러가 각 명령어와 데이터 값이 메모리상 어느 위치에 있을지 파악해 주기 때문이다.

 특정 프로세서 아키텍처에서 사용되는 어셈블리 언어는 그 아키텍처에 특화된 언어다. 어셈블리 언어는 대개 프로세서의 명령어와 일대일로 연결되고, 명령어가 이진수로 인코딩되는 특정한 방식과 메모리에 정보가 배치되는 방식 등을 알고 있다. 즉, 어떤 작업을 수행하기 위해 특정 종류의 프로세서(예를 들면, 맥이나 PC의 인텔 프로세서)의 어셈블리 언어로 작성된 프로그램은 다른 프로세서(휴대전화의 ARM 프로세서)에 맞춰 작성된 어셈블리 언어 프로그램과는 다르다는 뜻이다. 특정 프로세서용 어셈블리 언어 프로그램을 다른 프로세서용으로 변환하고 싶다면 프로그램을 완전히 새로 작성해야 한다.

'IT 지식' 카테고리의 다른 글

작문과 비슷한 프로그래밍  (0) 2022.08.20
고수준 언어에서 프로그램 실행까지  (0) 2022.08.20
10개 도시를 최단 거리로 여행하는 법  (0) 2022.08.18
선택정렬 vs 퀵 정렬  (0) 2022.08.18
이진 검색  (0) 2022.08.10