David Bednárek Jakub Yaghob Filip Zavoral. http://data.ksi.ms.mff.cuni.cz/svn/nprg051pub/html/nprg051.html



Podobné dokumenty
David Bednárek Jakub Yaghob Filip Zavoral.

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Jakub Čermák Microsoft Student Partner

PREPROCESOR POKRAČOVÁNÍ

Připravil: Ing. Vít Ondroušek, Ph.D. Technologie.Net Framework

Jakub Čermák Microsoft Student Partner

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Generické programování

Jazyk C# (seminář 6)

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Zápis programu v jazyce C#

Úvod do programovacích jazyků (Java)

typová konverze typová inference

Bázové třídy platformy.net

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

IUJCE 07/08 Přednáška č. 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programovací jazyk Úvod do programování v C#

PB161 Programování v jazyce C++ Přednáška 10

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Teoretické minimum z PJV

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Abstraktní datové typy: zásobník

Jazyk C++ I. Šablony

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

JAZYK C# ÚVOD. Literatura. Jazyk C# .NET Framework

Programovací jazyk C# Úvod do programování v C#

Jazyk C++ I. Šablony 2

PB161 Programování v jazyce C++ Přednáška 10

Programovací jazyk C# Úvod do programování v C#

Doxygen. Jakub Břečka

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Abstrakt. Klíčová slova. Title. Abstrakt. Klíčová slova

Jazyk C++ I. Šablony 3

Datové abstrakce v programovacích jazycích

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

PB161 Programování v jazyce C++ Přednáška 4

Abstraktní třídy, polymorfní struktury

přetížení operátorů (o)

Rozšiřování a upravování stávající funkcionality PLToolbox, Orafce

x86 assembler and inline assembler in GCC

Platforma.NET 4. hodina dnes to bude ideologické

Komponenty v.net. Obsah přednášky

boolean hasnext() Object next() void remove() Kolekce

Programování ve Windows Dynamické knihovny. Andrea Číková Martin Osovský

[ASP].NET Core Demystified. Miroslav Holec. Konzultant a lektor [ASP].NET Core.

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Programování v C++ 1, 1. cvičení

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PŘETĚŽOVÁNÍ OPERÁTORŮ

IPA - Lab.1 Úvod do programování v ASM

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Programování v C++ 2, 4. cvičení

K8055D.DLL v Technická příručka. Úvod. Obecné. Konvence volání. Nastavení adresy karty

Projekty pro výuku programování v jazyce Java

Algoritmizace a programování

Ján Hanák. Programujeme v jazycích C++ s Managed Extensions a C++/CLI

PROGRAMOVÁNÍ PRO MS WINDOWS 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programování v jazyce Java

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

7. Dynamické datové struktury

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Principy objektově orientovaného programování

Novinky ve Visual Studio Tomáš Kroupa

Programování v C++ První kroky

Algoritmizace a programování

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

Kolekce, cyklus foreach

Návrh softwarových systém. Návrh softwarových systémů

C++ a vnitřní svět. David Bednárek Jakub Yaghob Filip Zavoral

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Programování v C++ 1, 17. cvičení

Algoritmizace a programování

Abstraktní datové typy, moduly

IRAE 07/08 Přednáška č. 7. Začátek (head)

Programování v C++ 1, 5. cvičení

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Mělká a hluboká kopie

2011 Jan Janoušek BI-PJP. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Programování v Javě I. Leden 2008

Objektově orientované programování 1 XOBO1. Autor: Doc. Ing. František Huňka, CSc.

PB071 Programování v jazyce C

Java Enum Java, zimní semestr ,2017 1

PB161 Programování v jazyce C++ Přednáška 8

ADT/ADS = abstraktní datové typy / struktury

IRAE 07/08 Přednáška č. 1

Jazyk C++, některá rozšíření oproti C

David Bednárek Jakub Yaghob Filip Zavoral.

Transkript:

David Bednárek Jakub Yaghob Filip Zavoral http://data.ksi.ms.mff.cuni.cz/svn/nprg051pub/html/nprg051.html

Interoperabilita C++ a C, dll, C++ a.net, C++/CLI Nové normy a knihovny C++11/14/17, lambda výrazy, inference, r-value ref Kontejnery, iterátory pokročilé použití objektových knihoven Pokročilá práce s šablonami, kompilační polymorfismus Politiky, traits, generické programování Abstraktní datové typy, operátory Rozšířené knihovny databáze, síťová komunikace, POSIX, GNU, Boost, AIO Paralelismus v C++ Bezpečné programování s výjimkami Metaprogramování

2/2 Z/Zk Přednáška přednášející se budou se střídat Cvičení evidence v Grupíčku skupinky nemají žádný vliv na místo a konání, vše je dohromady 3 domácí úkoly zadání, řešení, rozbor chyb Zápočet alespoň 50% bodů z DÚ podmínka pro připuštění ke zkoušce Zkouška základ - hodnocení DÚ 27-30b 1, 23-26b 2, 19-22b 3 zkouška ±10b

2. týden 29.2. Zadání DÚ 1 4. týden 14.3. Odevzdání DÚ 1 5. týden 21.3. (! velikonoce) Řešení DÚ 1, Zadání DÚ 2 8. týden 11.4. Odevzdání DÚ 2 10. týden 25.4. Řešení DÚ 2, Zadání DÚ 3 12. týden 9.5. Odevzdání DÚ 3 15. týden 23.5. Řešení DÚ 3 Termín DÚ: vždy pondělí 12:00 pozdní odevzdání penalizace

C++ a vlastní C moduly 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

vlastní headery knihovní headery knihovny.h.h.obj.obj.obj.obj.obj.lib.cpp CC.obj Link.exe kompilace jednoho modulu.c.c.cpp.obj.obj.obj další moduly

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

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

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???

mangling mandlování, znetvoření name-decoration int a; int a( void); int a( int, int); class a {; class a { int a; ; class a { int a( int); ; 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é

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

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

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

/* pureclib.c */ #include "pureclib.h" int lib_x; int lib_fnc( int x) { return x + lib_x; /* pureclib.h */ #ifndef PURECLIB H_ #define PURECLIB H_ #ifdef cplusplus extern "C" { #endif extern int lib_x; int lib_fnc( int x); symboly C // cppexe.cpp #include "pureclib.h" int main(...) { int i = lib_fnc( 1); CC #ifdef #endif #endif cplusplus CPPC _lib_fnc CPPC - definované CC - nedefinované _lib_fnc

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 mov eax, 1 mov ebx, 2 call?f@@x f( 1, 2); mov eax, [ebp+08] mov ebx, [ebp+04]... 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

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

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

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

load dll // moje.cpp extern "C" declspec(dllexport) int add( int a, int b) { return a + b; BOOL APIENTRY DllMain(...) { return TRUE; // exe_import.cpp extern "C" declspec(dllimport) int add(int a, int b); int result = add(1, 2); explicit runtime linking // 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); return 1; int result = add(1, 2); FreeLibrary( dll); statické slinkování s moje.lib jen proxy, kód v.dll POSIX void *dll = dlopen("moje.dll", RTLD_NOW); typedef void dll_fnc(int,int); dll_fnc* add = (dll_fnc*)dlsym(dll, "add"); add( ); dlclose(dll);

Samostatný jazyk standardizovaný ECMA snaha o maximální kompatibilitu s C++ 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 Mono managed code spravovaný.net frameworkem přístup k CLI (.Net) knihovnám snadná interoperabilita C#, F#, VisualBasic,... COBOL, Eiffel, Mercury... MS implementace nadmnožiny CLI multiplatformní implementace CLI http://www.mono-project.com

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

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

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 class Native {...; ref class Managed {...; { Native* n = new N; Managed^ m = gcnew Managed; delete n; handle native heap managed heap

Typy hodnotové referenční 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 ne default sémantika stack heap s.: boxing heap stack s.: autoalokace 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();

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

property (get, set), indexed/static property delegáty a eventy String std::string (!!!) String^ ms; string s = (char*) Runtime::InteropServices::Marshal:: StringToHGlobalAnsi(ms).ToPointer(); 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,...,...

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++

Klady 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 nekompatibilní 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

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