"프로그래밍이 무엇인가요?"
익숙하면서도 참 어려운 말인 것 같습니다.
사실 <모던 자바스크립트 딥다이브>라는 책을 간만에 폈을 때, 이 말에 대해서 고민을 크게 했어요. 개발을 업으로 했음에도, 프로그래밍을 딱 뭐다!라고 이야기 못한다니. 웃깁니다. 😂
모르는 건 부끄러운 게 아닌 것 같아요. 다만 알지 못하는 것을 안다고 하는 것이 정말 부끄러운 거니까, 이제 제대로 찾아가는 게 아닐까요.
정말 천천히, 제대로 자바스크립트를 이해해야 할 준비를 해보려 해요.
그렇다면, 한 번 저 먼저 풍덩, 빠져보겠습니다. 💦
책에서는 프로그래밍이란 무엇이라고 정의했는지를 한 번 살펴보겠습니다.
- 컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션
- 요구사항의 집합을 분석해서 적절한 자료구조와 함수의 집합으로 변환한 후, 그 흐름을 제어하는 것.
이 말을 처음 들었을 때, 제가 느낀 감정은, '맞는 말이긴 한데 모호하다'였습니다.
말을 잘못했다기 보다는, 저와 같은 초보자에게는 정확히 딱 이것이다!라는 통쾌함이 없었다고나 할까요.
우리가 어셈블리어를 보면 이해하지 못하듯, 책의 글도 결국에는 고레벨 수준의, 이해할 수 있는 말로 변환해야겠지요. 우리는 그것을 이해라 합니다.
(이번에 스터디원분들의 발표를 보며 정말 많이 느꼈네요)
따라서 이를 좀 더, 저만의 언어로 해석해보려 합니다.
위의 정의를 먼저 키워드에 집중하여 나눠볼까요? 저는 크게 네 가지로 나눴어요.
저는 이를 다음과 같이 해석했습니다.
그렇다면 우리는 이제 큰 문제를 작은 문제로 나눴습니다.
이제 우리는 작은 문제들을 하나하나 정복해봅시다.
우리가 코드를 치는 것은 누구에게 무엇을 전달하는 것일까요?
각자가 다양한 이유가 있을 수 있겠지만, 분명한 것이 하나 있습니다.
우리는 컴퓨터에게 어떤 특정한 결과를 기대하며 수행한다는 것이죠.
우리는 끊임없이 코드를 작성하며, 컴퓨터에게 명령하며, 이에 대한 응답을 받으며 소통합니다.
그렇기 때문에, 우리의 프로그래밍은 커뮤니케이션 과정이라고 할 수 있습니다.
그러면, 우리는 어떻게 커뮤니케이션이 가능한 걸까요?
분명히 컴퓨터는 0과 1밖에 모르는데 말입니다.
맞습니다. 대화라는 게 존재하기 위해서는 언어라는 게 필요한데, 컴퓨터 세상에는 컴퓨터만의 언어가 존재합니다. 그 가장 근본이 되는 언어가 바로 기계어입니다.
자, 한국어를 쓰는 세상과 기계어를 쓰는 세상이 만났습니다.
두 세상은 완전히 포개어질 수 없습니다. 그렇다면, 우리는 어떤 방법을 펼칠 수 있을까요?
다양한 방법이 있겠지만, 제가 떠오른 해결 방법은, 바로 만국 공용어인 영어를 쓰면 된다는 것입니다. 결국, 한국어를 기계어에 맞는 중간 언어로 변환한 후, 컴퓨터가 중간 언어를 잘 해석할 수 있도록 하면 되는 거 아닐까요?
그래서 어셈블리어라는 것이 나오게 됩니다. 기계어를 좀 더 사람이 이해하기 쉽게 만든 저급 언어인데요. 하지만 저급 언어라는 말에서 드러나듯이, 사람에게는 아직 좀 와닿지 않은 느낌인 거에요. 음.. 예를 들자면 영어를 구글 번역기로 돌린 느낌이라고 할까요?
심지어 구글 번역기로 돌린 해석이 원문과 다르듯, 어셈블리어는 컴퓨터의 구조마다 또 다릅니다. 이에 대한 정확한 번역이 필요했어요. 그런데 번역을 누가하나요? 기계 대신 사람들이 체계를 만들어줘야겠죠!
그래서 컴퓨터와 편하게 소통하기 위해, 특정 구문의 문법들을 규정하고, 이를 바탕으로 구성된 언어를 사용하기로 했어요. 이를 바로 프로그래밍 언어라 합니다.
중간 점검:
비트 기반의 기계어를 쓰는 컴퓨터와의 원활한 커뮤니케이션을 위해 우리는 프로그래밍 언어를 사용한다.
그런데 이 세상에, 언어가 단 하나만 존재할까요?
굳이 영어가 아니라도, 중국어를 쓸 수도 있고 일본어를 쓸 수도 있겠죠?
프로그래밍도 이처럼, 다양한 프로그래밍 언어가 존재합니다.
그리고, 각 나라에 맞게 언어를 선택하듯, 우리는 현재의 상황에 적합한 프로그래밍 언어를 사용하죠.
그리고 이러한 언어들은, 특정한 패턴에 따라 분류할 수 있어요.
분류 방법은 매우 다양하지만, 대표적인 것이 바로 저급 언어로 변환하는 방법입니다.
이를 통해 프로그래밍 언어는 크게 컴파일러와 인터프리터로 나눌 수 있어요.
둘은 어떤 차이가 있을까요?
컴파일러
컴파일러는 프로그램 전체를 먼저 스캔하고, 오브젝트 파일이라는 실행하기 위해 필요한 저급 언어 기반의 부가정보들을 담은 파일을 만들어내요. 이후 이러한 파일들을 실행할 수 있도록 이어주는데요. 이 과정을 링킹이라고 합니다.
이미 하나의 파일을 만들어서 실행하기 때문에 실행 속도가 빠릅니다. 컴파일과정에서 미리 에러를 볼 수 있기도 하구요. 다만 하나씩 자주 코드를 바꿔야 한다면 전체를 다시 컴파일해야 하니 초반엔 번거롭기도 하고, 파일을 생성한다는 과정에서 메모리가 더 많이 들겠죠?
인터프리터
컴파일러와 달리 이 친구는 한 줄에 하나씩 저급 언어로 변환합니다. 이때, 한 줄에 하나씩 번역하기 위해 일단 프로그램을 실행해요. 따라서 실행한 후에 에러를 알 수 있겠죠?(보안 이슈가 있을 수 있다는 것이죠) 또한, 이미 완성된 파일을 다시 실행하는 게 아니라, 다시 한 줄씩 번역한다는 관점에서는 비효율적이구요.
그렇다면, 왜 우리는 인터프리터 언어를 사용할까요? 느린 대신, 인터프리터 언어는 메모리 사용이 효율적입니다. 파일을 만들지 않았기 때문이죠. 따라서 둘의 장단점을 이해하시면 좋을 것 같아요.
그렇다면 우리는 이런 질문을 할 수 있을 거 같아요.
"자바스크립트는?"
자바스크립트는 인터프리터의 성격이 짙지만, V8 등에서는 JIT 컴파일을 통해, 자바스크립트를 동적으로 컴파일한다는 측면에서는 컴파일러로써의 특징도 가질 수 있다고 할 수 있겠습니다.
자바스크립트로 컴파일러를 만드는 게 신기했어요.
이를 좀 더 찾아보니 실제로 TOAST UI 기술 블로그 글에서는 이를 만드는 과정을 소개하기도 했네요!
그럼, 이제 정리를 해볼까요?
커뮤니케이션 파트 정리
컴퓨터가 쓰는 저급 언어를 더 잘 다룰 수 있도록 하기 위해 우리는 프로그래밍 언어를 사용한다.
프로그래밍 언어는 크게 컴파일러와 인터프리터로 나뉘는데, 자바스크립트는 두 개의 성격을 갖고 있지만, 인터프리터에 가깝다. (사실 요즘은 이를 그렇게 따지지는 않는 것 같아요.)
프로그래머이자 개발자인 우리는 결국 문제를 해결하는 사람이라 생각합니다.
따라서 우리는 컴퓨터에 프로그래밍 언어로 해결 방법을 전달하며 문제를 해결하는데요.
이때 필요한 것이 바로 컴퓨터의 입장에서 바라보며 문제를 정확히 정의하고 설계하는 것이죠. 우리는 이것을 컴퓨팅 사고라고 부릅니다.
컴퓨터가 처리할 때 모호하지 않도록 정확히 문제에 대한 해결 방안을 상정하고, 이를 코드로 변환해야 하는 것이죠.
한편, 이러한 문제를 해결하기 위한 방법이 비슷하게 유지되는 일련의 과정들이 존재합니다. 우리는 이것을 알고리즘이라고 부릅니다.
그리고 이러한 컴퓨팅 사고와 알고리즘을 바탕으로, 발생한 문제를 컴퓨터가 제대로 처리하여 해결할 수 있도록 하는 것이 바로 프로그래머이자 개발자가 갖춰야 할 문제 해결 능력입니다.
문제를 해결해야 하는 것도 중요하지만, 어떻게 문제를 해결할 것인지 그 방법을 제대로 판단하고 가치를 저울질하는 것 또한 중요한 역량입니다. 밖에 나갔는데 목이 마르다고, 정수기를 살 필요는 없는 노릇이기 때문이죠.
그래서 우리는 코드가 문제에 대해 효율적으로 동작할 수 있도록 고민하거나, 가독성 및 안정성을 고민하며 자료구조와 함수를 신중히 선택하게 돼요.
이러한 과정 속에서 개발자들은 어떤 것이 좋은 프로그래밍인지 고민하기 시작했어요. 그리고 논쟁 속에서 프로그래밍 방법에 관해 패러다임들이 몇 가지 생겨나기 시작했습니다. 이는 다음과 같습니다.
간단한 차이는 알고 있기는 하나, 저 역시 이를 다 온전히 이해하지 못하고 있는 상황입니다.
하지만, 이정표는 정확히 찍어놓고 가야 정확히 바라보고 갈 수 있기 때문에, 이렇게 글로 4가지를 남겨 놓으려 합니다. 언젠가는 제대로, 하나하나 들여다 보고 이야기로 풀어나갈 계획입니다.
이 파트도 충분히 의미있는 파트였다 생각합니다.
단순히 구문만을 볼 것이 아니라, 의미를 정확히 전달해야 한다는 것인데요.
구현물도 중요하지만, 이 구현물의 과정에 담긴 의미를 정확히 변수로 상정할 수 있어야 합니다. 그렇지 않다면, 우리는 그 코드가 담긴 의미를 정확히 이해하지 못할 뿐더러, 더 큰 실수가 발생했을 때도 적절히 대처할 수 없기 때문이죠.
결국, 이러한 프로그래밍 패러다임에 기인한 철학에 맞춰, 우리는 정확한 문제 해결을 위해 분기처리를 하며 차근차근히 안정성 있는 코드를 의미 있게 작성하는 것이 프로그래밍이라 할 수 있겠네요.
https://ko.wikipedia.org/wiki/%EA%B8%B0%EA%B3%84%EC%96%B4
https://jhnyang.tistory.com/40