C++20: Üç büyük derleyicinin destek modülleri

Adanali

Active member
C++20: Üç büyük derleyicinin destek modülleri


  1. C++20: Üç büyük derleyicinin destek modülleri

Modüller C++20’nin dört büyük yeniliğinden biridir. C++20 derslerimin ana konularından biri bunlar. Ne yazık ki GCC ve Clang’daki uygulama Microsoft derleyicisinin çok gerisindeydi. Bu yüzden derslerimde, konferanslarımda ve kitaplarımda modülleri tanıtmak için çoğunlukla Microsoft derleyicisini kullandım. GCC ve Clang modül desteğinin gelişmesinden mutluyum. Bu nedenle bu makalede üç büyük derleyici GCC, Clang ve MSVC’nin modül uygulamasının mevcut durumunu (10/2023) sunacağım.

Duyuru








Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.







Geçtiğimiz dört yılda C++20 hakkında 100’e yakın makale yazdım ama henüz işim bitmedi. Bir sonraki yazımda C++20 ile ilgili hikayeme devam edeceğim.








C++20’deki modüllere aşina değilseniz, işte basit bir örnek:

Basit bir form


Bu form math.


// math1.ixx

module; // (1)

#include <numeric>
#include <vector>

export module math; // (2)

export int add(int fir, int sec){
return fir + sec;
}

export int getProduct(const std::vector<int>& vec) {
return std::accumulate(vec.begin(), vec.end(), 1, std::multiplies<int>());
}


Global form parçası anahtar kelimeyle başlar module (1) ve ihracat formu beyanı (3) ile biter. Global modül parçası, önişlemci talimatlarının bulunduğu yerdir #include Formun doldurulabilmesi için kullanılır. Genel modül parçası içinde kullanılan ön işlemci varlıkları yalnızca modül içinde görülebilir. Modül math iki işlevi dışa aktar add VE getProduct.

İstemci formu içe aktarır math (1) ve işlevlerini kullanın:


// client1.cpp

#include <iostream>
#include <vector>

import math; // (1)

int main() {

std::cout << 'n';

std::cout << "add(2000, 20): " << add(2000, 20) << 'n';

std::vector<int> myVec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

std::cout << "getProduct(myVec): " << getProduct(myVec) << 'n';

std::cout << 'n';

}


Bu programın çıktısıdır:








Modüller hakkında daha fazla bilgiyi aşağıdaki makalelerde bulabilirsiniz:

  1. Modüllerin avantajları
  2. Basit bir matematik modülü
  3. Modül arayüz ünitesi ve modül uygulama ünitesi
  4. Yapılandırma modülleri
  5. Modüller hakkında diğer açık sorular
  6. Özel form ve başlık ünitesinin parçası
Basit bir modülle başladım ve GCC, Clang ve MSVC’nin modül uygulama durumunu sunduğumda bunu daha da basitleştireceğim.






C++20 ile tanıtılan kavramlar, Ranges kitaplığı, modüller ve eşyordamlar ile birlikte modern C++ uygulamaları oluşturmanın yolunu yeniden tanımladı. 7 – 9 Kasım 2023 tarihleri arasında Rainer Grimm, C++20 ile ilgili yoğun çalıştayında sizi bilgilendirecek: yeni kavramlar kapsamlı bir şekilde açıklanacak ve C++20 tarafından sunulan çok sayıda faydalı fonksiyona değinecek.







Üç Büyük’ten modül desteği


math.ixx modülü tanımlar mathAşağıdaki karşılaştırmada bunu kullanacağım.


// math.ixx

export module math; // (1)

export int add(int fir, int sec){
return fir + sec;
}



Burada da müşteri programı var client.cppmodül hangisi math ithal.


// client.cpp

import math; // (2)

int main() {

add(2000, 20);

}


(1) dışa aktarma modülü bildirimidir ve (2) modülü içe aktarır. Belli nedenlerden dolayı program çıktısını göz ardı edeceğim.

Çünkü modül bildirim dosyasına sahibim math.ixx Bahsedilen ilk başta rahatsız edici olabilir.

Modül bildirim dosyası

  • Microsoft derleyicisi son eki kullanır ixx. sonek ixx modül arayüz dosyası anlamına gelir.
  • Clang derleyicisi son eki kullanır cppm. THE m son ek muhtemelen modül anlamına gelir.
  • GCC derleyicisi herhangi bir özel uzantı kullanmaz.
Bunlar yalnızca değiştirilebilecek geleneklerdir. Şimdi formu oluşturacağım math derleyin ve kullanın.

Formu doldurma ve kullanma


Öncelikle x64 için Microsoft’un cl.exe 19.29.30133 derleyicisiyle başlayacağım.








Bunlar, formu Microsoft derleyicisiyle derleme ve kullanma adımlarıdır. Sadece minimum komut satırını gösteriyorum. Söz verdiğim gibi, bir sonraki makalede bunun hakkında daha fazla bilgi yazacağım. Bayrak yerine daha eski bir Microsoft derleyicisiyle /std:c++20 bayrak /std:c++latest Kullanılacak.


cl.exe /std:c++20 /c math.ixx
cl.exe /std:c++20 client.cpp math.obj


  • Satır 1 bir nesne dosyası oluşturur math.obj ve bir IFC dosyası math.ifc. IFC dosyası modüldür ve modül arayüzünün meta veri açıklamasını içerir. IFC dosyasının ikili formatı, Gabriel Dos Reis ve Bjarne Stroustrup’un dahili program temsil formatını takip eder.
  • Satır 2 yürütülebilir dosyayı oluşturur client.exe. Derleyici örtük olarak derlenmiş olanı bulur math.ifc İlk geçişteki dosyalar.







Clang derleyicisi ile devam edelim.








Clang 16.0.5 derleyicisini kullanıyorum.

Clang derleyicisi uzantıya sahip bir modül bekliyor cppm. Bu nedenle dosyayı kullanacağım math.ixx İçinde math.cppm yeniden isimlendirmek. Dosya client.cpp Ancak değişiklik yapılmadan kullanılmaya devam edilebilir. Son olarak formu oluşturmak ve kullanmak için gerekli adımlar şunlardır:


clang++ -std=c++20 -c math.cppm --precompile -o math.pcm
clang++ -std=c++20 client.cpp -fprebuilt-module-path=. math.pcm -o client.exe


  • 1. satır formu oluşturur math.pcm. Bitiş pcm’si önceden derlenmiş modül anlamına gelir ve şuna karşılık gelir: ifc-Microsoft Görsel Derleyici Dosya Uzantısı. Ayrıca oluşturulan modül zaten modül tanımını içermektedir. Sonuç olarak Clang derleyicisi bir nesne dosyası üretmez math.o. Seçenek --precompile önceden doldurulmuş formu oluşturmanız gerekir.
  • Satır 2 yürütülebilir dosyayı oluşturur client.exemodül hangisi math.pcm kullanılmış. Clang derleyicisinin modül yoluna ihtiyacı var: -fprebuilt-module-path. Bu bilinmiyorsa bağlama işlemi başarısız olur:







Son olarak GCC derleyicisini kullanıyorum.








Artık GCC 11.1.0 derleyicisi kullanılıyor.

GCC derleyicisi son eki beklemiyor ixx Windows’tan hala son ek cppm Clang’dan. Bu yüzden dosyaya isim veriyorum math.ixx bir cpp dosyasında: math.cxx. Dosya client.cpp Microsoft derleyicisi ve Clang ile kullandıklarımın aynısı.


g++ -c -std=c++20 -fmodules-ts math.cxx
g++ -std=c++20 -fmodules-ts client.cpp math.o -o client


  • 1. satır formu oluşturur math.gcm ve nesne dosyası math.o. Bunun için bayrağa ihtiyacım var -fmodules-ts belirtmek. Genişleme -fmodules-ts Bu beni sinirlendiriyor çünkü ts genellikle teknik spesifikasyon anlamına gelir. Modül math.gcm alt dizindedir gcm.cache. math.gcm derlenmiş formun arayüzüdür. sonek gcm muhtemelen GCC derlenmiş formu anlamına gelir.
  • Satır 2, istemcinin çalıştırılabilir dosyasını oluşturur. Formu dolaylı olarak kullanın math.gcm.
Sıradaki ne?


Bu yazımda size Üç Büyük ile form oluşturmanın ilk adımlarını gösterdim. Bir sonraki yazımda Büyük Üç için modül desteğine değineceğim.


(kendim)



Haberin Sonu
 
Üst