Alibaba Cloud Compiler, Clang/LLVM'nin açık kaynak topluluk sürümü olan Clang/LLVM 13 temel alınarak Alibaba Cloud tarafından geliştirilen bir C++ derleyicisidir. Clang/LLVM 13'teki tüm seçenekleri ve parametreleri devralır, Alibaba Cloud altyapısı için derinlemesine optimize edilmiştir ve daha iyi bir kullanıcı deneyimi sunmak amacıyla ek özellikler sağlar. Bu konuda, yüksek performanslı C++ uygulamalarını hızlıca oluşturmak için Alibaba Cloud Linux 3 üzerinde Alibaba Cloud Compiler'ın nasıl yükleneceği ve kullanılacağı açıklanmaktadır.
Arka plan bilgileri
-
GNU Compiler Collection (GCC) ve diğer Clang/LLVM sürümleriyle karşılaştırıldığında, Alibaba Cloud Compiler derleme ve oluşturma hızlarında önemli iyileştirmeler sunar.
Alibaba Cloud Compiler, daha hızlı derleme için profil rehberli optimizasyon (PGO) gibi farklı teknikler benimser ve GCC gibi diğer derleyicilere kıyasla büyük ölçekli C++ kodlarını daha hızlı derler.
Clang/LLVM bağlayıcısı (LLD), özellikle büyük ikili dosyaları işlerken GCC tarafından kullanılan GNU bağlayıcısından daha iyi performans gösterir.
Alibaba Cloud Compiler, C++20 Modüllerini destekler ve standart bir C++ kitaplığının
std-moduleolarak modüler hale getirilmesine olanak tanır. Derlemeyi hızlandırmak ve iş kodunu düşük maliyetle dönüştürmek içinstd-modulekullanabilirsiniz.
Alibaba Cloud Compiler, program performansını artırmak için Alibaba Cloud Compiler (LLVM) ThinLTO ve AutoFDO gibi teknolojilerden yararlanır. Alibaba Cloud Compiler, x86 ve Arm64 gibi farklı mimarilerde çalışabilir ve performansı daha da artırmak için YiTian 710 işlemciler için ayarlanmıştır.
-
Alibaba Cloud Compiler, Eş Yordamları (Coroutines) ve Modülleri destekler ve modüler standart kitaplıklar sağlar. Alibaba Cloud, eş yordam kitaplığı, serileştirme kitaplığı, Uzak Yordam Çağrısı (RPC) kitaplığı ve HTTP özelliği gibi C++ geliştiricileri tarafından yaygın olarak kullanılan bileşenleri içeren yaLanTingLibs'i sunar.
NotyaLanTingLibs, geliştiricilerin yüksek performanslı ve modern C++ uygulamaları oluşturmak için kullanabileceği, yüksek performanslı ve kullanımı kolay C++ yardımcı program kitaplıklarından oluşan bir koleksiyondur.
Ön koşullar
Alibaba Cloud Linux 3 çalışan bir Elastic Compute Service (ECS) örneği oluşturulmuştur. Daha fazla bilgi için bkz. Örnek oluşturma.
Alibaba Cloud Compiler yalnızca Alibaba Cloud Linux 3'ü destekler.
Alibaba Cloud Compiler'ı yükleme ve kullanma
-
Alibaba Cloud Compiler'ı yükleyin.
sudo yum install -y alibaba-cloud-compiler -
libstdc++-develpaketini yükleyin.libstdc++-devel, GNU Standart C++ Kitaplığı için başlık dosyaları sağlar.sudo yum -y install libstdc++-devel -
Ortam değişkenlerini içe aktarın.
export PATH=/opt/alibaba-cloud-compiler/bin:$PATH -
Derleme için Alibaba Cloud Compiler'ı kullanın.
Basit derleme
-
hello.cppdosyasını oluşturun.sudo vim hello.cpp -
Ekleme moduna girmek için
ituşuna basın ve ardından aşağıdaki içeriği dosyaya kopyalayıp yapıştırın:#include <iostream> int main() { std::cout << "hello C++" << std::endl; return 0; } Esctuşuna basın,:wqgirin ve dosyayı kaydedip kapatmak içinEntertuşuna basın.-
Modüler C++ kodunu derleyin.
clang++ -O2 hello.cpp -o hello.cpp.out -
Programı çalıştırın.
./hello.cpp.outAşağıdaki komut çıktısı, programın çalıştırıldığını gösterir.

C++20 Eş Yordamlarını ve Modüllerini kullanma
Alibaba Cloud Compiler, derleme verimliliğini ve performansını artırmaya yardımcı olan C++20 Eş Yordamlarını ve Modüllerini destekler. Eş yordam örneklerini görüntülemek için bkz. RPC kitaplığını kullanma ve HTTP kitaplığını kullanma.
NotGeleneksel işlev çağrılarında, bir işlev çağrıldığında tamamlanana kadar yürütülür. Eş yordamlar, işlev yürütmesinin askıya alınmasına ve yeniden başlatılmasına olanak tanıyan bir programlama kavramıdır. Bu esnek kontrol akışı mekanizması, zaman uyumsuz programlamanın ve oluşturucu desenlerinin uygulanmasını basitleştirir.
Geleneksel C++ programlama paradigmasında kod, başlık dosyaları (
.h/.hpp) ve kaynak dosyalar (.cpp) halinde düzenlenir ve bildirimleri içermek için başlık dosyaları kullanılır. Bir başlık dosyasında bildirimler yaparsınız ve bildirimleri gerektiren her kaynak dosyaya başlık dosyasının bir kopyasını eklemek için#includeön işlemci yönergesini kullanırsınız. Bu nedenle, derleyiciler aynı başlık dosyalarını tekrar tekrar ayrıştırabilir ve bu durum derlemeyi yavaşlatır. Kod organizasyonunu ve derleme verimliliğini iyileştirmek için Modüller tanıtılmıştır.
Clang kullanarak C++ programlarını derlerken aşağıdaki tabloda yer alan parametreleri yapılandırabilirsiniz.
Parametre
Açıklama-std=
Derleme için kullanılan C++ dil standardını belirtir.-std=c++20belirtirseniz, C++ Eş Yordamları ve Modülleri etkinleşir.--precompile
Modül birimlerini ikili modül arabirimi (BMI) dosyalarına derler.-fprebuilt-module-path
BMI dosyalarını aramak için yolu belirtir.-fstd-modules
Std modülleri için dosyaların derleneceğini belirtir.-fmodules-export-all
Mevcut modüllerdeki tüm bildirimleriexportolarak işaretler.-fmodules-export-macros
Modüllerin makroları dışa aktarmasını etkinleştirir.-try-load-bmi-when-preprocessing
Ön işleme sırasında BMI dosyalarını arar.-fstd-module-path
Std modüllerini aramak için yolu belirtir.-fcoro-aligned-allocation
C++ Eş Yordamları için hizalanmış ayırmayı tercih eder.Derleme örneği:
-
Hello.cppmdosyasını oluşturun.sudo vim Hello.cppm -
Ekleme moduna girmek için
ituşuna basın ve ardından aşağıdaki içeriği dosyaya kopyalayıp yapıştırın:module; #include <iostream> export module Hello; export void hello() { std::cout << "Hello World!\n"; } Esctuşuna basın,:wqgirin ve dosyayı kaydedip kapatmak içinEntertuşuna basın.-
use.cppdosyasını oluşturun.sudo vim use.cpp -
Ekleme moduna girmek için
ituşuna basın ve ardından aşağıdaki içeriği dosyaya kopyalayıp yapıştırın:import Hello; int main() { hello(); return 0; } Esctuşuna basın,:wqgirin ve dosyayı kaydedip kapatmak içinEntertuşuna basın.-
Modüler C++ kodunu derleyin.
# Precompile the module interface to create the Hello.pcm file. clang++ -std=c++20 Hello.cppm --precompile -o Hello.pcm # Compile the main program and link the module to create the executable Hello.out file. clang++ -std=c++20 use.cpp -fprebuilt-module-path=. Hello.pcm -o Hello.out -
Programı çalıştırın.
./Hello.outAşağıdaki komut çıktısı, programın çalıştırıldığını gösterir.

(İsteğe bağlı) yaLanTingLibs'i kullanma
C++20 Eş Yordamları ve C++ şablon meta programlama özelliği temelinde eş yordam kitaplığı, serileştirme kitaplığı, RPC kitaplığı ve HTTP özelliği sağlayan yaLanTingLibs'i kullanabilirsiniz. Daha fazla bilgi için yalantinglibs ve async_simple adreslerini ziyaret edin.
Serileştirme kitaplığı, verileri serileştirmek ve seri durumdan çıkarmak için kullanılan bir yazılım kitaplığıdır. Serileştirme, bir veri yapısının veya nesne durumunun dosyalarda veya arabelleklerde depolanabilen ya da ağlar üzerinden iletilebilen bir biçime dönüştürülmesi işlemidir. Seri durumdan çıkarma, depolanan veya iletilen veri yapısının veya nesne durumunun orijinallerine geri yüklenmesi işlemidir.
RPC, süreçler arası iletişim (IPC) için kullanılan bir kitaplıktır. RPC, C++ programlarının işlevleri veya yöntemleri yerelmiş gibi uzak bir makinede yürütmesine olanak tanır. RPC; ağ iletimi, serileştirme, seri durumdan çıkarma ve rotalar gibi ayrıntıları soyutlar ve geliştiricilerin uygulamalarının iş mantığına odaklanmasını sağlar.
HTTP, dağıtılmış, iş birliğine dayalı hiperortam bilgi sistemleri için bir uygulama katmanı protokolüdür.
coro_http, C++20 eş yordamları kullanılarak uygulanan, yüksek performanslı ve kullanımı kolay bir HTTP kitaplığıdır. Kullanıcıların HTTP uygulamalarını hızlıca geliştirmesine yardımcı olmak için bir HTTP sunucusu ve bir HTTP istemcisi içerir.
-
yaLanTingLibs'i yükleyin.
sudo yum install -y yalantinglibs-devel -
yaLanTingLibs'in serileştirme kitaplığını, RPC kitaplığını ve HTTP kitaplığını kullanın.
Serileştirme kitaplığını kullanma
-
test.cppdosyasını oluşturun.sudo vim test.cpp -
Ekleme moduna girmek için
ituşuna basın ve ardından aşağıdaki içeriği dosyaya kopyalayıp yapıştırın:#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; } Esctuşuna basın,:wqgirin ve dosyayı kaydedip kapatmak içinEntertuşuna basın.-
Programı derleyin.
clang++ test.cpp -std=c++20 -o test -
Programı çalıştırın.
./testAşağıdaki komut çıktısı, programın çalıştırıldığını gösterir.

RPC kitaplığını kullanma
-
Bir sunucuda
server.cppdosyasını oluşturun.sudo vim server.cpp -
Ekleme moduna girmek için
ituşuna basın ve ardından aşağıdaki içeriği dosyaya kopyalayıp yapıştırın:#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(); } Esctuşuna basın,:wqgirin ve dosyayı kaydedip kapatmak içinEntertuşuna basın.-
client.cppdosyasını oluşturun.sudo vim client.cpp -
Ekleme moduna girmek için
ituşuna basın ve ardından aşağıdaki içeriği dosyaya kopyalayıp yapıştırın:#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; } Esctuşuna basın,:wqgirin ve dosyayı kaydedip kapatmak içinEntertuşuna basın.-
Sunucu tarafı programını derleyin.
clang++ server.cpp -I /usr/include/ylt/thirdparty -std=c++20 -o server -lpthread -
İstemci tarafı programını derleyin.
Notİstemci tarafı programını derlemeden önce, istemcide Alibaba Cloud Compiler'ın yüklü olduğundan ve ortam değişkenlerinin istemciye içe aktarıldığından emin olun. Daha fazla bilgi için bkz. Alibaba Cloud Compiler derlemesi.
clang++ client.cpp -I /usr/include/ylt/thirdparty -std=c++20 -o client -lpthread -
Sunucuyu ve istemciyi başlatmak için sunucuda ve istemcide aşağıdaki komutu çalıştırın:
./server & ./clientAşağıdaki komut çıktısı döndürülür. Günlük girişleri; RPC sunucusunun başlatılması, RPC sunucusunun RPC isteklerini dinlemesi, RPC istemcisinin RPC istekleri göndermesi, RPC sunucusunun RPC isteklerini işlemesi ve RPC istemcisinin bağlantıyı kapatması dahil olmak üzere tüm süreci açıklar.

HTTP kitaplığını kullanma
-
Bir sunucuda
http.cppdosyasını oluşturun.sudo vim http.cpp -
Ekleme moduna girmek için
ituşuna basın ve ardından aşağıdaki içeriği dosyaya kopyalayıp yapıştırın:#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()); } Esctuşuna basın,:wqgirin ve dosyayı kaydedip kapatmak içinEntertuşuna basın.-
HTTP programını derleyin.
clang++ http.cpp -I /usr/include/ylt/thirdparty -std=c++20 -o http -lpthread -
HTTP programını çalıştırın.
./httpAşağıdaki komut çıktısı, programın çalıştırıldığını gösterir.

-
-