Preskoči na sadržaj

C++ ekosustav jučer/danas/sutra

Vedran Miletić i Marin Jurjević

16. unConference IT zajednice Rijeka

Predavaona prof. dr. sc. Pavle Dragojlovića O-028, Fakultet informatike i digitalnih tehnologija Sveučilišta u Rijeci, 15. prosinca 2022.


Predstavljanje predavača

Vedran Miletić:

Marin Jurjević:

  • Softverski inženjer, GlobalLogic
  • Auto industrija, embedded

Zanimljivi podaci o stanju ekosustava u 2021. godini

  • Velik broj developera ne koristi alate za statičku analizu / oblikovanje koda
  • Stara verzija standarda C++98/03 je i dalje u upotrebi (12% korisnika)
  • Nova verzija standarda C++20 se brzo prihvaća (18%), iako nije potpuno podržana u kompajlerima

Izvor: C++ Ecosystem in 2021 (JetBrains); sirovi podaci


Kronologija razvoja programskih jezika: FORTRAN II

C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION
C INPUT - TAPE READER UNIT 5, INTEGER INPUT
C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
C INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING
      READ INPUT TAPE 5, 501, IA, IB, IC
  501 FORMAT (3I5)
C IA, IB, AND IC MAY NOT BE NEGATIVE OR ZERO
C FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLE
C MUST BE GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOO
      IF (IA) 777, 777, 701
  701 IF (IB) 777, 777, 702
  702 IF (IC) 777, 777, 703
  703 IF (IA+IB-IC) 777, 777, 704
  704 IF (IA+IC-IB) 777, 777, 705
  705 IF (IB+IC-IA) 777, 777, 799
  777 STOP 1
C USING HERON'S FORMULA WE CALCULATE THE
C AREA OF THE TRIANGLE
  799 S = FLOATF (IA + IB + IC) / 2.0
      AREA = SQRTF( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
     +     (S - FLOATF(IC)))
      WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
  601 FORMAT (4H A= ,I5,5H  B= ,I5,5H  C= ,I5,8H  AREA= ,F10.2,
     +        13H SQUARE UNITS)
      STOP
      END

Kronologija razvoja programskih jezika: Fortran 90+

TYPE point
   REAL x, y
END TYPE point
TYPE triangle
   TYPE(point) a, b, c
END TYPE triangle

! keyword capitalization is no longer required
program helloworld
     print *, "Hello, World!"
end program helloworld

Kronologija razvoja programskih jezika: C-asti C++ kakav se podučava na osnovama programiranja

int main(void) {
    enum { RED, GREEN, BLUE };
    const char *nm[] = {
        [RED] = "red",
        [GREEN] = "green",
        [BLUE] = "blue",
    };
}

Kronologija C++ standarda: C++98

Primjer koda koji izvodi zbrajanje dva broja:

int sum(const int &a, const int &b) {
    return a + b;
}

int main() {
    int a = 5;
    int b = 7;

    int c = sum(a, b);
    std::cout << c;
    return 0;
}

Kronologija C++ standarda: C++11/14

Primjer koda koji izvodi zbrajanje dva broja korištenjem lambda funkcije koja vraća i prima auto argumente i rezultat:

// auto sum(auto a, auto b) -> int {
//     return a + b;
// }

int main(){
    // this returns std::function
    auto sum = [](auto a, auto b) -> int {
        return a+b;
    };
    auto a = 5;
    auto b = 7;

    auto c = sum(std::move(a), std::move(b));
    std::cout << c;
    return 0;
}

Memory management i smart pointeri: C++98

Primjer koda s new i delete:

// c++98
class Foo {

public:
    Foo() {
        name = "Foo";
    }

    Foo(const std::string &newName) {
        name = newName;
    }

    void printName() {
        std::cout << name;
    }
private:
    std::string name;
};

int main() {
    Foo *foo = new Foo("IT Zajednica");
    foo->printName();
    delete foo;
    return 0;
}

Memory management i smart pointeri: C++11/14

Primjer koda s unique_ptr:

// c++11/14
class Foo {
public:
    Foo() = default;
    explicit Foo(const std::string &newName) : name(newName){}

    void printName() {
        std::cout << name;
    }

private:
    std::string name;
};

int main() {
    auto foo = std::make_unique<Foo>("IT Zajednica");
    foo->printName();
    return 0;
}

Novosti u C++17 (dio)

  • Standardna biblioteka za rad s datotečnim sustavom
  • std::any, std::variant -- mogućnost korištenja vise tipova unutar iste varijable
  • std::optional -- opcionalna vrijednost koja ne mora biti prisutna
  • std::tuple -- n-torka
  • std::byte -- implementacija koncepta bytea -- objekt koji sadrži definiciju 8 bitovnog polja, slično kao char i unsigned char
  • std::size/std::empty/std::data -- kao ne-članovi

Izvor: C++17 (cppreference.com)


Novosti u C++20 (dio)

  • Moduli
  • std::range -- ekstenzija iteratora koja ih čini moćnijima i manje podložnima greškama
  • Koncepti -- validacija template argumenata tokom vremena kompajliranja
  • Korutine -- Funkcije koje mogu prekinuti izvođenje i biti nastavljene kasnije
  • std::format -- formatiranje rečenica (konačno!)
  • Nema 100%-tnu podršku u program-prevoditeljima; stanje kompajlera za verziju C++20

Izvor: C++20 (cppreference.com)


Novosti u C++23 (dio)

  • std::exception
  • auto(x)
  • std::out_ptr i std::inout_ptr
  • Veća podrska za Atribute
  • Moduli za std

Izvor: C++23 (cppreference.com)


Stanje kompajlera otvorenog koda


Ostali kompajleri

  • MSVC
  • Intel Studio (icc), IBM XL, NVIDIA HPC SDK (ex. PGI)
  • online sučelje za kompajlere: Coliru, Godbolt

Razvojna okruženja

Relevantna:

  • Visual Studio (VS) Code
  • CLion
  • Visual Studio
  • Qt Creator
  • Vim/Emacs

Legacy (za C++):

  • Atom
  • NetBeans
  • Eclipse
  • Code::Blocks

Softveri napisani u C++-u


Industrijska primjena: najveće firme IT industrije

  • Google
  • Meta (ex. Facebook)
  • Amazon
  • Microsoft
  • Apple
  • ...

Industrijska primjena: autoindustrija

  • Rimac
  • Tesla
  • BMW
  • Mercedes
  • Hyundai
  • Kia
  • Citroen
  • ...

Industrijska primjena: ostale

  • Aeronautika
    • NASA
    • SpaceX
  • Pomorska industrija
  • Financije
  • Ugradbeni uređaji
  • Robotika
  • ...

Qt

  • programski okvir za razvijanje platformski nezavisnih programskih rješenja -de facto standard za razvijanje multiplatformskih aplikacija
  • značajke:
    • odraz (eng. reflection) -- introspekcija, pretraživanje i pretraga struktura (objekata); još uvijek nije efikasno implementiran u C++
    • implementacija dizajna promatrača (eng. observer pattern) -- sustav signala (engl. signals) i utora (engl. slots)
    • vlastita implementacija/omotač (eng. wrapper) više manje svih std struktura podataka i algoritama
  • 2 standardna načina razvoja Qt aplikacije:
    • Qt widgets (zastario, iako se još koristi)
    • QML (Qt Modeling Language)

Razvoj tehnologije Qt

Qt History (Qt Wiki)


Primjer sučelja u QML-u

import QtQuick 2.0
import "content" as Content

Rectangle {
    id: root
    width: 640; height: 320
    color: "#646464"

    ListView {
        id: clockview
        anchors.fill: parent
        orientation: ListView.Horizontal
        cacheBuffer: 2000
        snapMode: ListView.SnapOneItem
        highlightRangeMode: ListView.ApplyRange

        delegate: Content.Clock { city: cityName; shift: timeShift }
        model: ListModel {
            ListElement { cityName: "New York"; timeShift: -4 }
            ListElement { cityName: "London"; timeShift: 0 }
            ListElement { cityName: "Oslo"; timeShift: 1 }
            ListElement { cityName: "Mumbai"; timeShift: 5.5 }
            ListElement { cityName: "Tokyo"; timeShift: 9 }
            ListElement { cityName: "Brisbane"; timeShift: 10 }
            ListElement { cityName: "Los Angeles"; timeShift: -8 }
        }
    }

    Image {
        anchors.left: parent.left
        anchors.bottom: parent.bottom
        anchors.margins: 10
        source: "content/arrow.png"
        rotation: -90
        opacity: clockview.atXBeginning ? 0 : 0.5
        Behavior on opacity { NumberAnimation { duration: 500 } }
    }

    Image {
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        anchors.margins: 10
        source: "content/arrow.png"
        rotation: 90
        opacity: clockview.atXEnd ? 0 : 0.5
        Behavior on opacity { NumberAnimation { duration: 500 } }
    }
}

Izvor: Qt Quick Demo - Clocks


Primjena Qt-a u autoindustriji


Primjena Qt-a u pomorstvu


Qt - medicina


Infrastruktura


Budućnost


Hoće li C++ umrijeti?

C++ neće umrijeti jer:

Author: Vedran Miletić, Marin Jurjević