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?
Odpowiedzi:
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_147
niż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ę.
źródło
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 ++.
źródło
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.
źródło