소프트웨어의 개념
소프트웨어
소프트웨어는 프로그램, 데이터, 프로토콜 등과 같은 물질적 형태를 갖지 않는 컴퓨터의 부분을 말합니다. 소프트웨어는 시스템이 구축되는 물리적 하드웨어와 대조적으로 인코딩된 정보 또는 컴퓨터 명령어로 구성된 컴퓨터 시스템의 부분입니다. 컴퓨터 소프트웨어에는 컴퓨터 프로그램, 라이브러리 및 온라인 설명서 또는 디지털 미디어와 같은 관련 실행 불가능한 데이터가 포함됩니다. 종종 시스템 소프트웨어와 응용 소프트웨어로 구분됩니다. 컴퓨터 하드웨어와 소프트웨어는 서로를 필요로 하며 둘 다 혼자서는 현실적으로 사용할 수 없습니다. 소프트웨어가 IBM PC 호환 컴퓨터의 BIOS ROM과 같이 쉽게 수정할 수 없는 하드웨어에 저장되는 경우 "펌웨어"라고 불리기도 합니다.
프로그래밍 언어
수천 개의 다양한 프로그래밍 언어가 있습니다. 어떤 언어는 범용적인 용도로 사용되며, 다른 언어는 고도로 전문화된 응용 프로그램에만 유용합니다.
분류 | 언어 |
어셈블리 언어 | ARM, MIPS, x86 |
고급 프로그래밍 언어 | Ada, BASIC, C, C++, C#, COBOL, Fortran, PL/I, REXX, Java, Lisp, Pascal, Object Pascal |
스크립트 언어 | Bourne script, JavaScript, Python, Ruby, PHP, Perl |
프로그램
다른 모든 기계와 구별되는 현대 컴퓨터의 정의적인 특징은 프로그래밍이 가능하다는 것입니다. 즉, 어떤 종류의 명령어(프로그램)가 컴퓨터에 주어지면 컴퓨터가 이를 처리할 것입니다. 폰 노이만 아키텍처를 기반으로 하는 현대 컴퓨터들은 종종 명령어 프로그래밍 언어의 형태로 기계 코드를 가지고 있습니다. 실제적인 용어로 컴퓨터 프로그램은 예를 들어 워드프로세서나 웹 브라우저용 프로그램과 마찬가지로 몇 개의 명령어에 불과하거나 수백만 개의 명령어까지 확장될 수 있습니다. 일반적인 현대 컴퓨터는 초당 수십억 개의 명령어를 실행할 수 있고 수년 동안 작동하면서 거의 실수를 하지 않습니다. 수백만 개의 명령어로 구성된 대형 컴퓨터 프로그램은 프로그래머 팀이 작성하는 데 수년이 걸릴 수 있으며 작업이 복잡하기 때문에 거의 틀림없이 오류를 포함합니다.
Stored Program Architecture
대부분의 경우 컴퓨터의 명령어는 간단합니다: 하나의 숫자를 다른 숫자에 추가하거나, 일부 데이터를 한 위치에서 다른 위치로 이동하거나, 어떤 외부 장치로 메시지를 전송하는 등입니다. 이러한 명령어는 컴퓨터의 메모리에서 읽혀지고 일반적으로 주어진 순서대로 수행(실행)됩니다. 그러나 일반적으로 컴퓨터에게 프로그램의 다른 곳으로 앞 또는 뒤로 점프하도록 지시하고 거기에서 실행을 계속하기 위한 특수화된 명령어가 있습니다. 이를 "점프" 명령어(또는 분기)라고 합니다. 또한 점프 명령어는 이전 계산의 결과 또는 외부 이벤트에 따라 다른 순서의 명령어가 사용될 수 있도록 조건부로 발생하도록 만들 수도 있습니다. 많은 컴퓨터가 점프한 위치를 "기억"하는 점프 유형과 그 점프 명령어 뒤에 명령어로 복귀하기 위한 다른 명령어를 제공함으로써 서브루틴을 직접 지원합니다.
프로그램 실행은 책을 읽는 것에 비유될 수 있습니다. 보통 한 사람은 각각의 단어와 행을 순차적으로 읽는 반면, 때때로 그들은 텍스트의 이전 위치로 점프하거나 관심이 없는 섹션을 건너뛸 수 있습니다. 이와 비슷하게, 컴퓨터는 때때로 프로그램의 일부 섹션에 있는 지시사항을 어떤 내부 조건이 충족될 때까지 반복하여 반복할 수 있습니다. 이것을 프로그램 내 제어의 흐름이라고 하며 이것은 컴퓨터가 사람의 개입 없이 작업을 반복적으로 수행할 수 있도록 하는 것입니다.
이에 비해 포켓용 계산기를 사용하는 사람은 버튼을 몇 번만 누르면 두 개의 숫자를 더하는 것과 같은 기본적인 산술 연산을 할 수 있습니다. 하지만 1부터 1,000까지의 숫자를 모두 합하려면 수천 번의 버튼 누름과 많은 시간이 필요할 것이고, 실수할 가능성도 거의 없습니다. 반면에 컴퓨터는 몇 가지 간단한 명령만으로 이 일을 하도록 프로그래밍되어 있을 수도 있습니다.
기계어
대부분의 컴퓨터에서 각각의 명령어는 기계 코드로 저장되고 각각의 명령어에는 고유한 숫자(operation code 또는 줄여서 opcode)가 부여됩니다. 두 개의 숫자를 합하는 명령어에는 하나의 opcode가 있을 것이고, 곱하는 명령어에는 다른 opcode 등이 있을 것입니다. 가장 간단한 컴퓨터는 몇 개의 다른 명령어 중 하나를 수행할 수 있습니다. 더 복잡한 컴퓨터일수록 각각 고유한 숫자 코드를 가진 수백 개의 명령어를 선택할 수 있습니다. 컴퓨터의 메모리는 숫자를 저장할 수 있기 때문에 명령어 코드도 저장할 수 있습니다. 이렇게 되면 전체 프로그램은 숫자의 목록으로 표시될 수 있고 그 자체도 숫자 데이터와 같은 방식으로 컴퓨터 내부에서 조작될 수 있다는 중요한 사실이 나타납니다. 프로그램을 작동하는 데이터와 함께 컴퓨터의 메모리에 저장하는 기본 개념은 폰 노이만의 크럭스, 즉 저장된 프로그램, 아키텍처입니다. [118][119] 경우에 따라 컴퓨터는 작동하는 데이터와 분리된 상태로 유지되는 프로그램의 일부 또는 전부를 메모리에 저장할 수 있습니다. 이것은 하버드 마크 I 컴퓨터의 이름을 따서 하버드 아키텍처라고 불립니다. 현대의 폰 노이만 컴퓨터는 CPU 캐시와 같은 디자인에 하버드 아키텍처의 몇 가지 특징을 보여줍니다.
컴퓨터 프로그램을 긴 숫자 목록으로 작성하는 것이 가능하고 이 기술이 많은 초기 컴퓨터에서 사용되었지만, 특히 복잡한 프로그램의 경우 실제로 그렇게 하는 것은 매우 지루하고 오류가 발생할 가능성이 있습니다. 대신에, 각 기본 명령어에는 그 기능을 나타내고 기억하기 쉬운 짧은 이름이 붙여질 수 있습니다(ADD, SUB, MULT, JUMP 등). 이 기억법들을 통칭하여 컴퓨터의 집합 언어라고 합니다. 집합 언어로 작성된 프로그램을 실제로 (기계 언어) 이해할 수 있는 것으로 변환하는 것은 보통 어셈블러라고 불리는 컴퓨터 프로그램에 의해 이루어집니다.
고급 프로그래밍 언어
프로그래밍 언어는 컴퓨터가 실행할 프로그램을 지정하는 다양한 방법을 제공합니다. 자연어와 달리 프로그래밍 언어는 모호함이 없고 간결하도록 설계되었습니다. 순수하게 쓰여진 언어들이기 때문에 큰 소리로 읽기 어려운 경우가 많습니다. 일반적으로 실행되기 전에 컴파일러나 어셈블러에 의해 기계 코드로 번역되거나, 인터프리터에 의해 런타임에 직접 번역됩니다. 때때로 프로그램은 두 기술의 혼합된 방법에 의해 실행됩니다.
저수준 언어
일반적으로 기계 언어와 이를 표현하는 어셈블리 언어는 컴퓨터 중앙 처리 장치(CPU)의 특정 아키텍처에 고유합니다. 예를 들어, 스마트폰이나 핸드헬드 비디오 게임에서 볼 수 있는 ARM 아키텍처 CPU는 PC에 있을 수 있는 x86 CPU의 기계 언어를 이해할 수 없습니다. 역사적으로 상당히 많은 다른 CPU 아키텍처가 개발되었고, 특히 질로그 Z80 외에 MOS Technology 6502 및 6510을 포함하여 광범위하게 사용되었습니다.
고수준 언어
기계어보다 훨씬 쉽지만 어셈블리어로 긴 프로그램을 작성하는 것은 종종 어렵고 오류가 발생하기 쉽습니다. 따라서 대부분의 실용적인 프로그램은 프로그래머의 요구를 더 편리하게 표현할 수 있는 보다 추상적인 고급 프로그래밍 언어로 작성됩니다. 고급 언어는 컴파일러라는 또 다른 컴퓨터 프로그램을 사용하여 보통 기계어로 "컴파일링"됩니다. 고급 언어는 어셈블리어보다 대상 컴퓨터의 작동과 덜 관련이 있으며 최종 프로그램이 해결해야 할 문제의 언어 및 구조와 더 관련이 있습니다. 따라서 종종 다른 컴파일러를 사용하여 동일한 고급 언어 프로그램을 여러 종류의 컴퓨터의 기계어로 변환하는 것이 가능합니다. 이는 비디오 게임과 같은 소프트웨어를 개인용 컴퓨터나 다양한 비디오 게임 콘솔과 같은 다양한 컴퓨터 아키텍처에서 사용할 수 있도록 하는 수단의 일부입니다.
프로그램설계
소규모 프로그램의 프로그램 설계는 비교적 간단하며 문제 분석, 입력 수집, 언어 내 프로그래밍 구성 요소 사용, 기존 절차 및 알고리즘 사용, 출력 장치 및 문제 해결책에 대한 데이터 제공 및 해당 가능한 해결책 제공 등을 포함합니다. 문제가 점점 더 커지고 복잡해짐에 따라 서브 프로그램, 모듈, 공식 문서와 같은 기능과 객체 지향 프로그래밍과 같은 새로운 패러다임이 직면합니다. 수천 개의 코드 라인과 더 많은 코드를 포함하는 대규모 프로그램은 공식 소프트웨어 방법론을 필요로 합니다. 대규모 소프트웨어 시스템을 개발하는 작업은 상당한 지적 과제를 제시합니다. 예측 가능한 일정 및 예산 내에서 허용 가능할 정도로 높은 신뢰성을 가진 소프트웨어를 제작하는 것은 역사적으로 어려웠습니다. 소프트웨어 공학의 학문적 및 전문적 학문은 특히 이 과제에 집중합니다.
버그
컴퓨터 프로그램의 오류는 "버그"라고 불립니다. 버그는 프로그램의 유용성에 영향을 미치지 않거나 미세한 영향만 미칠 수 있습니다. 그러나 일부 경우에는 프로그램 또는 전체 시스템이 마우스 클릭이나 키 누름과 같은 입력에 반응하지 않거나 완전히 실패하거나 충돌하게 할 수 있습니다. 그렇지 않으면 버그를 이용하여 컴퓨터의 적절한 실행을 방해하도록 설계된 악용 및 코드를 작성하는 파렴치한 사용자가 악의적인 의도로 이용할 수 있습니다. 버그는 일반적으로 컴퓨터의 잘못이 아닙니다. 컴퓨터는 주어진 명령을 실행하는 데 불과하기 때문에 버그는 거의 항상 프로그래머 오류 또는 프로그램 설계상의 감독의 결과입니다. 미국의 컴퓨터 과학자이자 최초의 컴파일러 개발자인 그레이스 호퍼 제독은 1947년 9월 하버드 마크 II 컴퓨터에서 죽은 나방이 릴레이가 부족한 것을 발견한 후 컴퓨터에서 "버그"라는 용어를 처음 사용한 것으로 알려져 있습니다.