12

Chcę narzędzie wiersza polecenia do wyciąg definicji lub deklaracji (typedef, struktury, wyliczenia, zmiennej lub funkcji) z pliku źródłowego C lub C++. Również sposób na zastąpić istniejącej definicji/deklaracji byłby przydatny (po przekształceniu wyodrębnionej definicji przez skrypt przesłany przez użytkownika). Czy jest dostępne takie ogólne narzędzie, czy też pewne przybliżone przybliżenie takiego narzędzia?Czy istnieje narzędzie wiersza polecenia do wyodrębniania typedef, struktury, wyliczenia, zmiennej, funkcji z pliku C lub C++?

Poufność i możliwość łączenia się z tworzonymi przez siebie skryptami lub programami ma tutaj duże znaczenie, chociaż jestem również ciekawy akademickich programów GUI. Preferowane są rozwiązania open source dla obozu Unix/Linux (choć ciekawi mnie również system Windows i OS X). Podstawowe zainteresowania językowe to C i C++, ale bardziej ogólne rozwiązanie byłoby jeszcze lepsze (myślę, że nie potrzebujemy super dokładnych możliwości analizowania w celu znalezienia, wyodrębnienia i zastąpienia definicji w pliku źródłowym programu).

Przykładowe użycie walizki (dodatkowo - za ciekawy umysł):

  1. Biorąc głęboko zagnieżdżone struct s i zmienne (array) inicjowania tych typów, załóżmy, istnieje potrzeba, aby zmienić definicję struct przez dodawanie lub zmiana kolejności pól lub przepisywanie definicji zmiennych/tablic w bardziej czytelnym formacie bez wprowadzania błędów wynikających z pracy ręcznej. To działałoby przez wyodrębnienie starych inicjalizacji, a następnie użycie skryptu/programu do napisania nowych inicjalizacji w celu zastąpienia starych.
  2. Aby zastosować narzędzie do przeglądania kodu - wypakuj definicję.
  3. Dekoracyjne generowanie kodu (np. Zapisy/zgłoszenia funkcji rejestrowania).
  4. Strukturowanie kodu skryptowego (np. Wypakuj to i tamto i umieść w innym miejscu bez zmian - komentarz zatwierdzenia kontroli wersji może udokumentować polecenie wykonania tej operacji, aby było oczywiste i weryfikowalne, że nic się nie zmieniło).

alternatywna Problem: Jeśli istnieje narzędzie powiedzieć lokalizację definicji (początek i koniec linii wystarczyłyby - możemy nawet przejąć wszystkie definicje/deklaracje jesteśmy zainteresowani są we własnym wierszu) , to byłoby jest po prostu ćwiczenie zręczności palca aby napisać program do

  1. definicji ekstraktu
  2. zastąpić definicje, lub nawet
  3. wyodrębnić definicję, uruchom specy programu fied przez opcji wiersza poleceń (lub redaktor) do

    • otrzymać żądane wyodrębnione definicje z stdin (lub z pliku tymczasowego),
    • przeprowadzenia transformacji (edycja), a
    • wyjściu nowe definicje do stdout (lub zapisać je w podanym pliku tymczasowym)

    do zastąpienia przez program wykonujący.

Tak więc głównym, trudniejszym problemem byłoby znalezienie początku i końca linii definicji.

Informacja o tagach: Dokładniejsze tag niż code-generation byłoby code-transformation ale to nie istnieje.

+0

Wydaje się, że masz na myśli C. Nie ma języka o nazwie C/C++. – aschepler

+2

Przez C/C++ mam na myśli C lub C++. Interesuje mnie przede wszystkim C (aktywnie używam i radzę sobie ze starszym kodem), ale interesuje mnie również C++ (wolałbym używać do czystych projektów tabel, jeśli dany wybór byłby możliwy). W opisywanych zadaniach nie trzeba bardzo dobrze rozumieć składni języka, tak myślę, więc różnice między C i C++ nie wydają się tak ważne. – FooF

+0

Używałbym także tagu 'C++', ale maksymalna liczba tagów to 5. Nie ma tagów 'code-extraction' lub' code-transformation' ... oraz w jakikolwiek sposób osiągnięto maksymalną liczbę tagów. :-) – FooF

Odpowiedz

4

Nasz DMS Software Reengineering Toolkit stara się być narzędziem, którego pragniesz. Ale to popycha najnowocześniejsze narzędzie i nie jest narzędziem w stylu nirwany. Wystarczy wykonać prawdziwą, interesującą pracę.

DMS zapewnia ogólne funkcje do analizowania, analizy i przekształcania kodu źródłowego.

Używa jawnych gramatyk do definiowania języków (takich jak C i C++); gramatyki napędzają parsery budujące abstrakcyjne drzewa składniowe (AST). Różnorodne prymitywy analizy zapewniają a) udogodnienia ["grammy atrybutów" ATG] do zbierania informacji wzdłuż drzewiastych ścieżek przepływu informacji, które ładnie pasują do kształtu AST, b) konstrukcji użycia symboli do map definicji symboli ["tablice symboli"] , c) control and data flow analysis z wykorzystaniem faktów wyodrębnionych przez ATG, d) analizy zasięgu, e) punktów do analizy zarówno lokalnych, jak i globalnych. Te prymitywne analizatory mogą być używane do komponowania faktów z AST w celu wyciągnięcia wniosków na temat kodu reprezentowanego przez AST (np. "Ta instrukcja modyfikuje te zmienne"). A langauge front end pakuje gramatykę i specyficzne dla języka analizatory razem w pakiecie wielokrotnego użytku. DMS ma takie interfejsy językowe o różnych poziomach głębi i dojrzałości dla wielu różnych języków.

[EDIT 6/27: Konektory C i C++ obsługują określone dialekty C i C++: ANSIC, C99, GCC3/4 C, MS Visual C, ANSI C++ 98, ANSI C++ 11 , GCC3/4 C++, MS Visual C++ 2005/2008/2010. Jeśli chcesz dokładną analizę kodu, należy użyć „prawo” dialekt do przetwarzania kodu.]

Ale „analiza” nie o to chodzi. Celem analizy jest napędzanie zmian. DMS zapewnia dodatkowe podparcie proceduralnie modyfikować ASTs, zmiany ASTs przez source-to-source rewrite rules napisany w składni powierzchni języka (zarówno uwarunkowanej pewnym wybranym wyniku analizy), a do odbiorników grupy proceduralnych i źródło-źródło przepisuje razem, aby związek złożone przepisuje który może porwać ogromne zmiany kodu takich powrotnego architektur itp Po ASTs transformuje, mogą być stosowane do regeneracji („prettyprint”) składniowo poprawnego kodu w odpowiedniej przedniej powierzchni języka/odmianie języka. [Modyfikując AST na jeden język, dopóki nie otrzymasz AST dla innego, możesz zbudować tłumaczy, ale nie jest to tak łatwe, jak sugeruje to zdanie].

To wszystko działa w znacznym stopniu, ale nadal jest nieco napiętnowany przez pewnych komplikacji językowych. Dla C i C++ znaną komplikacją jest preprocesor; edytując tekst programu dowolnie, warianty preprocesora mogą sprawić, że kod źródłowy nie będzie się nadawał do niczego podobnego do standardowej technologii analizowania. C DMS i przednie końce C++ złagodzić ten nieco i można analizować kod z ustrukturyzowanych dyrektyw preprocesora tym jakichś dziwnych przypadków, że większość ludzi nie nazwałbym strukturyzowanych ale które powszechnie występują:

#IF cond 
     if (abc) { 
    #ELSE 
     if (def) { 
    #ENDIF 

Czynimy interesujący postęp na kod parsowania z arbitralnym rozmieszczeniem warunków wstępnych preprocesora.Ale kiedy to zrobisz, teraz wszystkie twoje analizatory muszą nagle wziąć preprocesorowe warunki i wszyscy nagle zaczynamy od kompilatora, którego ludzie naprawdę nie odwiedzili.

DMS został wykorzystany do dużych przesunięć architektonicznych w dużych programach w C++, konwertujących ze stylu nie-CORBA na styl CORBA z ogromną ilością tasowania kodu, aby wyodrębnić kod wzdłuż arbitralnych ścieżek przepływu kontrolnego, aby wygenerować interfejsy API typu SOW dla istniejący kod C, aby wstawić oprzyrządowanie w dużych programach C, aby wykryć błędy wskaźnika itp. [Został zastosowany do innych zadań w wielu innych językach].

Z własnego doświadczenia wciąż jest dość trudno korzystać. Naszym zdaniem jest to w tym samym sensie, że demokracja jest najgorszym ze wszystkich systemów rządowych, z wyjątkiem całej reszty; YMMV. Strona zawiera wiele narzędzi i dyskusji opartych na DMS.

W rzeczywistości został użyty do wyodrębnienia funkcji (ćwiczenie SOW jest znacznie bardziej ogólne niż to) i wstawiania funkcji (jest to ogólny przypadek oprzyrządowania).

Narzędzia takie jak GCC-XML to cienie funkcji DMS. GCC-XML analizuje, buduje tabele symboli i zrzuca deklaracje (nie kod), ale nie może wprowadzać żadnych zmian w kodzie. Clang jest lepszy; analizuje C i C++ na AST, może wykonywać analizy na pośredniej reprezentacji LLVM i ma pewien mechanizm do wypuszczania przyszłych łat na tekst źródłowy zainspirowany pożądaną zmianą drzewa. Nie wiem, czy Clang potrafi przeprowadzać ogromne transformacje kodu, szczególnie te, w których jeden wynik transformacji jest ponownie transformowany (jak modyfikować drzewo dla opóźnionej poprawki tekstowej?). DMS może to robić przez cały dzień i może to zrobić dla wielu języków innych niż C i C++, i może to zrobić dla dowolnej mieszanki znanych języków.

Dopóki problem preprocesora z warunkami warunkowymi nie zostanie rozwiązany, analiza/transformacja kodu C i C++ nie będzie łatwa. Te zadania wykonujemy na tych językach wyłącznie dzięki silnej woli i użyciu najsilniejszych narzędzi, które możemy zbudować. (Java nie ma tych problemów, a DMS jest odpowiednio lepszy w analizowaniu/transformacji).

Uważam, że przy dużym ryzyku pychy, DMS jest najlepszym z dostępnych narzędzi do ogólnej analizy i transformacji. Jako jego architekt uważam to za moją długoterminową pracę, aby uczynić ją jeszcze silniejszą w tym zadaniu.

+0

Brzmi bardzo ambitnie, Potężny, interesujący i przydatny, nawet jeśli jestem zainteresowany przede wszystkim rozwiązaniami open source i nie mam w tej chwili pieniędzy na wydawanie pieniędzy, z pewnością zamierzam dowiedzieć się więcej o twoich produktach (jeśli nie o czymkolwiek innym dla akademickiej ciekawości). commen także o trudnościach, a nie o to, by wszystko brzmiało zbyt różowo. Dowiedziałem się również, w jaki sposób warstwa preprocesora C sprawia, że ​​niektóre narzędzia działające na kodach C dają zły wynik (szybko pojawia się [GNU indent] (http://www.gnu.org/software/indent/). – FooF

3

Możesz uznać GCC-XML za podstawę do opracowania narzędzi, takich jak to, o czym mówisz. Użyłem go w połączeniu z pygccxml, aby wykonać automatyczne wyodrębnianie głęboko zagnieżdżonych elementów struktury. To nie sprawi, że twoja praca będzie szybka, ale z pewnością będziesz w lepszej sytuacji, niż byłbyś inny.

Słyszałem też, że inni wspomnieli o clang jako o podstawach pisania takich narzędzi, ale nie miałem okazji samemu w to dużo zajrzeć.

+0

Próbowałem również użyć 'gccxml' jako oczywistego wyboru, ale szybko nie uzyskałem wyniku innego niż błędy w moim teście. (Mam zły kod źródłowy w mojej dłoni, kod jest faktycznie kierowany do innej architektury (ARM i MIPS), a przede wszystkim 'gccxml' traktuje kod jako C++ (http://www.gccxml.org/HTML/ FAQ.html pytanie 1). – FooF

+0

@FooF: Ten fragment o "uznaje kod jako C++" wskazuje, że w rzeczywistości potrzebujesz precyzyjnego parsowania językowego, dla określonego * języka * przetwarzanego języka. w interpretacji znaczenia nieco składni może prowadzić do poważnych różnic w ekstrakcji/transformacji w późniejszym etapie procesu. (Ten problem staje się nieprzyjemny, gdy napotkasz preprocesorowe warianty, których ramiona zawierają kod dla * różnych * kompilatorów.) –

2

Możesz sprawdzić Clang. Mają nietrywialne biblioteki przetwarzania kodu źródłowego.

Powiązane problemy