Portierung von make.c nach D.

Walter Bright ist der "wohlwollende, lebenslange Diktator" der Programmiersprache D und Gründer von Digital Mars . Er verfügt über jahrzehntelange Erfahrung in der Entwicklung von Compilern und Interpreten für mehrere Sprachen, darunter Zortech C ++, der erste native C ++ - Compiler. Er ist auch der Schöpfer von Empire , der Hauptinspiration für Sid Meiers Civilization.



Bessere C-Serie
  1. D C
  2. ,
  3. make.c D


Besseres C ist eine Möglichkeit, vorhandene C-Projekte auf konsistente Weise nach D zu portieren. Dieser Artikel zeigt Ihnen Schritt für Schritt, wie Sie ein nicht triviales Projekt von C nach D konvertieren, und zeigt Ihnen die häufigsten Probleme, die auftreten.



Obwohl das Frontend des D-Compilers dmd bereits in D konvertiert wurde, ist es ein so großes Projekt, dass es schwierig ist, es vollständig abzudecken. Ich brauchte ein kleineres und bescheideneres Projekt, das vollständig verstanden werden konnte, aber kein spekulatives Beispiel war.



Ein altes Make-Programm, das ich Anfang der 1980er Jahre für den Datalight C-Compiler geschrieben habe, kam mir in den Sinn . Dies ist eine echte Implementierung des klassischen Make-Programms, das seit den frühen 1980er Jahren ständig verwendet wird. Es wurde bereits vor der Standardisierung in C geschrieben, von einem System auf ein anderes portiert und passt in nur 1961 Codezeilen, einschließlich Kommentaren. Es wird heute noch regelmäßig verwendet.



Hier ist die Dokumentation und der Quellcode . Die Größe der ausführbaren Datei make.exe beträgt 49.692 Byte und wurde zuletzt am 19. August 2012 geändert.



Unser böser Plan:



  1. Minimieren Sie Unterschiede zwischen C- und D-Versionen. Wenn sich das Verhalten der Programme unterscheidet, ist es daher einfacher, die Ursache des Unterschieds zu finden.
  2. C. № 1.
  3. . , . № 1.
  4. C , .
  5. , № 4.


, , , ..



!



C D. — 52 252 ( — 49 692 ). , , - NEWOBJ ( C- ) DMC 2012 .





. 664 1961, — , , , , .



#include D: , #include <stdio.h> import core.stdc.stdio;. , Digital Mars C, D ( ). , 29- 64-. (. import).



#if _WIN32 version (Windows). (. ).



extern(C): C. (. ).



debug1, debug2 debug3 debug prinf. , #ifdef DEBUG debug. (. debug).



/* Delete these old C macro definitions...
#ifdef DEBUG
-#define debug1(a)       printf(a)
-#define debug2(a,b)     printf(a,b)
-#define debug3(a,b,c)   printf(a,b,c)
-#else
-#define debug1(a)
-#define debug2(a,b)
-#define debug3(a,b,c)
-#endif
*/

// And replace their usage with the debug statement
// debug2("Returning x%lx\n",datetime);
debug printf("Returning x%lx\n",datetime);


TRUE, FALSE NULL true, false null.



ESC . (. ).



// #define ESC     '!'
enum ESC =      '!';


NEWOBJ .



// #define NEWOBJ(type)    ((type *) mem_calloc(sizeof(type)))
type* NEWOBJ(type)() { return cast(type*) mem_calloc(type.sizeof); }


filenamecmp .



.



D (thread-local storage, TLS). make — , __gshared. (. __gshared).



// int CMDLINELEN;
__gshared int CMDLINELEN


D , typedef . alias. (. alias). , struct.



/*
typedef struct FILENODE
        {       char            *name,genext[EXTMAX+1];
                char            dblcln;
                char            expanding;
                time_t          time;
                filelist        *dep;
                struct RULE     *frule;
                struct FILENODE *next;
        } filenode;
*/
struct FILENODE
{
        char            *name;
        char[EXTMAX1]  genext;
        char            dblcln;
        char            expanding;
        time_t          time;
        filelist        *dep;
        RULE            *frule;
        FILENODE        *next;
}

alias filenode = FILENODE;


D macro — , MACRO.



C, D , :



// char *name,*text;
// In D, the * is part of the type and 
// applies to each symbol in the declaration.
char* name, text;


C D. (. D).



static D . C D, , . __gshared, . (. static).



/*
static ignore_errors = FALSE;
static execute = TRUE;
static gag = FALSE;
static touchem = FALSE;
static debug = FALSE;
static list_lines = FALSE;
static usebuiltin = TRUE;
static print = FALSE;
...
*/

__gshared
{
    bool ignore_errors = false;
    bool execute = true;
    bool gag = false;
    bool touchem = false;
    bool xdebug = false;
    bool list_lines = false;
    bool usebuiltin = true;
    bool print = false;
    ...
}


D . , , , .



make- .



, , , D .



// int cdecl main(int argc,char *argv[])
int main(int argc,char** argv)


mem_init() , .



C , D , .



void cmderr(const char* format, const char* arg) {...}

// cmderr("can't expand response file\n");
cmderr("can't expand response file\n", null);


- (->) C (.), D .



version.



/*
 #if TERMCODE
    ...
 #endif
*/
    version (TERMCODE)
    {
        ...
    }


. D .



// doswitch(p)
// char *p;
void doswitch(char* p)


D debug . xdebug.



C \n\ . D .



/+ +/. (. , ).



static if #if. (. static if).



D , .ptr.



// utime(name,timep);
utime(name,timep.ptr);


const C D, D . (. const immutable).



// linelist **readmakefile(char *makefile,linelist **rl)
linelist **readmakefile(const char *makefile,linelist **rl)


void* char* D .



// buf = mem_realloc(buf,bufmax);
buf = cast(char*)mem_realloc(buf,bufmax);


unsigned uint.



inout , «» . const, , . (. inout-).



// char *skipspace(p) {...}
inout(char) *skipspace(inout(char)* p) {...}


arraysize .length. (. ).



// useCOMMAND  |= inarray(p,builtin,arraysize(builtin));
useCOMMAND  |= inarray(p,builtin.ptr,builtin.length)


(immutable), , . (. ).



// static char envname[] = "@_CMDLINE";
char[10] envname = "@_CMDLINE";


.sizeof sizeof() C. (. .sizeof).



// q = (char *) mem_calloc(sizeof(envname) + len);
q = cast(char *) mem_calloc(envname.sizeof + len)


Windows .



char * void*.



! , . , , — , .



man.c, , make -man. , D, .



make , make-:



\dmd2.079\windows\bin\dmd make.d dman.d -O -release -betterC -I. -I\dmd2.079\src\druntime\import\ shell32.lib




C D, . .



, , :



  • #include import;
  • D- ;
  • ->;
  • :

    • ,
    • ,
    • ,
    • ,
    • ;
  • ;
  • ;
  • ;
  • ;
  • ;
  • C D.


:



  • ,
  • ,
  • ,
  • ,
  • .




, Better C, , :





Zum Handeln



Wenn Sie Englisch sprechen, besuchen Sie Forum D und teilen Sie uns mit, wie Ihr Better C-Projekt voranschreitet!




All Articles