Siirry sisältöön

C++20

Wikipediasta

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

Kehityskohdat

[muokkaa | muokkaa wikitekstiä]

Version kehityskohtia ovat muun muassa:[1][6]

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

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.[27]

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

  • concepts
  • moduulit
  • coroutines

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

Lykättyjä tai hylättyjä ominaisuuksia

[muokkaa | muokkaa wikitekstiä]

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

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

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

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

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.[40] Tavoitteena on semanttisen tarkistuksen lisääminen syntaksitarkistuksen lisänä.[40][41] Ominaisuuden on sanottu olevan puuttuva ominaisuus geneerisen ohjelmoinnin haittapuolien eliminoimiseksi.[42]

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

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

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

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

    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):[47]

    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 on ylemmän tason kielien kuten Simulan ominaisuus, joka toimii vaihtoehtona aliohjelmille (alifunktioille): rutiinit ovat pinottomia.[48][49] Coroutines on tarkoitettu tilanteisiin, jossa eri funktiot vaihtavat suoritusvuoroaan jatkaen aiemmasta tilasta.[48] Coroutines sallii funktion suorittamisen pysäyttämisen ja jatkamisen ja lisää kolme uutta operaattoria:[28]

  • co_await, pysäyttää väliaikaisesti suorituksen palauttamatta arvoa kutsujalle
  • co_yield, pysäyttää väliaikaisesti ja palauttaa arvon kutsujalle
  • co_return, lopettaa suorituksen ja palauttaa arvon.

Uudet operaattorit mahdollistavat asynkronisen suorituksen, generaattorit ja laiskat funktiot.[28]

Esimerkki:[28]

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

Boost-kirjastossa on esimerkkitoteutus C++:lle.[50] Coroutines on hyväksytty mukaan C++20:een.[51][28]

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

  1. muuttujanimi
  2. funktionimi
  3. luokkanimi

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

Epävirallinen tuki toiminnolle on ollut aiemmin Clang-kääntäjässä.[52][53]

Esimerkki:[54]

// 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();
}
  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

[muokkaa | muokkaa wikitekstiä]