디노 (소프트웨어)

**Deno**는 V8 자바스크립트 엔진 및 러스트 프로그래밍 언어를 기반으로 하는 자바스크립트 및 타입스크립트용 런타임이다. Node.js의 원저자인 라이언 달이 만들었으며 생산성에 중점을 두고 있다.

공식적인 발음은 디노[Dēnō]다.

라이언 달은 2018년 "Node.js에 관해 후회하는 10가지" 강연에서 Deno를 발표했다.

Deno는 별도의 패키지 관리 프로그램이 필요없는데 단일 실행 파일 내에서 런타임 및 패키지 관리자의 역할을 명시적으로 수행하기 때문이다.

## 역사
라이언 달이 JSConf EU 2018에서 "Node.js에 관해 후회하는 10가지"를 이야기할 때 Node.js의 초기 디자인 결정에 대해 다음과 같은 후회들을 했다.
* API 디자인에서 promise를 사용하지 않는 선택
* 레거시 빌드 시스템인 GYP 사용
* node_modules 및 package.json 사용
* 파일 확장자 비포함
* index.js를 사용한 매지컬 모듈 해석(magical module resolution)
* V8의 샌드박스 환경 깨뜨림

이에 대한 해결 방안으로 프로토콜 버퍼와 같은 직렬화 도구로 메시지 전달을 통해 시스템 호출 바인딩을 달성하고 접근 제어를 위해 명령 줄 플래그를 제공하는 Deno의 프로토타입을 발표했다.

Deno는 처음에 Go로 작성되었으며 권한있는 쪽 (Go, 시스템 호출 액세스 포함)과 권한없는 쪽 (V8) 간의 직렬화를 위해 프로토콜 버퍼를 사용했다. 하지만 Go는 이중 런타임과 쓰레기 수집 부담에 대한 우려 때문에 곧 Rust로 대체되었다. 또, 비동기 이벤트 기반 플랫폼으로 libuv 대신 가 도입되었으며, 더 빠른 "제로-카피" 직렬화 및 역직렬화를 위해 FlatBuffers가 채택되었다. 하지만 2019년 4월, 벤치마크 게시 후 직렬화의 상당한 오버헤드가 측정되었다. 때문에, 2019년 8월 말 FlatBuffers는 제거되었다.

Deno의 표준 라이브러리는 Go의 표준 라이브러리 모델을 기반으로, 광범위한 도구와 유틸리티를 제공하기 위해 2018년 11월에 생성되었다. 이로써 Node.js의 의존성 트리 폭발 문제를 부분적으로 해결하였다.

공식 Deno 1.0은 2020년 5월 13일에 릴리즈하였다.

2021년 3월 29일, 개발을 촉진시키고 사용자에게 상업적 용도의 개발을 제공하기 위해 Deno 회사가 설립됐음을 발표했다. 이 회사는 Shasta Ventures, 모질라 코퍼레이션 등의 회사로부터 수 백만 달러를 지원 받았다.

## 개요
Deno는 모던 프로그래머를 위한 생산적인 스크립팅 환경을 목표로 한다. 또, Node.js와 마찬가지로 동기/비동기 코어 입출력 유틸리티 세트를 제공하는 이벤트 기반 아키텍처를 강조한다.

Deno는 웹 서버를 만들고 과학적 계산을 수행하는데 사용할 수 있다.

Deno는 MIT 라이선스에 따른 오픈 소스 소프트웨어다.

### Node.js와 비교
**공통점**

Deno와 Node.js는 구글 크롬의 엔진인 V8 JavaScript 엔진 기반으로 구축된 런타임 환경이다. 둘 다 내부 이벤트 루프가 있고 스크립트와 광범위한 시스템 유틸리티를 실행하기위한 명령 줄 인터페이스를 제공한다.

**차이점**

# ES 모듈 사용 (CommonJS 사용안함)
#* `require` 사용 안함
# 브라우저처럼 URLs(원격) / 파일경로(로컬)로 모듈 의존성 불러오기
# npm 사용 안함
#* URLs / file paths 로 모듈 레퍼런스 함
# `package.json` 모듈 해석 알고리즘 사용안함
# 모든 비동기 액션이 `Promise`를 반환함
# 파일, 네트워크, 환경(변수) 접근에 대해 명시적으로 권한설정 필요
# 예상하지 못한 error 발생 시 무조건 죽음
# 내장 타입스크립트 지원

## 릴리즈
Deno 릴리즈 페이지

## 예시
파일 시스템 또는 네트워크 권한 없이 다음과 같이 기본 Deno 스크립트를 실행할 수 있다. (샌드박스 모드)
```bash
deno run main.ts
```
필요할 경우, 명시적 플래그로 권한을 활성화 해야한다.


```bash
deno run --allow-read --allow-net main.ts
```
스크립트의 의존성 트리를 `info` 하위 명령을 통해 검사할 수 있다.
```bash
deno info main.ts
```
Deno의 기본 Hello, World! 프로그램은 Node.js와 같다.
```typescript
console.log("Hello, World!");
```
전역 `Deno` 네임 스페이스는 브라우저에서 사용할 수 없는 API를 노출한다. 유닉스 cat 프로그램을 다음과 같이 구현할 수 있다.
```typescript
/* cat.ts */

/* Deno APIs are exposed through the `Deno` namespace. */
const { stdout, open, copy, args } = Deno;

// Top-level await is supported
for (let i = 0; i < args.length; i++) {
    const filename = args[i]; // Obtains command-line arguments.
    const file = await open(filename); // Opens the corresponding file for reading.
    await copy(file, stdout); // Performs a zero-copy asynchronous copy from `file` to `stdout`.
}
```
`Deno.copy` 함수는 Go의 `io.Copy` 와 매우 유사하게 작동한다.  `stdout` (표준 출력)은 목적 `Writer`이고 `file`은 소스 `Reader` 다. 이 프로그램을 실행 하려면 파일 시스템에 대한 읽기 권한을 활성화해야 한다
```bash
deno run --allow-read cat.ts myfile
```
기본 HTTP 서버를 구현하는 예제
```typescript
// Imports `serve` from the remote Deno standard library, using URL.
import { serve } from "https://deno.land/std@v0.21.0/http/server.ts";

// `serve` function returns an asynchronous iterator, yielding a stream of requests
for await (const req of serve({ port: 8000 })) {
    req.respond({ body: "Hello, World!\n" });
}
```
이 프로그램을 실행할 때 Deno는 원격 표준 라이브러리 파일을 자동으로 다운로드 및 캐시한 뒤, 코드를 컴파일한다.

URL을 입력 파일 이름으로 제공하여, 다운로드하지 않고 직접 표준 라이브러리 스크립트를 실행할 수 있다.

예를 들면, file_server ( `-A`는 모든 권한을 활성화)
```console
$ deno run -A https://deno.land/std/http/file_server.ts
Download https://deno.land/std/http/file_server.ts
Compile https://deno.land/std/http/file_server.ts
...
HTTP server listening on http://0.0.0.0:4500/
```
더 많은 예시는 deno 메뉴얼 - 예시들에서 찾아볼 수 있다.

## 참고 문헌


## 외부 링크
* 공식 사이트
* 공식 디노 매뉴얼

분류:런타임 시스템
분류:패키지 관리 시스템
분류:자바스크립트 프로그래밍 도구
분류:자유 소프트웨어
분류:2018년 소프트웨어