Tag: C++

C++ untuk Pemrograman ML & AI

C++ telah berkembang jauh sejak pertama kali diluncurkan sebagai perluasan bahasa C yang mendukung pendekatan berorientasi objek pada tahun 1980-an. Evolusi C++ beberapa dasawarsa terakhir membuat bahasa ini menjadi bahasa yang lebih menarik dan modern. Versi C++11 membawa fitur modern seperti auto, lambda, dan smart pointer; lalu C++20 memperkenalkan modul, pengelolaan range, dan fungsi coroutines; hingga C++23 yang menangani data berdimensi banyak untuk pengelolaan tensor dan matriks. Versi C++26 yang masih dalam perancangan disusun dengan tambahan concurrency dan parallelism, reflection (semacam introspection), dan pattern matching, yang membuat C++ menjadi lebih dinamis.

Kemajuan fitur-fitur itu membuat C++ makin mudah digunakan dalam pengembangan sistem yang berkaitan dengan pembelajaran mesin (machine learning), pembelajaran mendalam (deep learning), dan kecerdasan buatan (AI). Bahasa ini memberikan kendali penuh atas penggunaan memori dan sumber daya komputasi, sangat penting untuk aplikasi yang memerlukan kecepatan tinggi dan efisiensi. Walaupun tidak memiliki pustaka bawaan untuk ML atau AI, C++ memberi dasar yang kuat untuk membangun pustaka atau sistem AI yang stabil, cepat, dan siap digunakan dalam skala besar.

Bahasa semacam Python yang telah menjadi pilihan banyak programmer ML/AI, tetap menjadi pilihan utama untuk belajar dan membuat prototipe karena sintaksnya yang ringkas dan pustaka siap pakainya yang sangat banyak. Namun, dalam pengembangan perangkat lunak AI berkinerja tinggi, Python biasanya hanya menjadi antarmuka depan saja, sementara proses yang berat dijalankan di balik layar oleh sistem yang ditulis dalam C++. Pemahaman atas kedua bahasa ini sangat berguna: Python untuk eksperimen dan pengujian cepat, C++ untuk penerapan nyata yang efisien dan kuat.

Pemanfaatan C++ dalam dunia AI dapat dilihat pada berbagai perangkat lunak ternama seperti TensorFlow, PyTorch (LibTorch), TensorRT, ONNX Runtime, hingga OpenCV. Semuanya menggunakan C++ di bagian dalamnya untuk menjamin kecepatan dan ketepatan proses.

Di sisi lain, C++ tetap dapat digunakan untuk belajar, bereksperimen, atau secara profesional membangun berbagai model kecerdasan buatan, termasuk regresi linear, klasifikasi, hingga jaringan syaraf. Ini berguna bagi kita yang ingin bereksplorasi dengan C++ untuk memahami konsep AI dari dasar, atau ingin membuat sistem AI kecil yang dapat dijalankan di perangkat terbatas.

Salah satu contoh yang menarik adalah penerapan jaringan syaraf tiruan sederhana, yaitu MLP satu lapis tersembunyi, dengan menggunakan C++ murni. Dengan hanya mengandalkan vektor dari STL dan fungsi-fungsi matematika dasar, kita dapat membangun sistem yang belajar menyelesaikan masalah XOR.

// Kode MLP XOR
// Copyrights (c) Informatika.AI, 2025

#include <vector>
#include <cmath>
#include <random>
#include <print>
#include <cstdio>

using namespace std;

// Sigmoid dan turunannya
float sigmoid(float x) {
    return 1.0f / (1.0f + exp(-x));
}

float sigmoid_derivative(float x) {
    float s = sigmoid(x);
    return s * (1.0f - s);
}

// Acak bobot awal
float rand_weight() {
    static mt19937 rng(42);
    static uniform_real_distribution<float> dist(-1.0f, 1.0f);
    return dist(rng);
}

// Struktur data untuk satu sample
struct Sample {
    vector<float> input;
    float target;
};

int main() {
    vector<Sample> dataset = {
        {{0.0f, 0.0f}, 0.0f},
        {{0.0f, 1.0f}, 1.0f},
        {{1.0f, 0.0f}, 1.0f},
        {{1.0f, 1.0f}, 0.0f}
    };

    constexpr float lr = 0.1f;
    constexpr int epochs = 10000;

    // Inisialisasi bobot
    float w_ih[2][2]; // 2 input → 2 hidden
    float b_h[2];     // bias hidden
    float w_ho[2];    // hidden → output
    float b_o;        // bias output

    for (int i = 0; i < 2; ++i) {
        b_h[i] = rand_weight();
        w_ho[i] = rand_weight();
        for (int j = 0; j < 2; ++j)
            w_ih[j][i] = rand_weight();
    }
    b_o = rand_weight();

    for (int epoch = 0; epoch < epochs; ++epoch) {
        for (const auto& sample : dataset) {
            // Forward
            float h_raw[2], h_act[2];
            for (int i = 0; i < 2; ++i) {
                h_raw[i] = b_h[i];
                for (int j = 0; j < 2; ++j)
                    h_raw[i] += sample.input[j] * w_ih[j][i];
                h_act[i] = sigmoid(h_raw[i]);
            }

            float o_raw = b_o;
            for (int i = 0; i < 2; ++i)
                o_raw += h_act[i] * w_ho[i];
            float o_act = sigmoid(o_raw);

            float error = sample.target - o_act;
            float d_o = error * sigmoid_derivative(o_raw);
            float d_h[2];
            for (int i = 0; i < 2; ++i)
                d_h[i] = d_o * w_ho[i] * sigmoid_derivative(h_raw[i]);

            // Update bobot
            for (int i = 0; i < 2; ++i)
                w_ho[i] += lr * d_o * h_act[i];
            b_o += lr * d_o;

            for (int i = 0; i < 2; ++i) {
                for (int j = 0; j < 2; ++j)
                    w_ih[j][i] += lr * d_h[i] * sample.input[j];
                b_h[i] += lr * d_h[i];
            }
        }

        if (epoch % 1000 == 0)
            print("Epoch {}\n", epoch);
    }

    // Evaluasi
    print("\n=== Evaluasi XOR ===\n");
    for (const auto& sample : dataset) {
        float h_act[2];
        for (int i = 0; i < 2; ++i) {
            float h_raw = b_h[i];
            for (int j = 0; j < 2; ++j)
                h_raw += sample.input[j] * w_ih[j][i];
            h_act[i] = sigmoid(h_raw);
        }

        float o_raw = b_o;
        for (int i = 0; i < 2; ++i)
            o_raw += h_act[i] * w_ho[i];
        float o_act = sigmoid(o_raw);

        print("Input: {} {} → Output: {:.4f} (Target: {})\n",
              int(sample.input[0]), int(sample.input[1]), o_act, int(sample.target));
    }

    return 0;
}

Dalam program ini, kita dapat melihat bagaimana data diproses maju (forward pass), kesalahan dihitung, lalu bobot diperbarui melalui proses penurunan gradien (backpropagation). Contoh ini menunjukkan bahwa tanpa bantuan kepustakaan eksternal, C++ tetap dapat menjadi sarana belajar AI yang mudah dan mendalam.

Pengenalan C++23

C++ adalah bahasa pemrograman yang paling aktif digunakan hingga hari ini. Lahir sebagai pengembangan dari bahasa C, C++ dirancang untuk memberi programmer kendali penuh atas perangkat keras komputer sekaligus mendukung pemrograman yang terstruktur. C++ menjadi tulang punggung sistem operasi, game engine, browser web, hingga kecerdasan buatan. Namun justru karena usianya yang panjang, C++ mengumpulkan banyak cara lama yang membuat belajar dan menggunakannya terasa berat. Kabar baiknya, C++ tidak berhenti berkembang. Setiap beberapa tahun, standar baru dirilis untuk membuat bahasa ini lebih aman, lebih ringkas, dan lebih mudah ditulis. C++23, versi terbaru yang resmi diadopsi pada tahun 2024, adalah lompatan besar yang membuat C++ terasa jauh lebih ramah, bahkan bagi pemula yang baru saja belajar Python.

C++ Klasik

Sebelum tahun 2011, C++ yang sering disebut “C++ klasik” menuntut programmer untuk mengurus hampir segalanya secara manual. Ingin mencetak teks ke layar? Kita harus menyertakan pustaka <iostream>, lalu menggunakan sintaks std::cout yang terasa asing. Ingin mengelola memori? Kita harus memanggil new dan delete secara eksplisit, dan jika lupa memanggil delete, program akan “bocor” memori secara perlahan. Tidak ada cara singkat untuk menulis fungsi kecil di dalam kode, tidak ada penyimpulan tipe otomatis, dan pesan error dari kompiler sering kali lebih membingungkan daripada membantu. C++ klasik sangat kuat, tetapi kekuatannya datang dengan harga yang mahal berupa kompleksitas yang tinggi.

C++11 dan C++14

Tahun 2011 menjadi titik balik. Standar C++11 memperkenalkan sejumlah fitur yang mengubah cara programmer menulis C++. Kata kunci auto memungkinkan kompiler menebak sendiri tipe data sebuah variabel, sehingga programmer tidak perlu menuliskannya secara eksplisit. Smart pointer seperti std::unique_ptr membuat manajemen memori jauh lebih aman karena memori dibebaskan secara otomatis. C++14 kemudian menghaluskan fitur-fitur ini lebih lanjut. Sebagian besar framework kecerdasan buatan besar yang ada sekarang, termasuk backend PyTorch dan TensorFlow, ditulis pada era C++11 dan C++14 ini.

C++23

C++23 membawa perubahan yang terasa lebih dekat ke cara berpikir programmer Python. Perubahan paling terlihat bagi pemula adalah std::print, sebuah fungsi baru yang bekerja sangat mirip dengan print() di Python.

Perhatikan perbandingan berikut untuk mencetak teks sederhana ke layar:

Python:

name = "Andi"
score = 95.5
print(f"Nama: {name}, Nilai: {score:.1f}")

C++ klasik / C++11:

#include <iostream>
#include <string>

int main() {
    std::string name = "Andi";
    double score = 95.5;
    std::cout << "Nama: " << name << ", Nilai: " << score << std::endl;
    return 0;
}

C++23:

import std;

int main() {
    std::string name = "Andi";
    double score = 95.5;
    std::print("Nama: {}, Nilai: {:.1f}\n", name, score);
}

Fungsi std::print menggunakan format kurung kurawal {} yang identik dengan f-string Python. Tidak ada lagi << yang berjejer panjang, tidak ada std::endl yang membingungkan, dan dengan import std kita tidak perlu lagi menghafal daftar #include yang berbeda untuk setiap fitur. Programmer Python yang melihat kode C++23 untuk pertama kali akan merasa jauh lebih familiar dibandingkan melihat kode C++ klasik.

C++23 Lebih Mudah Daripada C++ Klasik

Dibandingkan C++ klasik, sintaks C++23 jauh lebih ringkas. Banyak hal yang dulu membutuhkan 5 hingga 10 baris kode kini dapat ditulis dalam 1 atau 2 baris. Fitur seperti auto, range-based for loop, dan structured bindings membuat kode C++23 terasa lebih “to the point”, mirip dengan gaya penulisan Python.

C++23 juga memperkenalkan std::expected sebagai cara baru menangani error. Di C++ lama, error biasanya ditangani dengan exception yang melempar pesan ke tempat lain dalam kode, sesuatu yang sulit dilacak untuk pemula. std::expected bekerja seperti fungsi yang bisa mengembalikan “hasil yang berhasil” atau “keterangan error” secara langsung, sehingga alur program lebih mudah dibaca dari atas ke bawah.

Selain itu, tedapat std::mdspan di C++23 yang membuat pengelolaan data dalam bentuk matriks atau array multidimensi jauh lebih alami. Ini sangat relevan bagi siapa saja yang belajar pemrosesan data atau kecerdasan buatan, karena konsepnya mirip dengan cara NumPy bekerja di Python.

Tentu saja C++ tetaplah C++. Beberapa konsep seperti pointer, tipe data statis, dan manajemen memori tetap harus dipahami, dan ini membutuhkan waktu. Tetapi dengan C++23, hambatan awal itu jauh lebih rendah dibanding belajar dari C++ klasik. Daripada langsung terjebak mengurus #include, namespace, dan operator << yang membingungkan, kamu bisa fokus dulu pada logika program, dan membiarkan fitur-fitur modern C++23 menangani kerumitan di balik layar.

C++23 untuk ML dan AI

Salah satu alasan C++23 makin relevan di dunia kecerdasan buatan adalah std::mdspan. Fitur ini memungkinkan program untuk melihat dan memanipulasi data multidimensi seperti matriks atau tensor tanpa perlu menyalin data ke tempat baru. Bayangkan kita punya array angka panjang di memori; mdspan dapat “memandang” data itu seolah-olah berbentuk grid 2D atau kubus 3D, persis seperti cara NumPy memandang array di Python. Ini sangat efisien karena tidak ada pemborosan memori.

Untuk memproses data dalam jumlah besar, C++23 memiliki ranges dan views yang bekerja secara lazy. Artinya, filter dan transformasi data tidak langsung dieksekusi saat ditulis, melainkan baru dijalankan saat hasilnya benar-benar dibutuhkan. Ini serupa dengan generator di Python dan sangat menghemat memori ketika bekerja dengan dataset besar.

// C++23: filter data positif lalu kuadratkan, tanpa alokasi memori baru
import std;

int main() {
    std::vector<float> data = {-1.5f, 2.0f, -0.3f, 4.1f, -2.0f, 3.5f};

    auto pipeline = data
        | std::views::filter([](float x) { return x > 0; })
        | std::views::transform([](float x) { return x * x; });

    for (float val : pipeline)
        std::print("{:.2f}  ", val);
    // Output: 4.00  16.81  12.25
}

Bandingkan dengan Python:

data = [-1.5, 2.0, -0.3, 4.1, -2.0, 3.5]
pipeline = (x**2 for x in data if x > 0)
for val in pipeline:
    print(f"{val:.2f}", end="  ")

Strukturnya hampir identik. Di C++23, kita menggunakan | untuk menghubungkan operasi, sementara Python menggunakan ekspresi generator. Hasilnya sama, tetapi versi C++ akan berjalan jauh lebih cepat dan bisa dipakai untuk memproses jutaan data tanpa masalah performa.

Kolaborasi C++23 dan Python

C++ dan Python bukan pesaing, melainkan pasangan yang saling melengkapi. Python unggul dalam kemudahan penulisan kode, ekosistem library yang luas, dan kecepatan pengembangan. C++ unggul dalam kecepatan eksekusi dan kendali langsung atas perangkat keras. Dalam dunia nyata, banyak library Python yang paling populer, seperti NumPy, Pandas, dan PyTorch, sebenarnya ditulis dalam C++ di balik layar, dan Python hanya menjadi “antarmuka” yang nyaman untuk mengaksesnya.

C++23 membuat jembatan antara dua bahasa ini lebih mudah dibangun. std::span dan std::mdspan menggunakan format memori yang sama dengan NumPy, sehingga data bisa berpindah antara Python dan C++ tanpa perlu disalin. Dengan library seperti pybind11 atau nanobind, fungsi C++23 bisa “dibungkus” menjadi modul Python dan dipanggil seolah-olah fungsi Python biasa.

// Fungsi C++23 yang bisa dipanggil dari Python
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
import std;

namespace py = pybind11;

py::array_t<float> relu(py::array_t<float> input) {
    auto buf = input.request();
    std::span<float> data(static_cast<float*>(buf.ptr), buf.size);

    py::array_t<float> output(buf.size);
    auto out_buf = output.request();
    std::span<float> out(static_cast<float*>(out_buf.ptr), buf.size);

    std::transform(data.begin(), data.end(), out.begin(),
        [](float x) { return std::max(0.f, x); });

    return output;
}

PYBIND11_MODULE(fast_ops, m) {
    m.def("relu", &relu, "ReLU activation function");
}

Setelah dikompilasi, fungsi di atas dapat langsung dipakai dari Python:

import numpy as np
import fast_ops

x = np.array([-1.0, 0.5, 2.0, -0.3], dtype=np.float32)
print(fast_ops.relu(x))  # [0.   0.5  2.   0. ]

Kesimpulan

C++23 bukan bahasa yang sepenuhnya baru. Ia tetap C++, dengan semua kekuatan dan konsep fundamentalnya. Tetapi C++23 adalah versi C++ yang paling ramah yang pernah ada, terutama bagi kita yang sudah terbiasa dengan Python. Sintaksnya lebih ringkas, error handling lebih jelas, dan tools untuk pemrosesan data sudah tersedia di dalam standar tanpa perlu library tambahan. Jika kita ingin memahami bagaimana software berkecepatan tinggi dan sistem AI sesungguhnya bekerja di balik antarmuka Python yang nyaman, mempelajari C++23 adalah langkah berikutnya yang paling masuk akal.

© 2026 Informatika

Theme by Anders NorénUp ↑