0Pricing
WebAssembly (WASM) for High Performance Apps · レッスン

基本的なデータ交換:プリミティブ型

JavaScriptコードとWASMコードの間で整数や浮動小数点数などの単純なデータ型を渡す方法を理解します

「基本的なデータ交換:プリミティブ型」はCoddyKit上の無料WebAssembly (WASM) for High Performance Appsレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはWebAssembly (WASM) for High Performance Apps学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 WebAssembly (WASM) for High Performance Appsコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

Exchanging Basic Data Types

Welcome! In this lesson, we'll learn how to pass simple data types, known as primitives, between your JavaScript code and your WebAssembly (WASM) module compiled from C/C++.

Primitives include numbers like integers (int) and floating-point numbers (float, double). This is fundamental for enabling communication and interaction between your web application and high-performance WASM logic.

JS to WASM: Integer Input

Passing an integer from JavaScript to a C/C++ WASM function is quite direct. You define your C/C++ function with integer parameters, and Emscripten handles the necessary type mapping.

For example, a C function to add two integers would look like this:

int add_integers(int a, int b) {
  // Function body
  return a + b;
}

Example: WASM Integer Function

Let's look at a complete C program that defines a function to add two integers and exposes it to JavaScript using EMSCRIPTEN_KEEPALIVE.

Try running this code and see how it compiles:

#include <stdio.h>
#include <emscripten/emscripten.h>

#ifdef __cplusplus
extern "C" {
#endif

EMSCRIPTEN_KEEPALIVE
int add_integers(int a, int b) {
    printf("WASM: Adding %d and %d\n", a, b);
    return a + b;
}

#ifdef __cplusplus
}
#endif

int main() {
    printf("WASM module for integers loaded.\n");
    return 0;
}

Calling Integer Function from JS

After compiling the C code above, Emscripten generates a JavaScript glue code file (e.g., your_module.js) that provides access to your C functions.

You can then call the exported C function from your JavaScript code like this:

// Assuming 'Module' is the Emscripten-generated object
Module.onRuntimeInitialized = () => {
  // The C function is prefixed with an underscore by default
  const result = Module._add_integers(10, 25);
  console.log(`Sum from WASM: ${result}`); // Output: Sum from WASM: 35
};

WASM to JS: Integer Output

Returning an integer from a WASM function back to JavaScript is just as straightforward. C/C++ functions naturally return primitive types, and Emscripten ensures these return values are directly accessible in JavaScript.

Consider a C function that simply returns a fixed integer:

int get_magic_number() {
  return 42;
}

Example: WASM Returns Integer

Here's a C example that returns a specific integer. Notice the use of EMSCRIPTEN_KEEPALIVE to make it available to JavaScript.

Run this to see the simple C structure:

#include <stdio.h>
#include <emscripten/emscripten.h>

#ifdef __cplusplus
extern "C" {
#endif

EMSCRIPTEN_KEEPALIVE
int get_magic_number() {
    printf("WASM: Returning magic number.\n");
    return 42;
}

#ifdef __cplusplus
}
#endif

int main() {
    printf("WASM module for returning integers loaded.\n");
    return 0;
}

Exchanging Floating-Point Numbers

Passing floating-point numbers (float and double) between JavaScript and WASM works very similarly to integers. You define your C/C++ functions with float or double parameters and return types.

JavaScript's Number type is generally a 64-bit float (double-precision), which Emscripten automatically converts when passing to C/C++ float (32-bit) or double (64-bit) types.

Example: WASM Float Operations

Let's create a C function that takes two floats and returns their product, and another for doubles. This demonstrates both input and output of floating-point numbers.

Run this code to see how floats are handled:

#include <stdio.h>
#include <emscripten/emscripten.h>

#ifdef __cplusplus
extern "C" {
#endif

EMSCRIPTEN_KEEPALIVE
float multiply_floats(float a, float b) {
    printf("WASM: Multiplying floats %.2f * %.2f\n", a, b);
    return a * b;
}

EMSCRIPTEN_KEEPALIVE
double divide_doubles(double x, double y) {
    printf("WASM: Dividing doubles %.2f / %.2f\n", x, y);
    if (y == 0.0) return 0.0; // Avoid division by zero
    return x / y;
}

#ifdef __cplusplus
}
#endif

int main() {
    printf("WASM module for floats/doubles loaded.\n");
    return 0;
}

Type Matching is Key

While Emscripten handles much of the type conversion automatically, it's good practice to be aware of the underlying types:

  • JavaScript Number: This is typically a 64-bit floating-point number.
  • C/C++ int: Often 32-bit integer.
  • C/C++ float: 32-bit floating-point number.
  • C/C++ double: 64-bit floating-point number.

When passing a JS Number to a C float, there might be a slight loss of precision, as the 64-bit JS number is truncated to a 32-bit float.

Quick Check: Data Flow

You've learned how simple data types are exchanged. Let's test your understanding.

Recap: Primitive Exchange

Great job! You've mastered the basics of primitive data exchange between JavaScript and WebAssembly modules compiled from C/C++.

  • Simple data types like int, float, and double are straightforward to pass.
  • C/C++ functions can take them as parameters and return them as results.
  • Emscripten acts as the bridge, automatically converting between JavaScript's Number type and C/C++'s primitive types.
  • Be mindful of potential precision differences when converting between 64-bit (JS Number, C double) and 32-bit (C float, C int) types.

This fundamental understanding paves the way for exchanging more complex data structures later on!

よくある質問

「基本的なデータ交換:プリミティブ型」レッスンは無料ですか?

はい。「基本的なデータ交換:プリミティブ型」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、WebAssembly (WASM) for High Performance Appsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 WebAssembly (WASM) for High Performance Appsコースには全4レッスンが含まれています。

「基本的なデータ交換:プリミティブ型」で何を学びますか?

JavaScriptコードとWASMコードの間で整数や浮動小数点数などの単純なデータ型を渡す方法を理解します ブラウザで直接実行するハンズオンコードでWebAssembly (WASM) for High Performance Appsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

WebAssembly (WASM) for High Performance Appsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのWebAssembly (WASM) for High Performance Appsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「基本的なデータ交換:プリミティブ型」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このWebAssembly (WASM) for High Performance Appsレッスンでコードを書いて実行できますか?

はい。すべてのWebAssembly (WASM) for High Performance Appsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. EmscriptenによるC/C++からWASMへのコンパイル
  2. JavaScriptでのWASMの読み込みと実行
  3. 基本的なデータ交換:プリミティブ型
  4. C/C++からJavaScript関数を呼び出す
← WebAssembly (WASM) for High Performance Appsに戻る