소스 코드
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
소스 코드는 컴퓨터 프로그램의 원시 형태를 의미하며, 사람이 읽고 수정할 수 있는 텍스트 형태의 명령어 집합이다. 최초의 프로그램은 기계어로 작성되었으나, 이후 고급 프로그래밍 언어의 발명과 함께 소스 코드는 컴파일러를 통해 기계어로 변환되어 컴퓨터에서 실행된다. 소스 코드는 프로그램 개발, 유지보수, 알고리즘 공유, 소프트웨어 포팅 등에 활용되며, 오픈 소스 소프트웨어의 경우 자유로운 재사용과 수정을 허용한다. 소스 코드는 소프트웨어의 품질, 저작권, 라이선스, 리버스 엔지니어링, 군사적 이용 등 다양한 측면에서 중요한 역할을 한다.
더 읽어볼만한 페이지
소스 코드 | |
---|---|
컴퓨터 프로그램 | |
정의 | 컴퓨터가 실행할 수 있는 사람 읽기 가능한 명령어 |
종류 | 소스 코드 오브젝트 코드 바이트코드 기계어 마이크로코드 |
개요 | |
작성 | 프로그래밍 언어를 사용하여 작성됨 |
변환 | 컴파일러 또는 인터프리터를 통해 기계어로 변환되어 실행됨 |
편집 | 텍스트 편집기, 통합 개발 환경 등 다양한 도구로 편집 가능 |
관련 개념 | |
알고리즘 | 문제 해결을 위한 단계별 절차 |
데이터 구조 | 데이터의 효율적인 저장 및 관리를 위한 구조 |
소프트웨어 공학 | 소프트웨어 개발 및 유지보수에 대한 체계적인 접근 방식 |
기타 | |
중요성 | 컴퓨터 시스템의 동작을 정의하는 핵심 요소 |
2. 역사
초기 컴퓨터 프로그램은 컴퓨터 전면 패널의 스위치를 통해 바이너리 형태로 입력되었으며, 1세대 프로그래밍 언어는 소스 코드와 기계어 사이에 구별이 없었다.[11] 1950년대 중반, 프로그래머 생산성 향상을 위해 포트란과 같은 고급 프로그래밍 언어가 도입되었다.
IBM은 처음에 기계와 함께 작동할 소프트웨어를 제공했을 때 소스 코드를 무료로 제공했다. 당시 소프트웨어 개발 및 지원 비용은 하드웨어 가격에 포함되었다. IBM은 1983년까지 소스 코드를 자사 소프트웨어 제품 라이선스와 함께 배포하였다.[11]
소스 코드는 일반적으로 사람이 수정하는 고급 프로그래밍 언어 코드 형태이다. 목적 코드는 기계에서 직접 실행할 수 있으며, 어셈블리어와 같은 중간 단계를 거쳐 소스 코드로부터 자동으로 생성된다. 목적 코드는 특정 플랫폼에서만 작동하지만, 소스 코드는 다른 기계로 이식하여 다시 컴파일할 수 있다.
소스 코드의 정의는 명확하지 않지만, Linux Information Project (LINFO)는 소스 코드를 "사람이 일반 텍스트 형태로 처음부터 작성한 소프트웨어"로 정의한다.[8] 즉, 기계가 생성하거나 변환한 것이 아니라 사람이 처음부터 작성한 소프트웨어의 실체를 가리킨다.
트랜스파일러, 자동 프로그래밍과 같이 사람이 아닌 기계가 생성한 코드는 소스 코드가 아니지만, 중간 코드도 소스 코드라고 불리는 경우가 있다. 현대 소프트웨어 개발에서는 고수준 소스 코드가 여러 단계를 거쳐 중수준 소스 코드 또는 중간 표현으로 컴파일되거나 트랜스파일되고, 최종적으로 기계어 코드/프로그램이 되는 경우가 많다. (예: C#→CIL→기계어, TypeScript→JavaScript ES6→JavaScript ES5→기계어).
어셈블리 언어와 같은 저수준 언어 프로그램은 수작업으로 작성된 경우 소스 코드라고 할 수 있지만, 현대에는 유지 보수성 문제로 고수준 언어를 사용하여 작성 및 유지 보수된다.
2. 1. 초기 프로그래밍 언어
프로그램 내장식 컴퓨터를 위한 최초의 프로그램들은 컴퓨터의 전면 패널 스위치를 통해 바이너리 형태로 입력되었다. 1세대 프로그래밍 언어는 소스 코드와 기계어 간의 구별이 없었다.1940년대 말에 등장한 최초의 프로그래밍 가능 컴퓨터는 기계어(프로세서가 직접 실행할 수 있는 간단한 명령어)로 프로그래밍되었다. 기계어는 디버깅하기 어렵고, 서로 다른 컴퓨터 시스템 간에 이식이 불가능했다. 초창기에는 하드웨어 자원이 부족하고 비쌌지만, 인적 자원은 더 저렴했다. 프로그램이 점점 더 복잡해지면서 프로그래머 생산성이 병목 현상이 되었다. 이로 인해 1950년대 중반에 고급 프로그래밍 언어인 포트란이 도입되었다. 이러한 언어는 하드웨어의 세부 사항을 추상화하여, 인간이 더 쉽게 이해할 수 있는 알고리즘을 표현하도록 설계되었다. 컴퓨터 하드웨어와는 다른 명령어를 사용하는 소프트웨어는 비교적 최근의 기술이며, 포트란, Lisp, 코볼과 같은 초창기 고급 프로그래밍 언어 시대부터 시작되었다. 고급 프로그래밍 언어의 발명은 컴파일러를 통해 소스 코드를 자동으로 컴퓨터 하드웨어에서 직접 실행할 수 있는 기계어로 변환하는 것과 동시에 이루어졌다.
3. 목적
소스 코드는 주로 실행 프로그램을 만드는 데 사용되며, 컴파일이나 해석 과정을 거친다. 또한, 사람들 사이에 알고리즘을 주고받는 방식(코드 조각 등)으로 이용되기도 한다.[12]
프로그래머는 프로그래밍 기술을 배우기 위해 기존 소스 코드를 참고하며, 개발자들 간의 소스 코드 공유는 프로그래밍 기술 발전에 기여한다.[2]
일반적으로 소스 코드 없이는 소프트웨어를 다른 컴퓨터 플랫폼에 포팅하기 어렵지만, 이진 번역이나 원본 플랫폼 에뮬레이션과 같은 예외적인 방법도 존재한다. 디컴파일을 통해 고급 언어나 어셈블리어로 소스 코드를 생성할 수도 있다.
3. 1. 소프트웨어 개발 및 유지보수
소스 코드 접근은 소프트웨어 수정에 필수적이다. 기존 코드가 어떻게 작동하는지 이해해야 수정할 수 있기 때문이다. 코드 이해 속도는 코드 가독성과 프로그래머의 숙련도에 따라 달라진다. 숙련된 프로그래머는 코드가 상위 수준에서 어떤 작업을 수행하는지 더 쉽게 이해할 수 있다. 이러한 과정을 가속화하기 위해 소프트웨어 시각화를 사용하기도 한다.[12]많은 소프트웨어 프로그래머는 생산성을 향상시키기 위해 통합 개발 환경(IDE)을 사용한다. IDE는 일반적으로 소스 코드 편집기를 포함하여 여러 기능을 내장하고 있으며, 프로그래머에게 일반적인 오류를 경고할 수 있다. 코드 수정에는 종종 코드 리팩토링(기능을 변경하지 않고 구조를 개선)과 구조 조정(구조와 기능을 동시에 개선)이 포함된다. 코드에 대한 거의 모든 변경은 새로운 버그 또는 예상치 못한 파급 효과를 발생시켜 또 다른 수정 단계를 필요로 한다.[12]
다른 개발자의 코드 검토는 프로젝트에 추가된 새로운 코드를 면밀히 검토하는 데 자주 사용된다. 이 단계의 목적은 코드가 스타일 및 유지보수성 표준을 충족하고 소프트웨어 설계를 올바르게 구현했는지 확인하는 것이다. 일부 추정에 따르면 코드 검토는 소프트웨어 테스트가 완료된 후에도 지속되는 버그 수를 크게 줄인다. 정적 프로그램 분석은 코드를 실행하여 작동하는 소프트웨어 테스트와 함께 자동화된 도구를 사용하여 소스 코드의 문제를 감지한다. 많은 IDE는 코드의 명확성과 유지보수성에 대한 지표를 제공할 수 있는 코드 분석 도구를 지원한다. 디버거는 프로그래머가 각 상태 변경에 해당하는 소스 코드를 추적하면서 실행을 단계별로 진행할 수 있게 해주는 도구이다.[12]
4. 구성
프로그램을 구성하는 소스 코드는 일반적으로 컴퓨터의 하드 디스크에 저장된 하나 이상의 텍스트 파일에 위치한다. 이 파일들은 보통 '''소스 트리'''(source tree)라고 불리는 디렉터리 트리 형태로 정렬된다. 소스 코드는 데이터베이스 (저장 프로시저 등)와 같은 다른 곳에 저장될 수도 있다.
대부분의 프로그램은 실행에 필요한 모든 리소스를 포함하지 않고 외부 소프트웨어 라이브러리에 의존한다. 컴파일러는 이러한 라이브러리 파일을 연결하여 프로그램이 하드웨어에서 실행될 수 있도록 한다.
4. 1. 형상 관리
소프트웨어 개발자는 소스 코드 파일의 변경 사항을 추적하기 위해 형상 관리(버전 관리)를 사용한다. 형상 관리 시스템은 어떤 오브젝트 코드 파일이 어떤 버전의 소스 코드 파일에 해당하는지 추적한다.[1]5. 품질
소프트웨어 품질은 코드의 정확하고 효율적인 동작, 재사용성 및 이식성, 수정의 용이성을 모두 아우르는 포괄적인 용어이다.[1] 일반적으로 개발 과정 초기에 제품에 품질을 구축하는 것이 나중에 추가하는 것보다 비용 효율적이다.[2] 품질이 높은 코드는 신뢰성이 높고 유지보수성이 뛰어나 공급업체와 고객 모두의 수명 주기 비용을 절감한다.[3]
유지보수성은 기존 기능을 손상시키지 않고 소프트웨어를 쉽게 수정할 수 있도록 하는 소프트웨어의 품질이다.[4] 목적에 맞는 명확한 함수 및 변수 이름을 사용하는 것과 같은 코딩 규칙을 따르면 유지보수가 더 쉬워진다.[5] 코드가 두 번 이상 실행될 수 있는 경우에만 조건 루프 문을 사용하고, 실행되지 않는 코드를 제거하면 이해도를 높일 수 있다.[6] 많은 소프트웨어 개발 조직은 장기적인 비용이 증가함에도 불구하고 개발 단계에서 유지보수성을 소홀히 한다.[4] 기술 부채는 프로그래머가 게으름이나 마감 기한을 맞추기 위한 긴급함으로 인해 코드에 유지보수성을 구축하는 대신 빠르고 엉성한 해결책을 선택할 때 발생한다.[7] 일반적인 원인은 소프트웨어 개발 노력 추정에서 과소 평가되어 개발에 충분한 자원이 할당되지 않는 것이다.[8] 유지보수성의 문제점은 많은 소프트웨어 공학 강좌에서 이를 강조하지 않는다는 것이다.[9] 소프트웨어 유지보수를 담당하지 않는 개발 엔지니어는 유지보수성을 구축할 동기가 없다.
6. 저작권 및 라이선스
1974년 이전 미국에서는 소프트웨어와 소스 코드에 저작권이 인정되지 않아, 퍼블릭 도메인 소프트웨어로 취급되었다.[5] 그러나 1974년, 미국 저작물 신기술 사용 위원회(CONTU)는 컴퓨터 프로그램이 저작자의 독창성을 담고 있다면 저작권 대상이 될 수 있다고 결정했다.[6][7]
독점 소프트웨어는 소스 코드를 비공개로 하는 경우가 많다. 소스 코드는 소프트웨어 유지보수, 기능 개선, 유사 소프트웨어 개발, 하드웨어 이해에 필수적이므로, 기업에게는 중요한 자산이다. 소스 코드가 유출되면 경쟁사에 의해 개발 성과가 도용될 위험이 있다.
하지만 소스 코드를 적극적으로 공개하는 움직임도 있다.
- 미국 정부 자금으로 개발된 소프트웨어는 개발 성과를 납세자인 국민에게 환원해야 한다는 취지에서 소스 코드를 공개하는 경우가 많다.
- 리처드 스톨만과 자유 소프트웨어 재단은 컴퓨터 이용자가 자유롭게 소프트웨어 혜택을 누려야 하며, 소스 코드 독점과 은폐는 부도덕한 행위라고 주장한다. (자유 소프트웨어 운동)
- 에릭 S. 레이먼드를 중심으로 한 오픈 소스 지지자들은 소스 코드 공개가 소프트웨어 발전에 유익하다고 믿는다.
- 레드햇과 같이 브랜드 이미지, 사용자 지원, 안정성을 판매하는 비즈니스 모델에서는 소스 코드 공개가 전략적으로 중요할 수 있다. 소스 코드 공개를 통해 소프트웨어 보급과 시장 확대를 꾀하는 것이다.
- 유닉스, 리눅스, 안드로이드처럼 OS 소스 코드를 공개하고 라이선스 범위 내에서 이용 및 개조를 허용함으로써, 서드파티 참여를 유도하고 하드웨어 및 응용 소프트웨어 실행 플랫폼을 확산시킨 사례도 있다.
6. 1. 오픈 소스 소프트웨어
소스 코드에 대한 공개 접근을 의미하지만, 오픈 소스 소프트웨어에는 추가 요구 사항이 있다. 자유로운 재배포, 소스 코드 수정 및 동일한 라이선스 하에 파생 작품 출시 허용, 상업적 사용을 포함한 다양한 사용 간의 차별 금지 등이다. 오픈 소스 소프트웨어의 자유로운 소프트웨어 재사용은 개발 속도를 높일 수 있다.7. 리버스 엔지니어링
일반적으로 소스 코드를 실행 코드로 변환하는 과정에서 많은 정보가 손실되기 때문에, 실행 코드로부터 완전한 원본 소스 코드를 얻는 것은 불가능하다 (비가역 변환).[12] 그러나 실행 코드만 입수할 수 있는 경우라도, 시간과 노력을 들이면 리버스 엔지니어링을 통해 소스 코드에 가까운 것을 만들어낼 수 있다.[12]
Java VM이나 .NET Framework 등, 가상 머신 또는 중간 언어 방식의 프레임워크에서 동작하는 애플리케이션 소프트웨어는 바이너리 형식으로 컴파일 및 빌드된 후에도 형식이름이나 변수이름과 같은 프로그램 자체에 관한 메타데이터를 많이 포함하고 있으며, 역컴파일을 통해 Java나 C#과 같은 고수준 언어의 소스 코드로 변환할 수도 있기 때문에, 비교적 리버스 엔지니어링하기 쉬운 성질을 갖는다.[12] 독점적인 상용 소프트웨어에 이러한 프레임워크를 이용하는 경우, 제3자에 의한 리버스 엔지니어링을 방지하기 위해, 난독화를 실시하기도 한다.[12]
8. 군사적 이용
병기에 사용되는 프로그램의 소스 코드는 매우 중요한 기밀로 여겨지는 경우가 많다. 병기의 한계나 제한을 프로그램으로 알 수 있다면, 그에 대한 대항 수단을 얻을 가능성이 높아진다는 지적이 있다.
일례로, 일본의 국산 전투기 개발 계획인 F-2 협상 과정에서, 원형이 된 F-16의 비행 제어용 프로그램 소스 코드 열람 허용 여부 및 라이선스 제공 문제가 미국에서 쟁점이 되어 부결된 사례가 있다.
9. 용어의 유래
"코드"라는 용어는 원래 프로그래밍 언어가 널리 사용되기 전, 컴퓨터의 기계어나 어셈블리 언어 프로그램이 마치 암호처럼 보인다는 데서 유래했다.[3] (암호학에서 "코드"는 암호의 한 종류이다. 코드 (암호) 문서 참조).
"소스 코드"는 본래 컴퓨터 프로그램만을 지칭했지만, 하드웨어 기술 언어 등도 넓은 의미에서 소스 코드로 불리기도 한다.
"코딩"이라는 단어는 원래 어셈블리 언어처럼 매우 저수준 언어로 프로그램을 작성하는 작업을 의미했지만, 점차 소스 코드를 작성하는 것 전반을 의미하게 되었다.
9. 1. 일본어 번역
과거 일본에서는 소스 코드를 '''원산장(原算帳)'''으로 번역한 사례가 있다.[9]참조
[1]
웹사이트
Programming in C: A Tutorial
https://web.archive.[...]
Bell Laboratories, Murray Hill, N. J.
[2]
서적
Code Reading: The Open Source Perspective
Addison-Wesley Professional
2003
[3]
웹사이트
Art and Computer Programming
http://www.onlamp.co[...]
2005
[4]
웹사이트
Overview of Software Maintenance and Evolution
https://cs.gmu.edu/~[...]
2018-01
[5]
학술지
Copyright Law and Subject Matter Specificity: The Case of Computer Software
https://web.archive.[...]
2005
[6]
간행물
Apple Computer, Inc. v. Franklin Computer Corporation Puts the Byte Back into Copyright Protection for Computer Programs
http://digitalcommon[...]
1984-01
[7]
문서
Software and Internet Law
[8]
웹사이트
LINFO. Source Code Definition.
http://www.linfo.org[...]
[9]
학술지
数学者用ワープロSPE
https://doi.org/10.1[...]
日本数学会
1988-07-29
[10]
웹인용
Programming in C: A Tutorial
http://cm.bell-labs.[...]
[11]
서적
Object-code only: Is IBM playing fair?
https://books.google[...]
[12]
서적
Code Reading: The Open Source Perspective
Addison-Wesley Professional
2003
[13]
문서
Art and Computer Programming
2005
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com