C++ bilder

petak, 22.02.2008.

Visual Studio 2008 - bug u STL/CLR implementaciji !!!

Ccccc ...

Microsoftu je trebalo nekoliko godina da napravi port STLa (Standard Template Library) da se može koristiti i na .NET platformi i onda naprave ovako traljavi release !!!

Za neupućene, kratka rekapitulacija. Dakle, STL je biblioteka za programski jezik C++ u kojoj se nalaze implementacije mnooooogobrojnih izrazito korisnih struktura podataka (što bi rekli – „kolekcija“ iliti containera – vector, list, map, set, hash, queue, stack) i algoritama za operiranje nad njima.

Prije nešto više od destak godina, kad sam se prvi put upoznao s STLom, to je bilo vauuuu :-))))). Dinamičke i strogo tipizirane strukture podataka, s ugrađenim efikasnim algoritmima – što je više mogao poželjeti C/C++ programer !?

Klasični ArrayList iz .NET-a je u usporedbi s time bio čisti smijeh ...

Nažalost (u stvari na sreću ;-), .NET je imao „poneku“ :-) drugu prednost pred native C++om tako da je danas broj developera na .NET razvojnom okruženju vjerojatno puno veći od broja developera koji koriste C++.
Treba priznati i da se situacija značajno popravila s uvođenjem sa u C# 2.0 i ugrađivanjem tipiziranih kolekcija podataka pa je ArrayList (ne koristite ga više, je'l da ;-) zamijenjen s List i onda se dalo nekako živjeti bez STL-a.

Stoga, kad sam vidio da je STL/NET konačno postao dio Visual Studio 2008 okruženja, nisam mogao dočekati da ga malo okušam.

Pa sam lijepo kreirao novi Visual C++ projekt (tab CLR pa CLR Console Application) i ukucao najtrivijalniji mogući primjer:

#include "stdafx.h"
#include

using namespace System;

int main(array ^args)
{
cliext::vector c1;

c1.push_back(L'a');
c1.push_back(L'b');
c1.push_back(L'c');

for each (wchar_t elem in c1)
System::Console::Write(" {0}", elem);

return 0;
}

Pravi C++ gurui će ovdje odmah graknuti da „kakav for each“, da nema toga u STLu i gdje su const_iterator, begin i end ? OK, može i tako, ali for each je idiom koji je u .NET svijetu bread-and-butter i ruku na srce, ima puno manje kucati :-)))) I mislim da je sasvim zgodno da su implementatori STL/CLRa omogućili korištenje tog idioma sa STL/NET kolekcijama. Uostalom, to je ionako syntactic sugar ...

Ostalo je manje više jasno. Treba uključiti header cliext/vector da bi kompajler imao potrebne deklaracije (nešto ala „Add reference“ za C# programere), push_back je „klasičan“ način za dodavanje elementa na kraj kolekcije (Add za C#ovce) i tu bi sve trebalo biti jasno.

F7 i ...

1>C:Program FilesMicrosoft Visual Studio 9.0VCincludecliext/xutility(9) : fatal error C1107: could not find assembly 'Microsoft.VisualC.STLCLR.dll': please specify the assembly search path using /AI or by setting the LIBPATH environment variable

Neba ti nebeskog ... ???

Što je sad ?

Otvaranjem xutility headera (.h nastavak za headere standardnih biblioteka je „izgubljen“ u zadnjoj inkarnaciji C++ standarda) i odlaskom na liniju 9 se nađe „uzrok“ pogreške i tamo piše:

#using

U redu, jer TO JE TOČNO NO ŠTO BI TREBALO PISATI !!!???

Dotični dll-u je library u kojem je duša STL/CLR i #using direktiva je nužna kao pointer kompajleru. Taj dll se fizički nalazi u C:Program FilesMicrosoft Visual Studio 9.0VClib direktoriju, gdje se nalaze i mnogobrojne druge biblioteke za Visual C++ kompajler, i referenciran je kroz Libraries setting.

Dakle, kompajler bi ga morao vidjeti !!!
A on kaže da ga nema ?

Pokušao sam nekoliko trikova (npr. staviti ga ručno u referencirane biblioteke za projekt) ali nije mi baš išlo :-(. Ipak, na kraju sam našao spasonosno rješenje.

U xutility headeru sam dotičnu liniju promijenio u:

#using "C:Program FilesMicrosoft Visual Studio 9.0VClibMicrosoft.VisualC.STLCLR.dll"

I sve je proradilo kako treba ... Prijavio sam bug Microsoftu, i sad se na miru mogu (možete) poigrati sa STL/CLRom ...

- 15:50 - Komentari (0) - Isprintaj - #

ponedjeljak, 28.01.2008.

Drugi pokušaj ...

Eh ...

Dolazak C++ bildera i nije ostavio neki trag ! Možda zato što je od prethodnog (i jedinog !) posta prošlo 6 mjeseci :-). Yap, mora biti da je to.

Al' popraviti ću se ! Obećavam !

Moj politički alter ego je zadnjih pola godine (znate da su bili izbori, jel'da ;-) bio poprilično zauzet ispravljanjem razno raznih krivih Drina a usput i lamentiranjem o jadnom stanju našeg obrazovanja, ali nekako se mislim da je došlo vrijeme angažirati se i u IT blogosferi.

Iako me je iskustvo naučilo da je objavljivati unaprijed „planove“ za postove vrlo tricky stvar (iskustvo moje a i s drugih blogova mi govori da je dostizanje i 50 % plana u većini slučajeva nedostižan cilj !), I'll go for it ! Uostalom, reaktivacija bloga bez malo konkretnijeg plana baš i nije pametan potez i lako bi moguće odvela ovaj blog u još jednu hibernaciju :-)

Prva tema kojoj se planiram posvetiti u par postova je STL/CLR. Za one slabije upućene u C++, STL (Standard Template Library) je biblioteka standardnih programskih komponenti koju su sa zavišću gledali pripadnici vjera u druge programske jezike (ili bar tako C++ gurui vole misliti ;-).

U svakom slučaju, STL je jedan od najjačih aduta C++a, iako se mora reći da je s uvođenjem sa u .NETu i pripadnih strogo tipiziranih kolekcija (ne koristite više ArrayList, jel'da ?) stvar malo ujednačena.

Elem, STL/CLR je port STL librarya na .NET koji dolazi standardno sa Visual Studiom 2008 i koji sam jedva dočekao ! Međutim, pri prvom pokušaju korištenja STL/NET-a sam naišao na bug :-(, i to će biti tema prvog posta.

Nakon toga slijedi malo istraživanje runtime performansi standardne (native) C++ implementacije STL-a i implementaciju STL/NET. Jedna od ključnih osobina STL biblioteke je da garantira određene performanse za pojedine vrste operacija nad containerima/strukturama podataka (npr. O(1) za vector<>, O(n) za find u list<>, a O(log2n) za map<>).

Očekivano je da će ista O-složenost vrijediti i za STL/NET containere, ali mene živo zanima usporedba apsolutnih vremena za izvršavanje ekvivalentnog skupa operacija nad pojedinim vrstama containera. Da li postoji penalty zbog Garbage Collectora, i ako da, koliki je ?

A nakon što obradim STL/NET, krećem(o) u nepoznato :-).

F# !

Programski jezik proizašao iz Microsoft Research Laba koji kombinira proceduralnu, objektnu i funkcionalnu paradigmu, baziran je na .NET Frameworku, može ga se koristiti i kao skriptni jezik i sve u svemu it smells good :-)

Vrijeme je za novi paradigm shift i krajnje je vrijeme za hvatanje tog vlaka ...

A oni koji će na to odmahnuti rukom i reći: „Što će nam još jedan jezik, C#/Java su zaaaakon !“ ...

Heh, to su isto meni govorili Visual Basic-aši prije 10 godina kad sam ih pilio sa C++om i OO programiranjem :-))) Istina, nisu završili u C++ već u C# kampu, ali više od njih ne čujem „ih, što će nam ti objekti, kakvi su to bakrači, vidi kako ja to, klik, klik, klik i evo forme s podacima iz baze“ :-P.

OO paradigma je tu da ostane, ali popularnost dinamičkih/skriptnih jezika (Ruby, Python) ipak dosta govori. Late binding is all the rage, a i C# u svojoj 3.0 verziji ide u tom smjeru !

U svakom slučaju, biti će zanimljivo učiti novi programski jezik ... nisam već dugo .

A ako mislite da je s F#om iscrpljena lista potencijalno zanimljivih jezika, evo popisa iz mog ComputersProgramming languages bookmark foldera:

F# – sve rečeno
Ruby – ka' da su malo pali (u spinu :-), ali pratim IronRuby i Ruby.NET
Python – čisti Python mi se čini idealan za skripte, a IronPython obećava
Scala – to je sada in
Boo – idealna zamjena za C kao prvi programski jezik (a i dolazi free sa SharpDevelop razvojnim okruženjem – vidi jednostavne primjere na Wikipediji)
D – improved C++ !?
Erlang – concurrency će za par godina biti all the rage (lako kad ih je dvije, ali što kad u računalu postoji 8 jezgara u 2(4) procesora) ?) a tu je, barem tako kažu people in the know, Erlang naprosto neprejebiv :-)
LISP – bol u teoretical-computer-science srcu mom ...

Daaa, mogli bi biti zanimljivo ...

- 23:15 - Komentari (4) - Isprintaj - #

utorak, 12.06.2007.

C++ bilder is coming to town ...

Početi ćemo s disclaimerom – naime, nisam osobiti pobornik Borlandovog C++ Builder razvojnog okruženja jer, ... Visual Studio RULEZ :-)

A ime bloga je zbog nadimka koji su mi nadjenuli moji študenti na FERu (Fakultetu elektrotehnike i računarstva) gdje radim kao asistent (u biti „povjerenik predavanja“ – što je taktička caka kojom je FER omogućio onima koji su „samo“ dr.sc. a nisu docenti da mogu/smiju držati predavanja ;-) i trudim se prenositi znanja o programiranju, algoritmima, strukturama podataka i JEDNOM I JEDINOM, MASTER OF THE UNIVERSE C++ PROGRAMSKOM JEZIKU (vječna hvala i slava Bjarneu Stroustrupu).

Ali avaj i kukulele, C++ je definitivno preteška artiljerija za "rutinske" zahtjeve koji se danas stavljaju pred developere ("rutinske" - mo'š mislit :-) ! Pa će ovdje biti i podosta postova o .NET tehnologiji, što je u redu jer je .NET druga najbolja stvar na svijetu poslije C++a :-)) (a po važnosti u financijskom departmentu, debelo prva).

Pa to bi bilo to za početak ...

- 23:13 - Komentari (0) - Isprintaj - #

0