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ę.
new
jest przede wszystkim rozbudowany,malloc
który może również zająć się inicjowaniem pamięci. Dzięki „nowemu umieszczeniu”operator new
moż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ł!C+
Diclaimer: Przepraszam, nie mogłemt resist. It
1 kwietnia;)Odpowiedzi:
Mogą to być droidy, których szukasz ...
Idź - http://golang.org/
D - http://dlang.org/
Rdza - http://rust-lang.org/
źródło
struct
są 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.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ą.
źródło
Przepraszam kolego, alarm sprzeczności. Non-cstring obsługa wymaga
new
. To podstawowa konieczność. Nie możesz miećstd::string
beznew
. Co więcej,new
/delete
jest dokładnie równoważne zmalloc
/free
ale bezpieczniejszym , ponieważ gwarantuje poprawną budowę i zniszczenie obiektów hałdy (całkowicie konieczne!) I używa obsługi wyjątków zamiastNULL
zwrotu, a zatem jest lepszy pod każdym możliwym względem. W C ++ 11 jest bardzo możliwe napisanie własnejnew
funkcji stylu, ponieważ idealne przekazywanie pozwala na obsługę dowolnego konstruktora dowolnego typu. Jeśli jesteś nieśmiałynew
, 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.
źródło
f(g(x))
wydaje mi się, że działa dobrze. Wierzę też, że curry można ogólnie zrobić jako bibliotekę w C ++ 11.std::bind
obsługuje takie rzeczy.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.
źródło
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 ++”.
źródło
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 ++.
źródło
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.
źródło
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.
źródło