Czy można skompilować język wyższego poziomu do czytelnego C ++? [Zamknięte]

12

C ++ jest świetnym językiem na wiele sposobów, ale niektóre rzeczy są nieporęczne do pisania bez IDE. Jako użytkownik VIM byłoby bardzo interesujące, gdybym miał dostęp do języka wyższego poziomu, który umożliwiłby mi pisanie C ++ z S-Expressions i prawdopodobnie z makrami podobnymi do Lisp, pozwalając na generowanie czystego kodu, unikając przepisywania tych samych wzorców w kółko.

Zapytałem na freenode i przetestowałem kilka pomysłów, takich jak kompilacja Lisp-> C z kompilatorami takimi jak ECL i Bigloo, ale żaden z nich nie wygenerował szczególnie czystego kodu C.

Czy są jakieś prace na ten temat?

MaiaVictor
źródło
3
Dlaczego nie napisać kodu w seplenie z makrami, takimi jak C ++, a następnie te funkcje, które chcesz, ale których nie można łatwo wyczyścić, wystarczy rozszerzyć je za pomocą makra LISP od prostej składni do bardziej złożonego C ++. Co więcej, możesz po prostu napisać swój kod w LISP. :)
Jimmy Hoffa
2
Czy spodziewasz się, że tłumaczenie Lisp -> C ++ wygeneruje czysty kod C ++, gdy (prawdopodobnie prostsze) C ++ -> asembler tworzy nieczytelny (kwestia opinii) asembler? Dla kogo jest przeznaczony kompilacja?
1
Jakoś nie jestem całkowicie przekonany, że ktoś już napisał makra, aby rozwinąć dokładnie to, co chcesz rozwinąć, ale z reguły makra są zaskakująco proste do napisania, są to tylko metody przetwarzania list, nie powinieneś mieć większych trudności z pisaniem tego wszystko w jednym wyrażeniu s, które rozgraniczasz, gdy chcesz, aby ekspander makr zwracał uwagę, a następnie po prostu wydrukuj listę, aby uzyskać kod C ++ z rozszerzeniem.
Jimmy Hoffa,
2
Zgadzam się, że Lisp może robić pewne rzeczy, które są trudne w C ++ (np. Zamykanie). Czy musisz robić te rzeczy? Ponieważ są one trudne do zrobienia w C ++, bez względu na to, jak wprowadzisz je do C ++, automatycznie lub ręcznie, nie będzie ładnie. Moja sugestia: jeśli naprawdę nie potrzebujesz naprawdę trudnych rzeczy, które może zrobić Lisp, nie używaj Lisp. Bądź dobry w C ++. Jeśli musisz użyć tych rzeczy, ale musisz napisać kod w C ++, to wymyśl, jak to zrobić w C ++. To właśnie odróżnia dorosłych od dzieci w tym biznesie.
Mike Dunlavey,
3
Istnieje kilka języków z kompilatorami, które emitują kod C, więc nie rozumiem, dlaczego nie jest to wykonalne, nawet jeśli jest to kod C ++ podobny do C. Jeśli twoje pytanie brzmi: „czy mogę uzyskać kanoniczny, sprawdzony kod C ++ wykorzystujący wszystkie dostępne funkcje w C ++”, może to być nieco trudniejsze.
Robert Harvey

Odpowiedzi:

13

Kompilowanie języków wyższego poziomu na języki niższego poziomu to ciasto. Istnieją niezliczone przykłady tego. Bez większego znaczenia, możemy wskazać wczesne kompilatory C ++, które skompilowały się do C.

Kiedy jednak zaczniesz wrzucać do miksu „czyste” i „czytelne”, sprawy stają się naprawdę trudne. Czysty, czytelny kod wyraża znaczenie i cel tego, co piszesz. Komputery notorycznie źle interpretują i tworzą znaczenie. Bardziej prawdopodobne jest, że skończysz z nazwanymi zmiennymi int_147niż input_buffer_length. Oczywiście, jeśli naprawdę chcesz, aby ten projekt działał, możesz zaangażować się w ogromny projekt sztucznej inteligencji, aby poradzić sobie z konwersją Lisp do jakiegoś przyzwoicie czytelnego C ++, ale, szczerze mówiąc, kompilatory Common Lisp są naprawdę cholernie dobre w tym, co robią .

Ważniejsza niż trudność generowania C ++ z Lisp jest przydatność tego. W jakim celu wygenerowany C ++ byłby czytelny? Jeśli Lisp jest twoim kodem źródłowym, reprezentacje pośrednie powinny być nieistotne. Jeśli chcesz mieć możliwość przekazania C ++ programistom, którzy nie rozumieją twojego oryginalnego Lisp, masz teraz inny problem. Co dzieje się, gdy chcą zmodyfikować wygenerowany C ++? Co się stanie, jeśli napiszą w C ++ rzeczy, które nie tłumaczą czysto na twój Lisp?

Powiedzmy, że to rozwiązaliśmy. Dziesięć lat później, po przepłaceniu setek milionów dolarów dotacji DoD, stworzyliśmy ten ogromny, złożony (ale bezbłędny) silnik tłumaczący język, który może zmienić Lisp w idiomatyczne C ++ i odwrotnie. Co tak naprawdę zyskaliśmy, czego nie osiągnęlibyśmy lepiej, ucząc ludzi nowego języka programowania lub opracowując nowy kompilator, który pozwala nam łączyć oba języki?

Och, racja. Twój szef chce, żebyś napisał C ++, a wolisz tego nie robić. Zaktualizuj swoje CV i znajdź nową pracę.

Sean McSomething
źródło
Chciałbym zaktualizować swoje CV i znaleźć inną pracę. Niestety nie jest to takie proste, gdy praca = „student” i szef = „profesor”. I, niestety, mam dyplom. Niezależnie od tego, że nie chodzę na zajęcia, ale uczę się sam w domu. Z tego, że już pracuję w branży i zarabiam więcej pieniędzy niż większość absolwentów, których znam. Tak to działa. Niestety Na szczęście mój prof zgodził się mnie przekazać, jeśli napiszę coś skomplikowanego w C ++. Znam już C ++. Wolę więc nauczyć się czegoś innego (; Odłóż na bok, świetna odpowiedź. Dzięki.
MaiaVictor,
@Dokkat: Nie sądzę, że znasz C ++. Czy możesz pisać szablony ze specjalnymi implementacjami w zależności od tego, czy parametr ma jakąś metodę lub funkcję? Czy wykonałeś obliczenia w czasie kompilacji przy użyciu Boost.MPL? Czy rozumiesz, jak działa Boost.ForEach? Jeśli musisz to zrobić w C ++, skorzystaj z okazji, aby nauczyć się bardziej zaawansowanego C ++. Będzie również bardziej użyteczny w twojej pracy.
Jan Hudec
1
Cóż, zrobiłem kilka dość skomplikowanych szablonów, kiedy pracowałem z C ++ w tych smutnych latach. Tak, użyłem Boost. Dla każdego, pamiętam zdefiniowanie wielu makr, aby były bardziej przydatne. W każdym razie byłem dzieckiem, to nie było fajne doświadczenie. Nie mam sensu uczyć się dalej, kiedy Lisp zapewnia o wiele bardziej solidny, mniej bolesny system makr, który dokonuje dokładnie takiego rodzaju metaprogramowania, że ​​C ++ wymaga umiejętności guru.
MaiaVictor,
3

Krótka odpowiedź, obecnie nie ma nic, co pomogłoby Ci przekonwertować Lisp na READABLE C ++. Pewnie możesz przekonwertować wszystko na C ++ lub C, ale czytelny kod jest pisany przez ludzi, a nie programy. Na pewno możesz wyprowadzić kod C ++ z odpowiednim formatowaniem, wcięciami, ładnymi nazwami klas, a może nawet w jakiś sposób uzyskać idealne tłumaczenie z obiektów klasy Lisp na klasy C ++. Może uda ci się odpowiednio połączyć zależności bibliotek, a może skompilujesz pliki binarne, które byłyby bardzo zbliżone do tego, co stworzyłby język C, gdybyś napisał całość w C. Ale ostatecznie czytelny kod jest pięknem, którego nie rozumie się przez kogokolwiek, przynajmniej jeszcze nie teraz, i być może nigdy nie uważając tego za czytelny jest dość subiektywny na początek, a to, co może być uznane za czytelne wśród jednej grupy programistów, może być uważane za okropne przez innych.

Aby język C ++ był czytelny, musisz pisać w języku C ++, a nie w Lisp. Musisz także mieć możliwość zmiany stylu kodowania zgodnie z tym, co najlepiej zrozumieją osoby, które będą czytać Twój kod. Podobnie jak książki, programy są pisane z myślą o konkretnej publiczności i mogą być piękne i wzruszające, jeśli dobrze napisane, a zaciemnione i nużące, jeśli nie. A jeśli nie uda nam się stworzyć programu do pisania pięknych powieści dla nas, nie będziemy w stanie wymyślić czegoś, co można by przekonwertować na czytelny C ++.

Shashank Gupta
źródło
Chyba przesadzasz z tym, co mam na myśli, mówiąc „czytelny”! To nie musi być naprawdę piękne. Wystarczy, żebyś mógł go przeczytać i zrozumieć, co się dzieje. Myślę, że pójdę z kilkoma makrami Lisp do bezpośredniego tłumaczenia, jak sugerował JimmyHoffa w komentarzach.
MaiaVictor,
3

ViM to świetne IDE dla C ++. Ma też najlepsze zakończenie, jakie do tej pory widziałem, choć robi się trochę wolniej, jeśli wciągniesz dużo nagłówków, klang jest ukończony . I do kompilacji znalazłem i tak brak wszystkich IDE; w końcu piszesz system kompilacji w CMake lub coś takiego. I nie widziałem nic, aby zapewnić jakąkolwiek pomoc dla Lisp, kropka.

To prawda, że ​​C ++ nie ma makr w stylu seplenienia, ale szablony mogą zrobić wszystko, co mogą zrobić makra higieniczne schematu i jeszcze więcej, ponieważ można je wdrażać inaczej w zależności od typów i ich możliwości. To prawda, że ​​brak modułu wyrzucania elementów bezużytecznych powoduje, że zamknięcia są nieco bardziej nużące, ale idiom RAII używany do zarządzania zasobami ma swoje zalety i interesujące właściwości.

Jeśli jesteś studentem, czy naprawdę znasz wszystkie zaawansowane C ++? Od biblioteki algorytmów po pisanie szablonów z alternatywnymi implementacjami opartymi na właściwościach typów argumentów, kompilacja obliczeń czasu przy użyciu metaprogramowania szablonów (przy użyciu Boost.MPL) po zrozumienie, jak działa Boost pod maską? Jeśli nie, polecam wziąć to jako okazję do nauki zaawansowanego C ++. Zadania szkolne nie będą musiały być utrzymywane, więc możesz bawić się językiem, aby zobaczyć, jakie funkcje są warte, gdzie w kodzie produkcyjnym trzeba uważać na czytelność.


I aby odpowiedzieć na ostatnie bezpośrednie pytanie: C ++ ma o wiele więcej idiomów za sobą, że nie ma sposobu na wygenerowanie idiomatycznego C ++ z niczego. Po prostu dlatego, że nie będzie sposobu na wyrażenie większości tych idiomów w niczym innym. Zaczynając od tego, że cokolwiek będzie śmieciami, wszystko przydzieli na stosie, podczas gdy w C ++ idiomatyczne jest korzystanie ze stosu.

Jan Hudec
źródło
Zgadzam się na VIM. Pasuje jak rękawica do rozwoju C. Jestem użytkownikiem Vima, ale dla Lisp używam Emacsa w trybie zła z SLIME i Paredit. Istnieje pewne wsparcie dla Lispinga w vimie z podstawowymi hakami REPL, ale nie są one zbliżone do SLIME.
mike30