Autor Wątek: C++ i kod natywny kontra C# i kod managed  (Przeczytany 44756 razy)

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Kwiecień 19, 2006, 19:03:23
A z tym #pragma region czy też #region to mnie rozbawiliście. Chłopcy z MS naprawdę zrobili dyrektywę preprocesora do zwijania kodu. ROTFL.
To pewnie ficzer dla siszarpowców, którzy muszą coś pomęczyć w C++/CLI :)

Tak na prawdę, to w programie napisanym zgodnie ze sztuką, tzn. ciało funkcji powinno mieścić się na jednym ekranie (abstrahujemy od sensowności tej zasady) to outlinening wogóle jest nieprzydatny. Może tylko do chowania dłuuuuuugich komentarzy :) Ja osobiście bardzo sporadycznie go używam (głównie przy analizie cudzych programów, w których jest duże zamieszanie z grupami zamkniętymi w klamry, a gdzie nie ma wyczerpujących komentarzy).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Exe

  • Użytkownik
    • strona domowa:)

# Kwiecień 20, 2006, 23:36:49
To i ja dorzucę swoje 03h grosze do tej burzliwej dyskusji.
Osobiście zazdroszczę ludziom, którzy potrafią pisać w C# nie dostając przy tym białej gorączki. Jako konserwatywny niskopoziomowiec nie mogę przetrawić faktu, że nie operuję na zmiennych stanowiących nic więcej jak tylko ułatwienie odwoływania się do pamięci - prostych, przewidywalnych, przejrzystych i intuicyjnych, tylko na misternie upakowanych obiektach, po których nie wiem czego się spodziewać i którym zwyczajnie nie potrafię zaufać. Nie podoba mi się też, że mój program jest kompilowany do postaci jakiegoś bajtkodu zamiast po prostu stać się kodem maszynowym w pełni zrozumiałym dla procesora. Wspaniały(...) wynalazek jakim jest garbage collector także przyprawia mnie chwilami o mdłości, bo nie potrafię się pogodzić z tym, że użyłem new, a odpowiedniego delete nijak nigdzie nie widać. Dlatego kiedy tylko mam taką możliwość staram się pisać w C++(oby żył nam jak najdłużej).

Cytat: counterClockWise
A mnie i większości osób u mnie na roku szybciej się pisze w C#.
To ja widocznie jestem w tej mniejszości i wcale źle na tym nie wychodzę. :)

O wartości języka świadczy to, co zostało w nim napisane. W końcu "nie miecz, nie tarcza bronią języka, lecz arcydzieła" jak pisał Norwid... ;)

Offline vigrid

  • Użytkownik

# Lipiec 19, 2007, 02:27:45
Skoro już jest uprawiana tutaj wątkowa nekromancja (15 miesięcy), dołączę się do dyskusji ;)

Patrząc jednak na flame'y, jakie miały miejsce, myślę że należy się pewien disclaimer dla bezpieczeństwa ;). Opinie prezentowane przeze mnie są subiektywne, ponieważ nie zjadłem wszystkich rozumów i nie posiadam monopolu na wiedzę... I potencjalni flamerzy też.

C++
In plus:
+ większość bibliotek związanych z tworzeniem gier została stworzona z myślą o tym języku
+ bardzo dojrzałe i dopracowane kompilatory (optymalizacja na całego)
+ dojrzała społeczność użytkowników pozwala na łatwe uzyskanie rady od eksperta
+ BOOST
In minus:
- język jest już leciwy, jednak nie przełożyło się to na jego znaczące ulepszenia
- brak (przynajmniej mi znanych) dobrych~ IDE dla języka

~ - patrz niżej

C#
In plus:
+ język został zaprojektowany z myślą o łatwością jego użycia
+ język jest wspierany przez Microsoft - przekłada się to na ogromny rynek dla twórców dodatków do Visual Studio, które wydaje się być standardem w większości software house'ów
+ w większości logicznie przemyślana biblioteka klas bazowych ułatwia szybki start
In minus:
- język jest wspierany przez Microsoft - przekłada się to na monopol jeśli chodzi o narzędzia
- dopiero rozwijająca się społeczność; czasami ciężko jest znaleźć kogoś z wystarczającym doświadczeniem by udzielił *dobrej* rady

Temat kodu JIT-owanego vs kodu natywnego to temat-rzeka. Na rynku ostatnio można zauważyć tendencję do wszelkiego rodzaju wirtualizacji (posuwającą się nawet do wirtualizacji serwerów *produkcyjnych*). Niewątpliwą zaletą kodu JIT-owanego jest fakt, iż wystarczy skompilować go raz i (teoretycznie) będzie on działał na dowolnej platformie. Dalej idąc - jeśli mamy kod, który nie jest natywny, mamy (zaskakująco) więcej możliwości na jego optymalizację z myślą o konkretnej maszynie, na której ma być uruchamiany. Z drugiej strony istnieją projekty badawcze zajmujące się zagadnieniem re-optymalizacji już skompilowanego kodu natywnego. Działanie Garbage Collectora jest dość niedeterministyczne (raczej: nie jest w pełni kontrolowalne), jednak różne testy (nie powołam się na źródła, wiem to z jednej z prezentacji na których byłem) wykazują, że jest on diabelsko wydajnym mechanizmem zarządzania pamięcią (zarówno w założeniu swojej generacyjności i implementacji). Problem leży w jego nieprzewidywalnym działaniu i w tym, że podczas działania GC zatrzymywana jest bodajże cała pula aplikacji, co objawia się czkawką (raczej nieakceptowalne dla aplikacji real-time).

Wydaje mi się, że najlepszą możliwością było by odnalezienie "złotego środka" - wykorzystanie składni C#, możliwość jawnego zarządzania pamięcią, możliwość linkowania kodu. Z tej perspektywy bardzo ciekawą opcją jest "linker natywny" Salamander.

Sprawa #region'ów jest dla mnie prosta. Jeśli masz jakikolwiek powód, by ich używać, prawdopodobnie próbujesz umieścić zbyt wiele w jednym miejscu. Najwyraźniejszym ostrzeżeniem jest zauważenie tej dyrektywy w ciele metody/funkcji - zamiast tego ta część powinna zostać wyciągnięta do osobnej metody/funkcji.

Przy okazji trochę prywaty, chciałbym zasięgnąć języka, ponieważ chciałbym wrócić do C++ "po latach" spędzonych przy C#:

1. Czy ktoś może zna *dobre* IDE, z podpowiedziami w stylu Intellisense'a z Visual Studio, które nie kładzie się na template'ach i (ważne) możliwością refaktorowania kodu porównywalną z ReSharperem?
2. Jakich używacie:
- a. frameworków do testów jednostkowych?
- b. narzędzi do badania metryk kodu?

Offline tiago

  • Użytkownik

# Luty 21, 2011, 20:35:01
Miałem z C# styczność przez 2h i będę miał więcej, a nawet MSQLa (w szkole oczywiście na zajęciach)
C#:
 + bardzo prosciutki (prostszy chyba od LOGO :) - dobra przesada - od pascala )
 + można napisać aplikację na poczekaniu, nie myśląc o optymalizacjach
 + jak to mój teacher mówi, tam są cycki, no cóż chciał użyć orginalniejszego słowa niż klamry
 + bazowany na C++ :)

 - nie trawie firmę
 - nie wiem, czy aplikacja nie nawiązuje ukrytego połączenia z serwerami owej firmy
 - chcieli być orginalni, zamiast %d, piszemy {0} :)
 - nic odkrywczego oprócz prostoty nie widzę w tym języku, więc po co to?

ogólnie rzecz biorąc C# to taki język dla mnie, który uznaję, że istnieje (ba nauczę się go), ale żebym pisał swoje własne projekty (takie wiecie, z natchnienia i dla satysfakcji :) ) nie wybiorę C#. - Oczywiście wolę C/C++:)
Może kiedyś okazja będzie by to wykorzystać

Offline Avaj

  • Użytkownik

# Luty 21, 2011, 20:53:21
- nie wiem, czy aplikacja nie nawiązuje ukrytego połączenia z serwerami owej firmy
nie jestem fanem M$ ani C#, ale tu przesadziłeś

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Luty 21, 2011, 21:05:18
- chcieli być orginalni, zamiast %d, piszemy {0} :)

Jeden skomplikowany sposób formatowania stringów zastąpili drugim, równie skomplikowanym. Rzeczywiście, chodziło im najwyraźniej o oryginalność, bo innych zalet nie widzę ;-).

Offline tiago

  • Użytkownik

# Luty 21, 2011, 21:33:19
Avaj Może masz rację, przesadzone. Ale irytuje mnie jak na czystych produkcjach MS mam pootwierane porty nie wiadomo po co. W Visualu jest bodajże do ściągania newsów, co osobiście mnie irytuje, a nie siędziałem zbyt długo by rozgryźć, jak to wyłączyć.

Offline Esidar

  • Użytkownik

# Luty 21, 2011, 21:47:56
- chcieli być orginalni, zamiast %d, piszemy {0} :)

Jeden skomplikowany sposób formatowania stringów zastąpili drugim, równie skomplikowanym. Rzeczywiście, chodziło im najwyraźniej o oryginalność, bo innych zalet nie widzę ;-).
"{0}" nie określa typu, więc prawidłowe będzie napisanie:
string nazwa = "zupa";
int wartosc = 4;
object nieznanyTyp;
Format( "Cos {0} {1} {3}", nazwa, wartosc, nieznanyTyp );

%d w C++ nie dość że określało typ, to dawało kolejne miejsce do wywałki gdy np. napisałeś %s a podałeś int'a.

Offline Avaj

  • Użytkownik

# Luty 21, 2011, 21:59:32
- chcieli być orginalni, zamiast %d, piszemy {0} :)

Jeden skomplikowany sposób formatowania stringów zastąpili drugim, równie skomplikowanym. Rzeczywiście, chodziło im najwyraźniej o oryginalność, bo innych zalet nie widzę ;-).
"{0}" nie określa typu, więc prawidłowe będzie napisanie:
string nazwa = "zupa";
int wartosc = 4;
object nieznanyTyp;
Format( "Cos {0} {1} {3}", nazwa, wartosc, nieznanyTyp );

%d w C++ nie dość że określało typ, to dawało kolejne miejsce do wywałki gdy np. napisałeś %s a podałeś int'a.
większość kompilatorów i tak teraz to sprawdza, a w ostateczności jest boost::format ;]

Offline izaw

  • Użytkownik

# Luty 21, 2011, 22:05:44
Esidar, %d itp. to z C. W C++ masz cin/cout i dobieranie typów przez kompilator.

Offline K'Aviash

  • Użytkownik

# Luty 21, 2011, 22:11:57
Avaj Może masz rację, przesadzone. Ale irytuje mnie jak na czystych produkcjach MS mam pootwierane porty nie wiadomo po co. W Visualu jest bodajże do ściągania newsów, co osobiście mnie irytuje, a nie siędziałem zbyt długo by rozgryźć, jak to wyłączyć.
Są inne IDE =)

Offline vashpan

  • Użytkownik
    • Strona

# Luty 21, 2011, 22:18:19
Esidar, %d itp. to z C. W C++ masz cin/cout i dobieranie typów przez kompilator.

Co jest jeszcze gorsze....

...
« Ostatnia zmiana: Luty 21, 2011, 22:39:01 wysłana przez vashpan »

Offline Snejk47

  • Użytkownik

# Luty 21, 2011, 22:32:36
@up, a dlaczego? Po 4 latach dużo się zmieniło, a kolega od razu podał za i przeciw. Ktoś kiedyś musiał coś napisać.

Offline vashpan

  • Użytkownik
    • Strona

# Luty 21, 2011, 22:37:55
W sumie.... moze i racja, tym bardziej ze Req 100 lat temu napisal w pierwszym poscie ze to jest temat tylko i wylacznie na tego typu dyskusje przeznaczony ;)

EDIT: a juz w ogole ze jest przyklejony :D Ok, cofam to co napisalem wczesniej...

Offline yorp

  • Użytkownik
    • ProfessionGG Project

# Luty 21, 2011, 22:46:00
wiecie co, tak sobie mysle nad tym co ludzie wypisuja w tematach tego typu - czasami jak mam sie uczyc do sesji, to wlacze sobie na poprawe humoru - i nasuwa mi sie taka refleksja.

Ucze sie teraz elektroniki, gdzie matematyka jest uzywana na porzadku dziennym. Z drugiej strony, w 95% mowie tutaj o matematyce na poziomie bardziej zblizonej do liceum niz studiow (wylaczajac np. transformate Laplace'a). Jakby sie przyjrzec blizej, to jednak wiekszosc tego z czego korzystamy, ma swoj pierwowzor w rownaniach rozniczkowych i calkowych i spokojnie moge rozwiazac kazdy z problemow korzystajac z definicji, a nizeli z twierdzen. To czego tutaj uzyje jest moja wlasna wygoda. I tutaj dalej ciagnac mysl. Jestem Informatykiem-Fizykiem, czy naprawde bede korzystal z definicyjnych wersji rownan, czy skorzystam z gotowych? Roznie, bo czasem nie ruszysz, korzystajac z wyliczonych wzorow (przyklad. obwody nieliniowe), a czasem nie ma potrzeby i jest to strata czasu.
Teraz zastanowmy sie po co sie uczysz, zeby umiec, czy zeby zdac?

Nie bede tego tlumaczyl na C++ vs C#, mysle, ze kazdy kto zrozumie, jest odbiorca mojej mysli.