소스 코드
1. 개요
Source Code
컴퓨터 소프트웨어(프로그램)의 제작에 사용되는 설계파일(File)이다. 개념만 나타낸 추상적인 설계도가 아니라(그런 건 순서도라고 한다), 당장 컴퓨터에 입력만 하면 진짜로 프로그램을 완성할 수 있는 매우 세밀하고 구체적으로 짜인 설계 파일(File)이다. 이름인 '''소스''' 코드 중 “소스”(source, 근원)가 이를 의미하는 것으로, 프로그램의 근원이란 뜻이다.
일반적인 설계도는 실물을 제작하기 위한 설명서일 뿐이며 실물을 제작하기 위해서는 각종 재료와 제작 도구가 필요하지만, 소스 코드는 실물(컴퓨터 프로그램)의 설계도인 동시에 재료이기도 하다. 컴퓨터 프로그램은 오로지 정보로만 이루어져 있기 때문에, 컴파일러라는 도구(특별한 컴퓨터 프로그램이다)만 있으면 소스 코드를 곧바로 컴퓨터 프로그램으로 만들어낼 수 있다.
2. 소스 코드와 프로그램
건축물의 설계도나 전자기계의 회로도가 주로 기호(그림)로 이루어져 있듯, 컴퓨터 프로그램의 설계 파일인 소스 코드는 프로그래밍 언어로 작성되어 있다. 따라서 그 언어의 문법만 알면 사람도 소스 코드를 읽고 그 뜻을 이해할 수 있다. 실제로 소스 코드를 보면 영문자와 숫자, 몇 가지 특수문자 등으로 쓰여 있고, “set”, “value”, “push” 등 영어 단어 비슷한 것도 종종 보인다.
이런 단어와 기호, 숫자를 정해진 규칙에 따라 조합하면 컴퓨터에게 특정한 작업을 시킬 수 있는 명령이 만들어진다. 즉 소스 코드에 빽빽하게 나열되어 있는 문장들은 대부분이 "컴퓨터, 키보드로부터 특정 입력이 들어오면 해당 이벤트를 A라는 객체에 전달해라" 라든지 “컴퓨터, 이 변수가 특정한 값이 될 때까지 B라는 연산을 반복해라" 등과 같은, 컴퓨터에게 내리는 명령 목록인 것이다. 이렇게 프로그래밍 언어로 작성한 명령어들을 “코드”(code)라 부르기에, 프로그램의 설계 파일을 소스 '''코드'''라 부르는 것이다.
컴맹이라면 “건물을 지을 때는 도면외에 시멘트나 철근도 필요하고, 전자회로를 만들 때는 회로도 외에도 기판과 부품이 필요한데, 컴퓨터 프로그램은 설계 파일만 있으면 다른 재료가 하나도 없어도 만들 수 있단 말인가?” 하는 의문이 들 수도 있다. 허나 컴퓨터 프로그램은 오로지 정보로만 이루어져 있기 때문에, 설계 파일만 있어도 실물(?)을 만들 수 있다. 프로그램은 컴퓨터에게 일을 시키는 명령이기 때문이다. 악보를 읽을 줄 아는 사람에게 노래를 시키려면 악보만 있으면 되는 것에 비유할 수 있을 것이다. 소스 코드는 악보, 프로그램은 컴퓨터가 부르는 노래라고 생각해도 좋을지도.
3. 주석
소스 코드에는 컴퓨터에게 내리는 명령 외에도 프로그래머 등의 인간이 읽고 참조할 수 있는 안내문도 포함되어 있다. 이런 것은 대개 코드의 기능을 설명하는 주석이며, 개발 중인 프로그램일 경우 다른 작업자들에게 추가/삭제/변경된 코드의 변경 의도에 대해 설명하는 메모가 포함되어 있다.
또한 오픈 소스 소프트웨어나 기업이 제작한 상용 프로그램은 대개 여러 프로그래머들이 참여하는 대규모 프로젝트기 때문에, 주석을 잘 달아주는 것이 필수적일뿐더러 사람이 읽고 그 의미를 알기 쉽도록 작성하는 것이 좋다.[1] 이와는 반대로 업계 표준에 맞게 논리적이고 간결하게 짜여 있지 않은, 즉 읽기 불편한 소스 코드는 일명 스파게티라 불린다.[2]
4. 컴파일링/인터프리팅
사람이 읽을 수 있는 형태의 소스코드 설계 파일은 컴퓨터에게는 너무나 읽기 힘든 고차원적인(?) 내용이다. 때문에 컴퓨터가 읽을 수 있도록 아주 원초적인 레벨의 형태로 바꿔줘야 한다. 이렇게 바꿔주는 과정을 컴파일링/인터프리팅[3] 이라 하며 이를 해 주는 컴퓨터 프로그램을 컴파일러/인터프리터라 한다. 그 결과물은 컴퓨터가 읽을 수 있는 형태인 기계어로 쓰여 있다. 이 결과물은 이진수로 쓰여 있다고 하여 “바이너리(이진수, binary)”라고도 하고 컴퓨터에서 실행이 된다고 하여 “실행파일(이그제큐터블, executable)”이라고도 하는데, 이게 우리가 일반적으로 말하는 컴퓨터 프로그램(소프트웨어)이다. 바이너리는 이진수로 쓰여 있기 때문에 사람은 읽지 못하며, 억지로 뜯어봐도 1과 0만 어지럽게 나열되어 있을 뿐이다. 16진수로 묶어도 뭥미? 소리만 나올 뿐.
BASIC, Python 등의 스크립트 언어로 프로그래밍을 배우면 소스 코드를 본 적은 있으나 컴파일러라든지 바이너리는 보지 못한다. 스크립팅 언어는 실행파일을 만들어놓아야하는 컴파일러 대신, 즉석에서 언어를 해석(인터프리트)하여 컴퓨터가 실행할 수 있게 해주는 인터프리터를 사용하기 때문이다. 따라서 코드만 있고 바이너리 파일(실행 파일)이 따로 없다.[4]
5. 오픈 소스
상용 프로그램이 아닌 공개 프로그램 중에는, 실행파일(바이너리)뿐만 아니라 소스 코드까지 함께 다운로드할 수 있게 해놓은 경우도 많다. 그런데 다운로드 페이지를 좀 유심히 살펴봤다면, 바이너리는 윈도 PC용, 매킨토시용 등 OS별로 구분되어 있는 데 반해 소스 코드는 OS 구분 없이 하나만 있을수도 있고 OS별로 있을수도 있다. OS구분없이 하나의 파일에 있는 소스 코드는 OS 종류에 관계없이 각 OS 실행 바이너리 제작에 이용할 수 있기 때문이다. 단 해당 프로그램이 OS 의존성이나 하드웨어 의존성이 낮은 경우에 한한다. 제아무리 소스 코드를 공개해놨다고 하더라도 윈도우용 디바이스 드라이버 소스코드를 리눅스에서 컴파일해 쓸 순 없다.
공개 프로그램 중에는 다른 사용자/개발자들이 소스 코드를 들여다보고 연구 개발을 하는 것을 권장하기 위해 소스 코드를 공개하는 경우도 많다. 함께 힘을 합쳐 더 좋은 프로그램을 만들자는 초청 같은 것인데, 이렇게 공개(오픈)된 소스 코드를 갖는 프로그램을 오픈 소스 프로그램이라 부른다.
상용 프로그램 중에는 일부, 혹은 전부를 오픈 소스로 공개하는 경우도 있으나, 대부분은 오픈 소스가 아니다. 오픈은 커녕 영업비밀로 철저히 감춰지는 경우가 대부분이다.[5] 소스 코드 없이 바이너리 파일만으로 프로그램의 설계를 유추해내는 것은 귀찮고 까다로운 일이다.[6][7] 그래서 간혹가다 인디 게임이나 프로그램에서 포맷/바이러스 따위 때문에 소스 코드를 잃어버려서 개발/업데이트를 못한다는 말이 간간히 보인다. 물론 프리서버처럼(불법이기는 하지만) 기존 소스 코드에 기대지 않고 처음부터 다시 프로그래밍하여 기능을 복제하는 경우도 있기는 하다.
6. 베릴로그
소스 코드는 컴퓨터 프로그램과 같은 소프트웨어 제작에 주로 사용되지만, 반도체, 전자 회로와 같은 하드웨어의 제작에 사용되는 소스 코드도 있다. 자세한 내용은 베릴로그(Verilog) 문서를 참조하자.
7. 관련 문서
[1] 예를 들어 소스 코드에서 띄어쓰기는 해도 좋고 안해도 좋은 프로그래밍 언어가 많은데, 그래도 띄어쓰기를 해 주면 사람이 읽기가 훨씬 좋다.[2] 물론 컴퓨터에게는 소스 코드에 주석이 달려 있건 없건, 스파게티이건 아무 상관도 없다. 이런 것은 소스 코드를 접해야 하는 개발자 등의 인간을 위한 배려일 뿐. 컴퓨터 선 정리가 엉망으로 되어있건 깔끔하게 되어있건 컴퓨터 성능에는 문제가 없는 것과 같다.[3] 컴파일링은 기계어로 된 번역물을 던져주고 인터프리팅은 한 줄씩 번역해서 바로 실행하는 차이가 있다.[4] 베이직용 컴파일러도 나와 있다. 인터프리터가 워낙 느리다 보니.[5] 그래서 해당 소스가 일부라도 유출되어서 사용되었을 경우 너 고소를 당할 수 있다. 이런 것들은 오픈 소스에 대비해서 클로즈드 소스라고 부른다.[6] 2018년 현재는 디컴파일러가 많이 발전해서 바이너리로부터 소스 코드를 복원하는 게 크게 어렵진 않다. 특히 Java의 경우 거의 소스 코드 그대로 나와버리며 C로 만든 바이너리도 오픈 소스 라이브러리를 많이 땡겨쓴 경우 절반 이상 소스 코드가 복원돼 나온다.[7] 단, 자바나 닷넷은 기계어 바이너리를 생성하지 않고 중간형태의 바이트코드 형태로 만들어서 이를 읽어 실행하기 때문에 리버스 엔지니어링에 비해서 비교적 간단하고 복원율이 높다.