>  기사  >  웹 프론트엔드  >  런타임 생성

런타임 생성

Linda Hamilton
Linda Hamilton원래의
2024-10-27 09:55:03864검색

Criando uma Runtime

안녕하세요, 제 이름은 Lucas Wasilewski입니다. NodeJS로 프로그래밍을 시작한 이후(2021년 초)부터 제 github에 프로젝트 설명을 올렸듯이 저는 항상 하고 싶었습니다. 도구처럼 보이는 것을 작성하는 것은 프로젝트에 대한 다큐멘터리를 본 후에야 증가했으며 오픈 소스 세계가 어떻게 여러 우여곡절을 겪을 수 있고 원할 때 매우 환영받을 수 있는지에 놀랐습니다. 그리고 일주일 동안 머리를 긁적인 끝에, 이 도전을 원하는 미래의 미친 프로그래머들이 저와 같은 실수를 하지 않도록 이 글을 쓰기로 결정했습니다.

자바스크립트 런타임

이 용어는 해당 주제에 대해 잘 이해하지 못하는 사람에게 오해를 불러일으킬 수 있으므로 올바른 정의가 필요합니다.

Javascript 런타임은 브라우저 외부에서 언어를 실행할 수 있게 해주는 도구입니다

요즘에는 NodeJS, Deno(Node Killer) 및 Bun(Deno Killer)이라는 3가지 인기 있는 런타임이 있지만 기본적으로 동일한 작업을 수행합니다. 즉, 브라우저에서 벗어나 자바스크립트를 사용하고 다른 라이브러리를 사용하여 새로운 기능을 만들 수 있습니다. 서버를 구축하고, 라이브러리를 만들고, 모바일이나 터미널 애플리케이션까지 만들 수 있기 때문에 매우 좋습니다.

Node와 Deno는 모두 같은 사람인 Ryan Dahl에 의해 만들어졌습니다. Ryan Dahl은 2009년에 개발자가 "비동기 IO" 애플리케이션을 만들 수 있도록 하는 도구를 만들었습니다. 요청에 응답하는 것을 염두에 두고 그는 바로 그 일을 하는 라이브러리인 Libuv를 만들었습니다. 그때까지 프로젝트는 단지 C의 큰 더미에 불과했으며 더 많은 사람들이 도구를 사용하기를 원한다면 더 쉽게 이해하고 사용할 수 있는 언어가 필요했습니다. 동시에 Google은 V8을 출시했습니다. 빠른 자바스크립트 컴파일러 덕분에 그는 두 가지를 결합하여 Node를 만들었습니다.

얼마 후(구체적으로는 9년) Ryan은 프로젝트를 떠나 자신이 더 흥미롭다고 생각하는 다른 작업에 착수했습니다. 이를 통해 Node에서 수정할 수 있는 몇 가지 오류를 깨닫게 되었지만 커뮤니티는 이미 매우 컸습니다. 큰 발걸음을 떼는 것은 불가능했기 때문에 더 나은 일을 하기로 결심한 그는 Node보다 훨씬 뛰어날 것을 약속하는 또 다른 IO 런타임인 Deno를 만듭니다. 현재(2024년) Deno는 버전 2.0이며 매우 프로젝트와 커뮤니티에 안정적입니다.

이 전체 이야기를 통해 더 많은 사람들이 런타임 커뮤니티에 참여하게 되었고 이로 인해 Bun이 탄생하게 되었고 훨씬 더 좋은 것은 나와 여러분의 런타임이 탄생하게 되었습니다! 이제 사업을 시작하겠습니다.

V8 컴파일하기

앞서 언급했듯이 V8은 Node 엔진이므로 해당 라이브러리와 헤더에 액세스하려면 실제로 다운로드하고 수동으로 컴파일해야 합니다. Google 프로젝트이므로 다운로드 및 컴파일을 위한 고유한 방법이 있으므로 이를 위해서는 해당 매뉴얼을 따라야 합니다. 링크를 복사하고 붙여넣기만 하면 최종 명령이 표시됩니다.

그런데 여기서 제가 실수를 저질렀는데 제가 모든 걸 잘못하고 있다는 걸 깨닫는 데 3일이 걸렸습니다. 다음을 사용하여 빌드 구성 파일을 생성한 후:

tools/dev/v8gen.py x64.release

out.gn/x64.release/ 폴더 안의 args.gn 파일에는 닌자(컴파일 도구)가 라이브러리 파일을 생성하는 데 사용할 빌드 구성이 포함되어 있으므로 매우 주의해야 합니다. 일부 이전 튜토리얼 v8_monolithic = true 매개변수를 사용하지만 최신 버전에서는 더 이상 사용되지 않습니다. 이 StackOverflow 설명에 따르면 이제 is_comComponent_build = true 매개변수를 사용하여 올바른 파일을 생성하고 파일을 컴파일할 때 플래그를 수정해야 합니다. 주의를 기울이지 않으면 귀중한 시간을 낭비할 수 있는 아주 어리석은 일입니다.

나머지 플래그를 올바르게 배치한 후 명령을 실행하여 프로젝트를 컴파일하면 됩니다

ninja -C out.gn/x64.release

그동안 뭔가 먹으러 가세요. V8은 수많은 테스트를 거쳐 매우 광범위한 프로젝트이기 때문에 컴퓨터에 따라 이 프로세스는 쉽게 1시간 이상 걸릴 수 있으므로 실행 상태로 두고 계속 읽으세요.

console.log는 어디에 있나요?

컴파일한 후 v8/samples/hello-world.cc를 살펴보고 자바스크립트 컴파일 방법에 대한 아이디어를 얻을 수 있습니다. 특히 다음 줄은 다음과 같습니다.

v8::Local<v8::String> source =
          v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'");

// Compile the source code.
v8::Local<v8::Script> script =
          v8::Script::Compile(context, source).ToLocalChecked();

"Hello World"가 포함된 문자열을 가지고 놀고 함수, 루프, 조건문을 생성하고 클래식 console.log()를 포함하면 정의되지 않은 메시지를 받게 된다는 사실을 깨닫고 처음에는 당황했습니다. 나, 나는 항상 콘솔 객체가 V8 자체의 일부라고 생각했지만 실제로 Node 자체에는 이를 포함하고 브라우저는 이를 DOM의 일부로 포함합니다(console.log는 아마도 브라우저에서 지원되지 않을 것이라고 말한 2012년 게시물). 직접 만들어야 합니다.

안녕하세요 월드!

자신만의 함수를 만들려면 먼저 V8이 여러 범위에서 작동한다는 점을 이해해야 합니다. 그 중 하나는 컨텍스트이며, 이를 통해 런타임은 스크립트를 개별적으로 실행할 위치와 방법을 알 수 있습니다. 다른 모든 개체와 공유되는 전역 개체가 있을 수 있으며 그 안에 사용자 정의 기능을 삽입할 것입니다.

tools/dev/v8gen.py x64.release

이러한 줄을 사용하여 전역이라는 개체를 생성할 수 있었고 실행 시 인쇄 기능을 호출하는 "인쇄" 기능 템플릿을 삽입했습니다.

v8::Local<v8::String> source =
          v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'");

// Compile the source code.
v8::Local<v8::Script> script =
          v8::Script::Compile(context, source).ToLocalChecked();

Print 함수는 자바스크립트 내의 함수 호출에 대한 정보가 포함된 이 미친 매개변수를 수신하고 이를 통해 그 안에 있는 모든 항목을 반복하고 이를 C 문자열로 변환한 다음 화면에 매우 직접적으로 인쇄합니다. 매우 간단하고 그 역할을 수행합니다. 파일에 넣고 읽고 V8에서 재생하면 충분합니다(그건 여러분 손에 맡깁니다).

v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(GetIsolate());
global->Set(GetIsolate(), "print", v8::FunctionTemplate::New(GetIsolate(), this->Print));
v8::Local<v8::Context> context = v8::Context::New(GetIsolate(), nullptr, global);

리부브

여기에서 설치 및 컴파일에 대한 튜토리얼을 찾을 수 있습니다. 여기서 주목해야 할 중요한 점은 비동기 작업을 자유롭게 수행할 수 있다는 것입니다. 즉, 메인 스레드를 차단하지 않고 프로그램이 더 무거운 작업(예: 파일 열기 또는 서버에서 요청 대기 등)을 수행하는 동안 계속 실행될 수 있도록 한다는 것입니다. 소켓).

http 서버를 생성하는 기능이 이미 내장되어 있으므로 V8 호출과 동기화하기만 하면 됩니다. 실수하지 마십시오. 두 라이브러리의 인터페이스가 많이 다르기 때문에 둘 다 연결하기가 어렵기 때문에 이것은 쉬운 작업이 아닙니다. 그러나 항상 방법이 있고 노드 소스 코드가 열려 있으므로 다음에서 아이디어를 훔쳐오십시오. 저기

결론

다른 기사의 끝 부분에 도달했으며 구현 중에 발견한 몇 가지 세부 사항을 살펴보겠습니다. 첫 번째는 확실히 복잡성입니다. 물론 단순한 프로젝트는 아니지만 일단 V8 인터페이스와 상호 작용하는 방법을 이해하면 모든 것이 매우 빠르게 진행됩니다.

이 프로젝트를 통해 Node에 대한 이해도 더욱 깊어졌습니다. 런타임이 통신하는 라이브러리의 집합체라는 사실을 통해 더 복잡한 것(예: "이벤트 루프")이 작동하는 방식을 매우 쉽게 이해할 수 있습니다.

내가 한 일이 옳았는지, 아니면 아주 잘못되었는지 알고 싶다면 github에서 프로젝트를 살펴보세요. done

말은 싸다, 코드를 보여줘 - 리누스 토발즈

## 참고자료

https://github.com/libuv/libuv

https://v8.dev/docs
https://stackoverflow.com/questions/71213580/cant-get-v8-monolith-to-genorate
https://github.com/ErickWendel/myownnode
https://github.com/WasixXD/done

위 내용은 런타임 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.