NPRG051 Pokročilé programování v C++

Slides:



Advertisements
Podobné prezentace
Funkce Připomeňme si program pro výpočet faktoriálu:
Advertisements

Pole, ukazatele a odkazy
David Bednárek Filip Zavoral.  Vývoj ◦ první verze C, společný vývoj s UNIXem, jádro v C ◦ 1978Kerninghan, Ritchie: The C Programming Language.
Podpora vláken a jejich synchronizace v jazyce C# Jan Kučera Jan Mittner Petr Effenberger 4IT353 Klient/server aplikace v Javě.
OSNOVA: a)Programování se soubory b)Záloha databáze v souboru c) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování.
12/04/20151 Kolekce (1) Kolekce (collection) představují standardní datové struktury (seskupení) prvků (objektů) Jsou definovány ve jmenném prostoru System.Collections.
Pokročilé programování v C++ (část B)
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Kam se ubírá jazyk C#? Dr. Ing. Dalibor Kačmář Academic Developer Evangelist Developer & Platform Evangelist Group Microsoft Czech & Slovakia Anders Hejlsberg.
FUN WITH C# EPISODE XIII INTERFACES STRIKE BACK CLI Type System All types Reference types (allocated on managed heap) PointersValue types (allocated.
2.1 Pevný disk Fyzická struktura  plotny  záznamový materiál  č/z hlavičky  prachotěsný obal  motorky otáčení ploten  plotny na jedné hřídely.
BEZPEČNOSTNÍ TECHNOLOGIE I Operační program Vzdělávání pro konkurenceschopnost Projekt: Vzdělávání pro bezpečnostní systém státu (reg. č.: CZ.1.01/2.2.00/ )
Tým 32, varianta b/4/I.  Jakub Kadlubiec  Roman Pijáček  Petr Pliska  Jan Štourač  Václav Tunka (vedoucí)
Překladače 2. Vnitřní struktura překladače © Milan Keršlágerhttp:// Obsah: ● činnost.
Programování v jazyce C++ Dědičnost a polymorfismus.
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
Řetězce v jazyce C ● řetězec je posloupnost znaků ● řetězcové konstanty se v C vkládají mezi uvozovky, např. "Ahoj Hugo!" ● v paměti je řetězec uložen.
.NET framework platforma Jiří Pokorný
Přetěžování metod (1) Přetěžování metod – overloading:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Jazyk C# a platforma .NET ZS 2016/2017
Vytvořil: Robert Döring
COM – Práce s objektovým modelem jiné aplikace
Y36PJC Programování v jazyce C/C++
Obrázky Ram Rom Nástupci ROM Počítačová pamět Obrázky Paměti Ram rom
Přetěžování Datové typy.
Kurz algoritmizace a programování v jazyce C
State 1.
Programování v jazyce C++
Programování v jazyce C++
Struktury.
Rysy MS Windows Možnost multitaskingu a multithreadingu
Ruby on Rails framework vývoj aplikací pro WWW
Operační systémy 13. Knihovny, spustitelné soubory
Configuration Patterns
Programovací jazyky Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Jitka Vlčková. Dostupné z Metodického portálu ISSN.
Abstract Factory.
Lexikální atomy jazyka C
C# Vícevláknové aplikace
Překladače 6. Sémantická analýza
Výukový materiál zpracován v rámci projektu
Bridge.
Cvičení 4 Dědičnost objektů.
RUBY.
Operační systémy 13. Knihovny, spustitelné soubory
Reflexe jako introspekce
BIBS Informatika pro ekonomy přednáška 2
Programování v C++ domácí úkol 2.
MU002 Informatika II Základy algoritmizace 1/13
NPRG041 Programování v C++ Programování v C
NPRG051 Pokročilé programování v C++
Úvod do SQL Server Integration Services
Portál PUBLIKACE jako nástroj evidence výsledků vědeckovýzkumných aktivit Situace ke konci roku 2016 Cíl na rok 2017 – z nástroje dílčích sběrů vytvořit.
Remote login.
Platforma pro personalizaci standardizovaných výukových materiálů
Přednášky z Distribuovaných systémů
Fronta (1) Dynamická datová struktura typu FIFO (First In First Out)
C# přehled vlastností.
Vázání dat Data Binding
Funkce v jazyce C = „množina“ operací, která provádí nějakou činnost s různými vstupy odstranění vícenásobného psaní či vkládání téhož kódu a lepší přehlednost.
Algoritmizace a datové struktury (14ASD)
Jazyk C# a platforma .NET ZS 2018/2019
Výčtové typy ( Java 5 ) Výčtové typy jsou speciální třídy zavedené pro větší bezpečí a pohodlí. V nejjednodušší variantě se definují příkladmo takto:
Opakování ze 4. cvičení int a; printf("Zadej číslo: ");
Advanced .NET Programming I 1st Lecture
MU002 Informatika II Základy algoritmizace 1/13
Adapter
Bridge.
Union neboli sjednocení Bitová pole
Digitální učební materiál
Transkript prezentace:

NPRG051 Pokročilé programování v C++ David Bednárek Jakub Yaghob Filip Zavoral http://data.ksi.ms.mff.cuni.cz/svn/NPRG051pub/html/nprg051.html

Interoperabilita

Interoperabilita C++ a vlastní C moduly C++ a cizí C knihovny obj, lib, dll/so jak linkovat C a C++ moduly jak dělat společné C/C++ headery C++ a cizí C knihovny jak z C++ volat C knihovny callback z C knihoven do C++ mandlování, volací konvence dynamicky linkované knihovny C++ a .Net/C#/cokoliv# jak spojovat moduly jak volat metody jak sdílet data

kompilace jednoho modulu Překlad více modulů vlastní headery knihovní headery knihovny .h .h .obj .obj .obj .obj .obj .lib .cpp CC .obj Link .exe kompilace jednoho modulu .obj .obj .c .obj .c .cpp další moduly

Vytvoření vlastní knihovny vlastní headery knihovní headery .h .h .cpp CC .obj Lib .lib kompilace jednoho modulu .obj .obj .c .obj .c .cpp další moduly

C++ exe / C lib zdrojový text / překladač C lib.c CC .obj Lib .lib lib.h exe.cpp CPPC .obj Link .exe zdrojový text / překladač C++

C++ exe / C lib error LNK2019: unresolved external symbol lib.c CC .obj Lib .lib lib.h exe.cpp CPPC .obj Link .exe error LNK2019: unresolved external symbol "int __cdecl lib_fnc(int)" (?lib_fnc@@YAHH@Z) referenced in function _main what the ... ... hell???

Mandlování mangling syntaktická a sémantická informace o symbolu int a; int a( void); int a( int, int); class a {}; class a { int a; }; class a { int a( int); }; mangling mandlování, znetvoření name-decoration syntaktická a sémantická informace o symbolu overloading / přetěžování ➠ nejednoznačnost zjednoznačnění identifikátoru proměnná / funkce / operator / metoda typy a typové konstrukce parametrů a návratové hodnoty třída, další atributy (const, volatile, ...) volací konvence formát jednotně nedefinovaný závislý na platformě, překladači, ... obecně nepřenositelné

různé překladače různé jazyky C++ exe / C lib /* pureclib.h */ #ifndef PURECLIB__H_ #define PURECLIB__H_ extern int lib_x; int lib_fnc( int x); #endif /* pureclib.c */ #include "pureclib.h" int lib_x; int lib_fnc( int x) { return x + lib_x; } // cppexe.cpp #include "pureclib.h" int main(....) { int i = lib_fnc( 1); } CC různé překladače různé jazyky různé konvence CPPC _lib_fnc ?lib_fnc@@YAHH@Z

extern "C" symboly C CC CPPC _lib_fnc _lib_fnc /* pureclib.h */ #ifndef PURECLIB__H_ #define PURECLIB__H_ extern "C" { extern int lib_x; int lib_fnc( int x); } #endif // cppexe.cpp #include "pureclib.h" int main(....) { int i = lib_fnc( 1); } CC CPPC _lib_fnc _lib_fnc

extern "C" symboly C CC CPPC _lib_fnc _lib_fnc /* pureclib.h */ #ifndef PURECLIB__H_ #define PURECLIB__H_ extern "C" { extern int lib_x; int lib_fnc( int x); } #endif /* pureclib.c */ #include "pureclib.h" int lib_x; int lib_fnc( int x) { return x + lib_x; } // cppexe.cpp #include "pureclib.h" int main(....) { int i = lib_fnc( 1); } CC CPPC _lib_fnc _lib_fnc

Společné hlavičkové soubory symboly C /* pureclib.h */ #ifndef PURECLIB__H_ #define PURECLIB__H_ #ifdef __cplusplus extern "C" { #endif extern int lib_x; int lib_fnc( int x); } /* pureclib.c */ #include "pureclib.h" int lib_x; int lib_fnc( int x) { return x + lib_x; } // cppexe.cpp #include "pureclib.h" int main(....) { int i = lib_fnc( 1); } CC CPPC _lib_fnc CPPC - definované CC - nedefinované _lib_fnc

Volací konvence způsob implementace volání funkcí registry vs. zásobník zachovávání registrů pořadí předávání parametrů návratová hodnota příprava a úklid zásobníku nutná shoda volající a volané funkce deklarace funkce konkrétní konvence není součástí normy - rozšíření __cdecl - default for C and C++, varargs __stdcall - Win32 API functions __fastcall - arguments in registers, faster __thiscall - this __clrcall - C++/CLI, .Net, managed code f( 1, 2); mov eax, 1 mov ebx, 2 call ?f@@X mov eax, [ebp+08] mov ebx, [ebp+04] ...

callback knihovní kód volá klientskou funkci C++ callback callback knihovní kód volá klientskou funkci /* pureclib.h */ #ifdef __cplusplus extern "C" { #endif int lib_cb( int x, int (*cb_fnc)( int)); } // cppexe.cpp #include "pureclib.h" cpp_fnc( int x) { return x+1; } int main() { lib_cb( i, cpp_fnc); /* pureclib.c */ #include "pureclib.h" int lib_cb( int x, int (*cb_fnc)( int)) { return cb_fnc( x); } x = ♀♦☺∰Җא x = ♀♦☺∰Җא mov eax, ... call [edx] mov eax, [ebp+08] add eax, 1

C++ callback extern "C" určuje i volací konvenci /* pureclib.h */ #ifdef __cplusplus extern "C" { #endif int lib_cb( int x, int (*cb_fnc)( int)); } extern "C" určuje i volací konvenci // cppexe.cpp #include "pureclib.h" extern "C" int cpp_fnc( int x) { return x+1; } int main() { lib_cb( i, cpp_fnc); /* pureclib.c */ #include "pureclib.h" int lib_cb( int x, int (*cb_fnc)( int)) { return cb_fnc( x); } mov eax, ... call [edx] mov eax, [ebp+08] add eax, 1 CC očekává C funkci CC očekává funkci s volací konvencí C

Dynamicky linkované knihovny použití funkcí dodaných až za běhu není součástí normy použití na různých platformách ideově podobné ale nepřenositelné pomocí preprocesoru lze multiplatformní rozhraní Windows .dll chová se jako .exe vlastní zásobník, heap, standardní knihovny Linux / Unix / POSIX .so chová se jako .lib balíček .o more details: http://www.symantec.com/connect/articles/ dynamic-linking-linux-and-windows-part-one ...-part-two

dll - Windows, POSIX load dll explicit runtime linking // moje.cpp extern "C" __declspec(dllexport) int add( int a, int b) { return a + b; } BOOL APIENTRY DllMain(....) { return TRUE; // exe_explicit.cpp HINSTANCE dll = LoadLibrary( TEXT("moje.dll")); if( dll == NULL) return 1; typedef int dll_fnc(int, int); dll_fnc* add = (dll_fnc*) GetProcAddress( dll, "add"); if( add == NULL) { FreeLibrary( dll); } int result = add(1, 2); explicit runtime linking // exe_import.cpp extern "C" __declspec(dllimport) int add(int a, int b); int result = add(1, 2); "statické" slinkování s moje.lib jen proxy, kód v .dll void *dll = dlopen("moje.dll", RTLD_NOW); typedef void dll_fnc(int,int); dll_fnc* add = (dll_fnc*)dlsym(dll, "add"); add(…); dlclose(dll); POSIX

C++/CLI

C++/CLI Samostatný jazyk standardizovaný ECMA managed code snaha o maximální kompatibilitu s C++ managed code spravovaný .Net frameworkem přístup k CLI (.Net) knihovnám snadná interoperabilita C#, F#, VisualBasic, ... COBOL, Eiffel, Mercury ... CLI Common Language Infrastructure standard ECMA - virtual machine - framework (libraries) CLR Common Language Runtime implementace VM CIL Common Intermediate Language jazyk interpretovaný VM MSIL MSIL :-) konkrétní MS implementace CIL CTS Common Type System jednotný typový systém CLI .Net Framework MS implementace nadmnožiny CLI Mono multiplatformní implementace CLI http://www.mono-project.com Mono - Android

Operating System Services Architektura CLI Source code VB C# C++ Unmanaged Component Compiler Compiler Compiler Assembly IL Code Managed code Common Language Runtime JIT Compiler Native Code Operating System Services

User-Defined Value Types (structs) Common Type System Type Value Types Reference Types Built-In Value Types Self Describing Types Pointer Types Interface Types Enumerations User-Defined Value Types (structs) Class Types Arrays User-Defined Classes Boxed Value Types Delegates

Typový systém C++/CLI Ve skutečnosti dva nezávislé typové systémy native original ISO C++ managed fuj - manažovaný - řízený CTS string vs. String, vector vs. array Garbage collection pouze CTS managed heap handle není to ukazatel může se měnit nové operátory: gcnew ^ % reference vs. value type native heap class Native {...}; ref class Managed {...}; { Native* n = new N; Managed^ m = gcnew Managed; delete n; } handle managed heap

Referenční a hodnotové typy data primitivní typy, malé kolekce složitější struktury umístění přímo v paměti (zásobník) vždy na [managed] heapu přístup přímo přes [tracking] handle přiřazení, parametry hodnotou odkazem dědičnost ne jednoduchá (více interfaces) copy constr ano default sémantika stack heap s.: boxing heap stack s.: autoalokace stopovací držadlo :-) value struct B { int x; }; int main() { B b; b.x = 0; } ref class A { int f(); }; int main() { A^ a = gcnew A; a->f(); }

Agregované typy nesmí obsahovat nemanaged struktury ref class, ref struct nesmí obsahovat nemanaged struktury jednoduchá dědičnost, vícenásobná dědičnost interface value class, value struct nepodporují dědičnost ! enum class rozšíření enumu o několik metod - ToString value type interface class abstract class bez dat možnost vícenásobné dědičnosti array typované vícerozměrné pole - jagged array kovariance - pokud existuje konverze z A na B array<A> aa; array<B> bb; bb = aa; generic

Další vlastnosti property (get, set), indexed/static property delegáty a eventy String ≠ std::string (!!!) templates vs. generics compile- vs. run- time CLI kolekce ArrayList BitArray DictionaryBase Hashtable SortedList Stack Dictionary HashSet LinkedList List Queue SortedDictionary SortedList SortedSet Stack SynchronizedCollection atributy, reflexe, I/O, ..., ... String^ ms; string s = (char*) Runtime::InteropServices::Marshal:: StringToHGlobalAnsi(ms).ToPointer(); vypadá to stejně, ale dělá to úplně něco jiného, i když se to chová skoro stejně :-)

Interoperabilita C++/CLI  C++ C++/CLI  C#, *# ... jak spojovat moduly a volat metody  jen native C++ data jak sdílet managed a native data  nedělejte to - striktní rozhraní když už - speciální šablony nedělejte to C++/CLI  C#, *# ... jak spojovat moduly  class library / add reference (.dll) jak volat metody  class library jak sdílet data  CTS  ne native C++

Zhodnocení  Use cases  Klady  Zápory interoperabilita - .Net, C#, CTS téměř plná kompatibilita s C++03 managed code  Zápory dva jazyky v jednom odlišné typové systémy podivná syntaxe a hlavně sémantika mnoho divných variant definovaných výčtem ne zcela kompatibilní s C++11/14  Use cases velký C++ projekt, .Net služby (WPF) úzké rozhraní interoperabilita s C#, VB, F#, *# ? first-choice language ? zároveň požadavek na výkonnost a těsná integrace s GUI

C++/CLI a C# clilib.dll Project: C++ CLR Class Library namespace clilib { public ref class A { public: A() : x_(0) {} int f() {...}; }; } clilib.dll Project: C# Console App namespace App { class Program { static void Main(string[] args) { clilib.A a = new clilib.A(); int x = c.f(); } Add Reference: clilib.dll obracene: #using cshlib.dll