Kompatybilne nowoczesne alternatywy dla C / C ++ [zamknięte]

38

Zastanawiam się nad napisaniem nowego oprogramowania. Wydajność będzie miała kluczowe znaczenie, więc uważam, by nie używać interpretowanego języka, języka lub warstwy emulacji (czytaj java).

Co prowadzi mnie do myślenia o użyciu C (lub C ++), jednak oba są dość długie w zębie. Dawno też nie korzystałem. Doszedłem do wniosku, że w ciągu ostatnich 20 lat ktoś prawdopodobnie stworzył coś, co jest dość popularne, miłe do kodowania i skompilowane.

Jakie są bardziej nowoczesne alternatywy dla C do pisania wysoce skompilowanego kodu?

Jeśli C ++ jest inną bestią niż 15 lat temu, zastanowiłbym się nad tym, myślę, że miałem założenie, że ma pewne nieodłączne problemy.

Równoległość byłaby ważna, ale prawdopodobnie nie na wielu komputerach.

Jeremy French
źródło
21
Współczesne C ++ różni się radykalnie od C. Jest znacznie bardziej porównywalne z czymś takim jak Java lub C # niż w C, z tym wyjątkiem, że zawiera deterministyczne niszczenie zamiast wyrzucania elementów bezużytecznych, a także ma niezdefiniowane zachowanie, ponieważ nie działa na maszynie wirtualnej ani nie jest zarządzane środowisko. Inną alternatywą jest D, który jest przyzwoitym językiem, ale wciąż bardzo niedojrzałym pod względem bibliotek i wsparcia.
Charles Salvia
11
Czy możesz rozwinąć część „wydajność będzie kluczowa”? Dlaczego będzie to miało znaczenie krytyczne? Czy już coś zmierzyłeś?
JesperE
3
15 lat to eon pod względem komputerowym i od tego czasu ludzie tacy jak Ericsson używają funkcjonalnych języków, takich jak Erlang, do obsługi rozproszonych, odpornych na awarie, działających w czasie rzeczywistym aplikacji non-stop w swoich systemach wbudowanych! Nie zakładaj, że tylko C ++ może zapewnić pożądaną wydajność, lepiej jest rzucić więcej sprzętu na problem i zaoszczędzić sobie dużo czasu na wdrożenie w innym języku.
Mark Booth
5
@JeremyFrench: ale zadajesz pytanie w oparciu o fałszywe założenie, że wydajność => kompilacja statyczna.
vartec
4
Za to, co jest warte, w większości przypadków Haskell służy jako mój zamiennik C ++.
Jon Purdy,

Odpowiedzi:

54

Opracowywany jest język o nazwie The Rust Programming Language, który ma podobne cele jak C ++, w szczególności abstrakty o zerowym koszcie i doskonałą kontrolę nad zarządzaniem pamięcią. To powiedziawszy, jest to prawdopodobnie najbardziej znaczący nadchodzący kandydat, mimo że jest jeszcze bardzo młody.

Oprócz Rust naprawdę nie ma innych popularnych alternatyw, które kompilowałyby się do kodu natywnego. Oczywiście są też Delfy i D, ale nie są tak szybkie, popularne ani używane. Język Google Go może być kandydatem, ale wciąż jest bardzo młody i ma nieco inną domenę.

Należy jednak pamiętać, że C # (przy założeniu platformy Microsoft) i Java mogą nie być tak wolne, nawet jeśli działają na maszynie wirtualnej; kompilacja kodu just-in-time może dokonać optymalizacji, których tradycyjne kompilatory z wyprzedzeniem nie są w stanie zastosować z powodu braku informacji o stanie programu i środowisku.

Szczerze mówiąc, osobiście nie uważam C za kandydata, jeśli C ++ jest opcją, głównie dlatego, że współczesne C ++ jest bezpieczniejsze, działa na wyższym poziomie abstrakcji, jest bardziej ekspresyjne i praktycznie nie ma utraty wydajności w stosunku do C (w niektórych przypadkach C ++ jest znacznie szybszy). Krótko mówiąc, C ++ zapewnia wszystko, co zapewnia C i więcej. Większość funkcji C jest uważana za „przestarzałą”, a lepszą, bezpieczniejszą, szybszą i bardziej intuicyjną alternatywę zapewnia standardowa biblioteka C ++.

zxcdw
źródło
5
Nie powiedziałbym, że funkcjonalność C jest „przestarzała”, w oficjalnym znaczeniu - po prostu prawie nie ma powodu, aby kiedykolwiek używać funkcji biblioteki C, surowych wskaźników lub tablic C w C ++.
Charles Salvia
20
+1 za rozmowę z „fałszywym założeniem dotyczącym wydajności” jest wymagane.
Telastyn
3
@gbjbaanb spróbuj skompilować z Visual Studio i MinGW pod Windows i powodzenia: | spróbuj również przekonać osobę, która daje skompilowaną bibliotekę skompilowaną za pomocą jednego z tych narzędzi, która nie wie nic o ABI, że jest w błędzie i powinien dać ci źródło tej biblioteki lub nauczyć się, jak rekompilować i podać odpowiednie specyfikacje . czasem horror.
user827992,
5
@paxRoman: możesz pisać małe programy w C ++ i pisać je bezpieczniej niż w C.
kevin cline
3
@JBRWilkinson O ile mi wiadomo, popularność Objective-C nie istnieje poza platformą Apple.
zxcdw,
19

Istnieje również Ada , która kompiluje się do kodu natywnego i jest przenośna na różnych platformach w granicach standardowej biblioteki. Język żyje i ma się dobrze, a najnowsza standardowa aktualizacja języka jest obecnie w toku (znana jako Ada 2012).

Szybkie podsumowanie dla osób nieznających Ady:

  • Mocno napisane
  • Wbudowana obsługa współbieżności
  • Obiektowy lub proceduralny, w zależności od wymagań
  • Obsługiwane przez GNU toolchain (GCC zawiera interfejs użytkownika Ada)
  • Doskonały również do tworzenia oprogramowania, tj. Gdy potrzebujesz bezpośredniego interfejsu ze sprzętem
  • Obsługuje ogólne programowanie (ogólne pakiety, procedury, funkcje)
  • Funkcje obsługują tworzenie oprogramowania na dużą skalę (pakiety, pakiety potomne, osobna kompilacja, ścisłe rozróżnienie między specyfikacją a implementacją)
Harmonogram
źródło
1
Nie wspominając już o Zadaniach Ada (Równoległość!)
NWS
6
+1: Próbowałem nauczyć się trochę Ady i myślę, że to bardzo solidny i czysty język. Szkoda, że ​​nie ma tylu zadań, co w przypadku innych języków programowania.
Giorgio
3
Dobra wzmianka, szukałem czegoś bardziej „nowoczesnego”, ale zapomniałem o Adzie
Jeremy French
4
@Jeremy French: Jakich funkcji szukasz w bardziej „nowoczesnym” języku, którego Ada nie oferuje?
Giorgio
17

Jeśli C ++ jest inną bestią niż 15 lat temu, zastanowiłbym się nad tym, myślę, że miałem założenie, że ma pewne nieodłączne problemy.

15 lat temu nie było standardu C ++. Drugi został opublikowany w zeszłym roku. Najlepsze praktyki C ++ bardzo się zmieniły w ciągu 5 lat po opublikowaniu standardu 98 i zmieniają się ponownie wraz z opublikowaniem standardu 11.

AProgrammer
źródło
12

Dlaczego ludzie zawsze nalegają na poszukiwanie nowych języków?

C ++:

  • Jest językiem numer 4 według TIOBE, ale ściga całą konkurencję, jeśli jest połączona z C.
  • Ma wiele ram
  • Jest bardzo łatwy do kodowania
  • Jest bardzo łatwy do dostrojenia
  • Jest bardzo wydajny
  • Jest bardzo bezpieczny
  • Ma bardzo dobre wsparcie branży
  • Jest wieloplatformowy
  • Nie wymaga dodatkowych maszyn wirtualnych / ram / bałaganu wdrażania, jeśli zostanie to wykonane poprawnie
  • Z łatwością znajdziesz pracę
  • Posiada wszystkie niezbędne rzeczy do zbudowania .so / .dll do uruchomienia na bardzo starych systemach
  • Łatwy w rozwiązywaniu problemów
  • Bardzo drogie
  • Bardzo dynamiczny
  • i wiele innych interesujących rzeczy

Jedynym minusem C ++ jest to, że musisz się trochę nauczyć. to jest to!

Porównaj to z innymi językami, które są jednym lub więcej z:

  • Wąsko obsługiwane (OCML, Fortran, ...)
  • Slow (Java, JavaScript)
  • Eksperymentalny (Silverlight)
  • Ruchomy cel (.NET 1/2/3/4/5? Który z nich jest teraz ostatni?)
  • Platforma zablokowana (.NET)
  • Mają słabe wsparcie frameworka (Fortran)
  • Ma małe społeczności (wszystko poza pierwszą 10)
  • Czy koszmar do rozwiązania (Wszystko z wysokopoziomowymi, odpornymi na błędy koncepcjami i innymi rzeczami)
  • Wymaga 500 MB preintallacji na komputerze klienta (JVM / .NETVM)

IMHO, im mniej języków będziemy używać i wspierać, tym lepsza będzie sytuacja.

Powoduje to automatyczne ulepszenia ram dla języka, wsparcie, dokumentację, prace komitetów normalizacyjnych, lepsze książki, więcej wiedzy, łatwiejsze do obsługi oprogramowanie, lepsze wzorce, dłuższe cykle obsługi języka i bardziej wykwalifikowany kod napisany w języku.

Wiem, że ludzie będą głosować za tym, ale pomyśl o tym, naprawdę.

Koder
źródło
71
C ++ „bardzo łatwo jest napisać kod” jest po prostu absurdalnie niepoprawny, przepraszam. Jest to niezwykle trudny język do nauki, a nawet jeśli używasz nowoczesnych idiomów C ++ i unikasz wskaźników, będziesz musiał się zmierzyć z mnóstwem zagadkowych błędów kompilatora i błędów środowiska uruchomieniowego, zanim się go zawiesi. Nawet po opanowaniu składnia dość często przeszkadza. Safe C ++ często używa bałaganu zagnieżdżonych szablonów, które generują ogromne ilości kodu typu „Boiler Plate”.
Konrad Rudolph
20
Bardzo ekspresyjne i bardzo dynamiczne nie brzmią jak typowe cechy C ++, w porównaniu do języków dynamicznych.
vartec
29
@ gbjbaanb „nieco trudniejszy do nauczenia się” jest znowu absurdalnie nie na miejscu. Przepraszam. Programuję wszystkie te języki od lat, wyraźnie wolę C ++ (i robię w nim najpoważniejsze programowanie), ale powiedzenie, że to łatwe, jest po prostu całkowicie mylące. I nie mówię o wymyślnych metaprogramowaniu, mówię o błędach kompilatora spowodowanych przez zwykły kod, spowodowanych ukrywaniem nazw, ADL, constproblemami z poprawnością i tym podobne. Każdy, kto przeczytał Effective C ++ (jak twierdzi Coder) i utrzymuje, że C ++ jest łatwy, ma rozłączność umysłową.
Konrad Rudolph
13
@gbjbaanb Jestem programistą C ++. Po raz kolejny nie sądzę, aby C ++ było łatwe. I ten wątek z komentarzem spotkał się z niechęcią na czacie w C ++. Więc to nie tak. Różnica między gotchasami C ++ a gotchasami innych języków polega na tym, że jeśli nie wiesz o nich w innych językach, prawdopodobnie nic ci nie będzie. W C ++ jesteś tostem. I nawet jeśli o nich wiesz, nadal możesz uzyskać kilka stron ekranowych błędów kompilacji dla jednego błędu (znowu mi się dzisiaj zdarzyło). I chociaż błąd można łatwo naprawić (literówka), przeanalizowanie tego wszystkiego zajmuje trochę czasu.
Konrad Rudolph
6
Kiedy popularny język był kiedyś dobry? PHP jest niezwykle popularny i żadna poważna osoba nie uważa, że ​​jest to „dobry” język, nawet ze względu na swoją niszę. Jedyną „dobrą” rzeczą w popularnych językach jest to, że istnieje wiele bibliotek ułatwiających programowanie niektórych domen. Sam C ++ jest pełen frustracji.
weberc2
11

C / C ++ jest dość długi w zębie ... to dobra rzecz . Oznacza to, że zostały zaprojektowane wystarczająco dobrze (ahem), że nadal są bardzo użyteczne, że wiele osób używa ich do codziennych zadań i że znajdziesz dużą grupę programistów, którzy są w nich ekspertami. Dojrzałość należy cenić.

Jeśli spędzasz cały swój czas na szukaniu czegoś nowego, tylko dlatego, że jest to coś nowego i uważasz, że to musi być jakoś lepsze, czeka Cię wiele rozczarowania. Dotyczy to języków oprogramowania, systemów GUI (uwaga, Microsoft i Gnome) oraz miłośników (uwaga, młode panie :))

Trzeba przyznać, że jeśli masz doświadczenie w posługiwaniu się C ++ w wieku 20 lat, kiedy kod C ++ był ogólnie kodowany podobnie jak C, to być może nadszedł czas, aby ponownie ocenić język, wszystkie funkcje, które były tam w ciągu dnia, które nigdy nie były w pełni używane, są używane o wiele więcej dzisiaj, a kilka wysiłków normalizacyjnych nieco rozszerzyło język, aby wyglądał znacznie inaczej niż te stare zmiany w stylu C. Nie to, że C też jest zły - jest to także idealny język dla wielu rodzajów zadań kodowania!

gbjbaanb
źródło
16
Myślę, że C i C ++ są przykładem komentarza Hoare na temat projektowania oprogramowania: albo uczyń to tak prostym, że oczywiście nie ma braków, albo spraw, aby było tak skomplikowane, że nie ma oczywistych braków.
TMN
1
W jaki sposób powtarzające się luki w zabezpieczeniach spowodowane przez jakąś formę bufora wykorzystują „dobrą rzecz”, bez względu na to, ile lat ma język? Czy to naprawdę różni się od argumentowania o kontynuacji ustalonego małżeństwa po wielokrotnym wykorzystywaniu?
user2864740
@ user2864740 sugerujesz rozwód, ponieważ żona jest stara i chcesz nowego, ekscytującego modelu ... Mówię, że trzymasz się tego, co masz, ponieważ znasz słabości i dziwactwa. Ile nowych, fajnych języków rozwiązuje problemy, takie jak przepełnienie bufora, a następnie okazuje się, że mają subtelne sposoby na przepełnienie buforów? Więc co jest lepsze - przepełnienie, którego możesz uniknąć, nie będąc leniwym lub używając właściwej konstrukcji, lub tej, w którą wpadasz, ponieważ nie wiedziałeś, że tam jest?
gbjbaanb
@gbjbaanb Nie, nigdy tego nie powiedziałem. Narysowałem analogię konkretnie do szkód spowodowanych nie poprawieniem kontekstu sytuacji. Generalnie jestem dość racjonalny i nie mam skłonności do wybierania „fanboi” popularnych tematów lub narzędzi (to po prostu moja natura). Ponadto C i C ++ są różnymi językami; ale oba są uzasadnione z tego samego powodu. I na tym polega problem.
user2864740,
8

Obecny standard C ++ to C ++ 11 , który został opublikowany w 2011 roku. Więc nie jest to standard 20 lat. Między nimi było wiele standardów. Każdy z nich wprowadza liczne ulepszenia wydajności.

Kompilatory są również stale ulepszane. Są znacznie lepsi w optymalizacji, niż kiedyś.

Poprawiły się również formaty plików wykonywalnych, 20 lat temu miałeś a.out , teraz masz ELF .

Ogólnie rzecz biorąc, sugestia, że ​​C ++ nie zmieniła się w ciągu 20 lat, nie może być dalsza od prawdy.

Pamiętaj też, że C i C ++ to bardzo różne języki.

vartec
źródło
2
Moje założenie było takie, że coś, co po raz pierwszy wymyślono 20 lat temu, będzie miało nieodłączne ograniczenia architektoniczne, które można ulepszyć jedynie pustą tablicą. Myślę, że to założenie mogło być błędne.
Jeremy French
4
@JeremyFrench: Podoba Ci się architektura x86?
TMN
2
@TMN czy to dowodzi, czy obala moje założenia?
Jeremy French
6
Oryginalna architektura x86 była paskudnym kompromisem między wsteczną kompatybilnością z 8080 a zestawem funkcji konkurujących z 68000 i NS32032. Segmentowana pamięć (ze wskaźnikami „daleko” i „blisko”), tylko 4 rejestry ogólnego przeznaczenia, kodowanie instrukcji o zmiennej długości, ponad 50 odmian instrukcji JMP, multipleksowana trójstanowa magistrala systemowa ... A jednak dzisiaj to samo podstawowy projekt staje się silniejszy niż kiedykolwiek, po tym, jak wiele „lepszych” czystych projektów (Alpha, MIPS, PowerPC) nie udało się go wyprzeć.
TMN
1
@JeremyFrench nie, twoje założenie nie było błędne, przynajmniej w przypadku C ++. Funkcje C ++ 11 są zdecydowanie przydatne; jednak w tym momencie są po prostu bardziej gównem na kupie gówna. Próbują wbudować funkcje współczesnych języków, ale aby poradzić sobie z istniejącym bałaganem C ++, muszą mieć wyjątki, a wyjątki te będą miały wyjątki i tak dalej.
weberc2
6

Nie jestem wielkim ekspertem w tym języku, ale myślę, że OCaml może być interesującą opcją.

OCaml to skompilowany, funkcjonalny / obiektowy język. Dla porównania wydajności z C ++ zobacz C ++ vs OCaml: Porównanie ray tracera . Oczywiście jest to bardzo konkretny przykład i należy przeprowadzić bardziej szczegółowe testy, aby lepiej poczuć wydajność OCaml.

Giorgio
źródło
Czy downvoter może podpowiedzieć, jak można poprawić tę odpowiedź? Dzięki.
Giorgio,
3

Zależy od tego, co zrobi Twój produkt. Jeśli wydajność jest naprawdę krytyczna, to najczęściej wybieranym językiem jest FORTRAN . Nie wykluczałbym również Javy - jest ona używana w wielu aplikacjach do handlu finansowego na dużą skalę. Erlang jest wart spojrzenia, jeśli twoja domena problemowa wymaga wysokiej współbieżności. Cel C jest fajny, chociaż nie wiem, jak dobrze jest obsługiwany poza ekosystemem Apple (poza kompilatorami i podstawowym środowiskiem uruchomieniowym). Słyszałem też dobre rzeczy na temat wydajności Haskella, ale nie jestem pewien, czy jest to wydajność absolutna, czy tylko wydajność w stosunku do innych języków funkcjonalnych.

TMN
źródło
2
każde zadanie finansowe, na które patrzyłem, wymaga programistów C / C ++, a nie Java. Z doświadczenia z Javą nie widzę żadnych, które mają wysoką wydajność, chyba że rzucisz na to mnóstwo sprzętu.
gbjbaanb
Na Wall Street oraz w różnych bankach inwestycyjnych w USA i Wielkiej Brytanii działa wiele systemów transakcyjnych Java. Jest również dość intensywnie używany na giełdzie Chicago Mercantile Exchange.
TMN
3

Kiedy mówisz, że twój projekt jest wrażliwy na wydajność, masz na myśli każdą jego linię kodu? Lub, jak zwykle, czy jest mniejszy procent, który ma krytyczny wpływ na wydajność, podczas gdy reszta to zwykły kod biznesowy młyna?

Po udzieleniu odpowiedzi, jakie jest większe ryzyko dla Twojego projektu: że wynik końcowy jest zbyt wolny lub że nigdy go nie ukończysz?

Zakładając, że odpowiesz na drugie pytanie dla obu, powinieneś rozwijać się w języku wyższego poziomu, który obsługuje natywną interop (wszystkie mają Python, Ruby, .Net Family). Najpierw zakończ projekt. Następnie profiluj, optymalizuj, spłucz, powtórz. Dopiero po tym rozważ rozważ przepisanie segmentu wyboru aplikacji w kodzie natywnym i zintegrowanie tego kodu natywnego z gotowym produktem.

Chris Pitman
źródło
Gdy jest to Java, nie możesz jej uratować, jeśli działa zbyt wolno.
Koder
6
@Coder Java ma FFI (JNI), który pozwala „siać spustoszenie” w wybranym języku. Jeśli więc dobrze zaprojektowałeś interfejsy, możesz po prostu zastąpić implementację Java rodzimą. Platforma Java jest dobrze przemyślana.
K.Steff
1

Vala jest podobny do Java i C #, kompiluje się do kodu natywnego (lub kodu źródłowego C, jeśli wolisz) i jest bardzo szybki . Wymaga GLib dla bitów obiektowych i jest napisany przez hakerów Linuksa dla hakerów Linuksa, więc jeśli twoją domeną jest Windows, może nie być zbyt dobry.

Przywróć Monikę
źródło
1

Objective-C to nowoczesna, skompilowana alternatywa dla prostych C i C ++. Ma zarówno zbieranie pamięci, jak i deterministyczne zarządzanie pamięcią, a środowisko wykonawcze OO z przekazywaniem wiadomości zostało zoptymalizowane pod kątem wydajności.

Jest dostępny przez GCC i CLang, a istnieją biblioteki aplikacji, takie jak GNUStep i Cocotron, które działają na różnych platformach.

Jeśli wykonujesz wysokowydajną pracę, zakładam, że jest to rodzaj pracy polegającej na łamaniu liczb lub innej pracy typu dziel i zwyciężaj zamiast interfejsu użytkownika, co oznacza, że ​​możesz wykonać interfejs w dowolnym języku, który jest dla Ciebie najłatwiejszy, np. HTML przez mini serwer HTTP.

JBRWilkinson
źródło
0

Nigdy go nie używałem, ale mój przyjaciel przysięga Cython, który pozwala używać prymitywów w stylu C w krytycznych pod względem wydajności częściach kodu, zachowując ogólną składnię Pythona i będąc w stanie w pełni wykorzystać konstrukcje wyższego poziomu w celu ograniczenia rozwoju czas wszędzie indziej.

Dan Neely
źródło