Czy ma sens pisanie skryptów kompilacji w C ++?

15

Używam CMake do generowania moich projektów IDE / makefiles, ale nadal muszę wywoływać niestandardowe „skrypty”, aby manipulować moimi skompilowanymi plikami, a nawet generować kod.

W poprzednich projektach korzystałem z Pythona i było OK, ale teraz mam poważne problemy z zarządzaniem wieloma zależnościami w dwóch bardzo dużych projektach, nad którymi pracuję, więc chcę wszędzie zminimalizować zależności.

Ktoś zasugerował mi użycie C ++ do pisania moich skryptów kompilacji zamiast dodawania tylko zależności językowej. Same projekty już używają C ++, więc widzę kilka zalet:

  • do zbudowania całego projektu potrzebny byłby tylko kompilator C ++ i CMake, nic więcej (wszystkie pozostałe zależności to C lub C ++);
  • Bezpieczeństwo typu C ++ (przy użyciu nowoczesnego C ++) ułatwia wszystko, aby uzyskać „poprawność”;
  • jest to również język, który znam lepiej, więc jestem z nim swobodniejszy, nawet jeśli jestem w stanie napisać dobry kod Pythona;
  • potencjalny wzrost prędkości wykonania (ale nie sądzę, że będzie to naprawdę odczuwalne);

Myślę jednak, że mogą być pewne wady i nie jestem pewien prawdziwego wpływu, ponieważ nie próbowałem jeszcze:

  • pisanie kodu może być dłuższe (to powiedziawszy nie jestem pewien, ponieważ jestem wystarczająco wydajny w C ++, aby napisać coś, co działa szybko, więc może dla tego systemu pisanie nie byłoby tak długie) (czas kompilacji nie powinien problem będzie w tym przypadku);
  • Muszę założyć, że wszystkie pliki tekstowe, które czytam jako dane wejściowe, znajdują się w UTF-8, nie jestem pewien, czy można je łatwo sprawdzić w środowisku wykonawczym w C ++, a język tego nie sprawdzi;
  • bibliotekami w C ++ jest trudniej zarządzać niż w językach skryptowych;

Brakuje mi doświadczenia i zdolności przewidywania, więc może brakuje mi zalet i wad. Pytanie brzmi: czy ma sens używać do tego C ++? czy masz doświadczenia do zgłoszenia i czy widzisz zalety i wady, które mogą być ważne?

Klaim
źródło
1
W zależności od jednego interpretera języka dla kompilacji nie wydaje się to takie złe, zwłaszcza, że ​​jest to Python - bardzo przenośny, rozpowszechniony w systemie Linux i łatwo dostępny w systemie Windows. Jeśli potrzebujesz dodatkowych bibliotek Pythona, możesz użyć virtualenv i nie doda on nic oprócz jednego pliku Pythona (który możesz wysłać) połączenia internetowego i trochę hydrauliki, aby skonfigurować virtualenv, zainstalować je i uruchomić rzeczywistą buduj skrypty w tym środowisku. Możesz przejść do dodatkowego skryptu w kompilacji i połączenia internetowego jako wymogu.
Możesz zgadnąć kodowanie tekstu z dość dobrą niezawodnością.
DeadMG
@DeadMG Tak, ale robi tak przez strony, jeśli zbyt wiele pracy (jeśli chcesz mieć dobre przypuszczenie, a nie ograniczać się do „jest to ASCII lub Unicode, a jeśli jest to Unicode, ile bitów i jakie kolejność bajtów?”) I dodanie kolejnej zależności (jeśli w ogóle jest do tego wolna i wolnostojąca biblioteka) nie pozwala na przejście do C ++, aby przestać działać w zależności od Pythona.
@delnan Tak, ale nadal można zainstalować więcej języków. Z twojego opisu wynika, że ​​każda dodatkowa zależność nie wydawałaby się „zbyt zła”, ale rozważam to, ponieważ jest już wiele do zarządzania, więc może to pomóc w ograniczeniu używanych języków. Używam również wbudowanego języka skryptowego (zaimplementowanego w C ++ bezpośrednio w projekcie), javascript / HTML / CSS, XML i innych formatów, o których już wiele trzeba pamiętać.
Klaim
2
czego użyjesz do zbudowania skryptu kompilacji c ++?
jk.

Odpowiedzi:

24

Po prostu użyj Pythona.

Rozwijam się w C ++ i robię skrypty budowania w Pythonie, i bolesne byłoby tworzenie skryptów kompilacji w C ++:

  • Python sprawia, że ​​manipulowanie słownikami, listami, zagnieżdżonymi słownikami słowników list itp. Jest trywialne (na przykład jeden z moich skryptów używa wielopoziomowej hierarchii wszystkich moich narzędzi, wersji narzędzi i ścieżek wersji narzędzi. ) C ++ może zrobić to samo z szablonami i niestandardowymi klasami, ale jest o wiele bardziej szczegółowy (co przekłada się na więcej linii kodu, co ogólnie przekłada się na niższą produktywność).
  • Python zapewnia biblioteki i procedury wysokiego poziomu, takie jak obsługa XML i JSON, podproces i os.walk . Ponownie, C ++ może to zrobić, ale znalezienie pracy bibliotek, nauczenie się ich interfejsów API, poprawne składanie wywołań (które często są na niższym poziomie) jest o wiele więcej pracy itp.
  • Skrypty kompilacji są działaniem nieprzynoszącym wartości dodanej (pożyczanie terminu od lean). Lepiej jest używać języka na najwyższym poziomie, jak to możliwe, aby zrobić go tak szybko, jak to możliwe, aby wrócić do pracy, co przynosi korzyści użytkownikom.
  • Z mojego doświadczenia wynika, że ​​skrypty budowania rozwijają się w nieprzewidziany sposób. Nawet jeśli zadanie wydaje się początkowo proste dla C ++, może się szybko skomplikować. Kiedy pojawia się nowe wymaganie, często o wiele łatwiej jest poradzić sobie z obsługą w skrypcie Python niż z C ++ (co może wymagać znalezienia lub odczytania nowych API bibliotek itp.).

Jeśli chodzi o zalety, które wymieniasz dla C ++:

  • Dodanie pojedynczej zależności (Python) nie powinno znacząco komplikować kompilacji. Na przykład jest już standardem w większości instalacji Linuksa. Dzięki bibliotekom „dołączonych baterii” Pythona zarządzanie może być łatwiejsze niż bibliotek C ++, od których zależą skrypty kompilacji.
  • Bezpieczeństwo typu zapewniane przez C ++ jest najbardziej przydatne w przypadku dużych projektów, a nie małych skryptów.
  • Python bardzo dobrze uzupełnia C ++ (wysoki poziom w porównaniu z niższym poziomem, typowanie dynamiczne w porównaniu z typem statycznym itp.) I może nawet bardzo dobrze integrować się z C ++ (dzięki SWIG i Boost.Python), jeśli później chcesz to zrobić, więc jest to warto nauczyć się dla programisty C ++.
  • Jak już powiedziałeś, szybkość wykonywania powinna być niepotrzebna.
Josh Kelley
źródło
Zrobiliśmy to (kompilacje Pythona) po roku zmagań z cmake w projekcie cross paltform. W końcu nawet nie zawracaliśmy sobie głowy próbą sprawdzenia zależności (najbardziej złożona część kompilacji). Ponieważ w przypadku automatycznych kompilacji i tak chcesz wszystko odbudować, a w C ++ istnieje tak wiele złożonych zależności
Martin Beckett
1

Uważam, że jest to pytanie dotyczące konkretnego przypadku. Twierdzę, że nie ma poprawnej odpowiedzi na pytanie, czy ma to sens, czy nie używać C ++ do tworzenia skryptów, jedynym sposobem na znalezienie tego jest wypróbowanie go w praktyce.

Osobiście widziałbym, że Python jest lepszy od C ++ ze względu na lepszą ekspresję języka i łatwiejsze (oczywiście osobiste zdanie) standardowe narzędzia biblioteczne do zarządzania zadaniem manipulowania plikami binarnymi i generowania kodu. Oczywiście mogą być dostępne zaawansowane biblioteki opracowane dla tego zadania, ale jeśli nie, to osobiście zdecydowanie postawiłbym na to, że Python będzie „częściej poprawną” odpowiedzią - w ogólnym przypadku.

zxcdw
źródło
1

Nie pisz skryptów samodzielnie, duplikujesz wysiłek i ponownie wymyślasz koła.

Użyj czegoś takiego jak SCONS lub nawet Maven 3, który obsługuje systemy kompilacji C ++ .

Dobry system kompilacji, niezależnie od języka, nie powinien wymagać niestandardowej logiki w postaci skryptów do zbudowania działającego artefaktu wykonywalnego.

Jeśli musisz pisać skrypty dla systemu kompilacji, aby go dostosować, nie jest to dobry system kompilacji. Napisanie wtyczki do systemu kompilacji to inna historia, ale nadal powinno to być szczególnie specyficzne dla środowiska / sprzętu i powinno być czymś, do czego rzadko się ucieka.


źródło
1
Jak wyjaśniłem, używam już cmake, ale nadal potrzebuję niestandardowych skryptów do zrobienia. Mówię o tych niestandardowych skryptach, a nie o samym procesie kompilacji.
Klaim
1
Uwielbiam Maven - skrypt potrzebny do zbudowania programu „Hell World” C jest dłuższy niż program!
quant_dev
@ quant_dev, pamiętam, kiedy po raz pierwszy skorzystałem z Maven, na ich własnej stronie internetowej, zalecają zacząć od kogoś, kto już zna maven, ponieważ trudno jest go skonfigurować za pierwszym razem. To był pierwszy znak, że nie chciałem mieć z tym nic wspólnego!
Brady
Podobało mi się SCons, jest trochę powolny, ale bardzo łatwy w użyciu.
quant_dev
1
@JarrodRoberson Użyłem zbyt „skryptów” zbyt swobodnie. Mam na myśli jego pliki konfiguracyjne. Nie jestem pewien, czy deklaratywność sprawia, że ​​Maven jest bardziej przenośny i łatwiejszy w utrzymaniu. To sprawia, że ​​jest mniej elastyczny, co może być uciążliwe w dużych projektach.
quant_dev
0

Aby skoncentrować się na pytaniu:

Czy ma sens pisanie skryptów kompilacji w C ++?

Odpowiedź jest prosta: nie .

Aktualnie akceptowana odpowiedź zmienia się w python i zawiera listę wielu ważnych problemów, ale chciałbym dodać powód niezależny od języka:

Naprawdę nie chcesz pisać skryptów w żadnym skompilowanym języku, jeśli możesz pomóc:

  • Potrzebujesz skryptu, aby go uruchomić!
  • Lub musisz wpisać skompilowany skrypt do kontroli źródła (i zsynchronizować go ze sprawdzonymi źródłami!)
  • Skrypt nagle ma także dołączoną konfigurację kompilacji skryptu. (To musi być utrzymane!)

Ponadto, idąc z inną odpowiedzią:

Prawdopodobnie nie chcesz także używać „surowego” języka skryptowego do tworzenia skryptów kompilacji (rozumiem, że CMake będzie obsługiwał zawiłości C ++).

To, co prawdopodobnie powinieneś zrobić, to wybrać jedną z Kompilacji . Systemy . out . tam . i sprawdź, czy pasuje do twojego wrt rachunku. skryptowalność / rozszerzalność / play-nice-with-CMake / crossplatformness.

Martin Ba
źródło