{{위키데이터 속성 추적}}
{{다른 뜻|디노}}
{{소프트웨어 정보
|discontinued =
|이름 = Deno
|로고 = Deno.svg
|운영체제 = [[리눅스]], [[macOS]], [[마이크로소프트_윈도우|윈도우]]
|원저자 = [[라이언 달]]
|개발자 = Deno 회사<ref name="COMPANY">{{웹 인용|url=https://deno.com/blog/the-deno-company|title=Announcing the Deno Company|author=Ryan Dahl, Bert Belder|date=2021-03-29}}</ref>와 기여자들
|프로그래밍 언어 = [[TypeScript]], [[JavaScript]], [[러스트_(프로그래밍_언어)|Rust]], [[C++]](V8 [[언어_바인딩|바인딩]])
|저장소 = {{URL|https://github.com/denoland/deno}}|라이선스=[[MIT 허가서]]<ref>{{웹 인용|title=deno/LICENSE at main|url=https://github.com/denoland/deno/blob/main/LICENSE|website=GitHub|access-date=5 July 2019}}</ref><ref>{{웹 인용|title=The MIT License|url=https://opensource.org/licenses/MIT|website=Open Source Initiative|access-date=17 September 2018|date=17 September 2018}}</ref>
|최근 버전 출시일 = {{wikidata|qualifier|P348|P577}} ({{Time ago| {{wikidata|qualifier|raw|P348|P577}} }})
|최근 버전 = {{wikidata|property|reference|edit| Q65070939 |P348}}|종류=[[런타임 시스템|런타임 환경]]
|발표일 = {{시작 날짜와 나이|2018|05|13}}<ref>{{웹 인용| url=https://github.com/denoland/deno/graphs/contributors | access-date=5 July 2019|title=Contributors, denoland/deno, Github}}</ref>
}}

'''Deno'''는 [[V8 (자바스크립트 엔진)|V8]] 자바스크립트 엔진 및 [[러스트 (프로그래밍 언어)|러스트]] 프로그래밍 언어를 기반으로 하는 [[자바스크립트]] 및 [[타입스크립트]]용 [[런타임 시스템|런타임]]이다. [[Node.js]]의 원저자인 [[라이언 달]]이 만들었으며 생산성에 중점을 두고 있다.<ref>{{웹 인용|url=https://www.infoq.com/news/2018/12/deno-v8-typescript/|제목=Deno: Secure V8 TypeScript Runtime from Original Node.js Creator|언어=en|확인날짜=2021-05-26}}</ref>

공식적인 발음은 디노[Dēnō]<ref>{{웹 인용|url=https://changelog.com/jsparty/127|제목=A visit to Deno Land with Kit Kelly (JS Party #127)|언어=en|확인날짜=2021-05-26}}</ref>다.

라이언 달은 2018년 "Node.js에 관해 후회하는 10가지" 강연<ref>{{웹 인용|url=https://www.youtube.com/watch?v=M3BM9TB-8yA|제목=Node.js에 관해 후회하는 10가지 - Ryan Dahl - JSConf EU|날짜=2018-06-06.|확인날짜=2021-05-26}}</ref>에서 Deno를 발표했다.

Deno는 별도의 패키지 관리 프로그램이 필요없는데 단일 [[실행 파일]] 내에서 런타임 및 [[패키지 관리자]]의 역할을 명시적으로 수행하기 때문이다.<ref name=":1">{{웹 인용|url=https://deno.land/manual|제목=Deno Manual|웹사이트=deno.land|확인날짜=2019-05-17}}</ref><ref>{{웹 인용|url=https://www.infoworld.com/article/3283250/ryan-dahls-nodejs-regrets-lead-to-deno.html|제목=Ryan Dahl’s Node.js regrets lead to Deno|성=Paul Krill|날짜=2018-06-21|출판사=[[InfoWorld]]}}</ref>

== 역사 ==
라이언 달이 JSConf EU 2018에서 "Node.js에 관해 후회하는 10가지"를 이야기할 때 Node.js의 초기 디자인 결정에 대해 다음과 같은 후회들을 했다.<ref>{{웹 인용|url=https://github.com/denolib/awesome-deno|제목=denolib/awesome-deno|언어=en|확인날짜=2021-05-27}}</ref>
* [[API]] 디자인에서 [[퓨처와 프로미스|promise]]를 사용하지 않는 선택
* 레거시 빌드 시스템인 [[GYP (소프트웨어)|GYP]] 사용
* node_modules 및 package.json 사용
* 파일 확장자 비포함
* index.js를 사용한 매지컬 모듈 해석(magical module resolution)
* V8의 샌드박스 환경 깨뜨림

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

Deno는 처음에 [[Go (프로그래밍 언어)|Go]]로 작성되었으며 권한있는 쪽 (Go, 시스템 호출 액세스 포함)과 권한없는 쪽 (V8) 간의 직렬화를 위해 [[프로토콜 버퍼]]를 사용했다.<ref>{{웹 인용|url=https://github.com/denoland/deno/tree/golang|제목=denoland/deno - golang tree|언어=en|확인날짜=2021-05-27}}</ref> 하지만 Go는 이중 런타임과 [[쓰레기 수집 (컴퓨터 과학)|쓰레기 수집]] 부담에 대한 우려 때문에 곧 [[러스트 (프로그래밍 언어)|Rust]]로 대체되었다.<ref>{{웹 인용|url=https://github.com/denoland/deno/issues/205|제목=Suggestion: Look into porting to Rust and using Tokio · Issue #205 · denoland/deno|언어=en|확인날짜=2021-05-27}}</ref> 또, 비동기 이벤트 기반 플랫폼으로 [[libuv]] 대신 {{임시링크|Tokio (software)}}<ref>{{웹 인용|url=https://tokio.rs/|제목=Tokio|확인날짜=2021-05-27}}</ref>가 도입되었으며, 더 빠른 "[[제로 카피|제로-카피]]" 직렬화 및 역직렬화를 위해 [[FlatBuffers]]가 채택되었다.<ref>{{웹 인용|url=https://github.com/denoland/deno/issues/269|제목=Protobuf seems like a lot of overhead for this use case? · Issue #269 · denoland/deno|언어=en|확인날짜=2021-05-27}}</ref> 하지만 2019년 4월, [[벤치마크 (컴퓨팅)|벤치마크]] 게시 후 직렬화의 상당한 [[오버헤드]]가 측정되었다.<ref>{{웹 인용|url=https://github.com/denoland/deno/issues/2121|제목=Replace flatbuffers · Issue #2121 · denoland/deno|언어=en|확인날짜=2021-05-27}}</ref> 때문에, 2019년 8월 말 FlatBuffers는 제거되었다.<ref>{{웹 인용|url=https://github.com/denoland/deno/pull/2818|제목=Remove flatbuffers by ry · Pull Request #2818 · denoland/deno|언어=en|확인날짜=2021-05-27}}</ref>

Deno의 표준 라이브러리<ref>{{웹 인용|url=https://github.com/denoland/deno_std|제목=denoland/deno_std github repository|언어=en|확인날짜=2021-05-27}}</ref>는 Go의 표준 라이브러리 모델을 기반으로, 광범위한 도구와 유틸리티를 제공하기 위해 2018년 11월에 생성되었다. 이로써 Node.js의 [[의존성 지옥|의존성 트리 폭발 문제]]를 부분적으로 해결하였다.

공식 Deno 1.0은 2020년 5월 13일에 릴리즈하였다.<ref>{{웹 인용|url=https://deno.land/v1|제목=Deno 1.0|웹사이트=deno.land|확인날짜=2020-05-14}}</ref>

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

== 개요 ==
Deno는 모던 프로그래머를 위한 생산적인 [[스크립트 언어|스크립팅]] 환경을 목표로 한다.<ref>{{웹 인용|url=https://deno.land/manual#philosophy|제목=Deno manual - philosophy|언어=en|확인날짜=2021-05-27}}</ref> 또, Node.js와 마찬가지로 동기/[[비동기 입출력|비동기]] 코어 입출력 유틸리티 세트를 제공하는 [[이벤트 기반 아키텍처]]를 강조한다.

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

Deno는 [[MIT 허가서|MIT 라이선스]]에 따른 [[오픈 소스 소프트웨어]]다.<ref>{{웹 인용|url=https://www.infoq.com/news/2020/06/deno-1-ready-production/|제목=Deno Is Ready for Production|언어=en|확인날짜=2021-05-27}}</ref>

=== Node.js와 비교 ===
'''공통점'''

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

'''차이점'''<ref>{{웹 인용|url=https://deno.land/manual@main/introduction#comparison-to-nodejs|제목=Deno manual - comparison to nodejs|언어=en|확인날짜=2021-05-27}}</ref>

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

== 릴리즈 ==
[https://github.com/denoland/deno/blob/main/Releases.md Deno 릴리즈 페이지]

== 예시 ==
파일 시스템 또는 네트워크 권한 없이 다음과 같이 기본 Deno 스크립트를 실행할 수 있다. ([[샌드박스 (소프트웨어 개발)|샌드박스]] 모드)<syntaxhighlight lang="bash">
deno run main.ts
</syntaxhighlight>필요할 경우, 명시적 플래그로 권한을 활성화 해야한다.

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

</syntaxhighlight><code>Deno.copy</code> 함수는 Go의 <code>io.Copy</code> 와 매우 유사하게 작동한다.  <code>stdout</code> ([[표준 스트림|표준 출력]])은 목적 <code>Writer</code>이고 <code>file</code>은 소스 <code>Reader</code> 다. 이 프로그램을 실행 하려면 [[파일 시스템]]에 대한 읽기 권한을 활성화해야 한다<syntaxhighlight lang="bash">
deno run --allow-read cat.ts myfile
</syntaxhighlight>기본 [[웹 서버|HTTP 서버]]를 구현하는 예제<syntaxhighlight lang="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" });
}
</syntaxhighlight>이 프로그램을 실행할 때 Deno는 원격 표준 라이브러리 파일을 자동으로 다운로드 및 캐시한 뒤, 코드를 컴파일한다.

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

예를 들면, [[파일 서버|file_server]] ( <code>-A</code>는 모든 권한을 활성화)<syntaxhighlight lang="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/

</syntaxhighlight>더 많은 예시는 [https://deno.land/manual@v1.10.2/examples deno 메뉴얼 - 예시들]에서 찾아볼 수 있다.

== 참고 문헌 ==
<references />

== 외부 링크 ==
* [https://deno.land/ 공식 사이트]
* [https://deno.land/manual 공식 디노 매뉴얼]

{{자바스크립트}}

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