디노 (소프트웨어)
원저자 | 라이언 달 |
---|---|
개발자 | Deno 회사[1]와 기여자들 |
발표일 | 2018년 5월 13일[2] |
안정화 버전 | 2.1.1[3]
/ 2024년 11월 21일 (12일 전) |
저장소 | github |
프로그래밍 언어 | TypeScript, JavaScript, Rust, C++(V8 바인딩) |
운영 체제 | 리눅스, macOS, 윈도우 |
종류 | 런타임 환경 |
라이선스 | MIT 허가서[4][5] |
웹사이트 | deno |
Deno는 V8 자바스크립트 엔진 및 러스트 프로그래밍 언어를 기반으로 하는 자바스크립트 및 타입스크립트용 런타임이다. Node.js의 원저자인 라이언 달이 만들었으며 생산성에 중점을 두고 있다.[6]
공식적인 발음은 디노[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]
- ES 모듈 사용 (CommonJS 사용안함)
require
사용 안함
- 브라우저처럼 URLs(원격) / 파일경로(로컬)로 모듈 의존성 불러오기
- npm 사용 안함
- URLs / file paths 로 모듈 레퍼런스 함
package.json
모듈 해석 알고리즘 사용안함- 모든 비동기 액션이
Promise
를 반환함 - 파일, 네트워크, 환경(변수) 접근에 대해 명시적으로 권한설정 필요
- 예상하지 못한 error 발생 시 무조건 죽음
- 내장 타입스크립트 지원
릴리즈
[편집]예시
[편집]파일 시스템 또는 네트워크 권한 없이 다음과 같이 기본 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 https://0.0.0.0:4500/
더 많은 예시는 deno 메뉴얼 - 예시들에서 찾아볼 수 있다.
참고 문헌
[편집]- ↑ Ryan Dahl, Bert Belder (2021년 3월 29일). “Announcing the Deno Company”.
- ↑ “Contributors, denoland/deno, Github”. 2019년 7월 5일에 확인함.
- ↑ “Release 2.1.1”. 2024년 11월 21일. 2024년 11월 22일에 확인함.
- ↑ “deno/LICENSE at main”. 《GitHub》. 2019년 7월 5일에 확인함.
- ↑ “The MIT License”. 《Open Source Initiative》. 2018년 9월 17일. 2018년 9월 17일에 확인함.
- ↑ “Deno: Secure V8 TypeScript Runtime from Original Node.js Creator” (영어). 2021년 5월 26일에 확인함.
- ↑ “A visit to Deno Land with Kit Kelly (JS Party #127)” (영어). 2021년 5월 26일에 확인함.
- ↑ “Node.js에 관해 후회하는 10가지 - Ryan Dahl - JSConf EU”. 2018-06-06. 2021년 5월 26일에 확인함.
- ↑ “Deno Manual”. 《deno.land》. 2019년 5월 17일에 확인함.
- ↑ Paul Krill (2018년 6월 21일). “Ryan Dahl’s Node.js regrets lead to Deno”. InfoWorld.
- ↑ “denolib/awesome-deno” (영어). 2021년 5월 27일에 확인함.
- ↑ “denoland/deno - golang tree” (영어). 2021년 5월 27일에 확인함.
- ↑ “Suggestion: Look into porting to Rust and using Tokio · Issue #205 · denoland/deno” (영어). 2021년 5월 27일에 확인함.
- ↑ “Tokio”. 2021년 5월 27일에 확인함.
- ↑ “Protobuf seems like a lot of overhead for this use case? · Issue #269 · denoland/deno” (영어). 2021년 5월 27일에 확인함.
- ↑ “Replace flatbuffers · Issue #2121 · denoland/deno” (영어). 2021년 5월 27일에 확인함.
- ↑ “Remove flatbuffers by ry · Pull Request #2818 · denoland/deno” (영어). 2021년 5월 27일에 확인함.
- ↑ “denoland/deno_std github repository” (영어). 2021년 5월 27일에 확인함.
- ↑ “Deno 1.0”. 《deno.land》. 2020년 5월 14일에 확인함.
- ↑ “Deno manual - philosophy” (영어). 2021년 5월 27일에 확인함.
- ↑ “Deno Is Ready for Production” (영어). 2021년 5월 27일에 확인함.
- ↑ “Deno manual - comparison to nodejs” (영어). 2021년 5월 27일에 확인함.