LHJ

I'm a FE developer.

1.1. Program & Timing

14 Jun 2020 » codespitz

Program & Timing

COMPILE PROGRAM

  1. LANGUAGE CODE
  2. MACHINE LANGUAGE(컴파일)
  3. FILE(컴파일 후 파일화)
  4. LOAD(메모리에 로드) : exe 파일을 클릭해야지만 윈도우 메모리에 적재되고 실행됨
  5. RUN(실행)
  6. TERMINATE

LOAD 시점부터 프로그램이라고 부른다.
그냥 FILE은 의미 없음.
FILE이 프로그램이 되려면 주 메모리에 적재되어야지만 프로그램이 됨.
LOAD 행위가 프로그램이 아니라 LOAD해서 메모리에 적재되어있는 그 녀석이 프로그램인 것.

이런 프로그램을 만드는 행위를 프로그래밍이라고 한다.
사실은 1번만이 프로그래밍의 영역은 아니다.
1~4번까지가 다 프로그래밍의 영억.

실행은 기계가함. 프로그래머의 영역이 아니다.
LOAD까지는 프로그래머의 영역.


  1. LANGUAGE CODE - LINT TIME : 너 코드 그렇게짜면 나중에 곤란해질껄?
  2. MACHINE LANGUAGE - COMPILE TIME
  3. FILE
  4. LOAD
  5. RUN - RUN TIME
  6. TERMINATE

린트시점 에러, 컴파일 시점 에러, 런타임 시점 에러
린트시점의 에러가 제일 좋음.
그리고 컴파일 시점 에러.
런타임 때 에러가 발생하면..?

핵폭발 일어나는 것…


더 끔찍한 경우.
런타임에서도 안 걸리고 넘어가는 경우가 있다.
런타임에서도 안 걸리는 논리적인 이유로 일어나는 에러를 컨텍스트 에러라고 한다.

우리는 에러를 언제잡을 수 있나?
린트타임 에러, 컴파일 에러 잡을 수 있음.
런타임 에러? 못잡음.

엥? 왜 못잡음?
실행하고 나서 너 객체 참조 오류났어 등등 문구 뜨잖아?
그럼 그거 보고 잡으면 되잖아?
그건 여러분이 복잡한 프로그램을 안 짜봐서 그런 것.

복잡한 런타임 에러는 어떤걸까?
왜 첫번째 보스한테 폭탄 한 개 던지고 두번째 보스 때 총을 2발쏜 후 폭탄을 던지려고 하면 에러가 나지?
이거 못잡음. 절대.
이게 런타임 에러의 실체.

런타임에러는 재현도 힘들고 잡기도 힘듦. 보통은 못잡음.
런타임 에러가 지속적으로 쌓이면 어떻게 해야될까?
프로그램을 갈아 엎어야함.

그럼 런타임 에러가 안나게하는게 바로 여러분들이 앞으로 추구해야되는 방향.
여러분들 코드가 컴파일 시점, 린트시점에서 에러가 나는 건 괜찮아.
그런데 런타임 에러 때 오류가 발생하고 있어.
여러분들의 코드가 런타임 시점에 에러가 나는걸 유도하고 있어.
그러면 여러분들의 코드 스타일이 잘못되었다는 뜻.


컨텍스트 에러

이거는 팀의 커뮤니케이션으로 해결해야될 문제.
코드엔 일단 문제 없으니 런타임 에러는 아님.
이건 의사소통의 문제.
의사소통의 문제란 서로 대화를 잘못나눈다는 것 뿐만 아니라 여러분의 코드가 그런 오해를 불어일으킬 로직으로 되어있을 수도 있다는 것
이렇게 헷갈리게 코드를 짜는 사람들이 있다는 것임.

컨텍스트 에러는 보통 이런식으로 발생함.
개발자들 끼리 모듈을 나눠서 개발하다가 코드 스타일을 보고서 잘못 이해한 것.

SCRIPT PROGRAM

  1. LANGUAGE CODE
  2. FILE
  3. LOAD
  4. MACHINE LANGUAGE
  5. RUN
  6. TERMINATE

스크립트 언어는 MACHINE LANGUAGE(컴파일)을 거치지 않고 바로 FILE로 떨어진다.
그 다음에 바로 브라우저에 적재.
그리고 이 이후에 머신랭기쥐로 변환.
그리고 그 후에 실행됨.

이것이 스크립트 언어의 특징.

RUNTIME 이란?

런타임은 기본적으로 메모리에 적재되어있는 프로그램을 실행하는 과정.

즉 LOAD할 때, 가장 중요한 것들, 이거 없으면 프로그램이 성립하지 않을 것 같은 것들을 먼저 적재한다.
이것을 ESSENTIAL DEFINITION LOADING이라고 부른다.
그 다음에 바로 VTABLE MAPPING을 한다.
이래야지 여러분들이 코드에서 정의했던 변수들이 진짜로 활성화 된다.
그리고나서 드디어 RUN 할 수 있게 되는 것.

그런데 실행 중에도 정의가 올라온다. RUNTIME DEFINITION LOADING.
대표적으로 자바스크립트에서 여러분이 클릭을 했는데, 함수를 불러올 수 있다.
클릭을 한 후에 함수가 정의될 수 있다는 뜻. (콜백펑션)

새로운 변수, 함수, 클래스를 컴파일 시점에 정의된 것만 가져다 쓰는 것이 아니라 실행 도중에 계속해서 정의해낼 수 있다는 것.
여러분들이 배열을 쓸 때, 코드에서 미리 몇 개의 리스트가 들어올지 알 수 있나요?
ㄴㄴ JSON을 받아 보니 그때 10개 있더라 12개 있더라 알 수 있는 것.

LOADING

INSTRUCTION FETCH & DECODING -> EXECUTION -> INSTRUCTION FETCH & DECODING -> … 반복

  1. ESSENTIAL DEFINITION LOADING
  2. VTABLE MAPPING
  3. RUN
  4. RUNTIME DEFINITION LOADING
  5. RUN …

이런 과정의 연속
이것이 COMPILE PROGRAM…//

그렇다면 SCRIPT PROGRAM은 어떻게 작동하는 거야?

JS가 실행되면 처음에 무조건 런타임

  1. RUN - DECLARE BASE FUNCTION, CLASS…
  2. DECLARE EXTENDED FUNCTION, CLASS…

참조의 참조를 쓰는 이유

개발할 때의 유연성을 위해 참조의 참조를 쓰는 데, 참조의 참조를 왜 쓰는지를 이해하는 것이 이번 공부의 핵심
참조의 참조 : 링크드 리스트, 인터페이스와 구상 클래스, 클래스와 인스턴스, 디자인 패턴(데코레이터 패턴) 등등

  1. MEMORY
  2. 메모리의 주소 : ADDRESS
  3. 메모리의 주소를 가리키는 POINTER
  4. 이 모두를 아우르는 VARIABLES
  5. DISPATCH

메모리 주소의 크기 : 32비트 컴퓨터냐 64비트 컴퓨터냐가 여기서 나뉘어짐.
32비트 컴퓨터 메모리 하나당 최대 용량 4기가.
메모리 한개 블록은 32비트, 64비트 상관없이 그냥 4바이트로 나누는 경우도 있음.

  • 함수형 패러다임 : 참조 쓰지마, 값만 써!
  • 객체 지향 : 직접 참조하지마!
const a = {value: 3, v: 4}
b.value // 3; 더블 디스패치, 디스패치하고나서 value랑 또 디스패치해야됨

  • 링크드 리스트
  • 클래스와 인터페이스