개발/JavaScript

[JS]자바스크립트(JS,Javascript)란?

mabb 2023. 2. 22. 15:25
반응형

 

▷JS는 어떤 언어인가

-동적인 클라이언트 사이드 스크립트 언어

-싱글스레드 논 블로킹 언어

-인터프리터 혹은 Just-In-Time컴파일 언어

-일급 함수를 사용하는 언어

-프로토타입 기반 객체지향 언어

-다중 패러다임 언어

 

▷JS의 등장 배경

-정적인 HTML을 동적으로 표현하기 위해 넷스케이프사의  Brendan Eich에 의하여 개발되었다. 

 

▷JS의 성장

1) Ajax의 등장으로 비동기적 통신이 가능해졌다.
2) jQuery의 등장으로 DOM의 제어가 편리해졌다. 
3) V8엔진의 등장으로 성능이 향상되었다.
4) Node.js의 등장으로 웹 브라우저 외의 런타임에서 동작이 가능해졌다.

 

===================================================================

1.동적인 클라이언트 사이드 스크립트 언어

스크립트 언어는 응용 소프트웨어를 제어하는 컴퓨터 프로그래밍 언어를 말한다. Java의 main메서드 같은 엔트리포인트(진입점)이 없다는 것이 특징이다. JS는 정적인 웹을 동적으로 제어할 수 있게 해주는 스크립트 언어이다.

 

2.싱글스레드 논 블로킹 언어

 모든 브라우저는 자바스크립트를 해석하고 실행시키기 위한 JS 엔진을 가지고 있다.오픈 소스 JS엔진인  V8엔진은 구글 Chrome 브라우저와 안드로이드 브라우저, 그리고 node.JS에 탑재 되어 있다. V8엔진은 싱글 스레드이다. 싱글 스레드는 하나의 프로세스 내에 스레드가 한 개만 있는 것을 뜻한다.
 프로세스는 메모리에 올려져 실행중인 프로그램이다. 여기서 메모리란 RAM(Random Access Memory)을 말하며 프로그램 실행 시 RAM에 바이트 코드가 올라가고 이를 CPU가 연산 및 제어 하여 프로그램이 동작한다.
 한 프로세스(프로그램) 이/가 싱글스레드라는 것은 동시에 병렬적으로 2개 이상의 코드 흐름을 동작 시킬 수 없다는 것을 의미한다. 이는 for문이나 while문 같은 반복문이 돌아가는 동안에 다른 일을 할 수 없는 것과 같다고 생각할 수 있다. 
 하지만 자바스크립트는 서버의 응답을 기다리는 동안, 또는 setTimeout() 같이 일정 시간을 기다리는 동안 다른 작업을 처리할 수 있다. 싱글스레드이기 때문에 병렬적으로 작업을 처리할 수 없음에도 불구하고 논블로킹으로 동작할 수 있는 것이다.
 이는 시간이 걸리는 작업을 잠시 빼두고 다음 작업부터 처리하는 비동기 방식 덕분에 가능하다. 잠시 빼두는 곳은 Task Queue와 Microtask Queue이다. JS엔진은 싱글 스레드이므로 Call Stack이 한 개밖에 없다. 시간이 걸리는(블로킹이 될 수 있는) 작업은 잠시 빼두고 다른 작업들이 Call Stack에 쌓이고 실행되고 실행된 작업은 Call Stack에서 제거된다. 그리고 Call Stack이 비어있게 되면 Event Loop는 Task Queue 와 Microtask Queue에 빼두었던 작업을 Call Stack으로 옮겨 준다.
실행에 시간이 걸려 코드의 흐름을 막을만한 작업은 잠시 빼서 그 사이에 다른 작업들을 후딱 쳐내버리는 것이 싱글스레드로 막힘없이 코드를 실행하는 방법인 것이다. Event Loop와 Task Queue, Microtask Queue, 비동기로 처리하는 작업들에 대해서는 따로 더 자세히 알아보도록 한다.

 

3.인터프리터 혹은 Just-In-TIme언어

 V8엔진은 자바스크립트를 Byte Code로 컴파일하고 실행하는 방식을 사용한다. 전통적으로 컴퓨터 프로그램이 실행되는 두 가지 방식이 있다. 첫째는 인터프리터 방식, 둘째는 컴파일 방식이다. 인터프리터 방식은 Runtime 중 프로그래밍 언어를 한 줄 한 줄 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하는 방식이다. 컴파일 방식은 Runtime 이전에 컴파일러에 의해 프로그램 코드를 기계어로 변환한 후 실행하는 방식이다.
 Just-In-Time 방식은 이 두 가지 방식을 혼합한 방식이다. 인터프리터 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

 

4.일급 함수를 사용하는 언어

JS는 함수를 다른 변수와 동일하게 다루는 언어이다. JS는 원시값을 제외한 모든 것이 객체이다. 함수도 객체인데 변수처럼 다른 함수의 인수로 넣거나 함수가 함수를 반환할 수 있으며 함수를 변수에 할당할 수도 있다.

 

5.프로토타입 기반 객체지향 언어

 JS의 모든 객체는 자신의 프로토타입 객체를 가리키는 [[Prototype]] 인터널 슬롯(Internal slot)을 갖는다. __proto__로 접근할 수 있으며 __proto__는 부모 역할을 하는 객체를 가리킨다. JS는 특정 객체의 프로퍼티나 메소드에 접근하고자 할 때 해당 객체가 프로퍼티나 메소드를 가지고 있지 않은 경우 [[Prototype]]이 가리키는 부모역할을 하는 객체에서 이를 찾는다. 이것을 프로토타입 체인이라고 하며 부모 객체의 프로퍼티를 변경하여 상속을 구현할 수 있다.
 Type.prototype , instance.__proto__ 로 부모객체에 접근 가능하다. 

String에 프로퍼티를 추가하면 문자열에서 hihihi()를 실행할 수 있다.

 

6.다중 패러다임 언어

 JS는 함수형, 객체지향형, 절차지향형, 프로토타입형 등 여러가지 패러다임을 가지는 언어이다. 다양한 체계와 틀을 가질 수 있는 유연한 언어이다.

 

□ 참고
-위키백과
https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%96%B8%EC%96%B4 https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC

-MDN
https://developer.mozilla.org/ko/docs/Glossary/First-class_Function

-Poiemaweb
https://poiemaweb.com/js-prototype

 

반응형

'개발 > JavaScript' 카테고리의 다른 글

[JS] 렉시컬과 클로저  (0) 2023.02.22