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] Edellinen standardiversio on ISO/IEC 14882:2017 C++17. Seuraava kehitettävä versio tulee olemaan C++23.[4]

KehityskohdatMuokkaa

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

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

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

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ä ominaisuuksiaMuokkaa

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

std::formatMuokkaa

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

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

ConceptsMuokkaa

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

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

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

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

RangesMuokkaa

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

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

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

    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

CoroutinesMuokkaa

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

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

Esimerkki:[27]

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

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

ModuulitMuokkaa

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

  1. muuttujanimi
  2. funktionimi
  3. luokkanimi

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

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

Esimerkki:[53]

// 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ähteetMuokkaa

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

Aiheesta muuallaMuokkaa