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 ?
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.
Fajne biblioteki .Net.
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ż.
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.
źródło
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,
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.
źródło
String foo,bar;
pod uwagę, instrukcjafoo=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ć?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ę.
źródło
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ć.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło