C Language (borrador) Propuesta que habilita funciones genéricas y tipos paramétricos en C; Prototipo disponible aquí.
Psique-C es un interfaz de compilador para el idioma C. Está diseñado como una biblioteca, con un enfoque en la implementación de herramientas de análisis estático de los programas C, sin requerir la comprensión de su configuración de construcción. Bellow son las principales características de Psique-C:
struct , union , enum y typedef faltantes (debido a las fallas #include ).La API nativa de Psique-C está en C ++, pero se planifican API para otros idiomas.
void analyse ( const SourceText& srcText, const FileInfo& fi)
{
ParseOptions parseOpts;
parseOpts. setAmbiguityMode (AmbiguityMode::DisambiguateAlgorithmically);
auto tree = SyntaxTree::parseText (srcText,
TextPreprocessingState::Preprocessed,
TextCompleteness::Fragment,
parseOpts,
fi. fileName ());
auto compilation = Compilation::create ( " code-analysis " );
compilation-> addSyntaxTree (tree. get ());
AnalysisVisitor analysis (tree. get (), compilation-> semanticModel (tree. get ()));
analysis. run (tree-> translationUnitRoot ());
}SyntaxVisitor::Action AnalysisVisitor::visitFunctionDefinition ( const FunctionDefinitionSyntax* node) override
{
const sym = semaModel-> declaredSymbol (node);
if (sym-> kind () == SymbolKind::Function) {
const FunctionSymbol* funSym = sym-> asFunction ();
// ...
}
return Action::Skip;
}
Psique-C viene con el controlador CNIPPET y se puede usar como un analizador ordinario para los fragmentos C. Por ejemplo, si compila el fragmento a continuación con CNIPPET , verá un diagnóstico similar al que vería con GCC o Clang.
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psyte-C puede opcionalmente (hasta ahora solo disponible en la rama original) inferir los tipos faltantes de un fragmento C. Por ejemplo, para el fragmento a continuación, Psique-C puede inferir una declaración (compilable) para que T y sintetizarlo durante la compilación.
void f ()
{
T v = 0 ;
v -> value = 42 ;
v -> next = v ;
} typedef struct TYPE_2__ TYPE_1__ ;
struct TYPE_2__
{
int value ;
struct TYPE_2__ * next ;
} ;
typedef TYPE_1__ * T ;Es posible que desee usar esta funcionalidad para:
Excepto por la inferencia de tipo, que está escrita en Haskell, Psique-C está escrito en C ++ 17; CNIPPET está escrito en Python 3.
Para construir:
cmake CMakeLists.txt && make -j 4
Para ejecutar las pruebas:
./test-suite
De la psique-c en sí:
Inferencia de tipo para C: aplicaciones al análisis estático de programas incompletos
Transacciones ACM en lenguajes y sistemas de programación - Toplas , Volumen 42, Número 3, Artículo No. 15, diciembre de 2020.
Inferencia de semántica estática para programas C incompletos
Actas de la ACM sobre lenguajes de programación, Volumen 2, número Popl , enero de 2018, Artículo No. 29.
Que usan psique-c:
Slade: un descompilador de modelo de lenguaje pequeño portátil para un ensamblaje optimizado
Actas del Simposio Internacional IEEE/ACM sobre generación y optimización de código - CGO , 2024.
Anghabench: una suite con un millón de puntos de referencia C compilables para la reducción del tamaño de un código
Actas del Simposio Internacional IEEE/ACM sobre generación y optimización de código - CGO , 2021.
Generación de entradas internos para matrices en idiomas no hechos de memoria
Actas del Simposio Internacional IEEE/ACM sobre generación y optimización de código - CGO , febrero de 2019, p. 136-148.
Anotación automática de tareas en código estructurado
Actas de la Conferencia Internacional sobre Arquitecturas Paralelas y Técnicas de Compilación - PACT , noviembre de 2018, Artículo No. 31.