컴퓨터
특징
- 어떤 계산이라도 수행 가능
- 일부 명령어뿐이지만 매우 빠르며 제어 가능
- 극도로 상세하게 알려주지 않는다면 스스로 불가
소프트웨어
- 컴퓨터에 사용하는 일련의 명령어를 의미하는 일반적인 용어
알고리즘
- 특정 과제를 달성하기 위한 이상적인 절차
- 얼마나 효율적으로 작동하느냐가 중요
- 추상적이고 이상적인 절차를 기술한 것
- 기본 연산을 사용하여 각 단계를 상세히 설명하고 모든 상황을 다루며 결국 멈춰야 한다
- 최악의 경우(지름길 없이 모든 작업을 수행하는 경우)를 가정하기도 함
- 과제의 본질적인 복잡도와 알고리즘의 복잡도가 같을 필요는 없다
- 연산 횟수에 따라 선형 알고리즘, 지수 알고리즘 등으로 불림
프로그래밍 언어
- 특정 과제를 달성하기 위한 이상적인 절차를 표현하려고 사용하는 언어
- 사람에게도 어느 정도 자연스러운 형태로 표현하도록 해주는 언어
- 초기에 코드 작성 어려워 수정, 변경, 추가 자체가 어려웠다
- 개선 : 어셈블러 : 특정한 처리를 수행하는 프로그램, OS에 영향 많이 받으며 구문 오류 외적인 에러 검출 어려움
- 개선 : 고수준 언어
- 가장 중요한 언어 : C, C++, JAVA, JS, Python 등
- C : 에러 검출 쉽지 않음
- C++ : C 복잡성 관리 개선, 브라우저 및 맥에 기반, 프로그래밍의 편안함 보다는 컴퓨터의 효율
- JAVA : 임베디드 -> 웹 페이지 -> 웹서버, C++ 보다는 단순, C 보다는 복잡
- JS : 웹 페이지 동적인 효과, 광범위한 언어군
- 모든 브라우저에 포함되어 있어 소프트웨어 별도 다운 필요 X
- 약간의 HTML을 가미해야된다
- Python : 가독성 초점
- 폭넓으며 일상적인 프로그래밍이 가능
- 방대한 Lib
- 모든 언어들은 각자의 트레이드 오프를 고려하며 시대에 필요하게끔 발전
- 어떤 언어도 단독으로 모든 프로그래밍 과제에 이상적이지 않음
- 능숙한 개발자여도 사용할 수 있는 다수의 언어들의 수준이 동일하지 앟음
주요 개념
- 구문 규칙(syntax)
- 문법적으로 무엇이 맞고 무엇이 틀리는지 정의하는 규칙
- 하나의 언어를 배운경우 나머지 언어들도 구문 규칙만 익히면 되기에 자연스럽게 익힐 수 있다
- 의미 체계(semantics)
- 해당 언어로 표현할 수 있는 모든 것에 대해 명확히 정의된 의미
- ex) 자바스크립트 구현
- 브라우저마다 다소 차이가 있고, 심지어 같은 브라우저라도 버전별로 다르기도 하다
- 세 가지 측면
- 언어 그 자체
- 코드 라이브러리
- 프로그램 실행환경에 접근하는 기능
자료구조
- 과제 달성 과정에서 필요한 정보를 표현하고 관리하는 방법
프로그램
- 실제 컴퓨터가 과제를 완료하기 위해 수행해야 하는 모든 단계를 구체적으로 서술, 추상적 X
- 하나 이상의 알고리즘이 컴퓨터가 직접 처리할 수 있는 형태로 표현한 것
- 알고리즘 외적으로 실질적인 문제도 고려 필요
- 메모리, 프로세서 속도, 잘못된 입력 데이터, 하드웨어 결합, 네트워크 등
Lib
- 어떤 프로그램도 완전히 처음부터 새로 만들어지지 않음
- 다른 사람들이 이미 만들어 놓은 함수를 이용해서 계산을 수행 할 수 있으며 함수 내부적으로 어떻게 일이 진행되는지는 알 필요 X
- 함수들의 모음
- API(Application Programming Interface) 제공
- 함수의 설명서라 생각하면 된다
- 시스템을 사용과 관련된 여러 문서들
- SDK(소프트웨어 개발 키트, Software Development Kit)
- 복잡한 소프트웨어 Lib를 다루게 해주며 SDK 자체도 대형 소프트웨어 시스템
- 소프트웨어를 개발할 때 프로그래머 < 테스터
운영체제
- 컴퓨터 하드웨어를 관리하고 다른 프로그램을 실행할 수 있게 하는 소프트웨어의 기초 구조물
- 하나의 프로그램
- 과거에 하나의 운영체제에 하나의 App만 실행 가능
- 컴퓨터의 자원을 제어하고 할당
- 프로세서 관리, 스케줄링
- 자원 독점 방지
- 이벤트에 따른 프로그램 상태 관리
- 프로세서 속도의 따른 자원 할당
- Application에 차례로 통제권을 준다
- 시스템 콜 - system call
- 운영체제에 사용자가 원하는 서비스를 요청하는 진입점을 칭하는 말
- 주기억 장치
- 메모리에 프로그램 로드해 명령어 실행하게끔
- 스와핑(swaping)
- 용량 충분치 못한 경우 일부 프로그램 일시적으로 디스크(virtual memory)에 복사했다가 여유 생길 때 다시 옮겨오는 것
- 프로그램은 메모리가 무제한인 것처럼 행동, 스와핑을 통해 착시 시킴
- 보조 기억 장치에 저장된 정보 관리
- 메모리 겹치는 것 방지
- 디바이스 드라이버 : 특정 종류의 하드웨어 장치 간에 가교 역할
- 멀티 부트 - multiple boot
- 디스크에 몇 개의 운영체제를 저장해 두고 컴퓨터를 킬 때마다 어느 것을 실행할지 결정
- 가상 머신 - virtual machine
- 호스트 운영체제에서 특정 운영체제를 게스트 운영체제로 실행할 수 있게 해주는 것
- 호스트는 일부 권한들 컨트롤
- 클라우드 컴퓨팅
- 클라우드 서비스 제공 업체는 가상 머신에 의존저장 공간과 네트우크 대역폭이 충분한 물리적 컴퓨터를 대량으로 보유, 자원을 고객에게 제공
- ex) AWS
Application
- 운영체제 위에서 실행되는 프로그램
- 운영체제를 플랫폼으로 삼아 작업을 수행하는 온갖 종류의 프로그램이나 소프트웨어 시스템을 총칭하는 용어
- 하나의 기능만 실행하는 것부터 복잡한 작업을 수행하는 대형 프로그램까지 다양
브라우저
- 웹 서버에 요청을 보내고 화면에 표시할 정보를 웹 서버에서 받아온다
- 비동기적(asynchronous, 예측할 수 없는 시점에 순서 없이 발생하는) 이벤트로 인해 굉장히 복잡
- 운영체제와 유사
- 자원을 관리하고, 동시에 일어나는 활동을 제어하며 조정
운영체제 <-> Application
- 사용자가 원하는 작업(App)이 자원을 효율적이고 공평하게 공유하면서 서로 간섭하지 않을 것을 보장하는 조정자(운영체제)
- 그 중 Linux는 범용 OS 시스템이라 생각하면 된다
컴퓨터 간단한 구조
<어플리케이션, Lib>
System Call
<소프트웨어>
Device Driver
<하드웨어>
- 계층화
- 각 계층은 서로의 관심사를 구분 지으며 프로그래머가 복잡성을 처리하는 데 도움이 되는 중요한 아이디어 중 하나
프로세서
- 컴퓨터가 켜졌을 때 영구 기억 장치에 저장된 약간의 명령어를 실행해서 작동을 시작하도록 구성
- 작은 플래시 메모리에서 명령어를 읽음
- 이 과정을 부팅이라 부른다
정리