Wątek przeniesiony 2022-11-22 19:16 z C/C++ przez kq.

Preprocesor/parser C++ - header/typesystem level

1

Cześć :)
Jakiś czas temu zacząłem grzebać sobie poboczny projekt z kategorii narzędzia dla developerów lub system budowy czyli jak zrobić sobie narzędzie które jest w stanie zrozumieć system typów języka, deklaracje, definicje oraz przekazać informacje o nim lub nawet zająć się bezpośrednią generacją na podstawie tych informacji czegoś więcej.
Jak wszyscy wiedzą (taką mam nadzieję...) parsowanie C++ jest horrorem. Na szczęście mamy projekt clanga oraz wszystkie pomocnicze narzędzia które wraz z nim przychodzą, w tym pełen parser AST z pythonowymi bindigami.
Czy owrpappowałem clanga? Tak. Czy na tym skończyła się robota? Nie, to jak clang parsuje AST pasuje do zadania kompilacji ale nie do zrozumienia projektu. Do tego clang posiada kilka nieścisłości/brakujących informacji przy parsowaniu które ręcznie musiałem poprawić, a aby niektóre rzeczy parsował musiałbym nie tylko zrobić PR ale jeszcze przejść przez cały proces designe (np. to jak parsować atrybuty poza znanymi kompilatorowi jest nietrywialne koncepcyjnie stąd clang takie atrybuty omija, prędzej było mi je ogarnąć we własnym kodzie).
Czy projekt ma problemy? Paaaanie, od groma. Zaczynając od brakującej obsługi std i zewnętrznych headerów, przez wymagające dużo pamięci parsowanie (dla każdego pliku buduję osobną jednostkę translacyjną), a skończywszy na potencjalnych bugach.
Czy można korzystać? Jasne :)
Temu też zamieszczam, zbliżają się święta, trochę wolnego - jeśli mi nic nie wypadnie to po odrobinie odpoczynku z chęcią wrócę do biblioteki. Stąd postanowiłem trochę ją rozreklamować aby zebrać odrobinę bugów czy najbardziej bolesnych braków feature. Biblioteka ofc pod pythona. Jednocześnie liczę, że skala reklamy nie będzie taka aby mnie ubić bugami.
Biblioteka: https://pypi.org/project/devana/
Dokumentacja: https://jhnw.github.io/devana/
Github: https://github.com/JhnW/devana

1

Wygląda spoko, tylko cały czas ucieka mi ten use case

Python package to parse and generate C/C++ code as context aware preprocessor.

Jakiś czas temu zacząłem grzebać sobie poboczny projekt z kategorii narzędzia dla developerów lub system budowy czyli jak zrobić sobie narzędzie które jest w stanie zrozumieć system typów języka, deklaracje, definicje oraz przekazać informacje o nim lub nawet zająć się bezpośrednią generacją na podstawie tych informacji czegoś więcej.

Devana is a python tool that make it easy to parsing, format, transform and generate C++ (or C) code. This tool uses libclang to parse the code. Fundamental problems, bugs and missing features of libclang are fixed in Devann's internal code.

Na czym polega ten code gen? albo ogólnie do czego tego używasz?

bo najpierw myślałem że do jakichś analiz


Tu masz chyba literówkę

Devana is a python tool that make it easy to parsing

=> Devana is a python tool that makes it easy to parse?

0

Na czym polega ten code gen? albo ogólnie do czego tego używasz?

bo najpierw myślałem że do jakichś analiz

Moduł generowania kodu pozwala np. naśladować funkcjonalność MOCa znanego z Qt. Skoro znamy system typów to możemy do nich wygenerować np. serializacje czy funkcje zapewniające dodatkowe informacje. Przykład zastosowania jest w... przykładach do projektu, dokładnie to meta_enum opisuje jak wykonać skrypt który pozwala degenerować do enumówe w C++ ich interpretację w postaci stringów.
W przyszłości planuję na tej podstawie wdrożyć kilka wysokopoziomowych generatorów. W tym celu dodałem już parsowanie niestandardowych atrybutów C++11 aby były jedną z opcji sterowania generacją kodu bezpośrednio w definicjach (obok komentarzy i być może jakiś jsonów) - ale do tego jeszcze trochę czasu.

Tu masz chyba literówkę

Devana is a python tool that make it easy to parsing

=> Devana is a python tool that makes it easy to parse?

Dzięki :) Pewnie nie tylko tam, ale tu się może rzucać w oczy. Pewnie przy kolejnej porcji zmian skoryguję lekko teksty główne.

1

Czy nie uważasz że gdybyś napisał to w C++ to miałbyś większe zainteresowanie tym projektem ze strony C++ community?

0

Nie jestem przekonany. To jest narzędzie, normą dla narzędzi pomocniczych (a tym bardziej takich, które mogą się wpiąć w system budowy) jest jednak użycie jakiegoś języka skryptowego. Pod tym względem python jest po prostu wygodny, pozwalając łatwo użyć projektu. Jakoś nie wyobrażam sobie aby ktokolwiek najpierw kompilował sobie aplikacje pomocnicze do budowy projektu. Takie rzeczy zwykle rezydują w postaci pythona, perla (dawniej), skryptów sh i reszty ferajny. Swego czasu faktycznie popularny bywał C# w wersji script - i bardzo dobrze, że zdechł.
Ostatecznie sam python nie jest tu bottleneckiem w kwestii wydajności, najcięższe operacje bierze na siebie libclang który jest bindingiem pythonowym do natywnego parsera clanga napisanego w C++. Główne problemy wydajnościowe jakie można zaobserwować wynikają z tego, w jaki sposób z clanga korzystam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1