Czy istnieje język między C a C ++?

18

Naprawdę podoba mi się prosta i przejrzysta natura C: kiedy piszę kod C, czuję się nieobciążony „nieszczelnymi abstrakcjami” i prawie zawsze potrafię zgadywać, co do zespołu, który tworzę. Podoba mi się również prosta, znana składnia C.

Jednak C nie ma tych prostych, pomocnych rysunków, które C ++ oferuje jak klasy, uproszczona obsługa bez sznurowania itp. Wiem, że wszystko można zaimplementować w C za pomocą tabel skoków i tym podobnych, ale czasami jest to trochę trudne. i niezbyt bezpieczny z różnych powodów.

Nie jestem jednak fanem nadmiernego nacisku na obiekty w C ++ i jestem nieśmiały w stosunku do „nowego” operatora i tym podobnych. Wydaje się, że C ++ ma tylko kilka za dużo czkawek, aby na przykład być używany jako systemowy język programowania.

Czy istnieje język między C i C ++ w skali widżetów i baz danych?

Oświadczenie: Mam na myśli wyłącznie pytanie oparte na faktach. Nie zamierzam cię gniewać, ponieważ nie podzielam twojego poglądu, że C {, ++} jest wystarczająco dobry, aby zrobić wszystko, co planuję.

Robert Martin
źródło
10
Mówisz, że twoje pytanie jest „czysto faktyczne”, ale dyskontujesz c ++, ponieważ „wydaje się”, że ma zbyt wiele czkawek. Co to są czkawka i czy są one uzasadnione powody do dyskontowania c ++?
whatsisname
2
Jaka jest „skala widżetów i doodadów”? Jeśli chcesz prawdziwych odpowiedzi na pytanie „czysto faktyczne”, powinieneś unikać bezsensownych wskaźników.
Caleb
2
A kilka rzeczy, które podajesz w C ++, zdradzają pewne dezinformacje. newjest przede wszystkim rozbudowany, mallocktóry może również zająć się inicjowaniem pamięci. Dzięki „nowemu umieszczeniu” operator newmożesz zdecydować, w jaki sposób i gdzie przydziela pamięć. A jeśli chodzi o akcentowanie obiektu: kilka wierszy nad tobą stwierdza, że ​​uważasz klasy za „prostą, pomocną pomoc”. Uzupełnić swój umysł!
25
Użyj C+ Diclaimer: Przepraszam, nie mogłem t resist. It1 kwietnia;)
knut
2
Brzmi to okropnie podobnie do hipotezy continuum i prawdopodobnie z tą samą odpowiedzią. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Odpowiedzi:

29

Mogą to być droidy, których szukasz ...

Idź - http://golang.org/

D - http://dlang.org/

Rdza - http://rust-lang.org/

Jacks_Gulch
źródło
5
@dtech: D ma bezcelowe GC / „Wszystko dziedziczy po Object” / Wartości muszą ssać crappery. Mam już do tego C # i faktycznie ma przyzwoite narzędzia. Idź, przyznaję, że moja pamięć o tym, dlaczego ją odrzuciłem, jest nieco mglista, ale jak pamiętam, wycięła kilka bardzo przydatnych funkcji.
DeadMG
4
-1 dla „jaki powinien być C ++”. C ++ jest tym, czym jest, a jeśli nie możesz sobie z tym poradzić, to w dużej mierze twój problem. Możesz sobie z tym poradzić, używając języka, który bardziej Ci odpowiada, ale to nie znaczy, że C ++ powinien być taki, jak ten język.
back2dos
7
@DeadMG W D napisałeś 2 znaczące stwierdzenia: GC jest obowiązkowe i wszystko musi być przedmiotem. Oba są w błędzie. Doprowadziło mnie to do wniosku, że twój wniosek opiera się bardziej na ignorancji niż na wiedzy. Muszę się zgodzić z CodexArcanum.
deadalnix
5
@deadalnix: Technicznie możesz nie używać GC. Ale ponieważ nie masz sposobu, aby wiedzieć lub kontrolować, jakie funkcje biblioteki lub funkcje językowe używają GC, realistycznie nie ma sposobu, aby stworzyć program, który go nie używa. I nie można utworzyć klasy, która nie dziedziczy po Object. Ich wartości structsą poważnie wyważone w porównaniu do wartości C ++ - na przykład bez dziedziczenia, bez odwołań do wartości, więc niemożliwe jest stworzenie czegoś tak prostego jak klasa ciągu wartości w D, która jest tak wydajna, jak jej odpowiednik w C ++. To są fakty na temat języka D.
DeadMG
5
@DeadMG: Tworzenie struktur bez dziedziczenia jest cechą , a nie „ćwierkaniem”. To coś, co mieli rację, coś, co właściwie każdy język OO w historii, który nie nazywał się „C ++”, miał rację (w tym Simula, oryginalny język OO) i że C ++ popełnił błąd. Rodzaje dziedziczenia i wartości nie mieszają się. Łamie tożsamość obiektu, łamie substytucję Liskowa, łamie cały paradygmat OO.
Mason Wheeler,
19

Istnieje wiele języków (np. Java, Go, D, Objective-C), które są mniej więcej równoległe do C ++ lub próbują rozwiązać problemy, które autorzy zauważyli w C ++.

Przynajmniej IMO, jednak wszystkie z nich działają znacznie gorzej niż C ++ w większości praktycznych celów.

Niestety, w oparciu o twój pozorny gust wiedzieć, jaki kod asemblera zostanie wygenerowany, prawdopodobnie możemy natychmiast wykluczyć Objective C i Java.

Teoretycznie uważam Go za najbardziej interesujący z nich - ma naprawdę oryginalne pomysły i ciekawe podejście do rozwiązywania problemów, które znacznie ułatwiają niektóre rodzaje kodu. Niestety, obecne kompilatory nie produkują bardzo dobrego kodu i w ciągu ostatnich kilku lat nie było dużo poprawy w tym zakresie.

To prawie pozostawia D jako jedyną, która ma szansę. Prawdopodobnie jest najbardziej podobny do C ++ (z tych), ale także najmniej prawdopodobne (IMO), aby naprawić to, co wydaje się postrzegane jako problemy.

Pozostawia to jedno oczywiste podejście: użyj C ++, ale używaj tylko tych części, które chcesz i unikaj części, które ci się nie podobają.

Jerry Coffin
źródło
13
+1 dla „użyj C ++ i unikaj części, których nie lubisz”. I sugerowałbym OP, aby dowiedział się więcej o C ++, ludzie często odmawiają przyjęcia rzeczy tylko dlatego, że nie znają ich wystarczająco dobrze.
Doc Brown
1
@DocBrown Może dlatego, że znajomość C ++ nie jest wystarczająco łatwa.
Malcolm
3
@Malcolm: oczywiście ciężko jest nauczyć się dogłębnie współczesnego C ++. Ale z drugiej strony, nie ma absolutnie żadnego powodu, aby „bać się nowego operatora”, co wydaje mi się przesądne.
Doc Brown
3
@Malcolm: Prawdopodobnie dlatego, że koncepcja jest bardzo prosta . Czy potrzebuję literału ciągowego UTF-32, czy literału ciągowego UTF-16? Cóż, jest to dość łatwe pytanie, zakładając, że znasz podstawy kodowania napisów wtf. A te mnóstwo trudnych funkcji? Istnieją z jakiegoś powodu . Na przykład ogólne elementy języka Java. Są żałosne w porównaniu do szablonów. Jasne, jest mniej do nauczenia się, ale to po prostu dlatego, że nie są zbyt przydatne. To jak nazywanie czegoś bardziej skomplikowanego niż Brainfuck.
DeadMG
3
@Malcolm: To wcale nie jest prawda. Na popularność ma wpływ 99999 rzeczy oprócz tego, czy język jest dobry / użyteczny.
DeadMG
16

Jednak C nie ma tych prostych, pomocnych rysunków, które C ++ oferuje jak klasy, uproszczona obsługa bez sznurowania itp. Wiem, że wszystko można zaimplementować w C za pomocą tabel skoków i tym podobnych, ale czasami jest to trochę trudne. i niezbyt bezpieczny z różnych powodów.

Nie jestem jednak fanem nadmiernego nacisku na obiekty w C ++ i jestem nieśmiały w stosunku do „nowego” operatora i tym podobnych.

Przepraszam kolego, alarm sprzeczności. Non-cstring obsługa wymaga new . To podstawowa konieczność. Nie możesz mieć std::stringbez new. Co więcej, new/ deletejest dokładnie równoważne z malloc/ freeale bezpieczniejszym , ponieważ gwarantuje poprawną budowę i zniszczenie obiektów hałdy (całkowicie konieczne!) I używa obsługi wyjątków zamiast NULLzwrotu, a zatem jest lepszy pod każdym możliwym względem. W C ++ 11 jest bardzo możliwe napisanie własnej newfunkcji stylu, ponieważ idealne przekazywanie pozwala na obsługę dowolnego konstruktora dowolnego typu. Jeśli jesteś nieśmiały new, to sugeruję, że po prostu tak naprawdę nie wiesz, z czym masz do czynienia.

Och, tak, a inteligentne wskaźniki sprawiają, że nigdy nie będziesz musiał sobie z tym poradzić.

Ponadto w C ++ nie ma nadmiernego nacisku. Nie musisz używać żadnego obiektu, którego nie chcesz. Możesz programować funkcjonalnie za pomocą lambdas i kiedy tylko chcesz. Nikt nie zmusza cię do korzystania z funkcji dziedziczenia i funkcji wirtualnych - w rzeczywistości wiele dobrych programów w C ++ rzadko wykazuje dziedziczenie. Szablony są potężniejszą i bardziej przydatną techniką abstrakcyjną. To nie jest Java.

DeadMG
źródło
1
Zgadzam się. O wiele lepiej jest używać C ++ w sposób, w jaki chcesz, niż szukać (prawdopodobnie gorszej) alternatywy
dtech
1
Nie sądzę, że lambdy wystarczą, aby programować funkcjonalnie. Oczekiwałbym również, że będę mieć operator kompozycji funkcji, curry i tak dalej. Zobacz także stackoverflow.com/questions/1981400/functional-programming-in-c . Dla mnie to prawie jak OOP w C ...
Giorgio
@Giorgio: Odpowiedzi na to pytanie mówią tylko: „Trudno!”. Nie pokazują żadnych dowodów na to, że jest to naprawdę trudne . Dlaczego miałbyś chcieć osobnego operatora dla kompozycji funkcji? f(g(x))wydaje mi się, że działa dobrze. Wierzę też, że curry można ogólnie zrobić jako bibliotekę w C ++ 11.
DeadMG
1
@DeadMG: Operator kompozycji funkcji jest dość dobrze ugruntowaną, podstawową koncepcją w programowaniu funkcjonalnym. Spodziewałbym się znaleźć go w języku wspierającym FP. Uważam, że bardzo wygodne (zwięzłe) jest zdefiniowanie złożonej funkcji jako kompozycji innych funkcji (np. Tak jak robisz z potokami w Uniksie) bez użycia zmiennych: k = h. g. f
Giorgio
1
@Giorgio: std::bindobsługuje takie rzeczy.
DeadMG
4

C jest prawie podzbiorem C ++, więc możesz po prostu użyć tych części C ++, które ci się podobają, a resztę zignorować. Możliwe jest nawet napisanie poprawnego C, który jest również poprawnym C ++.

Nie będziesz pisać idiomatycznego C ++, ale jest to tak „pośrednie”, jak to możliwe.

Alternatywnie, możesz sprawdzić inne języki, które próbują rozszerzyć C w kierunku czegoś potężniejszego, zwłaszcza D i Objective-C.

I wreszcie, w zależności od charakteru projektu, możesz wybrać podejście wieloligowe: podziel swój projekt na moduły i wybierz najbardziej odpowiedni język dla każdej części. Wadą tego jest to, że języki muszą ze sobą współpracować, co może być zbyt pracochłonne, by było warte wysiłku.

tdammers
źródło
Rzeczywiście, pracując w branżach takich jak tworzenie gier konsolowych, gdzie naprawdę chcieliśmy „języka pomiędzy C i C ++”, właśnie to zrobiliśmy. Użyliśmy podzbioru funkcjonalności C ++, z pewnymi ograniczeniami lub bardziej prawdopodobnymi ograniczeniami w pętlach krytycznych pod względem wydajności.
Carson63000,
3

Wystarczy zaoferować dziką, gotową odpowiedź: jeśli żądany język nie istnieje, dlaczego nie stworzyć go sam? Istnieje wiele potężnych narzędzi do rozwoju języka, od dawnych czasów gotowości (F) Lex i Yacc / Bison. Ponieważ znasz już C, potrzebujesz tylko swojego „kompilatora” do wyprowadzenia kodu C, do którego następnie używasz istniejącego łańcucha narzędzi.

Może to być zarówno prostsze, jak i potężniejsze niż myślisz. Zacznij od parsera / leksera dla C, a następnie dodaj dodatkowe funkcje, które Twoim zdaniem są ważne. Jeśli tabele skoków są irytujące, aby pisać ręcznie, wymyśl konstrukcję wyrażającą streszczenie i pozwól tłumaczowi napisać je dla ciebie. Zasadniczo jest to tylko wyższy poziom metaprogramowania przedprocesowego, wykorzystujący zewnętrzne narzędzia do wykonywania metaprogramowania. Zawsze wiesz dokładnie, jak będzie wyglądał końcowy zestaw, ponieważ znasz C i wiesz, w C, w jakie rozszerzenia języka będą się rozszerzać.

Oczywiście istnieją pewne ograniczenia dotyczące skuteczności, bez konieczności dodatkowej pracy. Dodanie pełnego systemu typu statycznego może być nieco bardziej skomplikowane niż chcesz, ale jest to opcja, którą możesz zbadać, jeśli okaże się, że masz na to ochotę. Twoje rozszerzenia DSL są tak potężne i złożone, jak masz na to czas i energię, a kto wie, może kiedyś twój język rozszerzeń stanie się „następnym C ++”.

CodexArcanum
źródło
2

Nie powiedziałeś, jakie funkcje C ++ są dla ciebie denerwujące. w każdym razie możesz wypróbować Objective-C. Kładzie nacisk na Object Oriented zamiast Standard Library na C ++.

zero
źródło
2
imho Objective-C to skromna próba wprowadzenia klas do C i gorszej pod wieloma względami do C ++. Ponadto jest bardzo mało używany poza Mac OS X / iOS.
dtech
1
@dtech: Ciekawe, mój były kolega, który nie jest fanem komputerów Mac (raczej Debianem / Linuksem), był przekonany, że Objective-C było znacznie czystszym rozszerzeniem OO w C niż C ++. Jednak nigdy nie próbowałem Objective-C, więc nie mam na ten temat zdania.
Giorgio
1
@dtech: W takim razie pokornie sugeruję, abyś ponownie przemyślał swoją opinię;) Objective-C dotyczy orientacji obiektowej i robi o wiele lepszą robotę niż C ++, ponieważ wprowadza przekazywanie wiadomości. Chociaż zgadzam się, że język pod wieloma względami jest gorszy od C ++, pod innymi względami jest równie lepszy.
back2dos
@Giorgio Zgadzam się z twoim kolegą, chociaż Obj-C ma również pewne ograniczenia (być może niektóre z nich zniknęły z Obj-C 2.0), np. Chciałbym mieć przeciążenie „metod” (selektorów) - btw chciałbym funkcja przeciążająca a la Fortran w C ...
ShinTakezou
2

W świecie osadzonym określono Embedded C ++ , który może być tym, czego szukasz. Usunęli rzeczy takie jak wielokrotne dziedziczenie i tym podobne. O ile mi wiadomo, to jednak prawie wymarło.

mattnz
źródło
0

Przydaje się to dogłębne porównanie C ++, Objective-C, Java i C # . Osobiście uważam, że C # jest o wiele czystszy w pracy niż C ++. Przedtem przeniosłem kilka funkcji C (numerycznych / obliczeniowych) do C # bez zbyt wielu zmian, które są konieczne ze względu na podobieństwo składni i liczbowych typów danych.

dodgy_coder
źródło