David Bednárek Jakub Yaghob Filip Zavoral.

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

Jakub Čermák Microsoft Student Partner

PREPROCESOR POKRAČOVÁNÍ

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

Generické programování

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

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

typová konverze typová inference

Úvod do programovacích jazyků (Java)

Jazyk C# (seminář 6)

Zápis programu v jazyce C#

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

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

Jazyk C++ I. Šablony 2

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

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

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

Algoritmizace a programování

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

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

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

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

Abstraktní datové typy: zásobník

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

Jazyk C++ I. Šablony

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

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

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

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

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

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

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

8 Třídy, objekty, metody, předávání argumentů metod

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

Abstraktní třídy, polymorfní struktury

Platforma.NET 4. hodina dnes to bude ideologické

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

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

Doxygen. Jakub Břečka

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/

Bázové třídy platformy.net

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

ADT/ADS = abstraktní datové typy / struktury

11. Přehled prog. jazyků

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

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

x86 assembler and inline assembler in GCC

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

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

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

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

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

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

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

David Bednárek Jakub Yaghob Filip Zavoral.

Úvod do programovacích jazyků (Java)

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

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

Dědění, polymorfismus

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

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

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

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

konstruktory a destruktory (o)

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

Teoretické minimum z PJV

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

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Algoritmizace a programování

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

Jazyk C++ I. Šablony 3

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Datové abstrakce v programovacích jazycích

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

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

NPRG031 Programování II --- 2/2 Z, Zk

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 12.2.

1. Programování proti rozhraní

Novinky ve Visual Studio Tomáš Kroupa

Úvod do programování v jazyce Java

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

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

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

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

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

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

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

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

7. Dynamické datové struktury

Opakování programování

Výčtový typ strana 67

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Transkript:

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

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; int main() { lib_cb( i, cpp_fnc); אҖ x = 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 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

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