개발자입니다
[비트캠프] 19일차(4주차4일) - 프로그래밍 언어론 본문
프로그램 실행과 프로그래밍
programming : 컴퓨터가 할 일을 순서대로 기록한 것
loading : 읽고 저장하는 것
프로그램 실행은 App에서 OS로 ① 읽기 후 RAM으로 ② 저장한다. 이를 CPU로 ③ 전달하면 CPU는 ④ 명령어 실행 후 RAM에 결과를 ⑤ 보관한다. OS는 ⑥ 결과 꺼내기하고 ⑦ 화면 출력해서 사용자가 모니터로 볼 수 있게 된다.
CPU와 RAM, bit
CPU와 RAM간 데이터 전송 선 개수에 따라 32bit, 64bit 나뉜다.
CPU 제조사는 CPU를 통해 명령을 실행시키는 방법을 명세서로 제공한다.
+, -, *, / 등을 신호 보내는 비트 규칙에 맞춰서 코드로 보내는 방법이 있다.
신호 보내는 비트 규칙들을 instructions set(명령어 셋)이라 한다.
- cpu 버전이 올라갈수록 명령 규칙이 추가된다.
- cpu마다 명령어 다름 : i계열 vs 제온계열
- cpu 제조사마다 명령어 다름. 즉 전기 신호를 보내는 규칙이 다름
명령어 작성 : 기계어
① CPU instructions set 명세서를 보고 직접 명령어 작성
- 특징
1) CPU bit가 적은 8bit 시절에는 개발자가 직접 작성하기도 했다.
2) 보통 2진수를 짧게 표현한 16진수를 사용해서 작성한다.
3) 인간의 문자와 거리가 멀기 때문에 작성하기 매우 불편하고 힘들다.
4) CPU bit가 32bit, 64bit로 늘어나면서 더 어렵게 되었다.
5) CPU 마다 명령어(전기적 신호, 비트 규칙)가 다르기 때문에 다양한 CPU에서 실행할 수 있는 명령어를 작성하기 매우 힘들다.
명령어 작성 : Assembly
② 직접 기계어로 작성하는 대신 간결한 영어 단어로 이루어진 명령어 사용하기
개발자는 Assembly로 작성하고 이를 변환(compile, 번역)해서 기계어로 만든다. 이를 CPU가 실행한다.
*Compiler : Assembly 언어로 작성된 명령어를 CPU가 이해할 수 있는 기계어로 바꿔주는 프로그램
- 특징
1) 명령어가 영어 단어와 비슷해서 작성하기 편하다
2) CPU마다 다르게 작성할 필요가 없다. 왜? 컴파일러가 CPU에 맞춰서 기계어로 번역해준다.
명령어 작성 : Assembly와 컴파일러
개발자가 Assembly 명령을 작성하면 각각 Intel용 compiler, MiPS용 컴파일러, PowerPC용 컴파일러, ARM용 compiler가 이에 맞게 번역해준다.
명령어 작성 : C
③ 더 인간 친화적인 프로그래밍 언어로 명령어 작성하기
더 인간 친화적인 프로그래밍 언어 C로 명령어 작성할 수 있다.
기계어, OS, CPU
동일한 이력서를 여러 회사에 제출할 수 없다. 같은 한국어라도 각 회사마다 이력서 양식이 다르기 때문이다.
동일한 C언어 명령문을 Intel CPU용 기계어라고 다 적용할 수 없다.
같은 기계어라도 운영체제 마다 명령문을 구성하는 방식이 다르기 때문이다.
같은 한국어라도 회사마다 이력서 양식이 다르듯이
개발자가 작성한 명령문을 windows 컴파일러가 compile해서 windows OS용 기계어로 구성한다. 그러면 windows OS가 이를 받아들인다.
C 컴파일
Linux C 컴파일러로 만든 a.out 파일은 windows에서 실행할 수 없다. Linux용 Intel CPU 기계어 코드로 되어있기 때문이다.
Intel CPU 기계어라도 명령문의 배치 방법이 다르기 때문에 windows에서는 인식할 수 없다.
centos gcc 설치
: 리눅스에서 sudo yum install gcc 입력
windows gcc 설치 : 검색 'windows gcc' - https://www.mingw-w64.org/ - download - cygwin 버전 다운 후 설치
둘다 10.2.0-1 선택해서 다음 클릭한다.
작업표시줄에 '환경' 검색해서 시스템 속성 들어간다.
고급 - 환경 변수 들어가서 다음과 같이 설정한다.
C 컴파일 + OS 전용 명령 사용
명령문을 compile해서 windows 전용 기계어로 만든다. 그걸 실행하려면 windows OS와 Direct X가 필요하다.
이 명령문이 Linux에서 사용되지 않는 이유는 무엇일까. Direct X Library 명령은 windows에만 존재한다. Linux에 Direct X가 없어 compile이 불가하다. Linux에는 Direct X 라이브러리가 없다.
예전의 프로그램 공유 문화
소스코드를 그대로 공유했다. 왜냐면 CPU가 달랐기 때문이다.
컴파일해서 프로그램을 사용하는 것이 일반적이다. (unix에 컴파일러가 기본으로 내장됨)
프로그래밍 언어와 컴파일러
C 언어 명령문은 C 컴파일러로 compile하면 기계어로 바뀐다.
C++ 언어 명령문은 C++ 컴파일러로 compile하면 기계어로 바뀐다.
Pascal 언어 명령문은 Pascal 컴파일러로 compile하면 기계어로 바뀐다.
그렇다면 개발자는 어느 언어를 선택해야 하는가? 다음에 따라 선택해야 한다.
프로그래밍 언어마다 특장점이 있다. 프로젝트 성격에 따라 언어를 선택해야 한다.
- 인공지능, 머신러닝, 딥러닝 : Python
- Web app. : java(국내), php, go
- Web UI : javascript, Typescript
- 통계 : R
컴파일 방식과 인터프리트 방식
컴파일 방식 : *.c 파일을 C compiler가 읽고 compile한다. OS에 맞춰 기계어로 바뀌고 이를 OS에 load한다. OS가 CPU에 전달해 execution한다.
- 실행할 때 기계어 파일만 있으면 된다.
- 소스파일 필요없다. 소스파일을 보호(자산)
- 실행할 때 컴파일러 불필요.
→ 기계어로 바로 실행하여 실행 속도가 빠르다.
인터프리트 방식 : *.js 파일을 JavaScript Interpreter가 읽고 interprete한다. OS에게 전달하고 OS는 CPU에 전달해 execution한다.
- 실행할 때마다 소스 파일 필요
- 소스 파일 공개하여 자산으로 보호하기 힘들다.
- 실행하려면 인터프리터 필요
→ 매번 명령어를 해석해서 실행해 실행 속도가 느리다.
인터프리터
= viewer
= player
= engine
= virtual machine
JavaScript (Interpreter) Engine
chorne의 2개의 심장 : Webkit(HTML, CSS 렌더링 엔진), V8(JavaScript 엔진)
V8은 오픈 소스 공개했다. V8 + α 해서 NodeJS 로 만들었다. Standalone JavaScript Engine이며 웹브라우저 없이 JavaScript를 실행한다.
Nodejs 설치 : https://nodejs.org/en/ 접속 후 18.12.1 다운로드 후 다음 눌러 설치
JIT Compile 과 AOT Compile
① Plain 인터프리터 : 소스를 인터프리터가 읽어서 OS 통해서 execution 한다. 매번 소스를 검사하고 해석하기 때문에 속도 느리다.
② JIT (Just in Time) 컴파일 : 소스를 인터프리터가 읽어서 실행하려는 일부 코드를 컴파일한다. 그 기계어를 OS 통해서 execution 한다. 컴파일 할때 잠깐 느려지지만 이후에 실행할 때는 빨라진다.
③ AOT (Ahead of Time) 컴파일 : 소스를 HDD에 설치 할 때, 설치 시점에 미리 전체 소스를 컴파일 해둔다. 그 기계어를 OS 통해서 execution 한다. 설치 시간이 좀 더 걸린다. 실행은 컴파일 방식과 같다. 예) Android App
Android와 App, AOT 컴파일
PlayStore에 App이 올라가면 bytecode가 올라간다. bytecode : 진짜 기계어가 아니라 기계어에 흡사한 코드. (= 중간코드 = p-code)
App.을 설치할 때 해당 CPU에 맞춰서 컴파일 한다. "AOT" 컴파일
Web Browser와 JavaScript
Web Browser가 .html 파일에서 HTML, CSS, JavaScript를 읽는다.
HTML, CSS : Rendering Engine
JavaScript : JavaScript Engine
JavaScript 예제
ex00 폴더
<script>, </script> 제어권
exam01.html
<script> // javascript 엔진에게 제어권 넘김
console.log("출력1");
</script> <!-- rendering 엔진에게 제어권 넘김 -->
조언
*강사님 예제, 책 예제, 다른 책 예제 3개 다 해보면서 익숙해져라
*예습 하지말고 복습 철저히 해라
과제
/
'네이버클라우드 AIaaS 개발자 양성과정 1기 > Javascript' 카테고리의 다른 글
[비트캠프] 24일차(5주차4일) - Javascript(함수: 정의, closure, arrow function) (0) | 2022.12.08 |
---|---|
[비트캠프] 23일차(5주차3일) - Javascript(배열, 반복문, destructuring) (0) | 2022.12.07 |
[비트캠프] 22일차(5주차2일) - Javascript(연산자, 조건문) (0) | 2022.12.06 |
[비트캠프] 21일차(5주차1일) - Javascript(변수, 배열) (0) | 2022.12.05 |
[비트캠프] 20일차(4주차5일) - Javascript(개요) (0) | 2022.12.02 |