11

Kendi programlama dilimi c programlama dilinin bir uzantısı olarak yazmak istiyorum. Benim icat ettiğim tüm programlama dili, sadece geçerli bir c kodu çeviren kısa yollardır. Bütün bunlar yapılırc programlama dilini gcc ile genişletme

void* TcpConnection_connect(char *addr) 

basit isim yerine geçer: Örneğin: için

namespace TcpConnection { 
    void* connect(char *addr) 
} 

çevirmek olacaktır. Bu, sağlamak istediğim bir uzantının yalnızca bir örneğidir. Bir başka basit uzantı da aşırı fonksiyon işlevi görecektir (bu, fonksiyon isminin sonuna argüman türlerinin bitimiyle bağdaşır.

Her durumda, sonuç tam olarak geçerli C kodudur. gcc kodu?

cevap

13

Dilinizi ayrıştıran ve daha sonra gcc'ye iletilen C'ye derleyen bir önişlemci yazabilirsiniz.Yani C++'nin ilk uygulamalarında bu şekilde çalışmış olabilirsiniz. Ancak, LLVM'nin clang'ını kullanmayı tercih edebilirsiniz. Birkaç C-ailesi dilini desteklemek için tasarlanan ve LLVM'nin bir parçası olarak, daha modüler ve genişletilmesi daha kolay olacak şekilde tasarlanmıştır.

2

Prototipleme için, sadece bir ön işlemciye gidin Seçtiğiniz dilde yazılmış (C, Perl, Python ...) ve sonra Makefile kurallarına göre inşa edin. Her şeyi denemek için kolay, düşük maliyetli bir yol elde etmek için ...

Farklı bir dosya uzantısı kullanın ve .c'yi .c'ye dönüştürün.

0

Sen Clang başka bir seçenektir http://cil.sourceforge.net/

üstünde bir şey kesmek, ama o en yararlı kod yeniden yazma aracı değil, ve onun ayrıştırıcı ön uç değiştirme o kadar kolay değildir.

1

Bazı C99 makro büyüsü ve Perl kullanarak özel bir bayt kodu biçiminde bir derleme dili gömmek gibi bir şey yaptım.

makro

#define x3_pragma_(...) _Pragma(#__VA_ARGS__) 
#define x3_asm(...) ((const struct x3instruction []){ \ 
    x3_pragma_(X3 ASM __VA_ARGS__) \ 
}) 

almak için bir Perl komut dosyası üzerinden borulu alır

((const struct x3instruction []){ 
#pragma X3 ASM exit = find val(0) 
}) 

içine

x3_asm(exit = find val(0)) 

dönüşümü

((const struct x3instruction []){ 
{ { { X3_OPFINDVAL, { .as_uint = (0) } }, { X3_OPEXIT, { 0 } } } }, 
}) 
gcc ve Perl

bir örnek çağırma şu şekilde görünecektir:

gcc -E foo.c | perl x3pp.pl | gcc -o foo.o -x c - 

O stricly gereğinden fazla karışık ama bunu yararlı C önişlemci benim özel önişlemcisinden önce çalışır bulundu ve ben de kullanarak sevdim pragmalar, kaynak yasal olarak kalır C.