Zarządzane Coders vs Native Coders

19

Jestem programistą i mam doświadczenie z kodem natywnym i zarządzanym. Zacząłem od Pascala i C, potem przeniosłem się do C ++ i ostatecznie do C #.

W ciągu ostatniego roku kodowałem prawie wyłącznie w języku C # i straciłem wiele z tego, co przyszło naturalnie, kiedy byłem programistą w C ++.

Kilka tygodni temu, kiedy usiadłem napisać trochę kodu natywnego C ++, znalazłem się po omacku ​​jak powoli dostał ponowne zapoznanie się z zawiłościami, dziwactwa i dziwactw tego wszystkiego. Jestem prawie wstyd powiedzieć, że miałem zupełnie zapomniał, że przechodząc dynamicznie przydzielonego tablicy do funkcji bez również przekazując jego rozmiar będzie oznaczać, że funkcja odbierania miałby nie wiedział jak długo tablica jest.

Istnieje niezliczona ilość artykułów i dokumentów, które porównują i zarządzają kontrastem z kodem niezarządzanym. Wszyscy wiemy, że natywny kod, jeśli jest dobrze zoptymalizowany, może działać znacznie szybciej i lżejszy niż kod zarządzany. Z drugiej strony, kod zarządzany ma moduły wyrzucające elementy bezużyteczne i optymalizujące w czasie pracy specyficzne dla procesora i systemu operacyjnego, które mogą zapewnić natywnemu kodowi uruchomienie jego pieniędzy.

Z technicznego punktu widzenia nie ma wyraźnego zwycięzcy.

Nie ma wątpliwości, że kod zarządzany jest rzędem wielkości łatwiejszym do zakodowania i zrozumienia. Wystarczy spojrzeć na różnicę w liczbie łączy niezbędnych do skonstruowania prostego GUI w C ++ Win32 vs C #.

Powrót w moich rodzimych kodowania dni, głównie pisał symulacje matematyczne, który biegł na superkomputerach. Mieli brzydkie interfejsy CLI i skupiali się głównie na algorytmach. Obecnie piszę w języku C # i produkuję piękne aplikacje GUI, ale zgubiłbym się, gdybym musiał stworzyć coś podobnego kalibru w języku ojczystym. Nawet w ramach takich jak QT, to nadal ma dwa razy więcej czasu, aby stworzyć coś w C ++ / QT niż miałoby to miejsce w języku C #.

Ilekroć widzę kogoś, kto napisał na dużą skalę, w pełni funkcjonalny aplikacji GUI w C / C ++, nie mogę pomóc, ale poczucie lęku i nutą zazdrości.

Jestem ciekawy, jak inni doświadczeni koderzy widzą języki zarządzane i niezarządzane. Czy widzisz kodu zarządzanego jako amator-owski ? Czy widzisz rodzimych programistów jako bardziej hardcore'owych ?


źródło

Odpowiedzi:

26

Moja codzienna praca jest obecnie w C ++, ale programowałem w kilku językach na tyle długo, że ledwo zauważam różnicę. Oto moje spostrzeżenia:

  • Wiele rzekomych nieefektywności w innych językach jest często ponownie wdrażanych przez programistów C ++ jako najlepsze praktyki. Dodamy wystarczającej kontroli null, array granic kontrolnych, rodzaj kontroli, sprawdzania poprawności danych wejściowych, itp w znacznym stopniu neguje żadnych korzyści prędkości wykonanie zdobyte przez język nie automatycznie robi te rzeczy, przynajmniej dla kodu, który nie jest przetwarzanie danych intensywne.
  • Że dodatkowe boilerplate staje się zakorzenione przyzwyczajenie po jakimś czasie, tak, że nie ma ochoty dodatkowej pracy i wystaje jak ból kciuka, gdy brakuje.
  • Kiedy programuję w języku „zarządzanym”, wciąż myślę o przydziale pamięci, aby upewnić się, że nie spowoduję wycieku pamięci. I nie może być wprowadzenie wyraźne delete, ale nadal jestem świadomy w moim umyśle punktu, w którym uzna to za śmieciarza kwalifikują się do usunięcia. Miałem bardziej trudne do rozwiązania problemy z pamięcią niskie wychodząc w Javie niż kiedykolwiek w C ++, prawdopodobnie dlatego, że w C ++ są one znacznie trudniejsze do zignorowania przez bardzo długi czas.
  • To samo dotyczy dynamicznego typowania. Nadal mam śledzić w głowie, czy parametr funkcja jest tablicą lub int, lub ciąg. W rzeczywistości wymaga większego wysiłku umysłowego, ponieważ ten typ nie jest dla mnie wyraźnie wymieniony.
  • Nowoczesny styl C ++ jest bardzo różny od ery sprzed C #. Zamiast zmieniać język, ludzie „odkryli”, jak korzystać z istniejących funkcji C ++ w unikalny sposób, aby uniknąć znacznego zarządzania pamięcią w przeszłości. Wzorce projektowe, które automatycznie zwalniają pamięć, są teraz bardzo powszechne.
  • O ile mi wiadomo, chociaż możliwe jest tworzenie aplikacji GUI tylko poprzez pisanie kodu, projektanci graficzni, tacy jak projektant QT, są zdecydowanie preferowaną metodą, przy czym kod wykorzystywany jest głównie do obsługi zdarzeń lub dostosowywania środowiska wykonawczego.
  • Języki, z których nie korzystałeś od dłuższego czasu, zawsze wydają się trochę niezdarne, nawet jeśli w większości pamiętasz składnię. Jeśli nie piszę Pythona przez rok, zapomniałem o wielu dziwactwach i przez pewien czas czuję się bardziej niezręcznie niż C ++, chociaż obiektywnie większość osób uważa python za „łatwiejszy” język.

Dzięki połączeniu tych wszystkich czynników, moich psychicznych modelowych pobytów dość spójne między kiedy programować w C ++ i innych języków, a różnice czuć się przeważnie jedynie składniowym. To prawda, że ​​wiele jest wynikiem treningu, zwyczaj, standardów kodowania i nowoczesnych wzorców projektowych zamiast wyposażony nieodłączną częścią samego języka C ++, ale porównanie jest nadal aktualna.

Myślę, że staram się powiedzieć, że z mojego doświadczenia wynika, że ​​szkolenie programisty robi znacznie większą różnicę niż język, którego używa.

Karl Bielefeldt
źródło
20

Czy widzisz zarządzany kod jako amatorski? Czy widzisz rodzimych programistów jako bardziej hardkorowych?

Nie.

Widzę różnice między inżynierem a programistą. Hardcore inżynier zawsze wybrać język / tech stos, który jest odpowiedni do wykonania zadania w najkrótszym czasie na akceptowalnym standardzie wykonawczego.

W dzisiejszych czasach, gdy moc procesora jest większa , częstotliwość faktycznej potrzeby wydobycia z komputera jak największej liczby możliwości przy użyciu niższego poziomu, języków rodzimych jest coraz mniejsza. Zwykle naprawdę nie ma na to uzasadnienia biznesowego. Wydajność zawsze przebije różnicę czasu wykonania o kilka milisekund.

Demian Brecht
źródło
+1, ale należy pamiętać, że jest to efekt ekonomiczny - jeśli cykl obliczeniowy kosztuje 1 mln USD, wówczas rządzi ekstremalna optymalizacja - w przeciwnym razie nie zawracamy sobie głowy komputerami ...
Gary Rowe
10
Tyle tylko, że widzimy niższą wydajność ogólna - uruchamia Word6 jak oświetlenie na nowoczesnym sprzęcie, Word2010 trwa minutę tylko obciążeniem. Dziś potrzebujemy tego superszybkiego sprzętu, aby nadążyć za programistami!
gbjbaanb
2
@gbjbaanb: Bez względu na to, co programiści wybrać dowolny wystarczająco duża codebase będzie powolny. IIRC, Word jest nadal napisany w C ++ (i chciałbym się założyć, że znaczna część całego starszego kodu Word 6 nadal istnieje).
Steven Evers
2
@ gbjbaanb, Word 2010 nie jest prostym przepisem programu Word 6 w .NET. Dodaje wiele innych funkcji i musi obsłużyć wiele innych scenariuszy użytkowania. Jest to o wiele, wiele większe zastosowanie niż Word 6.
Mircea Chirea
6

Niestety, Microsoft ma nas doprowadzić do scalenia „kod zarządzany” z C # /. Net bibliotek klas.

Istnieją dwa oddzielne i niemal niepowiązane rzeczy w grze tutaj.

  1. Fajne biblioteki .Net.

  2. Kod zarządzany.

C # oferuje zarówno w schludny, obsługiwane, pakiet łatwy w obsłudze dla jednej cenie.

C ++ posiada liczne biblioteki fajne, że zrobić niemal wszystko .Net robi. Zamiast oskarżać „native C ++” kod jako posiadające więcej „zawiłości, dziwactwa i dziwactw” niż C # /. Net kodu, można szukać lepszych bibliotek C ++.

Lepsze biblioteki pozwalają napisać piękny C ++ kod, również.

Ilekroć widzę kogoś, kto został napisany na dużą skalę, w pełni funkcjonalny aplikacji GUI w C / C ++, nie mogę pomóc, ale poczucie lęku i nutą zazdrości

Zła polityka. Zamiast tego należy dowiedzieć się, jakie biblioteki definicji klasy są używane. Ty też mógł korzystać z tych bibliotek.

To wszystko o narzędziach. Bez użycia narzędzi, jesteśmy tylko zwierzęta w spodniach.

„Język C ++” nie znaczy, należy wyrzucić wszystkie swoje narzędzia. Oznacza to, że musisz znaleźć dobre narzędzia. Microsoft nie jest już pomaga, więc trzeba tracić czasu na znalezienie odpowiedniego zestawu narzędzi.

S.Lott
źródło
+1 dla „Go dowiedzieć się, co używasz”, ale szczerze mówiąc myślę, że to nie jest bardzo miły dla zwierząt narzędzi wykorzystujących lub zwierząt, które zdarzają się nosić spodnie na okazję.
Ian Pugsley,
@Ian Pugsleya: Zwierzęta, które nosić spodnie, ale nie używaj narzędzia są prawdopodobnie w porządku z ich statusem zwierząt. Ale masz rację, że zwierzęta narzędzi wykorzystujących bez spodni może denerwować. Moja żona, na przykład, nie preferuje spodnie zużycia, a nie narzędzia użytku. Może nie przeczyta tego pytania.
S.Lott
Możemy tylko mieć nadzieję (i postawić na dość wysokich szansach-). Mówię tylko, że nie będę patrzeć na zwierzę wystarczająco inteligentne, by założyć spodnie ... na wszelki wypadek.
Ian Pugsley,
Tak, w przeciwieństwie do C # 's biblioteki standardowej C ++' s jest stary i brakuje nowoczesnych potrzeb (GUI, schłodzić interfejs Sieci, etc).
Moshe Revah
Microsoft ponownie pomaga Ci w C ++ w Windows 8 (cała powierzchnia programistyczna Windows 8 jest rodzimym kodem, a C ++ jest obywatelem pierwszej klasy wraz z C # i JavaScript): msdn.microsoft.com/en-us/library/windows/ apps / ...
Zach
5

Chodzi tu nie chodzi o programowaniu Hardcore lub coś podobnego, chodzi o kontrolę. Faktem jest, że C # oferuje wydajność kosztem kontroli. Jeśli piszesz program, który wymaga dużej ilości kontroli (ta pamięć jest zwalniane dokładnie teraz), to nie masz wyboru, ale na C ++. Jeśli trzeba zrobić to szybko, to być może trzeba użyć C #. Problem jest, że biblioteki wspierające dla C # są znacznie lepsze i bardziej aktualne niż przewidziane dla C ++. Na przykład, MFC jest bardzo, bardzo stary i to praktyki wiadomo, że są straszne, to było w większości napisane na długo przed Normalizacyjny. Jeśli Microsoft przykłada się trochę wysiłku do zapewnienia nowych bibliotek C ++, sprawdź na przykład nową licencję PPL w Visual Studio 2010, co dziwne, zadanie to staje się łatwe w C ++. I myślę, że migrują w ten sposób,

Z drugiej strony, kod zarządzany ma moduły wyrzucające elementy bezużyteczne i optymalizujące w czasie pracy specyficzne dla procesora i systemu operacyjnego, które mogą zapewnić natywnemu kodowi uruchomienie jego pieniędzy.

Słyszałem wiele zarządzanych zwolennicy język to powiedzieć, ale ja prawie nigdy nie widziałem, żeby było prawdziwe. Faktem jest, że nowe instrukcje procesora dostępne w nowszych procesorach po prostu nie oferują tak dużej przewagi, chyba że robisz bardzo trudną matematykę, w którym to przypadku nie możesz pozwolić sobie na nakład pracy związany z kompilacją lub interpretacją podczas uruchamiania -time i można po prostu użyć kompilator C ++ Intela korzystać z najnowszych i najlepszych w SSE tak. Zakres optymalizacji kompilatora C ++ jest ogromny w porównaniu z tym, co potrafi JIT, ponieważ JIT musi działać w ułamku czasu podczas działania programu, podczas gdy kompilatory C ++ są dość legendarne, ponieważ poświęcają swój słodki czas na kompilację.

Odśmiecanie nie jest niczym magicznym ani czymś podobnym - to wybór algorytmu. Czy to jest odpowiednie dla wszystkich sytuacji? Nie daleko - spójrz na bałagan IDisposable w C # i jak Java nawet nie zadała sobie trudu, aby rozwiązać ten problem, podczas gdy destruktory C ++ zamkną twoje pliki i zwolnią pamięć i zamkną gniazda itp. GC jest świetny dla niektórych programów , a nie dla niektórych innych.

DeadMG
źródło
Różnice między procesorami to coś więcej niż SIMD - chociaż Twój kompilator C ++ prawdopodobnie bierze pod uwagę potok tak samo jak twój JIT.
Peter Taylor
Środowisko wykonawcze, w którym można zbadać stan systemu i zidentyfikować każde odwołanie do nieprzypiętego obiektu, które może być kiedykolwiek osiągalne, może amortyzować wiele kosztów związanych z GC w sposób, który nie jest możliwy w C ++. W Javie lub C #, biorąc String foo,bar;pod uwagę, instrukcja foo=bar;wykona dwie instrukcje - ładowanie rejestru i magazyn rejestru. Stały czas realizacji, niezależnie od długości łańcucha. Czy C ++ może się zbliżyć?
SuperCat
2

Moim zdaniem natywny C / C ++, w porównaniu do C #, wygląda jak asembler do samego C / C ++. Kolejna złożona warstwa abstrakcji (nieprawdziwa prawda, ale powiedzmy tak), jak zawsze, zapewnia łatwiejszy rozwój, ale pewne zmniejszenie prędkości i nadmierne zużycie pamięci. Tak więc, jak widzę, dzieli się na różne kategorie, tworząc nowe podtypy programistów.

Btw ze względu na poziom abstrakcji C # jest niesamowicie szybki, microsoft wykonał świetną robotę.

Petr Abdulin
źródło
2

Są programiści amatorzy, a nie języki amatorskie. Języki, które mają wszystkie (przynajmniej większość z nich) swój cel.

Obecnie pracuję nad silnikiem obliczającym ubezpieczenia stosowanym do testowania systemu produkcyjnego. System produkcyjny został wykonany w C, nasz silnik jest wykonany w Javie i od dłuższego czasu przewyższamy silnik C, będąc jednocześnie znacznie bardziej produktywnym. Nie dlatego, że Java jako taka jest szybsza niż C, jest po prostu wystarczająco szybka, a nasze algorytmy są lepsze, zaimplementowaliśmy je łatwiej, moglibyśmy szybciej i lepiej testować i refaktoryzować nasz kod.

Napisałem również kod testowy, aby porównać wyniki obliczeń z zawartością produkcyjnej bazy danych: nie w C, nie w Javie, ale w Ruby. Ponownie jest wystarczająco szybki i wymaga znacznie mniej kodu, więc jest łatwiejszy do wdrożenia, łatwiejszy do przetestowania, łatwiejszy do rozszerzenia.

I nie czuję się amatorski bez względu na to, jakiego języka używam, czuję się tak tylko wtedy, gdy popełniam głupi błąd, który nie powinien był się wydarzyć.

Tomasz Stańczak
źródło
1

W ubiegłym roku firma Pracuję były reverse engineering komunikacji kod CRC przez brute force (dostaliśmy go w końcu). 3 Deweloperzy każdy miał tam własną wersję, Borland C, C # .NET 2008, VB6. VB6 był oczywiście powolny, Borland C był szybki, ale C # .net tylko wychłostać go 12 razy szybciej. Nie było tak, jak się spodziewaliśmy.

Craig White
źródło
1
Czy używają tego samego algorytmu krok po kroku? Mogą obliczać ten sam wynik, ale elementarne kroki matematyczne zastosowane do uzyskania wyniku mogą być różne, a wydajność zależy od surowej liczby etapów elementarnych, która z kolei zależy od tego, jak rozkłada się na nie „formuła”.
rwong
Starszy kompilator C nie może być przy użyciu najnowszych instrukcji procesora (tj SSE2 i późniejsze)
GrandmasterB
1
Wszystkie trzy języki skompilować do zoptymalizowanego kodu natywnego (VB6 / C ++ w czasie kompilacji, .NET podczas JIT). Więc pewnie pomiaru różnic między swoimi programistów raczej niż pomiędzy językami programowania.
nikie
@nikie JIT! = kompilacja. A jakość kompilatorów jest różna. Widziałem dokładnie taki sam algorytm wykonać znacznie szybciej, gdy napisany w C ++ (bez wywołania API, tylko odwołania do tablic, pętle i prosta arytmetyczna) niż w Javie, pomimo całej gadaniny o JIT.
quant_dev
1
@quant_dev: Z mojego doświadczenia nie ma żadnego panaceum ;-) Moje doświadczenia z JIT .NET jest to, że różnica między JIT i MSVC ++ jest bardzo mała. Bardzo wątpię w 12-krotny sposób dla tego samego kodu.
nikie
1

Zależy to od wielu rzeczy, ale w gruncie rzeczy wszystko inne jest równe, tak, natywny kod jest bardziej „hardkorowy” niż kod zarządzany.

Myślę, że to zwykle złe, choć do normalnej aplikacji biznesowej, ponieważ oznacza to, że przeciętny programista musi wkładać więcej energii umysłowej w aspektach pozazawodowych ich kodu.

John Bickers
źródło
1

Mój program to coś, co można najlepiej opisać jako C ++ jak Java. Moja opinia jest można osiągnąć ten sam poziom niski programowania w Javie, ale jest to o wiele trudniejsze niż niskopoziomowego programowania w C ++. Jednak zwykle trzeba to programowanie niskim poziomie w niewielkiej części kodu i gdzie nie jest wymagana udało język jest bardziej wydajne.

Peter Lawrey
źródło
1

Natywni programiści zwykle zyskują reputację bardziej hardkorowych, ponieważ czują się bardziej hardkorowi i zachowują się w ten sposób. Natywni programiści są szkoleni w systemie, który nie toleruje żadnych błędów, ponieważ nieuchronnie prowadzą one do poważnych awarii lub nieograniczonych wycieków pamięci. W szczególności .NET pozwala na leniwe włamania, takie jak próbowanie / złapanie wszystkiego, co pozwala programistom na uniknięcie myślenia o podstawowym problemie („ czasami po prostu zgłasza InvalidOperationException. Nie potrafię tego wyjaśnić, po prostu złapmy wszystko. To kod jest krytyczny! ”). To wcale nie jest czarno-białe, ale moje obserwacje wyrosły w niezarządzanym świecie i teraz pracują w zarządzanym kodzie w pełnym wymiarze godzin.

Ponadto zarządzani programiści mają również dostęp do znacznie czystszych i lepiej zorganizowanych BCL. To często zachęca ich do odkrywania, co faktycznie dzieje się pod przykryciem. To samo można powiedzieć o, powiedzmy, STL lub Boost, ale biblioteka klas .NET jest często wystarczająco dobra, aby czasami być intelektualnie leniwym.

To powiedziawszy, napisanie dobrego, zarządzanego programu do wysyłki wymaga dużo pracy. Oznacza to wykonywanie profilowania pamięci i procesora, testów jednostkowych i analizy kodu w podobny sposób, jak robią to niezarządzani programiści. Programiści niezarządzani zazwyczaj rozumieją, jak to się dzieje, a programiści zarządzani zwykle obejmują więcej tych, którzy tego nie rozumieją.

Znowu nie czarno-biały. Jest wielu leniwych intelektualnie niezarządzanych programistów i hardkorowych programistów. Żadna z definicji nie jest bardziej elitarna niż druga.

Kevin Hsu
źródło
0

Czy widzisz zarządzany kod jako amatorski? Czy widzisz rodzimych programistów jako bardziej hardkorowych?

Między tymi dwoma światami jest luka i nie rozumiem, dlaczego: systemy zarządzane są gdzieś zapisane w natywnym kodzie (na końcu wszystko działa „w asemblerze”). To, co chcę zobaczyć (jeszcze w moim życiu), to system konstruowania aplikacji, w którym wszystkie pod-zadania aplikacji będą napisane we właściwym języku.

ern0
źródło
Opisany przez ciebie system konstruujący aplikacje to kolejny (i miejmy nadzieję lepszy) język programowania.
David Thornley,
Nie znam .NET, ale AFAIK to mieszany system językowy, który ma wspólny format wykonywalny obsługiwany przez maszynę wirtualną i ogromną bibliotekę, z której można korzystać w dowolnym języku .NET. Ten sam system byłby miły w świecie natywnym / skompilowanym. Oczywiście niezależne od platformy.
ern0
0

Kod macierzysty stał się łatwiejszy od czasu wydania Go . Łatwiej zarówno czytać, jak i pisać niż Java i C #. Chociaż GUI programowania z Go, jak na razie, nie jest bardzo miła (Wziąłem szybki rzut oka na opcjach).
Staram się nie oceniać go za to brak dużej społeczności i różnych bibliotek w porównaniu do C # (na przykład), ponieważ jest nadal uważane za nowe.

Mosze Revah
źródło