NODE.JS를 사용하여 평가 측면을 포함하여 NBUT의 온라인 판사를 재구성하는 것도 재구성해야합니다. (완료 될 때, 신경 쓰지 마세요, (/д ′)/~
요컨대, 우리가 지금 할 일은 c/c ++를 사용하여 node.js 모듈을 구현하는 것입니다.
준비
일을 잘하고 싶다면 먼저 갱스터처럼 행동하고 도구를 연마해야합니다.
노드 홈
먼저 노드 집합 모듈이 필요합니다.
모든 코너에서 실행 :
코드 사본은 다음과 같습니다.
$ npm Node -Gyp -G 설치
일련의 Blahblahs 후에, 당신은 그것을 설치했습니다.
파이썬
그런 다음 파이썬 환경이 필요합니다.
공식 웹 사이트로 이동하여 하나를 얻으십시오.
참고 : Node-Gyp의 Github 디스플레이에 따르면 Python 버전이 2.5.0에서 3.0.0 사이인지 확인하십시오.
컴파일 환경
글쎄, 나는 단지 게으르고 그것을 자세히 쓰지 않는다. 컴파일러의 요구를 확인하려면 Node-Gyp으로 이동하십시오. 그리고 소란을 만듭니다.
시작하기
공식 웹 사이트 Hello World 소개에 대해 알려 드리겠습니다.
안녕하세요 세계
예를 들어 C ++ 파일을 준비하십시오. 예를 들어 ~~ sb.cc ~~ hello.cc라고합니다.
그런 다음 단계별로 단계별로, 먼저 헤더 파일을 만들고 네임 스페이스를 정의합니다.
코드 사본은 다음과 같습니다.
#include <node.h>
#include <v8.h>
네임 스페이스 V8 사용;
주요 기능
다음으로 반환 값이 핸들 <value> 인 함수를 작성합니다.
코드 사본은 다음과 같습니다.
<Value> Hello (Const Arguments & Args)
{
// ... 배가 고프다
}
그런 다음 이런 것들을 대략 분석합니다.
처리 <value>
당신은 인생에서 정직해야합니다. 나는 여기에서 그것을 언급한다고 미리 선언한다 (@fool).
V8은 핸들 유형을 사용하여 JavaScript 객체를 호스트합니다. C ++의 STD :: SharedPointer와 유사하게 핸들 유형 간의 할당은 직접 통과 된 객체 참조입니다. 그러나 차이점은 V8이 자체 GC를 사용하여 스마트 포인터가 일반적으로 사용하는 참조 수보다는 객체 수명주기를 관리한다는 것입니다.
JavaScript 유형은 문자열, 정수, 객체, 날짜, 배열 등과 같은 C ++의 해당 사용자 정의 유형을 가지고 있으며 JavaScript의 상속 관계를 엄격히 준수합니다. C ++에서 이러한 유형을 사용하는 경우 핸들 호스팅을 사용하여 GC를 사용하여 기본 스택 및 힙을 사용하지 않고 수명주기를 관리해야합니다.
V8 엔진의 헤더 파일 V8.h의 다양한 상속 관계에서 볼 수있는이 소위 값은 실제로 JavaScript의 다양한 객체의 기본 클래스입니다.
이를 이해 한 후 위의 함수 명령문의 의미를 대략 이해할 수 있습니다. 즉, hello 함수를 작성하여 불확실한 유형의 값을 반환합니다.
참고 : 핸들 호스팅에서 특정 유형, 즉 문자열, 정수 등을 반환 할 수 있습니다.
논쟁
이것은이 기능에서 전달할 매개 변수입니다. 우리는 모두 node.js에서 매개 변수 수가 무작위라는 것을 알고 있습니다. 이러한 매개 변수가 C ++로 전달되면 인수 유형 객체로 변환됩니다.
나중에 특정 사용법에 대해 이야기 해 봅시다. 여기서 우리는 이것이 무엇인지 이해해야합니다. (비밀을 유지하려면 공식 노드 .JS 문서의 예제가 개별적으로 논의되기 때문에 첫 번째 Hello World 예제 (´థ౪థ) σ에 대해 이야기하고 있습니다.
벽돌과 타일을 추가하십시오
다음으로 우리는 기여하기 시작합니다. 가장 간단한 문장 :
코드 사본은 다음과 같습니다.
<Value> Hello (Const Arguments & Args)
{
핸들 스코프 범위;
return scope.close (String :: new ( "World"));
}
이 두 문장은 무엇을 의미합니까? 일반적인 의미는 node.js에서 "world"문자열을 반환하는 것입니다.
핸들 스코프
여기에서 같은 참조가 있습니다.
핸들의 수명주기는 C ++ 스마트 포인터의 수명주기와 다릅니다. C ++ 시맨틱의 범위 내에서 살아남지 못하지만 (즉, {}로 둘러싸인 부분)는 핸들 스코프를 통해 수동으로 지정해야합니다. 핸들 스코프는 스택에만 할당 될 수 있습니다. HandlesCope 객체가 선언 된 후 나중에 생성 된 핸들은 HandlesCope에 의해 관리됩니다. 핸들 스코프 객체가 파괴 된 후에는 GC에 의해 관리되는 핸들이 결정됩니다.
따라서 수명주기를 관리해야 할 때이 범위를 선언해야합니다. 좋아, 그래서 왜 우리 코드가 이렇게 쓰여지지 않습니까?
코드 사본은 다음과 같습니다.
<Value> Hello (Const Arguments & Args)
{
핸들 스코프 범위;
반환 문자열 :: new ( "World");
}
함수가 반환되면 범위가 파괴되고 손잡이가 재활용 되므로이 문자열은 의미가 없게됩니다.
그래서 V8은 마법의 아이디어를 생각해 냈습니다 - handlescope :: close (handle <t> value) 기능! 이 기능의 목적은 범위를 닫고 내부의 매개 변수를 이전 스코프 관리, 즉이 기능을 입력하기 전에 범위를 넘겨주는 것입니다.
따라서 이전 코드 scope.close (String :: new ( "World"));.
문자열 :: 새
문자열 클래스는 node.js의 기본 문자열 클래스에 해당합니다. 값 클래스에서 상속됩니다. 마찬가지로 다음이 있습니다.
•정렬
•정수
• 부울
•물체
•날짜
•숫자
•기능
• ...
이러한 것들 중 일부는 가치에서 물려 받고 다른 것들은 2 차에서 상속됩니다. 우리는 여기서 많은 연구를하지 않을 것입니다. V8 코드 (적어도 헤더 파일)를 보거나이 설명서를 볼 수 있습니다.
그리고이 새로운 것은 어떻습니까? 여기서 볼 수 있습니다. 새 문자열 객체를 만드는 것입니다.
이 시점 에서이 주요 기능을 구문 분석했습니다.
내보내기 개체
검토합시다. Node.js로 작성된 경우 기능이나 객체를 어떻게 내보내나요?
코드 사본은 다음과 같습니다.
Exports.hello = function () {}
그렇다면 C ++에서 어떻게 할 수 있습니까?
기능 초기화
먼저 초기화 기능을 작성하겠습니다.
코드 사본은 다음과 같습니다.
void init (handle <botorport> 내보내기)
{
// ... 나는 당신의 여동생에 대해 글을 쓰는 것이 배고프다! #゚ Å å) ⊂ち☆))) ゚ д ゚) ・∵
}
이것은 거북이 엉덩이입니다! 함수 이름이나 무언가가 중요하지는 않지만 전달 된 매개 변수는 <객체> 핸들이어야하므로 아래의 제품에서 물건을 내보낼 것입니다.
그런 다음 여기에 내보내기를 씁니다.
코드 사본은 다음과 같습니다.
void init (handle <botorport> 내보내기)
{
Exports-> set (String :: Newsymbol ( "Hello"),
functionTemplate :: new (hello)-> getFunction ());
}
일반적인 의미는이 내보내기 개체에 hello라는 필드를 추가하는 것이며, 해당하는 것은 기능 이며이 기능은 우리의 친애하는 Hello 기능입니다.
의사 코드에 간단한 점을 작성하려면 :
코드 사본은 다음과 같습니다.
void init (handle <botorport> 내보내기)
{
Exports.set ( "hello", function hello);
}
작업이 완료되었습니다!
(여동생이 끝났습니다! 닥쳐 ( 'д'⊂☡☆)) д´)
진정한 수출
이것이 마지막 단계이며, 우리는 이것이 수출의 입구라고 결국 선언 할 것이므로 코드 끝에이 줄을 추가합니다.
node_module (hello, init)
NI를 먹었습니까? ! 이게 뭔가요?
걱정하지 마십시오.이 node_module은 매크로입니다. 즉, 초기화 기능을 사용하여 HELLO로 내보낼 물건을 내보내는 것을 의미합니다. 그래서이 안녕하세요, 어디에서 왔습니까?
파일 이름에서 나옵니다! 예, 예, 파일 이름에서 나옵니다. 사전에 선언 할 필요가 없으며 사용할 수 없다는 것에 대해 걱정할 필요가 없습니다. 요컨대, 최종 컴파일 바이너리 파일의 이름은 무엇입니까? 여기에 hello를 작성하고 물론 접미사 이름을 제거해야합니다.
자세한 내용은 공식 문서를 참조하십시오.
모든 노드 추가는 초기화 함수를 내보내야합니다.
코드 사본은 다음과 같습니다.
void initialize (handle <boter> 내보내기);
node_module (module_name, 초기화)
Node_Module 후에 반콜론은 함수가 아니기 때문에 반 콜론이 없습니다 (node.h 참조).
Module_Name은 최종 바이너리의 파일 이름과 일치해야합니다 (.Node 접미사를 제외).
컴파일 (́ • ๑ ₃ • ̀๑)
어서, 함께 컴파일합시다!
makefile -binding.gyp과 유사한 새 아카이브 파일을 만들어 봅시다.
다음과 같은 코드를 추가하십시오.
코드 사본은 다음과 같습니다.
{
"대상": [
{
"Target_name": "Hello",
"소스": [ "hello.cc"]
}
]]
}
왜 이것을 쓰나요? Node-Gyp의 공식 문서를 참조 할 수 있습니다.
구성
파일이 준비된 후이 디렉토리 에서이 명령을 실행해야합니다.
코드 사본은 다음과 같습니다.
$ Node-Gyp 구성
모든 것이 정상이면 빌드 디렉토리를 생성하고 내부에 관련 파일이 있어야합니다. 아마도 플랫폼에 따라 m $ visual studio vcxproj 파일 등 또는 makefile 일 수 있습니다.
짓다
makefile이 생성 된 후, 우리는 구성 및 컴파일을 시작합니다.
$ Node-Gyp 빌드
모든 것이 편집 될 때만 실제 작업이 완료된 것으로 간주됩니다! 믿지 않으면 건물/릴리스 디렉토리를 확인하십시오. 아래에 hello.node 파일이 있습니까? 맞습니다. 이것은 C ++가 나중에 node.js를 위해 픽업하고 싶어하는 비누입니다!
기본 사항을 얻자! 노드 (ノ) ✿゚゚ C ++
우리는 지금 디렉토리에 새 파일 Jianfeizao.js를 만듭니다.
코드 사본은 다음과 같습니다.
var addon = require ( "./ build/release/hello");
Console.log (addon.hello ());
그것을 보거나 그렇습니다! 그것을 보거나 그렇습니다! 나와! Node.js 및 C ++의 결과는 기본을 얻습니다! 이 addon.hello ()는 우리가 C ++ 코드로 작성한 핸들 <value> hello (const arguments & args)이며 이제 반환하는 값을 출력했습니다.
샤워를하고 잠자리에 들면 다음 섹션은 더 깊습니다.
늦어지고 있으므로 오늘 글을 쓰게됩니다. 지금까지 모든 사람이 가장 기본적인 Hello World C ++ 확장을 제시 할 수 있습니다. 다음에 내가 쓸 때, 나는 다음에 언제 될지 모르겠습니다.
(이봐, 이봐 요