Perseus 2.6 - Caffeinated Cat

  • [Blockierte Grafik: http://apaste.square7.ch/rw_common/images/persaus.png
    Caffeinated Cat

    Was ist Perseus?

    Perseus ist eine kleine, vielseitige Programmiersprache die auf Effizienz und Portabilität zielt. Es ist eine kompilierte Sprache.

    Wie funktioniert das?

    Perseus besteht aus zwei Teilen (wird im Logo deutlich): PCG und FASM. PCG (Perseus Code Generator) ist die eigentliche Sprache. PCG beinhaltet einen Syntax-Debugger und einen Compiler. Der Compiler generiert aus Perseus-Code reinen FASM Code, welcher dann von FASM kompiliert wird. Perseus ist eine selbst-kompilierende Sprache, d.h. sie ist in sich selbst geschrieben. Der gesamte Quellcode der Sprache umfasst ca. 3000 Perseus-Zeilen, bis zu 10 Level Nesting von If/While etc. und braucht vom Code zur fertigen EXE nur 16ms!

    Welche Features bietet Perseus?

    While als Schleife, If/Else/Then, Switch/Case/Default, Select/Case/Default/ Do sind als Flow-Control Operatoren alle mit dabei. Desweiteren lassen sich eigene Funktionen deklarieren, mit Strings und Zahlen diverse Grundrechenarten durchführen, sowie bitwise logische Operationen. Für jede WinAPI Funktion kann mittels eines einzeiligen Prototypes deren Funktionalität einfach in das Programm übernommen werden. Dem Nesten von Funktionen sowie Operatoren sind keine Grenzen gesetzt. Es lassen sich mehrdimensionale Arrays erstellen. Variablen können vorgegebene oder eigene Typen annehmen. Structs können erstellt und objektorientiert angesprochen werden, etc pp.

    Zusätzlich kann (nun jede Art von) Code in Includes gespeichert und einfach eingebunden werden (jetzt auch mit relativen Pfaden). Außerdem bietet Perseus die Möglichkeit im Code FASM Inline zu nutzen, die Aufräumarbeiten übernimmt dabei Perseus automatisch.

    Der große Debugger erkennt jeden Fehler im Code und gibt möglichst genaue Beschreibungen.

    Perseus kann mit externen Ressourcen wie MANIFEST-Dateien umgehen und so auch die Visual-Styles Komponenten nutzen.

    4 Mal editiert, zuletzt von minx (7. Dezember 2013 um 00:35)

  • Wow, nice 8|
    Kannst du ein Geschwindigkeitsvergleich gegen Autoit machen?

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Nur ein kurzer Test:

    Code
    +-----------------+----------------------------------------------+
    | Language        |    Integer Operations per Second (ADD~SUB)   |
    +-----------------+----------------------------------------------+
    | Perseus         | 65,528,842 IOPS (281.33x AutoIt Performance) |
    | AutoIt (Stable) |    232,920 IOPS                              |
    +-----------------+----------------------------------------------+
  • Ah, endlich released!
    Sehr schön, werd ich mir gleich anschauen/ausprobieren. ^^

    (Zuvor muss ich mal Avast überreden, die FASM.exe zu ignorieren und nicht gleich den ganzen Download zu blockieren :whistling: )

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • PainTain:
    -> Avast ausschalten
    -> Downloaden und ZIP entpacken (Alles am besten in einen Ordner)
    -> Pfad als Ausnahme in Avast hinzufügen
    -> Avast wieder einschalten


    Hab einfach mal die apaste-URL + einen Download-Ordner dafür als Ausnahmen hinzugefügt.
    avast blockiert auch die kompilierten Exe'n, wenn ich sie in Papierkorb verschiebe. :D

    minx: Andromeda sieht ja echt super aus, ist der Lexer komplett selbst geschrieben?

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Freut mich, dass es endlich fertig ist :thumbup:

    Es ist wirklich eine super Arbeit geworden! Damit lassen sich endlich wesentlich einfacher inline ASM Funktionen für Autoit erstellen. :D Dann braucht man nurnoch ein bisschen optimieren und man hat Zeit gespart und trotzdem seinen optimierten, schnellen für langwierige Berechnungen.
    Die Syntax ist für mich wirklich sehr gewöhnungsbedürftig. Das scheint etwas von ASM, LUA, (BASIC?) und C/C++ mitgenommen zu haben oder?
    Insgesamt wirklich großes Lob an euch! Danke für diese Bereicherung :thumbup:


    Ich hätte da aber noch ein paar Fragen:
    - Gibt es wie in Autoit das & ein Zeichen mit dem man Strings aneinander "concaten" kann?
    - Wofür steht das @ vor Funktionen und Variablen (und dann auch noch vor Funktionsaufrufen)?

    ein paar Feststellungen:
    - bitwise NOT ist nicht ~ sondern !
    - \r\n in C\C++ wird zu ~r~n in Perseus (kommt das von Lua?)+
    - das Beispiel "controls" ruckelt, wenn man das Fenster verschiebt

    - der oben genannte Konsolenbefehl "path %PATH%;..." funktioniert bei mir nur für die aktuelle Konsolensession. Ich habe in der Systemsteuerung mal nach "Umgeb" gesucht und konnte dort bei Umgebungsvariablen ändern bei %PATH% den bin-Pfad anfügen. (ich hab mich dann zur Sicherheit neu angemeldet) Dann hat es funktioniert.


    und nun Verbesserungsvorschläge:
    - für das inline-ASM: eine do-end Unterstützung damit nicht in jeder Zeile asm stehen muss
    - für das inline-ASM: im inline Beispiel vertauscht ihr die beiden Parameter ^^ Dank Kommutativgesetz (a+b=b+a) merkt man das dort nicht. Bei sub wird auf einmal der zweite Parameter minus den ersten gerechnet.
    - @GetString kann keine negativen Zahlen anzeigen, da könnte man einen 2. Parameter oder eine 2. Funktion zur Verfügung stellen
    - Es wäre super geil wenn man damit kleine DLLs machen könnte 8o auch wenn man sich ja den ASM-Code einer Funktion sehr gut abgreifen kann :thumbup:
    - Bei der Dropbox.exe kann man in der Combobox reinklicken und selber was eintippen. Falls das nicht nötig ist, sollte man das ändern, dann muss man nicht so präzise klicken :rolleyes:

    -bei größeren Programmen wird man sehr viele DLL includes brauchen. Zum Beispiel die Konsolenbeispiele brauchen alle schon 3-4 Zeilen am Anfang. Man könnte da ein paar jeweils in Includes zusammenfassen. (iostream, fstream, windows, etc. sind bekannte includes bei C++)
    - dazu kommt, dass man einige sogut wie immer gebrauchten Funktionen automatisch includen könnte (in jeder Konsolenapplikation wird "print" gebraucht). Warum also nicht ab damit in ein include und vom Compiler automatisch includen lassen?


    Ich hab mir jetzt eigentlich alles gut angeguckt. Wenn ihr mir die Fragen beantwortet habt kann ich auch anfangen selber Programme zu schreiben ^^
    Ich freu mich schon :)

    PS: Andromedia sieht wirklich sehr gut aus :)

    mfg
    TheShadowAE

    Einmal editiert, zuletzt von TheShadowAE (27. Oktober 2013 um 22:25)

  • Insgesamt wirklich großes Lob an euch! Danke für diese Bereicherung

    Danke ;)

    Gibt es wie in Autoit das & ein Zeichen mit dem man Strings aneinander "concaten" kann?

    Nein, dazu bitte die funcLib benutzen. Daran arbeite ich gerade ^^

    - Wofür steht das @ vor Funktionen und Variablen (und dann auch noch vor Funktionsaufrufen)?

    Das ist ein Pointer.

    - das Beispiel "controls" ruckelt, wenn man das Fenster verschiebt

    Liegt daran, dass das Zeichnen der XOR-Tex an WM_PAINT gehookt ist, was jedes mal beim Verschieben ausgelöst wird. An WM_CREATE hooken und schon gehts ;)

    - der oben genannte Konsolenbefehl "path %PATH%;..." funktioniert bei mir nur für die aktuelle Konsolensession. Ich habe in der Systemsteuerung mal nach "Umgeb" gesucht und konnte dort bei Umgebungsvariablen ändern bei %PATH% den bin-Pfad anfügen. (ich hab mich dann zur Sicherheit neu angemeldet) Dann hat es funktioniert.

    CMD als Admin und der path-Befehl funktioniert auch global (zumn. bei mir :D )

    - @GetString kann keine negativen Zahlen anzeigen, da könnte man einen 2. Parameter oder eine 2. Funktion zur Verfügung stellen

    Joa, wenn du Lust hast, kannst du das gerne beitragen, sonst kommts später sowieso ;)

    - Es wäre super geil wenn man damit kleine DLLs machen könnte auch wenn man sich ja den ASM-Code einer Funktion sehr gut abgreifen kann

    Das ist nicht für die nächste Version geplant, aber etwas ähnliches :whistling:

    - Bei der Dropbox.exe kann man in der Combobox reinklicken und selber was eintippen. Falls das nicht nötig ist, sollte man das ändern, dann muss man nicht so präzise klicken

    Schönheitsfehler, wird später behoben :D

    -bei größeren Programmen wird man sehr viele DLL includes brauchen. Zum Beispiel die Konsolenbeispiele brauchen alle schon 3-4 Zeilen am Anfang. Man könnte da ein paar jeweils in Includes zusammenfassen. (iostream, fstream, windows, etc. sind bekannte includes bei C++)

    Das ist der Plan. Auch hier gilt: If you feel like doing it: do it! ;) Ich habe nicht so viel Zeit und die Includes wachsen nur langsam.

    - dazu kommt, dass man einige sogut wie immer gebrauchten Funktionen automatisch includen könnte (in jeder Konsolenapplikation wird "print" gebraucht). Warum also nicht ab damit in ein include und vom Compiler automatisch includen lassen?

    Das wird nicht passieren.

  • Ich hätte lieber den * als Pointer :P

    Weitere Fragen:
    Bei @GetStringEx ist ein Semikolon zwischen den Parameter, macht das einen Unterschied zu Komma?
    Außerdem wird der Buffer konkret "122341231" erstellt. kann man ein Array erstellen und zurückgeben oder wird das als lokale Variable wieder zerstört?
    Kann man irgendwann Variablen in den ASM-code einsetzen? (mov eax, BuFF)

    Ich kümmere mich dann nebenbei um eine Optimierung und Signed zu GetString.

  • Bei @GetStringEx ist ein Semikolon zwischen den Parameter, macht das einen Unterschied zu Komma?

    Bei der Deklaration einer Funktion muss der Typ jedes Parameters angegeben und die Parameter durch ein Semikolon getrennt werden. Beim Aufruf kommt ein Komma zum Einsatz. Siehe Spoiler in #1

  • Zitat von #1

    TYPE [@]Function(TYPE [@]Paramter1[, ...])

    man beachte das Komma, aber ok ^^ Ich weiß es ja jetzt

    Wie sieht es mit den anderen beiden Fragen aus?
    Ich brauche nämlich irgendeinen nicht lokalen Speicher. (Am besten wäre ja eigentlich malloc/new)

  • Hier ist schonmal eine nicht optimierte Variante ohne ASM für signed numbers:

    Spoiler anzeigen


    EDIT:
    alter kompilierter ASM code: 106 Zeilen (in diesem Post die obige Funktion)
    neuer kompilierter ASM code: 59 Zeilen (in diesem Post die untere Funktion)

    hier also die neue Funktion mit optimiertem ASM:

    Spoiler anzeigen


    Hab es mit einer zusätzlichen Funktion dann geschafft irgendwie globalen Speicher zu kriegen ^^

    Einmal editiert, zuletzt von TheShadowAE (27. Oktober 2013 um 21:41)

  • Ich hab noch einen Bug gefunden (glaube ich):

    Code
    void test()
    	print("test");
    	return;  <----Line 11
    end

    (!) ERROR in File (test.prs) Line (11) Col (9): Undeclared variable / function.

    Wenn ich ihm return 0; hinschreibe sagt er was von "address uncalculateable". Ich glaube man kann keine void-Funktion machen


    EDIT: Sorry.. Doppelpost