C++20

C++20 on C++-ohjelmointikielen ISO-standardiversio ISO/IEC 14882:2020, jonka kehitys alkoi C++17-standardin valmistumisen jälkeen. Standardiversio äänestettiin valmiiksi 15. helmikuuta 2020 ja hyväksytyksi ISO:n äänestyksessä syyskuussa. Standardiversio on julkaistu joulukuussa 2020. Edellinen standardiversio on ISO/IEC 14882:2017 C++17. Seuraava versio on C++23.

Kehityskohdat

Version kehityskohtia ovat muun muassa:

Haskell-kielen tyyppinen konsepti-ominaisuus, ranges-kirjasto sekä std::future odotetaan olevan myös kehityskohteina.

Bjarne Stroustrup julkaisi työryhmälle paperin nimellä Remember the Vasa! viitaten Vasa-laivaan, jossa hän muistutti perusasioiden tärkeydestä ominaisuuksien määrän sijaan.

Stroustrup on sanonut C++20-standardista sen olevan ”kolmas merkittävä standardi” (kuudesta standardista), jossa merkittävä tarkoittaa sen ”muuttavan ihmisten ajattelutapaa”. Merkittäviksi kohdiksi mainitaan:

Moduulien käyttö voi mahdollistaa esikääntäjästä luopumisen.

Lykättyjä tai hylättyjä ominaisuuksia

Standardia on kuitenkin myös kritisoitu päätöksistä säilyttää yhteensopivuus ja haluttomuudesta rikkoa ABI-yhteensopivuus. ABI:n muutoksilla pyrittäisiin saavuttamaan parempaa suorituskykyä.

std::format

Standardikirjaston lisäys std::format on uusi vaihtoehto merkkijonojen muotoiluun, jonka tavoitteena on tarjota sama joustavuus kuin printf-sarjan funktioilla. Esimerkki:

string message = format("The answer is {}.", 42);

Concepts

ISO:n tekninen määrittely: ISO/IEC TS 19217:2015 GCC-kääntäjän versiossa 6 on tukea ominaisuudelle. Standardimallikirjasto sisältää ominaisuutta tukevia määrittelyitä.

Concepts on laajennus template-malleihin, jotka voivat toimia rajoitteina sallituille argumenteille tai parametreille. Constraint-rajoitteella voidaan valita ylikuormitukset ja erikoistumiset. Concepts toimii nimettynä joukkona rajoitteita, jotka arvioidaan käännösaikana. Tavoitteena on semanttisen tarkistuksen lisääminen syntaksitarkistuksen lisänä. Ominaisuuden on sanottu olevan puuttuva ominaisuus geneerisen ohjelmoinnin haittapuolien eliminoimiseksi.

Kielen nimettyjä vaatimuksia voidaan esittää Concepts-kirjaston avulla. Esimerkiksi std::hash-tuen vaatimuskonsepti Hashable voidaan ilmaista:

template<typename T>
concept Hashable = requires(T a) {
    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};

Ranges

Eric Nieblerin esimerkkitoteutus on julkaistu osana ehdotusta ominaisuuden lisäämiseksi C++ standardiin ja on myöhemmin hyväksytty standardiin std::ranges-kirjastoksi. Kirjasto rakentuu Concepts-kirjaston ominaisuuksille. Toteutus on koottava abstraktiokerros iteraattoreiden päällä.

Kirjasto tukee Haskell-kielen tapaan laiskaa arviointia, jossa ääretöntä määrää tukevasta toiminnosta suoritetaan vain tarvittava osa. Esimerkiksi kokonaislukujoukosta [1, ..] voidaan valita viisi numeroa ja tulostaa ne seuraavasti:

    auto num = view::take(view::ints(1), 5);
    ranges::for_each(num, [](int i){ std::cout << i << " "; });

Esimerkki (std::views on lyhenne std::ranges::views nimiavaruudelle):

    std::vector<int> ints{0,1,2,3,4,5};
    auto even = [](int i){ return 0 == i % 2; };
    auto square = [](int i) { return i * i; };

    for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
        std::cout << i << ' ';
    }

.. joka tulostaa annettujen arvojen joukosta (0..5) parillisten numeroiden (0, 2, 4) neliöt seuraavasti:

0 4 16

Coroutines

Coroutines on ylemmän tason kielien kuten Simulan ominaisuus, joka toimii vaihtoehtona aliohjelmille (alifunktioille): rutiinit ovat pinottomia. Coroutines on tarkoitettu tilanteisiin, jossa eri funktiot vaihtavat suoritusvuoroaan jatkaen aiemmasta tilasta. Coroutines sallii funktion suorittamisen pysäyttämisen ja jatkamisen ja lisää kolme uutta operaattoria:

Uudet operaattorit mahdollistavat asynkronisen suorituksen, generaattorit ja laiskat funktiot.

Esimerkki:

generator<int> iota(int n = 0) {
  while(true)
    co_yield n++;
}

Boost-kirjastossa on esimerkkitoteutus C++:lle. Coroutines on hyväksytty mukaan C++20:een.

Moduulit

Moduulit (modules) on vaihtoehtoinen tapa otsikkotiedostoille, joka muun muassa mahdollistaa makrojen eriyttämisen. Aiemmin ohjelmoijille on ollut mahdollista käyttää kolmea nimettyä kapselointia:

  1. muuttujanimi
  2. funktionimi
  3. luokkanimi

Moduulit lisäävät neljännen nimetyn kapseloinnin, joka sisältää kaikki kolme aikaisempaa yhdessä. Moduulit on hyväksytty mukaan C++20:een.

Epävirallinen tuki toiminnolle on ollut aiemmin Clang-kääntäjässä.

Esimerkki:

// moduulissa:
// helloworld.cpp
export module helloworld;  // module declaration
import <iostream>;         // import declaration

export void hello() {      // export declaration
    std::cout << "Hello world!\n";
}

// moduulin käyttö:
// main.cpp
import helloworld;  // import declaration

int main() {
    hello();
}

Lähteet

  1. 1 2 Current Status isocpp.org. Viitattu 8.5.2017.
  2. 1 2 3 4 Bjarne Stroustrup on C++20's significance isocpp.org. 21.2.2020. Viitattu 25.2.2020. (englanniksi)
  3. ↑ Tim Anderson: Classy move: C++ 20 wins final approval in ISO technical ballot, formal publication expected by end of year theregister.com. 7.9.2020. Viitattu 7.9.2020. (englanniksi)
  4. ↑ ISO/IEC 14882:2020 Programming languages — C++ iso.org. joulukuu 2020. Viitattu 28.1.2023. (englanniksi)
  5. ↑ To boldly suggest an overall plan for C++23 open-std.org. 25.11.2019. Viitattu 11.3.2020. (englanniksi)
  6. ↑ Changes between C++17 and C++20 DIS open-std.org. Viitattu 24.3.2020. (englanniksi)
  7. ↑ Working Draft, Extensions to C++ for Modules open-std.org. Viitattu 8.5.2017.
  8. ↑ Extensions for parallelism en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  9. ↑ Extensions for parallelism, version 2 en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  10. ↑ Extensions for concurrency en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  11. ↑ P1135R6 The C++20 Synchronization Library open-std.org. 19.7.2019. Viitattu 25.2.2020. (englanniksi) 
  12. ↑ C++ Latches and Barriers open-std.org. Viitattu 17.5.2017.
  13. ↑ Revised Latches and Barriers for C++20 (PDF) open-std.org. Viitattu 25.2.2020. (englanniksi)
  14. ↑ Concepts Are Ready open-std.org. Viitattu 8.5.2017.
  15. ↑ Programming Languages — C++ Extensions for Concepts open-std.org. Viitattu 17.5.2017.
  16. ↑ Working Draft, C++ Extensions for Ranges open-std.org. Viitattu 8.5.2017.
  17. ↑ Working Draft, Technical Specification for C++ Extensions for Coroutines open-std.org. Viitattu 8.5.2017.
  18. ↑ Wording for lambdas in unevaluated contexts (PDF) open-std.org. Viitattu 21.1.2018.
  19. ↑ Thomas Köppe: Allow lambda capture [=, this] open-std.org. 4.3.2017. Viitattu 25.2.2020. (englanniksi) 
  20. ↑ Consistent comparison (PDF) open-std.org. Viitattu 21.1.2018.
  21. ↑ P1152R4 Deprecating volatile open-std.org. Viitattu 25.2.2020. (englanniksi) 
  22. ↑ std::span en.cppreference.com. (englanniksi)
  23. ↑ Feature testing en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  24. ↑ P0553R4: Bit operations open-std.org. Viitattu 25.2.2020. (englanniksi)
  25. ↑ Standard library header <bit> en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  26. ↑ Functional in C++17 and C++20 modernescpp.com. Viitattu 8.5.2017.
  27. ↑ Bjarne Stroustrup: Remember the Vasa! (PDF) open-std.org. 6.3.2018. Viitattu 27.7.2018.
  28. 1 2 3 4 5 6 7 C++20 Feature List Now Frozen: Modules, Coroutines, and Concepts are in; Contracts out infoq.com. (englanniksi) 
  29. ↑ Support for contract based programming in C++ open-std.org. Viitattu 25.2.2020. (englanniksi) 
  30. ↑ Working Draft, C++ Extensions for Networking open-std.org. Viitattu 8.5.2017. (englanniksi)
  31. 1 2 Experimental C++ Features en.cppreference.com. Viitattu 25.2.2020. (englanniksi) 
  32. ↑ Static reflection open-std.org. Viitattu 25.2.2020. (englanniksi)
  33. ↑ Transactional Language Constructs for C++ open-std.org. Viitattu 8.5.2017.
  34. ↑ Transactional memory en.cppreference.com. Viitattu 25.2.2020. (englanniksi) 
  35. 1 2 The Day The Standard Library Died cor3ntin.github.io. 24.2.2020. Viitattu 25.2.2020. (englanniksi) 
  36. ↑ Titus Winters: ABI - Now or Never (PDF) open-std.org. 9.1.2020. Viitattu 25.2.2020. (englanniksi) 
  37. ↑ ISO/IEC TS 19217:2015 International Organization for Standardization.
  38. ↑ GCC 6 Release Series Changes, New Features, and Fixes gcc.gnu.org. Viitattu 17.5.2017.
  39. ↑ Concepts library en.cppreference.com. Viitattu 25.2.2020. (englanniksi) 
  40. 1 2 3 4 Constraints and concepts en.cppreference.com. Viitattu 25.2.2020. (englanniksi) 
  41. ↑ C++20: Concepts, the Details modernescpp.com. Viitattu 25.2.2020. (englanniksi) 
  42. ↑ The C++20 Concepts is the missing feature to eliminate the generics paradigm drawbacks. cppdepend.com. Viitattu 25.2.2020. (englanniksi) 
  43. ↑ Named requirements en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  44. 1 2 Range-v3 ericniebler.github.io. Viitattu 25.2.2020. (englanniksi)
  45. ↑ The One Ranges Proposal (PDF) open-std.org. Viitattu 25.2.2020. (englanniksi)
  46. 1 2 The New Ranges Library modernescpp.com. Viitattu 25.2.2020. (englanniksi) 
  47. ↑ Ranges library en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  48. 1 2 Chisnall, David: Influential Programming Languages, Part 2: Simula informit.com. Viitattu 17.5.2017.
  49. ↑ Coroutines en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  50. ↑ Chapter 1. Coroutine boost.org. Viitattu 17.5.2017.
  51. 1 2 3 4 5 Herb Sutter: Trip report: Winter ISO C++ standards meeting (Kona) herbsutter.com. 23.2.2019. Viitattu 3.7.2019. (englanniksi)
  52. ↑ Clang 5 documentation clang.llvm.org. Viitattu 8.5.2017.
  53. ↑ Larabel, Michael: Facebook Has Been Working On C++ Modules Support For GCC Phoronix. Viitattu 9.10.2017.
  54. ↑ Modules en.cppreference.com. Viitattu 25.2.2020. (englanniksi)

Aiheesta muualla