Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
internet (socket) programming
ajb
Doet iets met Cloud (MS/IBM)
.edit: hmmm deze uitspraak doet mijn front niet veel goeds
.edit2: maar als je toch bezig wilt zijn, schrijf maar een tutorial over 3d convex object collision detection & response, daar heb ik ook nog wat aan
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
[off-topic] TDCOCD&R. Hum. Fijne afkorting.Op maandag 26 november 2001 14:05 schreef OiSyN het volgende:
met de inhoud van /14 zit het wel snor, maar die van /38 schijnt om tete zijn
.edit: hmmm deze uitspraak doet mijn front niet veel goeds
.edit2: maar als je toch bezig wilt zijn, schrijf maar een tutorial over 3d convex object collision detection & response, daar heb ik ook nog wat aan
Maareuhm volgens mij bedoelde hij meer items voor beginners (unlike you I suppose
STL?
Templates?
Exceptions?
Algoritmes?
OO/Patterns?
Boost libraries?
* Korben heeft twijfels over OiSyN, die blijkbaar is begonnen met het boek C++ - TDCOCD&R, te vinden bij Studieboeken -> ICT -> Programmeren -> C++ -> Beginners
.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?
Verwijderd
Download gewoon een wrapper library zoals common C++. Dan heb je al je socket functies portable (zelfs win32) gewrapped en hoef je niet met raw sockets aan de slag.Op maandag 26 november 2001 14:04 schreef D2k het volgende:
oe oe oe
internet (socket) programming
ajb
Nou, da's wel heel erg simpel:Op maandag 26 november 2001 14:05 schreef OiSyN het volgende:
.edit2: maar als je toch bezig wilt zijn, schrijf maar een tutorial over 3d convex object collision detection & response, daar heb ik ook nog wat aan
1: Breek convex object op in set van vierhoeken (dus met
4 driehoekige zijdes )
2: Test elk hoekpunt van ene object of dat in een van de
andere vierhoeken ligt.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
das een mooie link: die gaat de bookmarks inOp maandag 26 november 2001 14:24 schreef mietje het volgende:
[..]
Download gewoon een wrapper library zoals common C++. Dan heb je al je socket functies portable (zelfs win32) gewrapped en hoef je niet met raw sockets aan de slag.
<sneaky mode>
op mijn topic hierover werd niet gereplied dus dan zo maar ff:
Heeft er iemand als eens een PPP verbinding opgebouwd vanuit C/C++ ?
</sneaky mode>
Doet iets met Cloud (MS/IBM)
Ik heb de code net gedownload, en 't is een redelijke poging, alleen niet "zoals het hoort". De standaard manier om een nieuwe output voor een stream te maken is een streambuf klasse. Die zit er wel in, maar heet TCPstream. Bovendien is dat via Multiple Inheritance ook nog een iostream, zoals je zou verwachten met die naam. Dat moeten dus eigenlijk twee klasses zijn.Op maandag 26 november 2001 14:24 schreef mietje het volgende:
[..]
Download gewoon een wrapper library zoals common C++. Dan heb je al je socket functies portable (zelfs win32) gewrapped en hoef je niet met raw sockets aan de slag.
Aan de andere kant, geteste code is getest. Da's een groot voordeel.
Overigens is een streambuf class een leuke oefening als je wilt oefenen met iets meer dan newbie C++ code. Je zou in een dag een ROT-13 encoder moeten kunnen schrijven als je
alle basis C++ dingen snapt.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Verwijderd
In unix/linux werk je normaal met het SLIP-protocol als je over serieele poorten werkt, niet met PPP (het moet wel kunnen). Ik heb me er zelf nooit zo mee bezig gehouden, dus weet ik er weinig van, helaas.Op maandag 26 november 2001 14:47 schreef D2k het volgende:
<sneaky mode>
op mijn topic hierover werd niet gereplied dus dan zo maar ff:
Heeft er iemand als eens een PPP verbinding opgebouwd vanuit C/C++ ?
</sneaky mode>
Verwijderd
Een bekend probleem bij alle stream classes die multithreaded moeten werken. Er moet wat geknoeid worden om de boel thread-safe te krijgen (en dat is die hele library).Op maandag 26 november 2001 15:11 schreef MSalters het volgende:
Ik heb de code net gedownload, en 't is een redelijke poging, alleen niet "zoals het hoort". De standaard manier om een nieuwe output voor een stream te maken is een streambuf klasse.
Ik kan alle tutorials dan gebruiken, dus editors aweey !
A Breakbeat A Day Keeps Religion Away.
helaas moet ik het met ppp doen ivm een implementatie in al bestaande software. Ik heb vorige week al een stuk de ppp source herschreven (Op maandag 26 november 2001 15:12 schreef mietje het volgende:
[..]
In unix/linux werk je normaal met het SLIP-protocol als je over serieele poorten werkt, niet met PPP (het moet wel kunnen). Ik heb me er zelf nooit zo mee bezig gehouden, dus weet ik er weinig van, helaas.
Ik hoopte eigenlijk dat er iemand een goed id had.
Doet iets met Cloud (MS/IBM)
Verwijderd
die how-to kan ik al dromen inmiddelsOp maandag 26 november 2001 16:04 schreef mietje het volgende:
D2k>> ik heb iets gevonden in de PPP-HOWTO. Het moet gewoon lukken zonder te gaan source-hacken, volgens mij.
maar het is dus de bedoeling dat het niet vanaf de prompt maar vanuit een C programma gaat gebeuren. En liefst zonder ranzige system call met de parameters die ik nu ook op de prompt gebruik. (maar ik trek wel ff mijn oude topic omhoog dit gaat echt te ver ot)
<Edit> deze
[topic=322258/1]
Doet iets met Cloud (MS/IBM)
Lijkt mij erg interessant.
dan maar even een serieuze reactie op deze (denk ik) niet zo serieuze reactieOp maandag 26 november 2001 14:34 schreef MSalters het volgende:
[..]
Nou, da's wel heel erg simpel:
1: Breek convex object op in set van vierhoeken (dus met
4 driehoekige zijdes )
2: Test elk hoekpunt van ene object of dat in een van de
andere vierhoeken ligt.
1. Je hoeft convex objecten niet op te delen in vierhoeken als je de hoeken wilt gaan testen
2. De hoekpunten hoeven niet persee in het ander object te liggen willen ze elkaar snijden
3. Dit is dus met stilstaande objecten, er moet nog beweging in (lineaire snelheid + rotatie)
4. Waar is het response gedeelte?
Zo, nu jij weer
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
denk vooral dat je dingen als memoryleakage, segmentationfault, enz. goed uitlegd.
Welke dingen zeker en onzeker in c++ zijn:
x->set(a++,a++);
Voor c++ is er geen standaard welke nu eerst uitgerekend (de eerste 'a' of de 2e 'a') wordt. Dingetjes zoals erno lijken mij ook geen overbodige luxe.
en dat het maken van objecten niet altijd lukt
Backup not found (R)etry (A)bort (P)anic<br\>AMD 3400+ 64, 2 GB DDR, 1,5 TB Raid5
Verwijderd
(windows programming dus)
- dynamische zaken (arrays,structures enz)
- multithreading
- debugging!!
suc6!
nope
Beginners moeten geen geheugen dynamisch alloceren. Als ze std::vector / std::list gebruiken wordt dat voor ze gedaan,Op maandag 26 november 2001 19:16 schreef reddog33hummer het volgende:
als je een beginners tutorial schrijven gaat:
denk vooral dat je dingen als memoryleakage, segmentationfault, enz. goed uitlegd.
maar ook het dealloceren gebeurt dan voor ze.
Segfault's zijn denk ik ook daarom ook niet zo belangrijk in C++, omdat je veel minder zelf met pointers loopt te klooien.
Dat laatste is misschien wel het allerbelangrijkste. Het idee dat een ctor die niet wil, een exception moet gooien, dat verzin je zelf niet (als beginner). Er zijn nog teveel mensen die init() members maken.Welke dingen zeker en onzeker in c++ zijn:
x->set(a++,a++);
Voor c++ is er geen standaard welke nu eerst uitgerekend (de eerste 'a' of de 2e 'a') wordt. Dingetjes zoals erno lijken mij ook geen overbodige luxe.
en dat het maken van objecten niet altijd lukt
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Je hebt een vlak van 8 * 8 vierkantjes. In elke rij moet een koningin geplaatst worden. Deze mogen dus niet 'schaak' staan. Dus horizontaal, verticaal en diagonaal niet op 1 lijn zitten. Snappez vous?
oogjes open, snaveltjes dicht
Dat is zo simpel, dat kan ik hier wel laten zien.Op dinsdag 27 november 2001 13:49 schreef bloody het volgende:
- member functies als callback gebruiken
De grap met member functies is dat ze op een object werken. Als je een member functie als callback wil accepteren, dan moet je dus ook een bijbehorend object accepteren.
Als we de class T noemen, dan heb je dus member functies van het type
1
| ReturnType T::*( Args ) |
De callback maak je dus via een functie met signature
1
| install_callback( T& object, ReturnType (T::* method)(Args) ) |
Nu weet je niet vantevoren welke class iemand wil gebruiken, dus je moet een function template gebruiken. Die moet dan een object maken van de callback, met een niet-template base class.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| class CallBackBase {
public:
virtual ReturnType do( Args a ) = 0;
virtual ~CallBackBase() {;}
};
template< typename T>
class CallBack : public CallBackBase {
T& object;
ReturnType (T::* method)( Args );
public:
CallBack( T& object, ReturnType (T::* method)( Args ) ) :
object(object), method(method) {;}
ReturnType do( Args a ) { object.*method( a );
};
template< typename T>
std::auto_ptr< CallBackBase >
install_callback( T& object,
ReturnType (T::* method)(Args) )
{
return new CallBack<T>( object, method );
} |
De callback kun je nu aanroepen met ->do( args ) zonder
dat je weet uit wat voor class de method komt. Er is wel een heel belangrijk punt in dit ontwerp; het T object wordt niet gekopieerd. Dus dat object moet nog beschikbaar zijn op het moment dat de callback wordt aangeroepen. Je kunt misschien ook kiezen om het object te kopieren ipv een T& te gebruiken, maar dan kun je niet het originele object veranderen. Maar std::cout kun je bijvoorbeeld niet kopieren.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Dat bereik je niet door je classes te mixen. Een formatter ( iostream ) en een IO interface ( streambuf ) zijn twee verschillende objecten.Op maandag 26 november 2001 15:16 schreef mietje het volgende:
Een bekend probleem bij alle stream classes die multithreaded moeten werken. Er moet wat geknoeid worden om de boel thread-safe te krijgen (en dat is die hele library).
Bovendien verandert de state van de streambuf veel sneller dan die van de iostream. Des te meer reden om die twee gescheiden te houden.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
he het was voor beginners!! wat jij daar zegt lijk me NIET voor beginners.Op woensdag 28 november 2001 17:22 schreef MSalters het volgende:
een hele berg code
nope
Verwijderd
wat ik wel kan is C programmeren, nou de basis dan. ik kan korte routines schrijven. java kan ik ook perfect, is ook ontzettend makkelijk.
Toen wou ik proberen een java clas in c te zetten.
is me niet gelukt.
wat ik niet snap is de file structuur, in visual bc++ staan er een hele bult bestanden, waar begint hij in gods naam. hoe zit dat met die headers etc.
ik heb ook 2 jaar pascal geprogrammeerd en dat was vrij makkelijk, hij begon boven en gaat naar beneden.
dat is bij vc++ niet echt zo denk ik.
maar dat zou wel makkelijk zijn in de tutorial...
ik zou hem graag ook willen hebben(dmaniac_@Hotmail.com), misschien dat ik dan eindelijk kan beginnen in vc++ 6
Je hebt gelijk; van boven naar beneden werkt niet in C++.Op donderdag 29 november 2001 16:37 schreef d_maniac het volgende:
nou ik ben een beginner en ik wou visual c++ leren en ik snap er nogsteeds geen ene reet van.
wat ik niet snap is de file structuur, in visual bc++ staan er een hele bult bestanden, waar begint hij in gods naam. hoe zit dat met die headers etc.
ik heb ook 2 jaar pascal geprogrammeerd en dat was vrij makkelijk, hij begon boven en gaat naar beneden.
dat is bij vc++ niet echt zo denk ik.
Maar het werkt wel hetzelfde als in C.
Een C++ programma bestaat uit een verzameling .cpp files. Die hoeven niet tegelijk gecompileerd te worden. Als er een gecompileerd wordt, dan wordt het een .obj file. Als je alle .obj files hebt kun je er een .exe van maken. Als je een .cpp file verandert, dan hoef je alleen die opnieuw te compileren.
Headers, .h of .hpp, worden letterlijk in de .cpp gezet. Dat betekent dat als je een header verandert, dat je alle .cpp files moet compileren die die header gebruikt.
Een file wordt van boven naar beneden gecompileerd. Als je een functie probeert te gebruiken, die lager staat dan de plek die je wil gebruiken, dan moet je dus ook vantevoren vertellen dat er zo'n functie ergens staat. Dat doe je door de functie declaratie, net zoals in C.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
en die functiedeclaraties staan dus in de header files
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Daar heb je gelijk in. Ik begon gewoon met schrijven, en toen kwam ik erachter dat als je ALLE classes als callback wil kunnen gebruiken, dat je dan een template moet gebruiken. Dus toen moest ik overal template< > boven zetten. En dan wordt't een boel, ja.Op donderdag 29 november 2001 16:18 schreef bloody het volgende:
[.. boel code van mij ]
he het was voor beginners!! wat jij daar zegt lijk me NIET voor beginners.
OO callbacks zijn sowieso niet voor beginners. Het voordeel van C++ is dat je ook nog simpele functies hebt.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| class CallbackInterface
{
public:
virtual void callback ()
};
// hier een functie die wat met die callback gaat doen
void blaat (CallbackInterface & c)
{
...
c.callback ();
...
}
// en je functie declareer je vervolgens zo
class MyClass : public CallbackInterface
{
// hier natuurlijk nog andere troep zoals een constructor enzo
void callback ()
{
// jouw callback code hier
}
}
int main ()
{
MyClass myclass;
blaat (myclass);
return 0;
} |
en ook wat begrijpelijker voor de beginnende coder
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Wat is alles toch eenvoudig als het duidelijk wordt uitgelegdMSalters legde het compilatie proces van C++ even uit
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Ja maar ik denk niet dat dit wordt bedoelt met member callbacks. Eigenlijk zit je in dit stukje gewoon via een functie een (virtual) method aan te roepen van een object.Op vrijdag 30 november 2001 01:10 schreef OiSyN het volgende:
als je echt callbacks wilt hebben dan hoor je dat eigenlijk te doen met een interface
De kunst is om een object 'aan te sluiten' op een ander object. Wanneer die een signaal afgeeft (callback aanroept) kan het andere object daarop reageren. En ja, helaas moet dit heel complex gebeuren. Als voorbeeld kan je kijken naar libsigc++, een cross-platform signal-slot systeem.
En waarom zou je dat in mindere mate een member callback mogen noemen?Orphix: Ja maar ik denk niet dat dit wordt bedoelt met member callbacks. Eigenlijk zit je in dit stukje gewoon via een functie een (virtual) method aan te roepen van een object.
* mbravenboer is het eigenlijk wel met OiSyN eens
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Wat OiSyN doet vind ik meer een vorm van abstractie door de interface op te delen in verschillende delen (classen). Op die manier kunnen veel verschillende classes die interface ondersteunen (omdat het vrij specifiek is).
Dat kan toch door in de interface verschillende functies op te nemen voor de verschillende gebeurtenissen? Op die manier leg je gelijk op een duidelijke manier vast welke events er mogelijk zijn. Ik begrijp je probleem ermee wel, maar het zorgt toch wel voor duidelijkere code?Orphix: In de methode van OiSyN geef je niet aan de objecten mee welke functies moeten worden aangeroepen bij bepaalde gebeurtenissen (callbacks).
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Object A kent geen interface van de andere kant.. al helemaal geen toekomstige interfaces. Dan werkt deze methode toch niet
Das waar (denk ikOrphix: Maar met deze methode kan je niet 2 'blinde' objecten aan elkaar knopen.
Allebei dus goede toepassingen?
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Hehe dealOp vrijdag 30 november 2001 03:16 schreef mbravenboer het volgende:
Allebei dus goede toepassingen?
ik geef toe de methode van OiSyN is veel mooier, maar als ik bv een library schrijft wil ik toch liever niet de gebruiker verplichten allerlei interfaces voor hun (bestaande) klasses als parent-classes te gaan gebruiken.
Nouja het juiste middel voor het juiste doel he
(en nu
Met templates proggen heet niet voor niets "generic programming".Op vrijdag 30 november 2001 03:16 schreef mbravenboer het volgende:
[..]
Das waar (denk ik), er wordt gecommuniceerd via de interface. Die interface moet de een accepteren en de ander implementeren. Uiteraard kan je wel een zeer generieke interface maken als je dat wilt...
Allebei dus goede toepassingen?
In principe heb je in C++ twee types polymorphisme; compile-time en run-time. Compile-time doe je met templates, en klasses met identieke members. Run-time doe je met inheritance, en virtual functies.
En voor dit probleem heb je allebei nodig. Je hebt een runtime dependancy (dat is het hele idee van de callback), dus heb je virtual functies nodig. Maar als je niet kunt garanderen dat de method die je wil aanroepen virtual is, dan moet je daar dus een wrapper class omheen doen. En die wrapper is dus een template, omdat-ie alles moet kunnen wrappen. En dan kom je op de lap code daarboven uit.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Vaak.Op vrijdag 30 november 2001 00:57 schreef OiSyN het volgende:
subtiele toevoeging
en die functiedeclaraties staan dus in de header files
Alleen, als je voor je class nog drie helper functies hebt, die niemand hoeft te zien, dan hoeven de functiedeclaraties dus niet in een header. Headers zijn voor je publieke interface.
B.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| X.h:
class X {
X(); // declaratie van member
virtual ~X();
}
X.cpp:
void helper1(); // declaraties
void helper2();
void helper3();
X::X() { helper1(); helper2(); } // definitie.
X::~X() { helper2(); helper3(); }
void helper1() // definitie.
{
std::cout << "helper1" << std::endl;
}
... |
Simpele regel: Definities kosten geheugen; declaraties niet.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Mwah, dat generic programming valt nog wel iets mee, maar het is er inderdaad wel een vorm van. In principe kan je alle vormen van polymorphisme wel generic programming noemen. Luca Cardelli hebben een beroemd stuk hierover geschreven. Ze onderscheiden:MSalters: Met templates proggen heet niet voor niets "generic programming".
1. Ad-hoc polymorphisme
a) Coercion
b) Overloading
2. Universal polymorphisme
a) Parametric
b) Inclusion
Veel van deze vormen worden al at-compile time toegepast (dus niet alleen templates). Coercion wordt bijvoorbeeld toegepast voor het optellen van ongelijke types. 1 van de twee types wordt dan automatisch geconverteerd naar de ondere (als je bijvoorbeeld een double bij een int optelt, de int zal dan geconverteerd worden naar een double).
Overloading is ook een hele makkelijke vorm van polymorphisme, die ook at-compile time wordt toegepast. Bij overloading kan dezelfde operatie op meerdere types worden toegepast, maar de implementatie van de operator verschilt voor de verschillende typen. De bekendste vorm van overloading is natuurlijk + en * voor double, int long etc. Ook dit is dus een vorm van polymorphisme!
De interessantere vormen van polymorphisme (parameteric en inclusion) werken via generieke data-types. Deze kan je bereiken door een data-type te parameterizeren of door sub-typing. De parameterizatie van een klasse (via templates) in C++ is eigenlijk een hele simplistische, maar wel handige vorm.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
De C++ vorm is handig voor simplistische vormen. I.h.a. is het namelijk niet simplistisch. Je kunt alle theoretische informatica problemen oplossen met templates (dwz de template taal is compleet) maar de syntax is daarvoor eigenlijk niet gemaakt.Op maandag 03 december 2001 11:44 schreef mbravenboer het volgende:
[..]
De interessantere vormen van polymorphisme (parameteric en inclusion) werken via generieke data-types. Deze kan je bereiken door een data-type te parameterizeren of door sub-typing. De parameterizatie van een klasse (via templates) in C++ is eigenlijk een hele simplistische, maar wel handige vorm.
Heb je de code wel eens gezien die compile-time alle priemgetallen onder de N berekende? Het idee was dat je classes priem<N> kreeg. priem<2>::is_priem was een const bool die true was; priem<4>::is_priem was een const bool die false was.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
ik bedoelde ook niet dat ze altijd daar moeten staan, ik bedoelde dat dat nou het hele idee was van header filesOp maandag 03 december 2001 11:35 schreef MSalters het volgende:
[..]
Vaak.
dat soort helper functies wil je vaak static hebben, zodat code in andere object files niet eens die functies kan aanroepen (en ook weer minder gezeik met naamconflicten e.d.)Alleen, als je voor je class nog drie helper functies hebt, die niemand hoeft te zien, dan hoeven de functiedeclaraties dus niet in een header. Headers zijn voor je publieke interface.
[.. lap code ..]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Je bedoelt, in de unnamed namespace ? "static" is teOp maandag 03 december 2001 15:12 schreef OiSyN het volgende:
[... helper functies ... ]
dat soort helper functies wil je vaak static hebben, zodat code in andere object files niet eens die functies kan aanroepen (en ook weer minder gezeik met naamconflicten e.d.)
verwarrend.
Oh, en je kunt functies best aanroepen vanuit andere
object files, ook al is-tie static:
static int i;
int* ptri = &i;
en
static void f() {;}
void (*ptrf)() = &f;
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Ik ben wel benieuwd wat je met 'alle theoretische informatica problemen bedoelt'. Je kunt in ieder geval sowieso al niet alle generiek programmeren problemen (op een acceptabele manier) oplossen met behulp van templates. Simpelweg alleen al door het ontbreken van een universeel data-type. Als je gaat kijken naar wat in de wetenschappelijke wereld onder echt generiek programmeren wordt verstaan kom je al snel bij zeer bijzondere taaltjes terecht. Zelfs een taal als Haskell wordt dan al niet meer als geschikt gezien. Polytypic programmen (zoals bijvoorbeeld PolyP) gaat zelfs nog een enorme stap verder dan Haskell. Ik denk dat C++ templates zelfs al qua toepasbaarheid zwaar inferieur zijn aan de mogelijkheden van Haskell. Overigens zijn is de Java Generics uitbreiding geen cent beter (en wellicht zelfs slechter, doch eenvoudiger).MSalters: De C++ vorm is handig voor simplistische vormen. I.h.a. is het namelijk niet simplistisch. Je kunt alle theoretische informatica problemen oplossen met templates (dwz de template taal is compleet) maar de syntax is daarvoor eigenlijk niet gemaakt.
Dat stukje van Cardelli is echt heel boeiend om te lezen. Er wordt overal naar verwezen. hier kan je het vinden.
M'n afstudeer begeleider heeft hier ook een zeer interessant stuk over geschreven in z'n proefschrift. Hij had wat verregaande ideeen over methoden of type-niveau. Het is ook online te vinden, maar wel heel erge strong-stuff
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Er is een vrij bekende stelling in de informatica, die stelt dat er een klasse problemen is die door een Turing machine kan worden opgelost, en dat elke taal waarin je een Turing machine kan programmeren dus die problemen kan oplossen. En problemen die zo'n Turing machine niet kan oplossen, kun je ook niet met bestaande computers oplossen,Op dinsdag 04 december 2001 23:41 schreef mbravenboer het volgende:
[..]
Ik ben wel benieuwd wat je met 'alle theoretische informatica problemen bedoelt'. Je kunt in ieder geval sowieso al niet alle generiek programmeren problemen (op een acceptabele manier) oplossen met behulp van templates.
want een Turing machine kan op zijn beurt weer alle bestaande computers emuleren.
Dus verschillende computers/talen doen misschien langer/korter over de oplossing, maar als er 1 het probleem kan oplossen, dan kunnen ze het allemaal.
Vrijwel elke taal heeft een universeel datatype, int of zo. Hoe je dat gebruikt is een tweede, maar ik kan bv. in 3 ints een floating point type zetten. Goed, in de praktijk is het niet zo efficient als het ingebouwde, maar in theorie is het net zo goed.Simpelweg alleen al door het ontbreken van een universeel data-type. Als je gaat kijken naar wat in de wetenschappelijke wereld onder echt generiek programmeren wordt verstaan kom je al snel bij zeer bijzondere taaltjes terecht. Zelfs een taal als Haskell wordt dan al niet meer als geschikt gezien. Polytypic programmen (zoals bijvoorbeeld PolyP) gaat zelfs nog een enorme stap verder dan Haskell. Ik denk dat C++ templates zelfs al qua toepasbaarheid zwaar inferieur zijn aan de mogelijkheden van Haskell. Overigens zijn is de Java Generics uitbreiding geen cent beter (en wellicht zelfs slechter, doch eenvoudiger).
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Het oneindige X 0
Uiteraard, daarom stond er ook tussen haakjes "op een acceptabele manier". Dat C++ Turing-compleet is, is natuurlijk heel interessant als je theoretisch wilt bewijzen dat C++ alle theoretische informatica problemen op kan lossen, maar veel minder interessant als je praktisch ook daadwerkelijke alle theoretische informatica problemen op wilt gaanb lossen.MSalters: Dus verschillende computers/talen doen misschien langer/korter over de oplossing, maar als er 1 het probleem kan oplossen, dan kunnen ze het allemaal.
Met een universeel datatype doel ik absoluut niet op een int . Het gaat bij een universeel datatype sowieso niet om primitieven zoals floats of ints. Jij doelt volgens mij meer op het verschil tussen basic typen en geconstructueerde typen.Vrijwel elke taal heeft een universeel datatype, int of zo. Hoe je dat gebruikt is een tweede, maar ik kan bv. in 3 ints een floating point type zetten. Goed, in de praktijk is het niet zo efficient als het ingebouwde, maar in theorie is het net zo goed.
Het gaat hier echter vooral om data-structuren met typen en constructoren. Deze kan je in de meeste echte generieke programmeertalen gebruiken via een universeel datatype. Bij een universeel datatype kan je via een bepaalde universeel model al deze typen verwerken en zo generieke procedures over deze datatypen schrijven.
Dit zie je terug in PolyP, Stratego (A-termen) en in een bepaalde vorm ook bij XML. In Java en veel andere talen kan je het ook in een ranzigere vorm gebruiken mbv reflectie. In C++ kan je het ook vast in een wellicht nog ranzigere vorm uitdrukken, maar dat verdient zeker niet de benaming universeel datatype
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
als je alle problemen wilt oplossen ?Op vrijdag 07 december 2001 21:10 schreef mbravenboer het volgende:
Uiteraard, daarom stond er ook tussen haakjes "op een acceptabele manier". Dat C++ Turing-compleet is, is natuurlijk heel interessant als je theoretisch wilt bewijzen dat C++ alle theoretische informatica problemen op kan lossen, maar veel minder interessant als je praktisch ook daadwerkelijke alle theoretische informatica problemen op wilt gaan lossen.
Ben je wel effe bezig
Maar goed, 't punt was over de template taal in C++, het is triviaal dat de runtime Turing-compleet is. Mijn punt is dat de compiler een weakly-typed Turing-complete taal intepreteert om het uiteindelijk te compileren programma te krijgen.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein