Compiler zu eigener Programmiersprache bauen
-
Hallo!
Ich möchte eine Programmiersprache erfinden und einen dazu passenden Compiler bauen. Ich habe mich schon im Internet informiert, aber ich habe manche Punkte noch nicht ganz verstanden.
Im Internet hieß es, dass man, um es sich einfacher zu machen, erst einmal in eine existierende Sprache compilieren sollte und diese dann einem Compiler für diese Sprache übergeben sollte.
Aber jetzt habe ich die Frage: Wenn ich es jetzt in eine cpp-Datei compilieren würde, wie wird es dann eine exe-Datei? Kann mein Compiler es einfach einem existierenden Compiler übergeben und wenn ja, wie?
Kann mir jemand weiterhelfen?
-
Blauwaal schrieb:
Aber jetzt habe ich die Frage: Wenn ich es jetzt in eine cpp-Datei compilieren würde, wie wird es dann eine exe-Datei? Kann mein Compiler es einfach einem existierenden Compiler übergeben und wenn ja, wie?
Ich will dir ja nicht die Illusion rauben, aber einen Compiler zu entwickeln ist einige Größenordnungen komplizierter als die Frage, die dich da gerade umtreibt. Aber wie dem auch sei, du kannst andere Programme z.B. mit der Funktion system() aufrufen. Du kannst auch deinen Compiler und den anderen Compiler hintereinander in einem Script aufrufen. Du kannst diesen Ablauf auch dem Benutzer und seinem Buildtool überlassen.
-
Lieber Blauwal, wenn ich mir die Qualität deiner Fragen und Anmerkungen in allen Beitrage durchlese die du hier je gepostet hast, dann kann ich an dieser Stelle nur davon abraten, eine Programmiersprache erfinden zu wollen. Du verstehst ja noch nicht mal eine bereits existierende, bei der mittlerweile schon alles durchgekaut wurde. Also um eine eigene erfinden zu wollen, dafür hast du viel zu wenig Grips...
-
Lieber Bashar,
danke für Deine Antwort. Ich möchte vorerst nur eine sehr kleine Programmiersprache entwerfen und keineswegs ein c++++.
Ich glaube, ich entscheide mich dafür, es dem Benutzer und seinem Buildtool zu überlassen. Ich hab aber jetzt das Problem, dass wenn mein Compiler in eine cpp-Datei compiliert, der c++-Compiler, weil es keine vollständige Projektmappe ist, das Programm nicht compiliert.Lieber weißer Hai mit Deinen garstigen scharfen Zähnen,
Du hast ja Recht, dass ich trotz meines Namens eigentlich noch ein kleiner Fisch bin. Aber ich fürchte, dass ich erst wieder ruhig schlafen kann, wenn ich wenigstens versucht habe eine Programmiersprache zu erfinden. Bitte friss mich nicht.
-
Haben Blauwale nicht den längsten Penis? hmmm, sei es wie es sei. Naja, schaden kann es nicht, du wirst definitiv auch sehr viel dabei lernen, frisst aber unendlich viel Zeit...
-
Ich fühl mich leicht getrollt, aber es war ja gerade Weihnachten ...
Blauwaal schrieb:
Ich hab aber jetzt das Problem, dass wenn mein Compiler in eine cpp-Datei compiliert, der c++-Compiler, weil es keine vollständige Projektmappe ist, das Programm nicht compiliert.
Du hast dieses Problem? Wirklich? Du meinst nicht vielleicht eher, dass du Angst hast, dieses Problem in frühestens einem halben Jahr zu haben? Vielleicht versuchst du, bevor du damit anfängst, auch erstmal, einen bestehenden (C++-)Compiler besser zu verstehen. So von der Bedienung her meine ich.
-
Sorry, Bashar.Es war nicht meine Absicht Dich zu trollen.
Ich versuche noch mal auf anderen Wegen die offenen Fragen zu klären.
Denn trotz allem habe ich die Hoffnung es zu schaffen noch nicht aufgegeben.
-
Auch einen einfachen Compiler zu schreiben, der zuerst in eine andere Sprache übersetzt, ist nicht einfach. Dafür braucht man schon ein gewisses Verständnis von Informatik, formalen Sprachen und Programmiererfahrung.
Dabei wird "irgendwas" entstehen, z.B. eine C oder eine C++ Datei. Die mit einem richtigen Compiler zu bauen ist dann im Gegensatz dazu nur eine leichte Fingerübung. Es ist zwar nachvollziehbar, warum du dir jetzt schon Gedanken darüber machst, allerdings ist das Problem an sich völlig irrelevant. Wenn du soweit bist, einen Compiler zu schreiben, der aus deiner eigenen Sprache eine cpp erzeugt, wirst du damit sicher keine Schwierigkeiten mehr haben.
-
Ich habe nun den Anfang von meinem Compiler gebaut. Er kann bis jetzt nur einen Befehl, aber diesen übersetzt er auf c++.:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>#define in_cout_datei "in.txt"
#define ozw_cout_datei "ozw"
#define out_cout_datei "out.cpp"using namespace std;
void befel(string sB);
void parser();namespace include
{
bool Windows = false;
bool Iostream = false;
bool std = false;
}
namespace alt
{
bool alt = false;
string tuhe("");
}ofstream ozw(ozw_cout_datei);
int main()
{
ifstream in(in_cout_datei);
vector<char>source_code;
copy(
istreambuf_iterator<char>(in.rdbuf()),
istreambuf_iterator<char>(),
back_inserter(source_code));
int i = 0;
string sB;
sB = "";
while (source_code.size() > (size_t)i)
{
if (source_code[i] == ' ' || source_code[i] == '\n' || source_code[i] == '\r')
{
if (sB != "")
{
befel(sB);
}
sB = "";
}
else
{
char Text[21];
sprintf_s(Text, "%s%c", sB.c_str(), source_code[i]);
sB = Text;
}
i++;
}
if (sB != "")
{
befel(sB);
}
sB = "";
ozw.close();
parser();
cout << endl;
system("PAUSE");
}void befel(string sB)
{
if (!alt::alt)
{
if (sB == "Text")
{
include::Iostream = true;
include::std = true;
alt::alt = true;
alt::tuhe = "Text";
}
else
{
cout << "Der Begriff: \"" << sB << " ist undefiniert!" << endl;
}
}
else
{
if (alt::tuhe == "Text")
{
ozw << "cout << \"" << sB << "\";" << endl;
alt::alt = false;
alt::tuhe = "";
}
}
}void parser()
{
ofstream out(out_cout_datei);
if (include::Iostream)
out << "#include <iostream>" << endl;
if (include::std)
out << "using namespace std;" << endl;
out << "int main(){" << endl;
ifstream izw(ozw_cout_datei);
out << izw.rdbuf();
out << "return 0;}";
}Jetzt würde mich interessieren, ob man diese cpp-Datei auch einzeln compilieren kann oder ob man sie jedes mal in eine neue Projektmappe einfügen muss.
-
Von was für 'ner Projektmappe redest Du die ganze Zeit? Einen Compiler ruft man auf, und fertig?! Verwechselst Du Compiler und IDE?
-
LOL.
Wenn dir das mit dem Übersetzen so wichtig ist... Du redest von VS, also könntest du z.B. ein Makefile für nmake vorbereiten, als Vorlage mitausliefern und nmake mit dem Makefile ausführen.
-
Das ist kein Compiler, sondern ein Programm, dessen Code mit ungenügend zu bewerten ist.
Deine Vorhaben ist mit deinem Kenntnisstand vermutlich nicht angemessen zu realisieren. Möglicherweise strebst du auch ein ganz anderes Ziel an und kennst die Fachausdrücke nicht, aber auch in diesem Fall gilt, dass dein Vorhaben nicht angemessen realisierbar ist.
-
Ansonsten kannst du dir noch folgenden Artikel ansehen: https://www.c-plusplus.net/forum/268247
Der Artikel deutet an, wie z.B. ein mathematischer Term in eine Zwischensprache (hier C++ Makros) überführt werden könnte (s. 8 Abstrakter Syntaxbaum) oder wie man sowas überhaupt auswertet (braucht man für einen echten Compiler ohnehin).
Es ist aber wirklich nichts für Anfanger!
-
Blauwaal schrieb:
Ich glaube, ich entscheide mich dafür, es dem Benutzer und seinem Buildtool zu überlassen. Ich hab aber jetzt das Problem, dass wenn mein Compiler in eine cpp-Datei compiliert, der c++-Compiler, weil es keine vollständige Projektmappe ist, das Programm nicht compiliert.
Wenn du es dem Benutzer überlassen willst, dann ist es auch die Aufgabe des Benutzers die "Projektmappe" (aka. Solution) zu erstellen.
Sowohl die .sln Files als auch die .vcxproj Files sind allerdings rechte einfache Textfiles. Die kannst du per Clickediclick 1x erstellen und dann beliebige .cpp Files damit übersetzen. Das File .cpp muss halt einfach nur immer gleich heissen. Bzw. wenn du das .vcxproj File aufmachst siehst du da drin auch sofort den Namen des .cpp Files und wie man den ändern kann sollte dann klar sein.Du kannst aber auch einfach den Compiler direkt aufrufen. Der heisst CL.EXE und ist ein ganz normales Commandline-Tool. Der übersetzt einzelne .cpp Files und braucht keine Projektmappen - bzw. er kann damit nicht mal was anfangen. Dann noch linken (LINK.EXE) und fertig ist dein Programm. Die Kommandozeilenparameter für die beiden Programme sind im Internet auch gut dokumentiert, kannst du dir schnell selbst rausgoogeln.
-
Vielen Dank für eure Antworten. Ich habe tatsächlich ein bisschen durcheinandergebracht. Aber eure Antworten haben mir geholfen, wie ich an meinem Projekt weiterarbeiten kann. Nochmals Dankeschön.