1. 프로그램?
-프로그램: 계획(or 수행절차)
-사실 일상에서 많이 사용되고 있다: 영화제 프로그램, 교육 프로그램, 라디오 프로그램, 컴퓨터 프로그램 등등
이 재료를 가지고 어떤 순서로 수행할 것인가?
ex) 영화제의 경우, 상영할 영화들을 어떤 절차로 상영할 것인가?
컴퓨터의 경우, 컴퓨터 안에있는 요소들을 이용하여 절차를 만드는 것
2. 컴퓨터?
-중앙처리장치(CPU) : 산술/논리 연산, 흐름제어
-기억장치=주기억장치(Memory)+보조기억장치(storage): 데이터 저장소
-다양한 입·출력 장치: 데이터 소스/영구 저장소
(기본 입출력 장치=콘솔: 모니터, 키보드, 마우스)
*콘솔: 사람이 기계를 이용하기 위한 조정장치
3. 컴퓨터 프로그램?
-컴퓨터 프로그램: 컴퓨터를 이용한 절차를 만들어 놓은 것
시작(CPU)->읽어오기(주기억장치, 보조기억장치)->메뉴출력(모니터)->연산(CPU)->종료
재료(=플랫폼=하드웨어)를 이용해서 수행절차(=프로그램=소프트웨어)를 만드는 것
4. CPU?
-CUP: 계산기 능력과 순서를 제어하는 중앙처리장치
요즘 CPU는 CPU안에 여러 개의 CPU가 들어가 있는 추세.
'Core'부분이 하나의 CPU안의 또 하나의 CPU임
-L1캐시, L2캐시, L3캐시: 메모리(1,2,3차이는 1이 속도가 가장 빠름. 메모리 속도에 맞춰서 1,2,3 알아서 매칭)
-ALU: 산술연산, 논리연산 유닛
-CU: 흐름제어 유닛
-레지스터: 데이터를 메인 메모리에서 읽어옴, 임시저장소
[정리] 메모리가 저장 버퍼(L1 캐시, L2캐시, L3캐시)에 올라옴->로드 버퍼인 임시저장소(레지스터)에 잠시 저장-> 메모리를 연산함(ALU)
EX) 입출력 장치에서 2+243+325+63547+64758473+212+2425이 메모리에서 읽어옴->저장 버퍼를 거쳐 레지스터에 임시 저장-> ALU+CU에서 연산
5. 컴퓨터 프로그램 만들어보기
3+4를 연산하기 위해 필요한 것은? CPU입니다.
CPU안에서 할 수 있는 게 ALU와 CU가 있는데, 연산에는 CU는 굳이 필요 없으니 ALU면 충분합니다.
3이 데이터선을 만나면 2진수로 바꾼 011(3)이 들어가게 됩니다. 그럼 명령선은 move!라는 명령을 내리게 되고 레지스터로 이동하게 됩니다.
4도 데이터선을 만나 2진수로 바뀌고 명령선에 의해 레지스터로 이동하게 됩니다.
명령선은 add!라는 명령을 내리고 ALU에 의해 두 개의 수가 더해집니다.
그럼 7이 출력하게 됩니다.
6. 번역기를 이용한 컴퓨터 프로그래밍 언어들
-3+4 -> 번역기 -> 2진수
-수학 연산을 많이 닮은 C 계열의 고급언어의 명령어
산술 연산 + - * / %
비교 연산 > < <= >= ==!=
관계 연산 && ||
7. 번역기의 종류
3+4를 '실행코드'로 보여주면 우리는 부담이 되죠.
숫자는 실행하는 스위치 상태를 보여주긴 하나, 숫자 자체가 우리한테 주는 의미 자체를 어려워서 와닿지 못하거든요.
그래서 '기능'적인 의미로 쉽게 이해할 수 있게 '기능코드'로 바꿉니다.
'MOV', 'AX', '3'처럼 심벌을 이용해서 보여주면 이해하기 쉽기 때문에 기능코드를 사용하기 시작합니다.
기능코드만 보여주면 '어떠한 내용으로, 어떠한 기능을 이용하겠다'는 잘 알겠지만,
실행하려 하면 어려워요. 어떤 흐름인지 알지 못해요.
실행코드: 내용은 모르지만 '실행'은 할 수 있다.
기능코드: 실행코드의 '기능'을 설명하는 것
번역기는 컴파일러, 어셈블러 두 가지만 있는 게 아니라 인터프리터라는 것도 존재합니다.
컴파일러는 번역만 하는 역할을 하고, 인터프리터는 한 번에 번역하기보단 사용자가 필요한 부분만 번역하여 결과를 남기지 않습니다. 대표적으로 자바스크립트가 인터프리터 언어이고 c나 c++ 이 컴파일 언어입니다.
8. 고급언어를 이용한 컴퓨터 프로그래밍
시작-> CU(흐름 제어)->01101011을 보조장치에서 읽어오고 메모리에 01101011로 씀->모니터에서 메뉴를 출력하는데 01001001로 읽어오고 10101011로 씀->CU->ALU에서 연산이 이루어짐->CU->종료->다시 시작~
근데 고급언어(Jva, C, C++, C#..)를 사용하면 어떨까요?
고급언어는 연산자, 제어구조, 변수, 배열 등으로 이루어져 있습니다.
절차는 똑같으나 사용하는 명령 형태가 달라지는 것뿐입니다.
시작-> CU(흐름 제어)->01101011을 보조장치에서 읽어오고 메모리에 'int [] data='로 씀->모니터에서 메뉴를 출력하는데 'menu'로 읽어오고 10101011로 씀->switch문-> 연산자 '+'를 통해 'int result = 4+2+5;' 연산이 이루어짐->if문-> break문->다시 시작~
이걸 번역기를 돌리면
시작-> CU(흐름 제어)->01101011을 보조장치에서 읽어오고 메모리에 01101011로 씀->모니터에서 메뉴를 출력하는데 01001001로 읽어오고 10101011로 씀->CU->ALU에서 연산이 이루어짐->CU->종료->다시 시작~
번역기의 도움으로 기계어 형태가 되는 것입니다.
보면 바뀐 부분을 색깔로 표시해놨는데 안 바뀐 부분도 있습니다.
그런 부분은 언어로 커버할 수 있는 부분이 아니라서입니다. 입출력 장치는 언어가 지원하지 않습니다.
입출력 장치까지 지원하는 것은 API라는 것입니다. API는 큰솔과 파일로 이루어져 있습니다.
결론 CPU와 기억장치는 고급언어로 변경가능하나, 입출력장치는 API도움이 필요하다.
9. API(Application Progreamming Interface)란?
CPU와 기억장치는 API의 도움이 안 필요한데, 입출력장치는 왜 API의 도움이 필요할까요?
CPU와 기억장치는 그렇게 자주 바뀌지도 않고, 만드는 것도 쉽지 않아요.
반면에 입출력 장치는 CPU와 기억장치에 비해 많죠. 그 많은걸 언제 계산하고 앉아있나요.
그래서 API(Console, Window, 파일, 네트워크 등)를 사용하여 입출력 장치를 연결합니다.
애플리케이션이 프로그램을 만들 때 입출력 장치를 간접적으로 사용하는 것
10. API의 구현체 그리고 API와 플랫폼의 관계
절차 언어(고급언어)↔프로그램(수행절차)↔API↔플랫폼(카카오톡, 페이스북, 입출력 도구 등등)
고급언어를 가지고 절차를 짭니다. 입출력을 지원하기 위해 API를 사용하죠.
API가 중간 매개 역할로 카카오톡과 같은 플랫폼을 연결해줍니다.
신기하게 API는 함수 형태로 이루어져 있습니다.
11. 프로그래밍에서 함수가 제공하는 3가지 능력
"철수는 사과, 배, 바나나, 오렌지를 먹었다. 근데 영희도 사과, 배, 바나나, 오렌지를 먹었다."
글에서 중복된 표현이 보이죠? 너무 길어요. 짧게 바꿀 순 없을까요?
여기서 '사과, 배, 바나나, 오렌지'를 '과일'이라고 칭하면 어떨까요?
더 간단하게 '과일'을 'x'라고 바꾸면요?
[과일 = 사과, 배, 바나나, 오렌지;]
[x = 과일;]
[철수는 x를 먹었다. 근데 영희도 x를 먹었다;]
-코드 파편화: 코드를 나눠서 만들 수 있다.
-코드 집중화: x로 바꾸니 훨씬 더 보기 쉽습니다.
-코드 은닉화: x를 알려면 원래 그 뜻이 뭐였는지 알아야 하기 때문에
우리는 플랫폼이 바뀌어도 코드에 영향이 가지 않아요.
플랫폼 자체는 가만히 있고 API로 함수만 바꾸면 되니까요.
모니터를 바꾼다? 안에 있는 함수는 내버려두고 모니터만 바꾸면 됩니다.
그래서 자주 바뀌는 입출력 장치는 API가 꼭 필요한 이유입니다.
-함수는 API일까요?
:API일수도 아닐 수도 있다.
:함수가 간접적인 도구로 사용할 때만 API인 거다.
:함수가 인터페이스로만 사용된다는 것은 잘못된 것
:인터페이스로서 함수를 사용할 순 있다.
12. 어떤 언어로 프로그래밍을 시작할 건가?
웹플랫폼(Browser, NodeJS 등) | javascript, Typescript, ... |
모바일 플랫폼(Android, IOS 등) | Java, Kotlin, Swift, Objective-c, C# ... |
가상머신 플랫폼(Java, .NET 등) | Java, C#, Kotlin, ... |
운영체제(Unix, MS Windows 등) | C, C++ |
물리적인 장치 | Assembly |
본 내용은 유튜버 '뉴렉처'를 참고하여 만들었습니다.
https://www.youtube.com/user/newlec1/playlists