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 kehitettävä versio tulee olemaan C++23.[5]

Kehityskohdat muokkaa

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

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]

std::format muokkaa

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);

Concepts muokkaa

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>;
};

Ranges muokkaa

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 muokkaa

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 muokkaa

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

Lähteet muokkaa

  1. a b Current Status isocpp.org. Viitattu 8.5.2017.
  2. a b c d 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. a b c d e f g 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. a b 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. a b 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. a b c d 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. a b 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. a b The New Ranges Library modernescpp.com. Viitattu 25.2.2020. (englanniksi) 
  47. Ranges library en.cppreference.com. Viitattu 25.2.2020. (englanniksi)
  48. a b 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. a b c d e 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