{{위키데이터 속성 추적}}
{{다른 뜻}}
[[파일:Operating system placement kor.png|섬네일|사용자가 일반적인 [[데스크톱 컴퓨터]]에서 [[응용 소프트웨어]]와 어떻게 상호 작용하는지 나타낸 그림.]]
[[파일:Abiword 2.4.png|섬네일|[[AbiWord]] [[워드 프로세서|워드 프로세싱]] 소프트웨어의 [[스크린샷]]]]
'''컴퓨터 소프트웨어'''({{lang|en|computer software}}, 혹은 간단히 '''소프트웨어''', {{문화어|'''쏘프트웨어'''}}, <small>[[한국어 순화|순화 용어]]:</small> 무른모)는 [[컴퓨터]]에게 동작 방법을 지시하는 [[명령어 집합]]의 모임이다.<ref>{{웹 인용|last1=IBM |title=What is Software Development |url=https://www.ibm.com/topics/software-development |website=IBM |publisher=IBM |access-date=2021-10-04}}</ref><ref>{{웹 인용|last1=Johnson |first1=Dave |title=What is Software |url=https://www.businessinsider.com/what-is-software?r=US&IR=T |website=Business Insider |publisher=Business Insider |access-date=2021-10-04}}</ref> [[컴퓨터 프로그램|프로그램 소프트웨어]]는 [[컴퓨터 하드웨어]]에 직접 [[명령어 집합|명령어]]를 주거나 다른 소프트웨어에 [[입력]]을 제공함으로써, 명령어의 기능을 수행한다. 컴퓨터 소프트웨어는 [[컴퓨터 하드웨어]]의 반대 의미로, 컴퓨터 하드웨어는 해당 일을 실제로 수행하는 시스템이다. 쉽게 설명하자면 생명체를 하드웨어라고 가정한다면, 그를 구성하는 유전자가 소프트웨어라고 생각할 수 있다.

"소프트웨어"라는 용어는 [[1957년]]에 [[존 터키]](John W. Tukey)가 처음 사용한 용어이다. 일상적으로 이 용어는 [[응용 소프트웨어]]의 의미로 자주 쓰인다. [[컴퓨터 과학]]과 [[컴퓨터 공학]]에서 "컴퓨터 소프트웨어"는 [[컴퓨터 시스템]], [[컴퓨터 프로그램|프로그램]], [[데이터]]에 의해 처리된 모든 [[정보]]를 말한다.

소프트웨어 대부분은 [[고급 프로그래밍 언어]]로 개발된다. 이 유형의 프로그래밍 언어는 프로그래머들에게 더 쉽고 더 효율적인데, 그 이유는 기계어보다 [[자연어]]에 더 가깝기 때문이다.<ref>{{웹 인용|title=Compiler construction|url=http://www.cs.uu.nl/education/vak.php?vak=INFOMCCO|url-status=live|archive-url=https://web.archive.org/web/20131102143144/http://www.cs.uu.nl/education/vak.php?vak=INFOMCCO|archive-date=2 November 2013|df=dmy-all}}</ref> 고급 언어는 [[컴파일러]]나 [[인터프리터]], 또는 이 둘의 조합을 이용하여 기계어로 변환된다. 소프트웨어는 컴퓨터의 기계어와 상당히 일치되는 저급 [[어셈블리어]]로도 개발이 가능하며 이는 [[어셈블러]]를 사용하여 기계어로 변환된다.

== 역사 ==
{{본문|소프트웨어의 역사}}
소프트웨어의 최초의 장소가 되는 윤곽([[알고리즘]])은 계획된 [[해석기관]]을 위해 19세기 [[에이다 러브레이스]]가 작성하였다. 그러나, 해석기관이든 소프트웨어든 실제로 만들어진 것은 없었다.

오늘날 우리가 인식하는 컴퓨터의 발명 이전의 소프트웨어에 대한 최초의 이론은 앨런 튜링이 1935년 수필 《''Computable numbers with an application to the Entscheidungsproblem''에서 제안되었다. (결정 문제)

이는 컴퓨터 과학과 소프트웨어 공학의 양대 산맥이 탄생하는 계기가 되었으며, 둘 다 소프트웨어 및 소프트웨어의 제작에 대해 연구한다. 컴퓨터 과학은 더 이론적인 반면(튜링의 수필이 컴퓨터 과학의 한 예이다), 소프트웨어 공학은 더 실용적인 부분에 초점을 둔다.

그러나 1946년 이전까지 우리가 알고있는 소프트웨어, 즉 저장식 프로그램 디지털 컴퓨터의 메모리에 저장되는 프로그램들은 존재하지 않았다. 최초의 전자식 컴퓨팅 장치들이 그 대신 이들을 다시 프로그램할 목적으로 재배치되었다.

== 사용자가 보는 소프트웨어의 세 층 ==
사용자들의 시각은 보통 프로그래머의 시각과는 차이가 있다. 현대의 범용 컴퓨터([[임베디드 시스템]]의 반대 의미)를 사용하는 사람들은 보통 소프트웨어를 플랫폼, 응용 프로그램, 사용자 소프트웨어의 세 층으로 분류한다.

; 플랫폼 소프트웨어 : 플랫폼이란 [[바이오스]]("소프트웨어" 대신 "[[펌웨어]]"라는 용어로 종종 설명되는), [[장치 드라이버]], [[운영 체제]], 그리고 대표적으로 그래픽 사용자 인터페이스 등을 총체적으로 포함하는 것으로, 컴퓨터와 [[주변기기]]가 서로 소통할 수 있게 만들어 준다. 플랫폼 소프트웨어는 대개 컴퓨터에 꾸러미로 같이 제공되며, 대개의 사용자는 그러한 것이 실제로 있는지, 아니면 선택할 수 있는 다른 플랫폼 소프트웨어가 존재하는지에 대해서 모르는 경우가 많다.

; 응용 소프트웨어 : [[응용 소프트웨어|응용 프로그램]]은 사람들이 일반적으로 소프트웨어라고 생각하는 것이다. 대표적인 예로 [[오피스 제품군]], [[비디오 게임]]을 들 수 있다. 응용 소프트웨어는 보통 컴퓨터 하드웨어와는 별도로 구매한다. 어떤 응용 프로그램은 컴퓨터에 꾸러미로 제공되지만, 독립적인 응용 프로그램으로 수행된다는 점에서 차이가 없다. 응용 프로그램은 거의 대개 운영 체제와는 독립적인 프로그램이지만, 보통 특정 플랫폼만을 위해 제작된다. 사용자들은 흔히 컴파일러, 데이터베이스와 같은 "시스템 소프트웨어"를 응용 소프트웨어와 같이 여긴다.

; 사용자 작성 소프트웨어 : [[사용자 소프트웨어]]는 사용자 특화된 요구를 충족시키기 위한 것이다. 사용자 소프트웨어에는 스프레드시트 템플릿, 워드 프로세서 매크로, 과학 시뮬레이션, 그래픽/애니메이션 스크립트 등이 있다. 심지어 전자우편 필터 역시 사용자 소프트웨어의 하나로 볼 수 있다. 사용자들은 이 같은 소프트웨어를 직접 제작하고도 그 중요성을 흔히 간과하곤 한다.

{{참고|다층 구조}}

== 소프트웨어의 수행 ==
컴퓨터 소프트웨어는 [[컴퓨터 저장장치|컴퓨터의 저장장치]]("[[메모리]]" 또는 "[[램]]"으로 알려져 있음)로 "적재"되어야 한다.

소프트웨어를 불러오면 컴퓨터는 소프트웨어를 작동할 수 있다. 컴퓨터는 [[컴퓨터 프로그램]]을 "실행"하여 작동시킨다. 여기에는 응용 소프트웨어에서 [[명령어 집합|명령어]]를 보내는 과정이 포함되는데, 시스템 소프트웨어를 거쳐 궁극적으로 [[기계어]] 명령이 [[하드웨어]]에 전달된다. 각각의 명령어는 하나의 작업([[데이터]]를 옮기거나, 계산 결과를 저장하거나, 명령의 흐름을 변경하는 등의)을 수행하도록 한다.

* 기능에 따른 소프트웨어의 종류:
** [[실행 파일|실행 가능]]한 [[컴퓨터 소프트웨어|프로그램]]
** [[소스 코드]] 또는 [[스크립트 언어|스크립트]]
** [[구성]]

== 소프트웨어 제작 ==
소프트웨어는 [[프로그래밍 언어]]와 관련 유틸리티를 사용하여 제작되는데, 다음과 같은 몇 가지 형태가 있다.
* 스크립트 [[인터프리터]]와 같은 단일 프로그램: [[컴파일러]], [[링커 (컴퓨팅)|링커]]
* 다른 도구를 포함한 패키지: 다양한 언어를 지원하며 [[편집기]], [[디버거]]와 다른 도구들을 포함한 대형 제품군(보통 [[통합 개발 환경]][IDE]으로 불림).

[[컴퓨터 프로그래밍]], [[소프트웨어 공학]], [[소프트웨어 구조]], [[SaaS]]도 참조하라.

소프트웨어 제작 때는 다음과 같은 [[컴퓨터 언어]]가 쓰인다.

여담이지만 삼성 스마트폰의 터치 위즈를 구성하는 소프트웨어는 [[파이썬]](Python)
으로 제작 되었다.

* [[B (프로그래밍 언어)|B 언어]]
* [[C (프로그래밍 언어)|C 언어]]
* [[C++]]
* [[C 샤프|C#]]
* [[비주얼 베이직]]
* [[D (프로그래밍 언어)|D 언어]]
* [[코볼]](COBOL)
* [[에이다 (프로그래밍 언어)|에이다]](ADA) 등
* [[자바 (프로그래밍 언어)|자바]](JAVA)
* [[자바스크립트]](JavaScript/JS)
* [[파이썬]](Python)

그리고 소프트웨어 제작할 때 쓰이는 프로그램은 다음과 같다.
* [[비주얼 스튜디오]]
* [[볼랜드 C++]]
* [[GNU 컴파일러 모음|GCC]] 등

== 소프트웨어 특허 ==
[[소프트웨어 특허]]에 대해서는 찬반이 엇갈린다. 특허가 "[[발명자]]"의 아이디어를 보호하는 반면에, 많은 이들이 이것이 [[소프트웨어 개발]]을 방해한다고 믿기 때문이다.

== 법학적 관점에서의 소프트웨어 ==
대한민국의 소프트웨어산업진흥법에서는 소프트웨어를 "[[컴퓨터]]·[[통신]]·자동화 등의 장비와 그 주변장치에 대하여 명령·제어·입력·처리·저장·출력·상호 작용이 가능하도록 만드는 지시·명령(음성이나 영상정보를 포함한다)의 집합과 이를 작성하기 위하여 사용된 기술서 기타 관련 자료를 말한다."라고 정의한다.(법 제2조 1호)

== 소프트웨어 라이선스 ==
{{참고|틀:소프트웨어 배포}}
소프트웨어에는 여러 종류의 라이선스 형태가 있다. 크게는 다음과 같이 나뉜다.

# [[프리웨어]](freeware): 제작자가 라이선스만 지키면 마음껏 사용해도 된다.
# [[셰어웨어]](shareware): 보통 30일 동안 소프트웨어를 정식 버전과 같은 기능을 사용할 수 있다.<br />60일이나 90일 동안 사용할 수 있는 셰어웨어도 있다. 데모버전이라고도 한다.
# [[상용 소프트웨어]](Commercial Software): 돈을 지불하고 사용권을 구매해서 사용해야하는 소프트웨어 라이선스의 한 분류이다. 기업에서 제작하는 대부분의 소프트웨어가 상용 소프트웨어에 속한다. 예로는 Microsoft의 Office, Oracle의 Oracle DB등이 있다. 상용 소프트웨어는 다시 Node locked license, floating license, per user license, per machine license와 같이 나뉠 수 있다.

== 개발 단계에 따른 소프트웨어 분류 ==

소프트웨어 개발 단계에 따라 분류를 나눌 수 있다. 소프트웨어 배포자에 따라 이 소프트웨어 분류는 바뀔 수 있지만 일반적인 룰은 다음과 같다.

# 알파 버전: 개발 주기에서 알파 버전의 경우 내부 테스트용으로 공개하는 경우가 많다. 거의 모든 주요 기능을 포함하고 있지만 많은 버그가 존재하고 실제 사용자가 도입해서 사용하기에는 무리가 있는 버전을 말한다. 베타 버전 이전의 단계이다.
# 베타 버전: 베타 버전의 경우 알파에서 나온 문제점들을 수정한 단계이고 외부로 공개 테스트를 시작할 수 있을 정도의 완성도를 가진 소프트웨어를 말한다. 이후로는 새로운 기능보다는 나온 문제점들을 수정하고 UI를 최적화하는 작업을 진행한다.
# RC (Release Candidate): RC는 Microsoft에서 사용하는 소프트웨어 개발 단계로 정식판이 배포되기 직전의 단계로 볼 수 있다. 일반적으로 베타와 정식 배포판의 중간단계에 해당한다.
# Nightly build: 매일 발생하는 소프트웨어에 대한 수정사항을 포함하고 있는 소프트웨어 배포버전이다. 소프트웨어는 테스트가 되어 있지 않을 수 있기 때문에 매우 불안정한 상태이다.
# 정식 버전

== 같이 보기 ==
{{Col-begin}}
{{Col-2}}
* [[응용 소프트웨어]]
** [[모바일 응용 소프트웨어]]
* [[컴퓨터 프로그래밍]]
** [[프로그래밍 언어]]
** [[텍스트 편집기]]
** [[컴파일러]]
** [[알고리즘]]
** [[소프트웨어 개발]]
** [[소프트웨어 개발도구]]
** [[소프트웨어 유지보수]]
** [[소프트웨어 최적화]]
** [[API]]
* [[소프트웨어 공학]]
* [[소프트웨어 패키지]]

{{Col-2}}
* [[소프트웨어 라이선스]]
** [[오픈 소스]] 소프트웨어
** [[소프트웨어 저작권 침해]]
* [[프리웨어]]
* [[셰어웨어]]
* [[교육용 소프트웨어]]
** [[교수용 소프트웨어]]
** [[학습용 소프트웨어]]
{{Col-end}}

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{위키공용분류-줄}}
* {{dmoz|Computers/Software}}

{{소프트웨어 공학}}
{{전거 통제}}

[[분류:소프트웨어| ]]
[[분류:법학]]
[[분류:전산장비]]