최근 수정 시각 : 2024-09-09 10:27:55

소스 코드


파일:나무위키+유도.png  
은(는) 여기로 연결됩니다.
영화 소스 코드에 대한 내용은 소스 코드(영화) 문서
번 문단을
부분을
, 디지몬 시리즈의 모바일 게임에 대한 내용은 디지몬 소스 코드 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
참고하십시오.
1. 개요2. 소스 코드와 프로그램3. 주석4. 컴파일링/인터프리팅5. 오픈 소스6. 베릴로그7. 관련 문서

1. 개요

Source Code

소스 코드는 컴퓨터 소프트웨어(프로그램)의 제작에 사용되는 설계도이다. 개념만 나타낸 추상적인 설계도가 아니라(그런 건 순서도라고 한다), 당장 컴퓨터에 입력만 하면 진짜로 프로그램을 완성할 수 있는 매우 세밀하고 구체적으로 짜인 설계도이다. 이름인 소스 코드 중 “소스”(source, 근원)가 이를 의미하는 것으로, 프로그램의 '근원'이란 뜻이다.

일반적인 설계도는 실물을 제작하기 위한 설명서일 뿐이며 실물을 제작하기 위해서는 각종 재료와 제작 도구가 필요하지만, 소스 코드는 실물(=컴퓨터 프로그램)의 설계도인 동시에 재료이기도 하다. 컴퓨터 프로그램은 오로지 정보로만 이루어져 있기 때문에, 컴파일러[1]라는 도구만 있으면 소스 코드를 곧바로 컴퓨터 프로그램으로 만들어낼 수 있다.

컴퓨터로 작성한 전자 파일만을 소스 코드라고 오해하는 이들이 있으나, 종이에 적힌 프로그램 역시 소스 코드다. 아직 컴퓨터에 입력이 안 되었을 뿐. 컴퓨터 초창기(20세기 중반~1980년대)에는 오히려 천공 카드나 하드카피처럼 종이에 소스 코드가 기록되어 있는 것이 일반적이었다.

2. 소스 코드와 프로그램

건축물의 설계도나 전자기계의 회로도가 주로 기호(그림)로 이루어져 있듯, 컴퓨터 프로그램의 설계 파일인 소스 코드는 프로그래밍 언어로 작성되어 있다. 따라서 그 언어의 문법만 알면 사람도 소스 코드를 읽고 그 뜻을 이해할 수 있다. 실제로 소스 코드를 보면 영문자와 숫자, 몇 가지 특수문자 등으로 쓰여 있고, “set”, “value”, “push” 등 영어 단어 비슷한 것도 종종 보인다.

이런 단어와 기호, 숫자를 정해진 규칙에 따라 조합하면 컴퓨터에게 특정한 작업을 시킬 수 있는 명령이 만들어진다. 즉 소스 코드에 빽빽하게 나열되어 있는 문장들은 대부분이 "컴퓨터, 키보드로부터 특정 입력이 들어오면 해당 이벤트를 A라는 객체에 전달해라" 라든지 “컴퓨터, 이 변수가 특정한 값이 될 때까지 B라는 연산을 반복해라" 등과 같은, 컴퓨터에게 내리는 명령 목록인 것이다. 이렇게 프로그래밍 언어로 작성한 명령어들을 “코드”(code)라 부르기에, 프로그램의 설계 파일을 소스 코드라 부르는 것이다. 제아무리 복잡한 프로그램도 열어보면 전부 이런 명령 목록으로 만들어져 있다. 알파고GTA 5건 마찬가지다. 당연히 프로그램이 크고 복잡할수록 그 안에 포함된 코드의 수는 많다. 윈도우 11은 약 5천만 줄, GTA 5는 약 1억 줄의 코드로 구성되어 있다고 한다.

컴맹이라면 “건물을 지을 때는 도면외에 시멘트나 철근도 필요하고, 전자회로를 만들 때는 회로도 외에도 기판과 부품이 필요한데, 컴퓨터 프로그램은 설계도만 있으면 다른 재료가 하나도 없어도 만들 수 있단 말인가?” 하는 의문이 들 수도 있다. 허나 컴퓨터 프로그램은 오로지 정보로만 이루어져 있기 때문에, 설계도(소스 코드)만 입력하면 실물(?)을 만들 수 있다. 프로그램은 컴퓨터에게 일을 시키는 명령이기 때문이다. 악보를 읽을 줄 아는 사람에게 노래를 시키려면 악보만 있으면 되는 것에 비유할 수 있을 것이다. 소스 코드는 악보, 프로그램은 컴퓨터가 부르는 노래라고 생각해도 좋을지도.

3. 주석

소스 코드에는 컴퓨터에게 내리는 명령 외에도 프로그래머 등의 인간이 읽고 참조할 수 있는 안내문도 포함되어 있다. 이런 것은 대개 코드의 기능을 설명하는 주석이며, 개발 중인 프로그램일 경우 다른 작업자들에게 추가/삭제/변경된 코드의 변경 의도에 대해 설명하는 메모가 포함되어 있다.

또한 오픈 소스 소프트웨어나 기업이 제작한 상용 프로그램은 대개 여러 프로그래머들이 참여하는 대규모 프로젝트기 때문에, 주석을 잘 달아주는 것이 필수적일뿐더러 사람이 읽고 그 의미를 알기 쉽도록 작성하는 것이 좋다.[2] 하지만 읽기 불편한 소스 코드, 즉 가독성이 낮은 소스 코드는 스파게티 코드라고도 불린다. [3]

4. 컴파일링/인터프리팅

사람이 읽고 쓰는 언어와 컴퓨터의 언어는 다르다. 사람의 언어(“자연어”라 부른다)는 컴퓨터가 이해할 수 없는 고차원 언어이며, 컴퓨터가 별도의 가공 없이도 바로 이해할 수 있는 언어(“기계어”라 부른다)는 인간이 읽고 이해하기 매우 어렵다. 그래서 사람이 작성한 소스 코드를 기계어로 바꿔주는 가공 과정이 필요한데, 이를 컴파일링/인터프리팅이라 한다. 컴파일링은 기계어로 된 번역물[4]을 생성하는 과정이며, 인터프리터는 한 줄씩 해석해서 바로 실행한다. 번역과 통역이라고 생각하면 이해하기 쉽다.

이런 작업을 하는 컴퓨터 프로그램을 컴파일러/인터프리터라 한다. 그 결과물은 컴퓨터가 읽을 수 있는 형태인 기계어로 쓰여 있다. 이 결과물은 이진수로 쓰여 있다고 하여 “바이너리(이진수, binary)”라고도 하고 컴퓨터에서 실행이 된다고 하여 “실행파일(이그제큐터블, executable)”이라고도 하는데, 이게 우리가 일반적으로 말하는 컴퓨터 프로그램(소프트웨어)이다. 바이너리는 0 또는 1로 구성된 흐름이다. 이 파일을 실행할 수 있는 것은 오직 컴파일러가 실행된 CPU 또는 그 CPU와 호환되는 특정 아키텍처이며 사람이 읽거나 쓸 수 없다. 이 흐름을 사람이 볼 수 있도록 치환한 게 어셈블리어다.

BASIC, Python 등의 스크립트 언어로 프로그래밍을 배우면 컴파일러라든지 바이너리는 볼 일이 없다. 인터프리터는 작성된 코드를 해석하고 런타임에서 실행하기 때문이다.

상용 프로그램이 아닌 공개 프로그램 중에는, 실행파일(바이너리)뿐만 아니라 소스 코드까지 함께 다운로드할 수 있게 해놓은 경우도 많다. 그런데 다운로드 페이지를 좀 유심히 살펴봤다면, 바이너리는 윈도 PC용, 매킨토시용 등 OS별로 구분되어 있는 데 반해 소스 코드는 OS 구분 없이 하나만 있을수도 있고 OS별로 있을수도 있다. OS구분없이 하나의 파일에 있는 소스 코드는 OS 종류에 관계없이 각 OS 실행 바이너리 제작에 이용할 수 있기 때문이다. 단, 해당 프로그램이 OS 의존성이나 하드웨어 의존성이 낮은 경우에 한한다. 제아무리 소스 코드를 공개해놨다고 하더라도 윈도우용 디바이스 드라이버 소스 코드를 리눅스에서 컴파일해 쓸 순 없다.

5. 오픈 소스

공개 프로그램 중에는 다른 사용자/개발자들이 소스 코드를 들여다보고 연구 개발을 하는 것을 권장하기 위해 소스 코드를 공개하는 경우도 많다. 함께 힘을 합쳐 더 좋은 프로그램을 만들자는 초청 같은 것인데, 이렇게 공개(오픈)된 소스 코드를 갖는 프로그램을 오픈 소스 프로그램이라 부른다.

오픈 소스 프로그램의 유형은 다양하지만, 대개 많은 이들에게 널리 유용한 소프트웨어거나(이메일 클라이언트인 모질라 썬더버드, 웹 브라우저Firefox, 운영체제인 리눅스 등) 많은 이들이 재미있게 즐길 수 있는 오락용 소프트웨어(넷핵같은 게임 등)인 경우가 많다.

상용 프로그램 중에는 일부, 혹은 전부를 오픈 소스로 공개하는 경우도 있으나, 대부분은 오픈 소스가 아니다. 오픈은 커녕 영업비밀로 철저히 감춰지는 경우가 대부분이다.[5] 소스 코드 없이 바이너리 파일만으로 프로그램의 설계를 유추해내는 것은 귀찮고 까다로운 일이다.[6][7] 그래서 간혹가다 인디 게임이나 프로그램에서 포맷/바이러스 따위 때문에 소스 코드를 잃어버려서 개발/업데이트를 못한다는 말이 간간히 보인다. 물론 프리서버처럼(불법이기는 하지만) 기존 소스 코드에 기대지 않고 처음부터 다시 프로그래밍하여 기능을 복제하는 경우도 있기는 하다.

6. 베릴로그

파일:상세 내용 아이콘.svg   자세한 내용은 베릴로그 문서
번 문단을
부분을
참고하십시오.
소스 코드는 컴퓨터 프로그램과 같은 소프트웨어 제작에 주로 사용되지만, 반도체, 전자 회로와 같은 하드웨어의 제작에 사용되는 소스 코드도 있다.

7. 관련 문서



[1] 인간의 언어에 맞춘 프로그래밍 언어를 컴퓨터가 이해하는 0과 1로 변환하는 프로그램[2] 예를 들어 소스 코드에서 띄어쓰기는 해도 좋고 안해도 좋은 프로그래밍 언어가 많은데, 그래도 띄어쓰기를 해 주면 사람이 읽기가 훨씬 좋다.[3] 읽기 불편한 소스 코드는 성능 및 기능 개선이 매우 힘드므로 코드를 보기 쉽게 짜는 것이 개발자 본인을 포함한 모든 기여자와 개발 팀, 사용자를 위한 최소한의 배려다. 소스 코드를 모든 물리적 현상이 예외된 컴퓨터 배선으로 비유하는 것은 상당히 잘못되었다.[4] 이 번역물의 대표적 예시가 우리가 흔히 접하는 exe파일이다.[5] 그래서 해당 소스가 일부라도 유출되어서 사용되었을 경우 너 고소를 당할 수 있다. 이런 것들은 오픈 소스에 대비해서 클로즈드 소스라고 부른다.[6] 2018년 현재는 디컴파일러가 많이 발전해서 바이너리로부터 소스 코드를 복원하는 게 크게 어렵진 않다. 특히 Java의 경우 거의 소스 코드 그대로 나와버리며 C로 만든 바이너리도 오픈 소스 라이브러리를 많이 땡겨쓴 경우 절반 이상 소스 코드가 복원돼 나온다.[7] 단, 자바나 닷넷은 기계어 바이너리를 생성하지 않고 중간형태의 바이트코드 형태로 만들어서 이를 읽어 실행하기 때문에 리버스 엔지니어링에 비해서 비교적 간단하고 복원율이 높다.