Alibaba Cloud Compiler adalah kompiler C++ yang dikembangkan oleh Alibaba Cloud berdasarkan Clang/LLVM 13, versi komunitas sumber terbuka dari Clang/LLVM. Kompiler ini mewarisi semua opsi dan parameter dari Clang/LLVM 13, dioptimalkan secara mendalam untuk infrastruktur Alibaba Cloud, dan menyediakan fitur tambahan untuk pengalaman pengguna yang lebih baik. Topik ini menjelaskan cara menginstal dan menggunakan Alibaba Cloud Compiler pada Alibaba Cloud Linux 3 untuk membangun aplikasi C++ berperforma tinggi dengan cepat.
Informasi latar belakang
Dibandingkan dengan GNU Compiler Collection (GCC) dan versi lain dari Clang/LLVM, Alibaba Cloud Compiler memberikan peningkatan signifikan dalam kecepatan kompilasi dan pembuatan.
Alibaba Cloud Compiler menggunakan teknik seperti optimasi berbasis profil (PGO) untuk kompilasi yang lebih cepat dan menulis kode C++ skala besar lebih cepat daripada GCC.
Clang/LLVM linker (LLD) lebih unggul dibandingkan GNU linker yang digunakan oleh GCC, terutama dalam memproses file biner besar.
Alibaba Cloud Compiler mendukung C++20 Modules dan memungkinkan pustaka standar C++ dimodularisasi menjadi
std-module. Anda dapat menggunakanstd-moduleuntuk mentransformasi kode bisnis dengan biaya rendah dan mempercepat kompilasi.
Alibaba Cloud Compiler memanfaatkan teknologi seperti Alibaba Cloud Compiler (LLVM) ThinLTO dan AutoFDO untuk meningkatkan performa program. Kompiler ini dapat berjalan di berbagai arsitektur, seperti x86 dan Arm64, serta dioptimalkan untuk prosesor YiTian 710 untuk performa lebih baik.
Alibaba Cloud Compiler mendukung Coroutines dan Modules serta menyediakan pustaka standar yang dimodularisasi. Alibaba Cloud juga menyediakan yaLanTingLibs, yang mencakup komponen sering digunakan oleh pengembang C++, seperti pustaka coroutine, pustaka serialisasi, Remote Procedure Call (RPC) library, dan fitur HTTP.
CatatanyaLanTingLibs adalah kumpulan pustaka utilitas C++ berperforma tinggi dan mudah digunakan yang membantu pengembang membangun aplikasi C++ modern dan berperforma tinggi.
Prasyarat
Sebuah instance Elastic Compute Service (ECS) yang menjalankan Alibaba Cloud Linux 3 telah dibuat. Untuk informasi lebih lanjut, lihat Buat instance.
Alibaba Cloud Compiler hanya mendukung Alibaba Cloud Linux 3.
Instal dan gunakan Alibaba Cloud Compiler
Instal Alibaba Cloud Compiler.
sudo yum install -y alibaba-cloud-compilerInstal
libstdc++-devel.libstdc++-develmenyediakan file header untuk GNU Standard C++ Library.sudo yum -y install libstdc++-develImpor variabel lingkungan.
export PATH=/opt/alibaba-cloud-compiler/bin:$PATHGunakan Alibaba Cloud Compiler untuk kompilasi.
Kompilasi sederhana
Buat file
hello.cpp.sudo vim hello.cppTekan tombol
iuntuk masuk ke mode Insert, lalu salin dan tempel konten berikut ke dalam file:#include <iostream> int main() { std::cout << "hello C++" << std::endl; return 0; }Tekan tombol
Esc, masukkan:wq, lalu tekan tombolEnteruntuk menyimpan dan menutup file.Kompilasi kode C++ yang dimodularisasi.
clang++ -O2 hello.cpp -o hello.cpp.outJalankan program.
./hello.cpp.outKeluaran perintah berikut menunjukkan bahwa program telah dijalankan.

Gunakan C++20 Coroutines dan Modules
Alibaba Cloud Compiler mendukung C++20 Coroutines dan Modules, yang membantu meningkatkan efisiensi kompilasi dan performa. Untuk melihat contoh coroutines, lihat Gunakan pustaka RPC dan Gunakan pustaka HTTP.
CatatanPada pemanggilan fungsi tradisional, sebuah fungsi setelah dipanggil akan dieksekusi hingga selesai. Coroutines adalah konsep pemrograman yang memungkinkan eksekusi fungsi ditangguhkan dan dilanjutkan. Mekanisme kontrol alur fleksibel ini menyederhanakan implementasi pemrograman asinkron dan pola generator.
Dalam paradigma pemrograman C++ tradisional, kode diorganisasikan ke dalam file header (
.h/.hpp) dan file sumber (.cpp), dengan file header berisi deklarasi. Anda membuat deklarasi dalam file header dan menggunakan direktif preprocessor#includeuntuk menyisipkan salinan file header ke dalam setiap file sumber yang membutuhkan deklarasi tersebut. Oleh karena itu, kompiler mungkin berulang kali mengurai file header yang sama, yang memperlambat kompilasi. Modules diperkenalkan sebagai metode untuk meningkatkan organisasi kode dan efisiensi kompilasi.
Saat menggunakan Clang untuk mengompilasi program C++, Anda dapat mengonfigurasi parameter dalam tabel berikut.
Parameter
Deskripsi
-std=Menentukan standar bahasa C++ yang digunakan untuk kompilasi. Jika Anda menentukan
-std=c++20, C++ Coroutines dan Modules akan berlaku.--precompileMengompilasi unit modul menjadi file antarmuka modul biner (BMI).
-fprebuilt-module-pathMenentukan jalur untuk mencari file BMI.
-fstd-modulesMenentukan untuk mengompilasi file untuk modul std.
-fmodules-export-allMenandai semua deklarasi dalam modul saat ini sebagai
export.-fmodules-export-macrosMengaktifkan modul untuk mengekspor makro.
-try-load-bmi-when-preprocessingMencari file BMI selama preprocessing.
-fstd-module-pathMenentukan jalur untuk mencari modul std.
-fcoro-aligned-allocationMemilih alokasi yang selaras untuk C++ Coroutines.
Contoh kompilasi:
Buat file
Hello.cppm.sudo vim Hello.cppmTekan tombol
iuntuk masuk ke mode Insert, lalu salin dan tempel konten berikut ke dalam file:module; #include <iostream> export module Hello; export void hello() { std::cout << "Hello World!\n"; }Tekan tombol
Esc, masukkan:wq, lalu tekan tombolEnteruntuk menyimpan dan menutup file.Buat file
use.cpp.sudo vim use.cppTekan tombol
iuntuk masuk ke mode Insert, lalu salin dan tempel konten berikut ke dalam file:import Hello; int main() { hello(); return 0; }Tekan tombol
Esc, masukkan:wq, lalu tekan tombolEnteruntuk menyimpan dan menutup file.Kompilasi kode C++ yang dimodularisasi.
# Pra-kompilasi antarmuka modul untuk membuat file Hello.pcm. clang++ -std=c++20 Hello.cppm --precompile -o Hello.pcm # Kompilasi program utama dan tautkan modul untuk membuat file executable Hello.out. clang++ -std=c++20 use.cpp -fprebuilt-module-path=. Hello.pcm -o Hello.outJalankan program.
./Hello.outKeluaran perintah berikut menunjukkan bahwa program telah dijalankan.

(Opsional) Gunakan yaLanTingLibs
Anda dapat menggunakan yaLanTingLibs, yang menyediakan pustaka coroutine, pustaka serialisasi, pustaka RPC, dan fitur HTTP berdasarkan C++20 Coroutines dan fitur metaprogramming template C++. Untuk informasi lebih lanjut, kunjungi yalantinglibs dan async_simple.
Pustaka serialisasi adalah perangkat lunak pustaka yang digunakan untuk serialisasi dan deserialisasi data. Serialisasi adalah proses mengubah struktur data atau status objek menjadi format yang dapat disimpan dalam file atau buffer atau ditransmisikan melalui jaringan. Deserialisasi adalah proses mengembalikan struktur data atau status objek yang disimpan atau ditransmisikan ke kondisi semula.
RPC adalah pustaka yang digunakan untuk komunikasi antar-proses (IPC). RPC memungkinkan program C++ mengeksekusi fungsi atau metode pada mesin jarak jauh seolah-olah fungsi atau metode tersebut lokal. RPC mengabstraksi detail seperti transmisi jaringan, serialisasi, deserialisasi, dan rute, sehingga pengembang dapat fokus pada logika bisnis aplikasi mereka.
HTTP adalah protokol lapisan aplikasi untuk sistem informasi hipermedia terdistribusi, kolaboratif.
coro_httpadalah pustaka HTTP berperforma tinggi dan mudah digunakan yang diimplementasikan menggunakan C++20 coroutines. Ini mencakup server HTTP dan klien HTTP untuk membantu pengguna dengan cepat mengembangkan aplikasi HTTP.
Instal yaLanTingLibs.
sudo yum install -y yalantinglibs-develGunakan pustaka serialisasi, pustaka RPC, dan pustaka HTTP dari yaLanTingLibs.
Gunakan pustaka serialisasi
Buat file
test.cpp.sudo vim test.cppTekan tombol
iuntuk masuk ke mode Insert, lalu salin dan tempel konten berikut ke dalam file:#include <iostream> #include "ylt/struct_pack.hpp" struct person { int age; std::string name; }; int main() { person tom{.age=20,.name="tom"}; auto buffer = struct_pack::serialize(tom); auto tom2 = struct_pack::deserialize<person>(buffer); std::cout<<"age: "<<tom2.value().age<<", name: "<<tom2.value().name<<std::endl; return 0; }Tekan tombol
Esc, masukkan:wq, lalu tekan tombolEnteruntuk menyimpan dan menutup file.Kompilasi program.
clang++ test.cpp -std=c++20 -o testJalankan program.
./testKeluaran perintah berikut menunjukkan bahwa program telah dijalankan.

Gunakan pustaka RPC
Buat file
server.cppdi server.sudo vim server.cppTekan tombol
iuntuk masuk ke mode Insert, lalu salin dan tempel konten berikut ke dalam file:#include "ylt/coro_rpc/coro_rpc_server.hpp" std::string ping(std::string ping) { return "Receive: " + ping + ". Return pong."; } int main() { coro_rpc::coro_rpc_server server{1 , 8801}; server.register_handler<ping>(); return server.start(); }Tekan tombol
Esc, masukkan:wq, lalu tekan tombolEnteruntuk menyimpan dan menutup file.Buat file
client.cpp.sudo vim client.cppTekan tombol
iuntuk masuk ke mode Insert, lalu salin dan tempel konten berikut ke dalam file:#include <iostream> #include "ylt/coro_rpc/coro_rpc_client.hpp" std::string ping(std::string); async_simple::coro::Lazy<void> example(){ coro_rpc::coro_rpc_client client; auto ec = co_await client.connect("localhost","8801"); assert(!ec); auto ret = co_await client.call<ping>("ping"); std::cout << ret.value() << std::endl; co_return; }; int main(){ async_simple::coro::syncAwait(example()); return 0; }Tekan tombol
Esc, masukkan:wq, lalu tekan tombolEnteruntuk menyimpan dan menutup file.Kompilasi program sisi server.
clang++ server.cpp -I /usr/include/ylt/thirdparty -std=c++20 -o server -lpthreadKompilasi program sisi klien.
CatatanSebelum mengompilasi program sisi klien, pastikan bahwa Alibaba Cloud Compiler telah diinstal di klien dan variabel lingkungan telah diimpor ke klien. Untuk informasi lebih lanjut, lihat Kompilasi Alibaba Cloud Compiler.
clang++ client.cpp -I /usr/include/ylt/thirdparty -std=c++20 -o client -lpthreadJalankan perintah berikut di server dan klien untuk memulai server dan klien:
./server & ./clientKeluaran perintah berikut dikembalikan. Entri log menggambarkan seluruh proses, termasuk memulai server RPC, server RPC mendengarkan permintaan RPC, klien RPC mengirim permintaan RPC, server RPC memproses permintaan RPC, dan klien RPC menutup koneksi.

Gunakan pustaka HTTP
Buat file
http.cppdi server.sudo vim http.cppTekan tombol
iuntuk masuk ke mode Insert, lalu salin dan tempel konten berikut ke dalam file:#include <iostream> #include "ylt/coro_http/coro_http_client.hpp" #include "ylt/coro_http/coro_http_server.hpp" using namespace std::chrono_literals; using namespace coro_http; async_simple::coro::Lazy<void> basic_usage() { coro_http_server server(1, 9001); server.set_http_handler<GET>( "/get", [](coro_http_request &req, coro_http_response &resp) { resp.set_status_and_content(status_type::ok, "ok"); }); server.async_start(); std::this_thread::sleep_for(300ms); coro_http_client client{}; auto result = co_await client.async_get("http://127.0.0.1:9001/get"); assert(result.status == 200); assert(result.resp_body == "ok"); for (auto [key, val] : result.resp_headers) { std::cout << key << ": " << val << "\n"; } } int main() { async_simple::coro::syncAwait(basic_usage()); }Tekan tombol
Esc, masukkan:wq, lalu tekan tombolEnteruntuk menyimpan dan menutup file.Kompilasi program HTTP.
clang++ http.cpp -I /usr/include/ylt/thirdparty -std=c++20 -o http -lpthreadJalankan program HTTP.
./httpKeluaran perintah berikut menunjukkan bahwa program telah dijalankan.
