디노 (소프트웨어)

V8 자바스크립트 엔진과 Rust 언어로 작성된 Javascript / Typescript 시큐어 런타임

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

Deno
원저자라이언 달
개발자Deno 회사[1]와 기여자들
발표일2018년 5월 13일(5년 전)(2018-05-13)[2]
안정화 버전
1.42.4[3] 위키데이터에서 편집하기 / 2024년 4월 16일 (6일 전)
저장소github.com/denoland/deno
프로그래밍 언어TypeScript, JavaScript, Rust, C++(V8 바인딩)
운영 체제리눅스, macOS, 윈도우
종류런타임 환경
라이선스MIT 허가서[4][5]
웹사이트deno.com 위키데이터에서 편집하기

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

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

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

역사 편집

라이언 달이 JSConf EU 2018에서 "Node.js에 관해 후회하는 10가지"를 이야기할 때 Node.js의 초기 디자인 결정에 대해 다음과 같은 후회들을 했다.[11]

  • API 디자인에서 promise를 사용하지 않는 선택
  • 레거시 빌드 시스템인 GYP 사용
  • node_modules 및 package.json 사용
  • 파일 확장자 비포함
  • index.js를 사용한 매지컬 모듈 해석(magical module resolution)
  • V8의 샌드박스 환경 깨뜨림

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

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

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

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

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

개요 편집

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

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

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

Node.js와 비교 편집

공통점

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

차이점[22]

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

릴리즈 편집

Deno 릴리즈 페이지

예시 편집

파일 시스템 또는 네트워크 권한 없이 다음과 같이 기본 Deno 스크립트를 실행할 수 있다. (샌드박스 모드)

deno run main.ts

필요할 경우, 명시적 플래그로 권한을 활성화 해야한다.

deno run --allow-read --allow-net main.ts

스크립트의 의존성 트리를 info 하위 명령을 통해 검사할 수 있다.

deno info main.ts

Deno의 기본 Hello, World! 프로그램은 Node.js와 같다.

console.log("Hello, World!");

전역 Deno 네임 스페이스는 브라우저에서 사용할 수 없는 API를 노출한다. 유닉스 cat 프로그램을 다음과 같이 구현할 수 있다.

/* 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 다. 이 프로그램을 실행 하려면 파일 시스템에 대한 읽기 권한을 활성화해야 한다

deno run --allow-read cat.ts myfile

기본 HTTP 서버를 구현하는 예제

// 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는 모든 권한을 활성화)

$ 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 메뉴얼 - 예시들에서 찾아볼 수 있다.

참고 문헌 편집

  1. Ryan Dahl, Bert Belder (2021년 3월 29일). “Announcing the Deno Company”. 
  2. “Contributors, denoland/deno, Github”. 2019년 7월 5일에 확인함. 
  3. “Release 1.42.4”. 2024년 4월 16일. 2024년 4월 22일에 확인함. 
  4. “deno/LICENSE at main”. 《GitHub》. 2019년 7월 5일에 확인함. 
  5. “The MIT License”. 《Open Source Initiative》. 2018년 9월 17일. 2018년 9월 17일에 확인함. 
  6. “Deno: Secure V8 TypeScript Runtime from Original Node.js Creator” (영어). 2021년 5월 26일에 확인함. 
  7. “A visit to Deno Land with Kit Kelly (JS Party #127)” (영어). 2021년 5월 26일에 확인함. 
  8. “Node.js에 관해 후회하는 10가지 - Ryan Dahl - JSConf EU”. 2018-06-06. 2021년 5월 26일에 확인함. 
  9. “Deno Manual”. 《deno.land》. 2019년 5월 17일에 확인함. 
  10. Paul Krill (2018년 6월 21일). “Ryan Dahl’s Node.js regrets lead to Deno”. InfoWorld. 
  11. “denolib/awesome-deno” (영어). 2021년 5월 27일에 확인함. 
  12. “denoland/deno - golang tree” (영어). 2021년 5월 27일에 확인함. 
  13. “Suggestion: Look into porting to Rust and using Tokio · Issue #205 · denoland/deno” (영어). 2021년 5월 27일에 확인함. 
  14. “Tokio”. 2021년 5월 27일에 확인함. 
  15. “Protobuf seems like a lot of overhead for this use case? · Issue #269 · denoland/deno” (영어). 2021년 5월 27일에 확인함. 
  16. “Replace flatbuffers · Issue #2121 · denoland/deno” (영어). 2021년 5월 27일에 확인함. 
  17. “Remove flatbuffers by ry · Pull Request #2818 · denoland/deno” (영어). 2021년 5월 27일에 확인함. 
  18. “denoland/deno_std github repository” (영어). 2021년 5월 27일에 확인함. 
  19. “Deno 1.0”. 《deno.land》. 2020년 5월 14일에 확인함. 
  20. “Deno manual - philosophy” (영어). 2021년 5월 27일에 확인함. 
  21. “Deno Is Ready for Production” (영어). 2021년 5월 27일에 확인함. 
  22. “Deno manual - comparison to nodejs” (영어). 2021년 5월 27일에 확인함. 

외부 링크 편집