Essay - Free Blitz2D

Übersicht Sonstiges Smalltalk

Gehe zu Seite 1, 2, 3, 4  Weiter

Neue Antwort erstellen

Vertex

Betreff: Essay - Free Blitz2D

BeitragMi, Okt 31, 2007 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde, Blitz2D hat langsam ausgedient und könnte ruhigen Gewissens kostenlos vertrieben werden. Dies soll ein Denkanstoß sein, wie man dies umsetzen könnte.

Compiler
Wir haben da zuerst die Sprache BlitzBasic. Die Syntax müsste Formal definiert werden da Mark Sibly keine Dokumente dazu bereit stellt. Dies geschieht mittels EBNF. Das könnte folgendermaßen Aussehen:
Code: [AUSKLAPPEN]
RepeatUntil   = 'Repeat'
                {Statement}
                'Until' Expression;

WhileWend     = 'While' Expression
                {Statement}
                'Wend';

SelectCase    = 'Select' Expression
                {'Case' Expression {Statement}}
                ['Default' Expression {Statement}]
                {'Case' Expression {Statement}}
                ('EndSelect' | 'End Select');


Aus dieser formalen Definition lässt sich ein Lexer basteln, der die Quellcodes in so genannte Tokens unterteilt. Dabei werden Nummern, Bezeichner, Strings, Keywords, Labels usw. erkannt ohne aber dabei schon Aufschluss zu geben, ob der Quelltext korrekt ist. Folgendes Beispiel:
Code: [AUSKLAPPEN]
Global X%

For X = 1 To 10
   Print "Hallo Welt"
Next

Würde in Tokens aufgesplittet folgendes ergeben:
Code: [AUSKLAPPEN]
Id         | Content
-----------+------------
Keyword    | Global
Identifier | X%
Keyword    | For
Identifier | X
Symbol     | =
Number     | 1
Keyword    | To
Number     | 10
Identifier | Print
String     | Hallo Welt
Keyword    | Next


Nun ist der Parser am Zug. Er analysiert die Tokens und erstellt einen abstrakten Syntax Baum kurz AST auf. Das könnte auf das obige Beispiel so aussehen:
Code: [AUSKLAPPEN]
                 Program
                    |
           +--------+-----------------------+
           |                                |
VariableDecleration                      ForNext
           |                                |
         +-+-+         +------+------+------+----------+---------------+
         |   |         |      |      |      |          |               |
      Global X%       For Assignment To Expression Statement          Next
                              |             |          |
                          +---+----+        10    FunctionCall
                          |   |    |                   |
                          X%  =    1               +---+------+
                                                   |          |
                                                 Print    Expression
                                                              |
                                                         "Hallo Welt"


Aus diesem Baum erfolgt dann eine Tabelle, die alle Bezeichner und deren Typ bereitstellt. Blitz ist da in Sachen Variablen recht offen, was die Deklaration an geht. Die Variablen müssen also nicht vorher über Global, Local oder Dim deklariert werden, sondern werden vom Compiler automatisch beim ersten Vorkommen deklariert. An dieser Stelle würde ich jedenfalls zumindest Warnungen in der Compiler-Ausgabe anzeigen wie "Warning Variable 'X' is not explicit declared".

In eine solchen Tabelle kommen also die Bezeichner. Dies ist wichtig, damit später eine semantische Analyse erfolgen kann. Zu den Bezeichner gehören wie schon erwähnt lokale/globale Variablennamen und Funktionsnamen. Blitz ist da recht simpel gestrickt, was Scopes angeht. Ich meine damit, das es "echte" lokale Variablen nur innerhalb von Funktionen gibt(in BlitzMax lassen sich diese bspw. auch in Repeat-Until Blöcken deklarieren).

Dazu ein Beispiel:
Code: [AUSKLAPPEN]
Global X%, Y#, Z$

A = X + Y + Z

Function DoSomething(X, Y, Z)
   Local Blub$
End Function


Die dazugehörige Tabelle könnte so aussehen:
Code: [AUSKLAPPEN]
Identifier    | Type    | Scope
--------------+---------+------------
X             | Integer | Global
Y             | Float   | Global
Z             | String  | Global
A             | Integer | Global
F DoSomething | Integer | Global
X             | Integer | DoSomething
Y             | Integer | DoSomething
Z             | Integer | DoSomething
Blub          | String  | DoSomething


Bei der semantischen Analyse kann natürlich nicht einem gesagt werden, dass Flaeche# = Hoehe# + Breite# falsch ist vielmehr wird folgendes erkannt:
- nicht vorhandene Variablen(sollten als Warnung ausgegeben werden)
- nicht vorhandene Funktionen
- unterschiedliche Werte-Typen. Bspw. $MeinString = 123 sollte zumindest eine Warnung erzeugen.
Grundsätzlich macht aber Blitz ein automatisches Typecasting -> $MeinString = String(123).
- Falsche Anzahl an Parametern bei Funktionsaufrufen

Es wurde nun bereits eine Token-Liste erstellt, daraus ein AST und dieser AST auf Korrektheit geprüft. Wenn all diese Schritte bestanden wurden, ist der Quelltext korrekt und es kann daraus ein ausführbares Programm erzeugt werden.

Dabei gibt es unterschiedlichste Methoden. Man kann direkt aus dem AST ein Assemblercode generieren lassen. Den Assemblercode zu erstellen ist gar nicht mal so schwierig, aber die Optimierung. Gerade der x86 Umfang an Instruktionen ist groß. Da lässt sich einiges an Optimierungen zaubern was aber mit enormen Wissen/Aufwand verbunden ist.

Der AST liese sich auch so aufbauen, dass man ihn an die GNU CC Tools übergeben könnte. user posted image
Wir bauen praktisch ein Frontend; Middleend(also salopp gesagt Optimierung) und Backend(Maschinencode -Erzeugung) übernehmen die GNU CC Tools. Riesen Vorteil: Blitz wäre endlich Plattform unabhängig - könnte somit auch unter Linux, MacOSX, Amiga usw. laufen.

Ein weitere Denkanstoß hier sei BlitzBasic .NET fähig zu machen. Dazu müsste aus dem AST eine Art Assemblercode für die CIL gestaltet werden. Die Vorteile wären: Funktionen, die in Blitz geschrieben wurden, könnten unter C#, VB.NET, J# uvm. genutzt werden; Auch wenn .NET (ohne jetzt Streitigkeiten auszulösen) größtenteils proprietär(Microsoft) ist, so ist auch .NET Plattform unabhängig. Auch Blitz Programme liesen sich dann wieder unter Linux, MacOS usw. ausführen.

Ich pers. halte aber folgendes für die einfachste Lösung:
Aus dem AST wird ein C-Code erstellt, der dann über den gcc(der C Compiler aus der GNU CC) in ausführbaren Maschinencode kompiliert wird. Vorteile: Sehr einfach umzusetzen, Plattform unabhängig, Codeoptimierung. Nachteil: Etwas langsamere Kompilierung(erst muss der BB Code gelext, geparst usw. werden und dann der daraus entstandene C Code ebenfalls)

An der Lösung über den C Code halte ich dennoch weiter fest, da vor allem die einfache Umsetzung von Vorteil ist. Es gibt zudem ein recht große Anzahl an C Compilern, wie etwa auch Tiny C Compiler, Portable C Compiler uvm. die bei der Kompilierungszeit unter die Arme greifen.

Blitz Engine
Natürlich müssten die kompletten Funktionen von Blitz nachprogrammiert werden. Schließlich ist Blitz nicht nur durch die Sprache so populär geworden sondern auch durch die eingebaute Engine.

Ich halte an dem Konzept der Plattform-Unabhängigkeit ganz gerne fest, und würde darauf bestehen, die Engine ebenfalls Plattform unabhängig zu gestalten. Die Engine liese sich komplett in C oder C++ umsetzen. Dabei bietet C/C++ Standardbibliotheken um bspw. Speicher zu allozieren(Einsatz in Banks), Systemzeiten abzureifen(Millisecs, CurrentTime, CurrentDate usw.), Umgang mit Umgebungsvariablen, Dateioperationen(ReadFile etc.)

Für den Grafikbereich empfiehlt sich SDL. Oder OpenGL in Zusammenhang mit GLUT(Fenster, Tastatur/Maus-Eingaben), QuesoGLC(Schriftrendering).

Bei der Sound-Programmierung wären [url]=http://www.fmod.org/]FMOD[/url] oder BASS möglich.

Aus Erfahrung kann ich in Sachen Netzwerkprogrammierung doch recht gut sagen, dass das Problemlos umzusetzen ist. Schließlich habe ich über BNet schon einmal die Funktionen für BlitzMax verfügbar gemacht.

Probleme bereiten folgende Dinge:
DirectPlay ist nur unter Windows möglich, eine passende Bibliothek für die Movebefehle müssten gefunden werden(Blitz setzt ja hier auf DirectShow) und FMOD und BASS sind Lizenz pflichtig(bei kommerziellen Projekten)

mfg olli
vertex.dreamfall.at | GitHub
 

Dreamora

BeitragMi, Okt 31, 2007 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Moved da es da nix zu suchen hatte
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Abrexxes

BeitragMi, Okt 31, 2007 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Was soll das werden? Etwas zwischen Blitz3D und Blitzmax was dann weit hinter dem Niveau von GLbasic oder Cobra endet? Also mit ist die Motivation nicht klar. Es wäre effektiver in ein Framework für Blitzmax zu investieren als da da von 0 aufzubauen. Es sei denn du willst das zu Lernzwecken machen. (Freebasic? http://freebasic.de/ )

cu
 

E. Urbach

ehemals "Basicprogger"

BeitragMi, Okt 31, 2007 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@Vertex:
Was glaubst du woran ich seit einem Jahr arbeite?
Der einzige Unterschied bei mir ist, dass ich die Codes erst in XML umwandle und dann nach C/C++.
Die Blitz Engine habe ich in der Zeit noch nicht komplett nachprogrammieren können, aber hardwarebeschleunigtes 2D mit Front-To-Back- und Single-Surface-Rendering ist drin.

Hier ein Screenshot:
user posted image
Tilemaps mit sehr vielen verschiedenen Tiles werden mit dieser Engine sogar fast 3mal so schnell wie in BMax angezeigt.

Sogar eine Partikelengine mit 8000 Partikeln läuft mit über 50 FPS in OpenGL, hier ein Screenshot mit weniger Partikeln:
user posted image

Wenn du bei meinem Projekt mitmachen würdest, könntest du den Win32-Teil übernehmen, da ich im Moment alles nur in Linux/OpenGL implementiert habe.
Zusätzlich würdest du dir den Parser ersparen, denn den habe ich fast schon fertig geschrieben, und zwar für BMax (B2D ist sogar noch einfacher).
Die Standard-Bibliothek enthält sogar schon Threads + GUI, so dass man in der Hauptschleife kein UpdateOSGUI() oder sonstiges braucht.
Netzwerkfunktionen habe ich ebenfalls drin, diese orientieren sich an deinem BNetEx, sind aber etwas effizienter implementiert.
Wenn nicht, tja, dann viel Erfolg Wink
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik
  • Zuletzt bearbeitet von E. Urbach am Mi, Okt 31, 2007 17:33, insgesamt einmal bearbeitet

Vertex

BeitragMi, Okt 31, 2007 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Motivation: Kostenloses, Platform unabhängiges, offenes Blitz. Zudem über die neue OpenGL basierte 2D Engine ein Haufen Geschwindigkeit heraus geholt werden kann.

Zugegebener Maßen hatte ich zuerst den Gedanken, aus BlitzMax ein BlitzMax .NET zu basteln. Habe also mal Test halber dazu versucht die EBNF dazu zu entwickeln und musste aber ganz klar da schon feststellen, wie komplex doch es ist, eine solche Sprache in Angriff zu nehmen. Kam dann also bei BlitzBasic heraus, und leitete da alles Nötige ab.

Dreamora: Sorry, war mir nicht ganz sicher Smile

Edit:
Basicprogger, wo hast du denn Infos zu deinem Compiler/Parser + Engine? Ist es möglich jetzt ein Blitz2D Programm damit ohne den original Compiler übersetzen zu lassen? Ich gucke gerade auf deiner Website nach, weiß aber noch nicht konkret um was es geht.
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Mi, Okt 31, 2007 17:42, insgesamt einmal bearbeitet

Abrexxes

BeitragMi, Okt 31, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist aber das du unter Windows nicht weit kommst ohne DX da nun mal in der bösen weiten Welt draussen die meisten weder die passende Karte noch Treiber haben. Wenn also das Resultat (des Compilers) "vertrieben" werden soll dann kommst du an DX nicht vorbei. Denn der "normale" Kunde kauft keine neue Karte nur weil sein Onboard Chip nix mit Ogl anfangen kann.

Ohne DX unter Windows ist da nichts zu machen. Das beste wäre natürlich die Lösung das beides geht.

cu
 

E. Urbach

ehemals "Basicprogger"

BeitragMi, Okt 31, 2007 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ohne DX unter Windows ist da nichts zu machen. Das beste wäre natürlich die Lösung das beides geht.

Eben das ist bei meiner Engine der Fall. Unter Linux wird direkt OpenGL genutzt, bei Windows eine abstrakte Schnittstelle, wo zurzeit nur der Ansatz für DX9 vorhanden ist, weil das im Moment der beste Kompromiss zwischen Aktualität und Kompatibilität zu alten PCs ist. DX10 finde ich etwas zu extrem, weil es ohne Hacks nicht auf XP läuft, welches garantiert noch bis 2014 auf den PCs von vielen Personen zu finden sein wird. Dennoch könnte man DX10 implementieren, gerade weil die Schnittstelle bei Windows abstrakt ist.

Da ich selber an genau demselben Projekt (mit einigen Änderungen) arbeite, stimme ich dir natürlich zu: Es sollte endlich mal Blitz4Free mit zusätzlichen Extras wie Threading etc. geben. Dass dies nicht einfach zu erreichen ist, weiß ich, aber ich arbeite ja auch schon ziemlich lange dran. Ich fände es schade, wenn 2 Leute, die dasselbe Ziel verfolgen nicht gemeinsam daran arbeiten, andererseits kann ich es natürlich auch verstehen, wenn du lieber deine eigene Implementation mit EBNF-Parser und Co. erstellen willst, bloß das Parsen von Code -> XML -> C++ dauert gerade mal 25ms, ich nehme an die Methode mit EBNF wird nicht spürbar schneller sein...

Edit:
@Vertex: Meine Website ist veraltet. Die alten Infos sind hier zu finden: http://www.blitzprog.de/forum/viewforum.php?f=32
Zitat:
Ist es möglich jetzt ein Blitz2D Programm damit ohne den original Compiler übersetzen zu lassen?

Ja, aber im Moment nur über C++ Compiler. Der BB -> C++ Parser ist noch nicht komplett fertig.
Im Moment sieht der Code so aus:
Code: [AUSKLAPPEN]
Graphics(800, 600, 32, 2);
Image img = LoadImage("spaceship.png");
...


Edit #2:
Speichermanagement ist ebenfalls drin, man muss sich also auch nicht darum kümmern, img wieder freizugeben. Dies gilt für jeden Typ, auch für eigene Types.
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik
  • Zuletzt bearbeitet von E. Urbach am Mi, Okt 31, 2007 17:57, insgesamt 4-mal bearbeitet

Vertex

BeitragMi, Okt 31, 2007 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Abrexxes: Ist halt Sache der Implementierung. Du weißt ja sicher selber, dass man Grafikengines über abstrakte Treiber erstellt. Bekanntestes Beispiel ist in dem Falle ist Max2D, dass die Methoden Plot, DrawLine, DrawImage usw. in einem abstrakten Type darstellt und es dazu konkrete Implementierungen über GLMax2D und D3D7Max2D gibt.

Aber das ist sicher noch zu weit gedacht.

Edit:
Basicprogger, deine Umsetzung würde mich dazu mal interessieren. XML ist ja hochgeeignet dazu, um den AST aufzunehmen.
Code: [AUSKLAPPEN]
<program>
 <varDecl>
  <global />
  <identifier type="int">x</identifier>
 </varDecl>

 <forNext>
  <for />

  <assignment>
   <identifier type="int">x</identifier>
   <equal />
   <number>1</number>
  </assignment>

  <to />

  <expression>
   <term>
    <factor>
     <number>10</number>
    </factor>
   </term>
  </expression>

  <statement>
   <functionCall>
    <identifier>Print</identifier>
    <expression>
     <term>
      <factor>
       <string>Hallo Welt</string>
      </factor>
     </term>
    </expression>
   </functionCall>
  </statemen>

  <next />
 </forNext>
</program>
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Mi, Okt 31, 2007 17:58, insgesamt einmal bearbeitet

tft

BeitragMi, Okt 31, 2007 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ...

ja ich finde euer vorhaben extrem interesant. Ich kann aber leider nicht helfen. Da ich zur zeit an meiner MultiProcessSchnitstelle für B3D Arbeite.
Aber ich könnte mir vorstellen diese als zusatzt Funktion für FreeBlitz zur verfügung zu stellen. Macht weiter... es ist die richtige Richtung.

gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!
 

E. Urbach

ehemals "Basicprogger"

BeitragMi, Okt 31, 2007 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Basicprogger, deine Umsetzung würde mich dazu mal interessieren. XML ist ja hochgeeignet dazu, um den AST aufzunehmen.

Ich kann dir gerade kein top-aktuelles Beispiel geben, weil sich der Parser täglich ändert und anderen Code produziert, aber ich habe mal meine alte 3D-Vektor-Testklasse ausgegraben:
Code: [AUSKLAPPEN]
<module>
   <header>
      <title>
         <en>
            3D vector class
         </en>
         <de>
            3D-Vektor-Klasse
         </de>
      </title>
      <version>
         <major>
            1
         </major>
         <minor>
            0
         </minor>
         <revision>
            0
         </revision>
         <build>
            0
         </build>
      </version>
      <license>
         GPL
      </license>
      <authors>
         <person role="developer">
            <name>
               Eduard Urbach
            </name>
            <id>
               2
            </id>
         </person>
      </authors>
      <website>
         http://www.blitzprog.de/Vector3D
      </website>
      <keywords>
         vector, 3d
      </keywords>
      <description>
         <de>
            Eine 3D-Vektor-Klasse, um Positionsdaten im dreidimensionalen Raum zu speichern und ggf. nötige Informationen mit den Funktionen der Vector3D-Klasse zu ermitteln.
         </de>
         <en>
            A 3D vector class for storing position data and getting information about the vector.
         </en>
      </description>
   </header>
   <code>
      <dependencies>
         <import>
            Blitzprog.Math
         </import>
      </dependencies>
      <class name="Vector3D">
         <public>
            <definitions>
               <define name="T">
                  <type callby="value" const="false">
                     Float
                  </type>
               </define>
            </definitions>
            <vars>
               <var name="x">
                  <type callby="value" const="false">
                     T
                  </type>
                  <value>
                     0
                  </value>
               </var>
               <var name="y">
                  <type callby="value" const="false">
                     T
                  </type>
                  <value>
                     0
                  </value>
               </var>
               <var name="z">
                  <type callby="value" const="false">
                     T
                  </type>
                  <value>
                     0
                  </value>
               </var>
            </vars>
            <methods>
               <constructor>
                  <parameters>
                     <parameter>
                        <var name="nX">
                           <type callby="value">
                              T
                           </type>
                        </var>
                     </parameter>
                  </parameters>
                  <code>
                     <var name="f">
                        <type callby="value">
                           T
                        </type>
                        <value>
                           <call from="this" function="GetLength">
                           </call>
                        </value>
                     </var>
                  </code>
               </constructor>
               <todo>
                  Check this function
               </todo>
               <function const="false" name="SetLength">
                  <parameters>
                     <parameter>
                        <var name="nLength">
                           <type callby="value" const="">
                              T
                           </type>
                        </var>
                     </parameter>
                  </parameters>
                  <code>
                     <var name="f">
                        <type callby="value" const="">
                           T
                        </type>
                        <value>
                           nLength /
                           <call from="this" function="GetLength">
                           </call>
                        </value>
                     </var>
                     <if-block>
                        <if>
                           <condition>
                              f != 0
                           </condition>
                           <code>
                              <divide>
                                 <operand>
                                    x
                                 </operand>
                                 <value>
                                    f
                                 </value>
                              </divide>
                              <divide>
                                 <operand>
                                    y
                                 </operand>
                                 <value>
                                    f
                                 </value>
                              </divide>
                              <divide>
                                 <operand>
                                    z
                                 </operand>
                                 <value>
                                    f
                                 </value>
                              </divide>
                           </code>
                        </if>
                     </if-block>
                  </code>
               </function>
               <function const="true" name="GetLength">
                  <type callby="value" const="false">
                     T
                  </type>
                  <code>
                     <return>
                        <call from="" function="Sqr">
                           <parameter>
                              x * x + y * y + z * z
                           </parameter>
                        </call>
                     </return>
                  </code>
               </function>
               <function const="false" name="Normalize">
                  <type callby="reference" const="false">
                     Vector3D
                  </type>
                  <code>
                     <var name="f">
                        <type callby="value" const="">
                           T
                        </type>
                        <value>
                           <call from="this" function="GetLength">
                           </call>
                        </value>
                     </var>
                     <if-block>
                        <if>
                           <condition>
                              f != 0
                           </condition>
                           <code>
                              <divide>
                                 <operand>
                                    x
                                 </operand>
                                 <value>
                                    f
                                 </value>
                              </divide>
                              <divide>
                                 <operand>
                                    y
                                 </operand>
                                 <value>
                                    f
                                 </value>
                              </divide>
                              <divide>
                                 <operand>
                                    z
                                 </operand>
                                 <value>
                                    f
                                 </value>
                              </divide>
                           </code>
                        </if>
                     </if-block>
                     <return>
                        this
                     </return>
                  </code>
               </function>
            </methods>
            <operators>
               <operator sign="=">
                  <type callby="reference" const="true">
                     Vector3D
                  </type>
                  <parameters>
                     <parameter>
                        <var name="vec">
                           <type callby="reference" const="true">
                              T
                           </type>
                        </var>
                     </parameter>
                  </parameters>
                  <code>
                     <assign>
                        <operand>
                           x
                        </operand>
                        <value>
                           <get>
                              <from>
                                 vec
                              </from>
                              <var>
                                 x
                              </var>
                           </get>
                        </value>
                     </assign>
                  </code>
               </operator>
            </operators>
         </public>
      </class>
   </code>
</module>

Dieser XML-Code wurde durch das Parsen einer BB/BMax-Datei erstellt, wobei mein Parser dank dem abstrakten Interface theoretisch mehrere Syntaxen unterstützt. Anschließend wird alles in C++ Code umgewandelt, dies ist (war) die generierte Datei:
Code: [AUSKLAPPEN]
//---------------------------------------------------------------------------
// Title (en):             3D vector class
//---------------------------------------------------------------------------
// Description (en):       A 3D vector class for storing position data and ge
//                         tting information about the vector.               
//---------------------------------------------------------------------------
// Title (de):             3D-Vektor-Klasse
//---------------------------------------------------------------------------
// Description (de):       Eine 3D-Vektor-Klasse, um Positionsdaten im dreidi
//                         mensionalen Raum zu speichern und ggf. nötige Inf
//                         ormationen mit den Funktionen der Vector3D-Klasse
//                         zu ermitteln.                                     
//---------------------------------------------------------------------------
// Version:                1.0.0.0
// License:                GPL
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Includes
//---------------------------------------------------------------------------


//Vector3D
class Vector3D
{
   public:
      //---------------------------------------------------------------------------
      // Definitions
      //---------------------------------------------------------------------------
      
      typedef Float T;
      
      //---------------------------------------------------------------------------
      // Variables
      //---------------------------------------------------------------------------
      
      T x;
      T y;
      T z;
      
      //---------------------------------------------------------------------------
      // Methods
      //---------------------------------------------------------------------------
      
      //SetLength
      inline void SetLength(T nLength)
      {
         T f = nLength / this->GetLength();
         if(f != 0)
         {
            x /= f;
            y /= f;
            z /= f;
         }
      }
      
      //GetLength
      inline T GetLength()
      {
         return Sqr(x * x + y * y + z * z);
      }
      
      //Normalize
      inline Vector3D& Normalize()
      {
         T f = this->GetLength();
         if(f != 0)
         {
            x /= f;
            y /= f;
            z /= f;
         }
         return (*this);
      }
      
      
};

(btw, SetLength ist hier falsch implementiert, aber das sollte auch nur eine Testklasse sein)

Was die Umsetzung im Detail angeht: Datei per FileStreams öffnen, bei BB/BMax Zeile für Zeile, Zeichen für Zeichen parsen (wäre in anderen Sprachen nicht sinnvoll, bei BB/BMax kann man das aber machen), Art der Anweisung herausfinden, entsprechenden XML-Knoten erstellen und am Ende ein simples xmlFile->Save("Vector3D.cpp"); also das übliche Wink

Speichermanagement kommt dadurch zustande, dass ich eine eigene SharedPtr-Implementation benutze (ist ca. 20 % schneller als shared_ptr von boost und dennoch thread-safe) und bei jedem Type einen SharedPtr einsetze, so dass das Objekt automatisch freigegeben wird, wenn es nicht mehr benötigt wird. Das einzige Problem bei Smart Pointern ist das Erstellen einer Baum-Struktur mit Child-Parent-Zeigern. Dafür gibt es WeakPtr, aber ich hoffe, dass der User wenig Gebrauch davon machen muss. Im Gegensatz zu BMax werden Objekte sofort entfernt, wenn sie nicht mehr benötigt werden, man muss also nicht auf den Einsatz des GC warten.

Die Standardlib selbst ist im Moment in C++ implementiert, ich möchte aber die gesamte Lib in BPC-Code (BMax-Erweiterung) umschreiben, so dass die Lib selbst in XML umgewandelt werden kann. Das liegt nicht nur daran, dass ich Compilerseitige Optimierungen bei Stringklassen und GUI-Funktionen machen kann, sondern auch daran, dass ich den Code später in jeder beliebigen Syntax editieren kann.

Ebenso ist ein "Lokalisierungs-Feature" geplant, mit dem Strings als "Translatable" markiert werden können und diese Information im XML-Code gespeichert wird. Der Compiler generiert eine EXE mit allen Übersetzungen und man kann zur Laufzeit auswählen, welche Sprache genutzt werden soll.

Die GUI orientiert sich im Gegensatz zu BMax nicht an Events, sondern an Callbacks, also ein simples
button->OnClick(ShowMsg, "Hello World");
reicht, um das Ereignis "Click" des Buttons mit der Funktion ShowMsg und dem Parameter "Hello World" zu verbinden.

Die Grafik-Engine, bei der im Moment nur das Zeichnen mit 2D implementiert ist, ist umso schneller als BMax je mehr Zeichenoperationen genutzt werden. Alle Zeichenoperationen werden gepuffert. Bei einer Tilemap kann man per zwei-dimensionaler For-Schleife alle Tiles zeichnen. In BMax wäre das ein enormes Performanceproblem, wenn für jedes Tile ein Bild genommen wird (siehe Batching), bei meiner Grafikengine werden alle Tiles mit der richtigen Z-Position und mit korrektem Alpha-Blending per Single-Surface gerendert. Ist schneller als Blitz3D und Max2D.
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik

Vertex

BeitragMi, Okt 31, 2007 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ui, großen Respekt hier von meiner Seite! Sieht doch sehr professionell aus Smile
vertex.dreamfall.at | GitHub

TheShadow

Moderator

BeitragMi, Okt 31, 2007 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

So wie Vertex beschrieben hat - also Basic->Token->(Ast)->C und dann per GCC kompilieren finde ich persönlich auch am besten und ehrlich gesagt auch am einfachsten...

Evtl. ist das mit Frontend auch gut - aber schau dir selbst Beispiele an, dann wirst du schon sehen dass es auch nicht viel einfacher ist... Zudem ist man dann von GCC abhängig...

Es gibt jedoch Probleme mit GCC - wer GCC unter Vista etwa unter C:\Progs\MinGW installiert hat, kann damit dann gar nix mehr kompilieren... ich hab über 1 Stunde versucht - erst wenn man unter C:\MinGW installiert, geht alles gut... somit kann man GCC z.B. nicht einfach beipacken, sondern es muß separat installiert werden... Ich persönlich sehe GCC technisch eher fast am Abgrund stehen... Zumindest wenn ich an GCC denke kriege ich irg. kotzreize...



Ich habe schon vor einiger Zeit in C sowas wie Basic->C Konverter versucht zu coden. Das mit Token zerlegen hat ganz gut geklappt - aber ab da an - die Token zu analysieren und daraus C-Code zu exportieren ist hochkompliziert... weswegen ich da nicht weitergemacht habe...

Zum einen muß man den Code in 2-Pass scannen. Im 1. Durchlauf werden alle Funktionen/Variablen gescant (und eine Tabelle gebildet) und im 2. Durchlauf wird der Code generiert - andernfalls würde man vorher Deklarationen wie in C benötigen - was grausam ist...

Dann muß der Code auf alle mögliche Fehler geprüft werden... Die Variablentypen müssen inline konvertiert werden... aus Codes wie x.blub=1 muß unter umständen sowas wie (*x).blub=1 oder x->blub=1 generiert werden - also codes müssen umformatiert werden (geht wohl per tree)... und überhaupt so einen Tree zu generieren ist auch nicht sooo einfach (das ist der komplexere Part überhaupt)...

Mittlerweile habe ich eine Lösung für Tree gefunden... Vertex zu schreibst, man soll so wie ich oben sehe den ganzen code in Ast umwandeln.... ich weiß nicht ob es wirklich so in der Compiler-Technik ist - aber ich würde so einen Tree IMMER nur für 1 Codezeile oder Anweisung generieren... UND so ein Tree wäre meiner Meinung sogar je nach "Typ" unterschiedlich... also bei IF... wäre Tree anders als bei x=1+a. Ich wollte damals einen universellen tree bilden und irg. scheint es so nicht zu klappen...

Die Reihenfolge ist so:
1) Codezeile einlesen
2) Token erzeugen (und etwa ungültigen Symbol-Kombinationen abbrechen)
3) Token prüfen (etwa fehlende Klammern, Tokenkombinationen die nicht möglich sind)
4) Bestimmen was für ein Tree es wird (IF, Anweisung...)
5) Tree generieren
6) Tree umformatieren (nach C(++)-Tree umwandeln)
7) Tree als C(++)-Code ausgeben

Hat man erstmal so einen Crosscompiler geschrieben, dann benötigt man Library. Diese wäre in Basic selbst geschrieben und wird dann auch nach C(++) konvertiert... Es werden alle möglichen Standardfunktionen benötigt - GUI/Grafik/Sound... etc... Von SDL rate ich ab... DX ist noch v5 (also extrem veraltet) - oder softwarerenderer. SDL ist sauschlecht zu kompilieren... (nein jetzt nicht SDL selbst, sondern SDL_image, SDL_mixer usw - denn ohne die ist SDL "sinnlos"). Ich denke fast eine schlanke neue Lib wäre sinniger...

Selbst wenn jetzt paar Leute daran arbeiten kann es paar Jahre dauern... sowas zu entwickeln...



ABER! Meiner Meinung ist BlitzBasic von Syntax her nicht mehr up-to-date. So ein Projekt wird dann genau so sein wie FreeBasic... (QBasic-Klon - mit komischen beigeschmack). Man wird viel Zeit reinstecken um kompatibel mit BB zu werden - was irg. unsinnig ist...

Wäre es generell nicht besser eine neue, perfekte Sprache zu entwickeln, die man dann bis zum Ende verwendet?

Ich wäre z.B. mehr für sowas hier:

Code: [AUSKLAPPEN]
CLASS tube
  LOCAL width:INT
  LOCAL height:INT
  LOCAL blub:BYTE

  count:INT

  SUB NEW()   ;constructor
  END

  SUB DELETE()   ;destructor
  END

  SUB meinemethode ()
  END

  LOCAL SUB sumsum ()
  END
END

CLASS supertube EXTENDS tube
  xyz:SHORT
END


SUB foo:INT (a:BYTE, b:SHORT, c:INT, d:LONG)
  ;declaration
  x:INT

  ;declaration+definition
  y:SINGLE=1.23

  LOOP x=1   ;wie while
  ...
  END
 
  LOOP   ;wie repeat
    IF  ... THEN STOP   ;wie end in bb
    ...
  END x=1

  LOOP   ;endlos
    IF ... THEN EXIT
    IF ... THEN SKIP   ;wie continue
  END

  FOR i, 0, 100[,step]
  END

  FOR i, listname   ;entspicht foreach
  END

  SELECT x
  CASE 1
  CASE 2
  CASE   ;wie default
  END

  IF x=0
  ..
  ELSE x=1
  ..
  ELSE x=2
  ..
  ELSE
  ..
  END

END



Ich habe bereits mir sehr viele Gedanken gemacht wie eine Next-Gen-Sprache aussehen könnte... Man sieht oben wie sauber und gut lesbar das wird... besser als BB es wohl je sein wird... Es gibt keine Semikolons am Ende - es gibt keine {}. Ich habe noch viel mehr - insgesamt gibt es jedoch wenige Keywords - so wenige wie möglich - sogar weniger als in C.

Interessant wäre es mit meheren so ein Projekt durchzuziehen... aber das ist recht kompliziert... Die Frage ist dann ob es sich überhaupt lohnt... Ich überlege mir die lezten Tage: ist es nicht einfacher nur eine neue Lib für C++ zu schreiben? Oder noch einfacher: nur irrlicht zu nutzen... ist zwar nicht perfekt - aber dauert keine zeit was neues zu entwickeln... wobei noch einfacher ist es bbmax zu benutzen und keinen kopf um c++/libs zu zerbrechen
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

E. Urbach

ehemals "Basicprogger"

BeitragMi, Okt 31, 2007 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Es gibt jedoch Probleme mit GCC - wer GCC unter Vista etwa unter C:\Progs\MinGW installiert hat, kann damit dann gar nix mehr kompilieren... ich hab über 1 Stunde versucht - erst wenn man unter C:\MinGW installiert, geht alles gut... somit kann man GCC z.B. nicht einfach beipacken, sondern es muß separat installiert werden... Ich persönlich sehe GCC technisch eher fast am Abgrund stehen... Zumindest wenn ich an GCC denke kriege ich irg. kotzreize...

Wer Windows nutzt (und dazu noch Vista) ist selbst schuld. GCC ist für Windows nur in der Alt-Version 3.4.5 über MinGW verfügbar. Ich nutze unter Linux die top-aktuelle, nicht veraltete GNU Compiler Collection 4.2. Deine Kritik bezieht sich also 1.) auf eine veraltete Version und 2.) auf den Windows-Port MinGW. Ich habe MinGW problemlos im Februar dieses Jahres in einem beliebigen Pfad mit einigen Kniffen installieren können, ich weiß allerdings nicht, ob sich Vista so stark verändert hat, dass diese "Hacks" nicht mehr funktionieren.

Zitat:
Ich überlege mir die lezten Tage: ist es nicht einfacher nur eine neue Lib für C++ zu schreiben? Oder noch einfacher: nur irrlicht zu nutzen... ist zwar nicht perfekt - aber dauert keine zeit was neues zu entwickeln... wobei noch einfacher ist es bbmax zu benutzen und keinen kopf um c++/libs zu zerbrechen

Wäre vernünftig. Aber die Welt wurde nicht von vernünftigen Menschen aufgebaut Wink Außerdem bietet eine syntaxunabhängige Sprache, die zusätzliche Informationen in XML speichert mehrere Vorteile, die ich teilweise in diesem Thread und in meinem anderen Thread schon genannt habe.
Zitat:

Ich habe schon vor einiger Zeit in C sowas wie Basic->C Konverter versucht zu coden. Das mit Token zerlegen hat ganz gut geklappt - aber ab da an - die Token zu analysieren und daraus C-Code zu exportieren ist hochkompliziert... weswegen ich da nicht weitergemacht habe...

Was ist daran kompliziert, Basicsyntax zu parsen und in C++ umzuwandeln? Eine gut durchdachte Schnittstelle und ein wenig Rekursion können dabei Wunder wirken. Und damit meine ich nicht die Vektor-Klasse, die ich einen Beitrag vorher gepostet habe, denn diese ist noch im August generiert worden und es hat sich mittlerweile ziemlich viel verändert, insbesondere beim Speichermanagement und bei der Definition von Klassen.

Zitat:
Ich habe bereits mir sehr viele Gedanken gemacht wie eine Next-Gen-Sprache aussehen könnte... Man sieht oben wie sauber und gut lesbar das wird... besser als BB es wohl je sein wird...

Eben deshalb habe ich XML zwischengeschaltet. Damit man mehrere Syntaxen als Eingabesprache wählen kann.

Zitat:
Zum einen muß man den Code in 2-Pass scannen. Im 1. Durchlauf werden alle Funktionen/Variablen gescant (und eine Tabelle gebildet) und im 2. Durchlauf wird der Code generiert - andernfalls würde man vorher Deklarationen wie in C benötigen - was grausam ist...

Funktioniert dennoch alles innerhalb von 50ms bei Dateien mittlerer Größe, von X-beliebiger Syntax zu XML zu C++.

Zitat:
Hat man erstmal so einen Crosscompiler geschrieben, dann benötigt man Library. Diese wäre in Basic selbst geschrieben und wird dann auch nach C(++) konvertiert... Es werden alle möglichen Standardfunktionen benötigt - GUI/Grafik/Sound... etc... Von SDL rate ich ab... DX ist noch v5 (also extrem veraltet) - oder softwarerenderer. SDL ist sauschlecht zu kompilieren... (nein jetzt nicht SDL selbst, sondern SDL_image, SDL_mixer usw - denn ohne die ist SDL "sinnlos"). Ich denke fast eine schlanke neue Lib wäre sinniger...

Stimme ich dir zu, ich habe bei meiner Standardlib ebenfalls SDL vermieden und schreibe derzeit alles in BPC (die Next-Gen-Sprache Wink ) um, wie ich einen Beitrag vorher schon erwähnt habe.

Zitat:
Wäre es generell nicht besser eine neue, perfekte Sprache zu entwickeln, die man dann bis zum Ende verwendet?

Jep Smile

Zitat:
Interessant wäre es mit meheren so ein Projekt durchzuziehen... aber das ist recht kompliziert...

Würdest du dich denn bei einem solchen Projekt beteiligen oder beharrst du immer noch darauf, dass ich die XML-Zwischenstufe entfernen soll? Smile
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik

TheShadow

Moderator

BeitragMi, Okt 31, 2007 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Würdest du dich denn bei einem solchen Projekt beteiligen oder beharrst du immer noch darauf, dass ich die XML-Zwischenstufe entfernen soll?


Schwer zu sagen... XML stört mich extrem gewaltig ehrlich gesagt... Das ist ein zusätzlicher Zwischenschritt - du willst immer noch eine art universellen "Compiler" bauen - was mein Ziel nicht wäre. Ich halte es weiterhin für unnötig aus einer X-beliebiger Sprache XML zu generieren... Sinniger wäre die "ultimative" Sprache zu erschaffen - den die Kompatibilität ist zwar schön und gut - aber man sieht es an FreeBasic - es ist immer noch nicht zu 100% mit QB kompatibel...

Weiterhin weiß ich nicht welche Sprache du nutzt - ich empfehle C - alles andere wird nie ewig portierbar sein... Dein Sprachkonzept und die Syntax sowie die geplanten Features sind mir auch unbekannt...


EDIT
Als Compiler soll C++ von GCC kommen - ich weiß gar nicht ob es Sinn machen würde mehrere Compiler zu unterstützen - denn dazu muss der C++Compiler auch externe Libs wie fteetype oder zlib oder pnglib oder jpeglib uns usw usw mitkompilieren können - so wie es BlitzMax macht... Ich bin mir gar nicht sicher, ob einige Projekte überhaupt ohne makefile zu kompilieren sind... ich stelle mir das horrormässig vor (probiere es mit SDL ohne makefile - whaaaaa)
END EDIT


Und die Komplexität ist nicht zu verachten - so einen Compiler zu schreiben ist sehr sehr anspruchsvoll... ich höre öfter von Vertex über sowas reden - aber auch er traut sich scheinbar nicht richtig ran...

Ich weiß nicht was dein Compiler schon alles kann - und ob es z.B. alle Fehler abfangen kann... Hast du eine Doku?



Meine Idee wäre z.B. eine Sprache ähnlich Basic - jedoch mit C-Features - wo man weder etwas Linken muß, noch kompliziert konfigurieren muss... Einen Modul-Ordner einfach kopieren und mit einer Zeile importieren - schon soll alles funktionieren (vorausgesetzt die sind noch alle untereinander kompatibel)...

Im Prinzip macht es BlitzMax schon richtig gut - z.B. die Synchronisation - fantastisch... Nur die Syntax ist nicht up-to-date und es ist "kommerziell" - was open-source-artiges wäre schon cool - aber bisher reicht kein anderes Projekt an BB ran... (was einfachkeit angeht - nicht zu verwechseln mit limitierung der sprache - den da ist bb auch vorne dabei).
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Vertex

BeitragMi, Okt 31, 2007 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Basicprogger, nunja, dieser Compiler für alle Sprachen zu XML will mir dabei noch nicht richtig einleuchten. Du verfolgst also das Konzept, so viele Sprachen wie möglich in XML umzuwandeln und daraus dann ein C++ Output zu erzeugen.
Also praktisch gesehen:
Code: [AUSKLAPPEN]
BlitzBasic |
BlitzMax   | -> XML -> C++
QBasic     |
FreeBasic  |


Gekoppelt an deine Engine. Man kann also in FreeBasic, BlitzBasic usw. dann DrawImage aus deiner Engine aufrufen.

Wie gesagt, sehr interessant aber meiner Meinung nach fast unmöglich und doch sehr aufwendig.

TheShadow, diese "Supersprache" existiert m.M. nach bereits und nennt sich C# Smile Glaub mir, was du dir vorstellst lässt sich nur mit einem sehr großen Team an Entwicklern realisieren ist aber auf alle Fälle machbar. Und ja, ich versuche z. Z. einen recht simple Sprache über dieses Konzept laufen zu lassen, um überhaupt zu sehen, wie aufwendig dies ist.

Code: [AUSKLAPPEN]
(* Parser --------------------------------------------
*)

Program = {ConstantDecleration}
          {VariableDecleration}
          {Statement};

ConstantDecleration = 'Const' DeclerationAssignment
                      {',' DeclerationAssignment};

VariableDecleration = 'Var' DeclerationAssignment
                      {',' DeclerationAssignment};

Statement = FunctionCall
          | Assignment
          | IfThen
          | WhileLoop
          | ForLoop;

DeclerationAssignment = Decleration '=' Expression;

Decleration = Identifier ':' ('Int' | 'String');

Expression = SimpleExpression
             [('==' | '!=' | '<' | '<=' | '>' | '>=')
             SimpleExpression];

SimpleExpr = ['+' | '-'] Term [('+' | '-') Term];

Term = Factor [('*' | '/') Factor];

Factor = Number
       | String
       | FunctionCall
       | Identifier
       | '(' Expression ')';

FunctionCall = Identifier
               '(' [Expression {',' Expression}] ')';

Assignment = Identifier '=' Expression;

IfThen = 'If' Expression 'Then'
         {Statement}
         ['ElseIf' Expression 'Then' {Statement}]
         ['Else' {Statement}]
         'EndIf';

WhileLoop = 'While' Expression
            {Statement}
            'Wend';

ForLoop = 'For' Assignment 'To' Expression
          ['Step' Expression]
          {Statement}
          'Next';

(* Lexer ---------------------------------------------
*)

Digit      = '0' | '1' | '2' | ... | '9';
Letter     = 'A' | 'B' | 'C' | ... | 'Z'
           | 'a' | 'b' | 'c' | ... | 'z';

Comment    = ';' {Characters};
Number     = Digit {Digit};
String     = '"' {CHARACTERS} '"';
Identifier = Letter {'_' | Letter | Digit};


Der Lexer Funktioniert bereits, der Parser arbeitet schon fast. Es gibt nur Probleme mit optionalen Tokens die mir meinen TokenStack durcheinander bringen. Wenn der Parser fertig ist, poste ich mal das Resultat(ist übrigens in BlitzMax geschrieben).

Aber zurück zum Thema:
FreeBlitz würde natürlich wieder mit simpler IDE kommen, und das Kompilieren erfolgt wie gehabt über einen Button. Also diese Konfiguration über Makefiles usw. kann ich pers. auch nicht leiden. Blitz soll so simpel bleiben wie es immer wahr - das reicht auch vollkommen aus.
vertex.dreamfall.at | GitHub

pixelshooter

BeitragMi, Okt 31, 2007 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
TheShadow hat Folgendes geschrieben:
Zitat:
Würdest du dich denn bei einem solchen Projekt beteiligen oder beharrst du immer noch darauf, dass ich die XML-Zwischenstufe entfernen soll?


Schwer zu sagen... XML stört mich extrem gewaltig ehrlich gesagt... Das ist ein zusätzlicher Zwischenschritt - du willst immer noch eine art universellen "Compiler" bauen - was mein Ziel nicht wäre. Ich halte es weiterhin für unnötig aus einer X-beliebiger Sprache XML zu generieren... Sinniger wäre die "ultimative" Sprache zu erschaffen - den die Kompatibilität ist zwar schön und gut - aber man sieht es an FreeBasic - es ist immer noch nicht zu 100% mit QB kompatibel...
[...]

kann es eine ultimative programmiersprache geben? glaube ich nicht, denn dazu gibt es zu viele Dinge die man haben will, die sich aber gegenseitig ausschließen. Angefangen bei banalen Dingen wie portierbarkeit <-> Hardwarenähe (niemand käme bspw wohl auf die idee, ein os zu bauen, was erst die JRE vorraussetzt); Abstraktion und anderen komfort <-> schlanke binaries, einflussnahme <-> einfache bedienung, ...

Und dann die Programmier patterns. Es gibt sprachen für bestimmte patterns optimiert sind. Wenn du es schaffst, ein konzept für eine ultimative sprache zu schreiben, die alles gleichermaßen berücksichtigt, zur geltung kommen lässt und benutzbar macht, dann wärs geil.
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

TheShadow

Moderator

BeitragMi, Okt 31, 2007 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
TheShadow, diese "Supersprache" existiert m.M. nach bereits und nennt sich C#


Ich stimme zu - wobei ich das NET-Framework irg. HASSE
Solange es C# oder D in GCC nicht gibt, sind die Sprachen uninteressant...

Die Syntax von C# ist nahezu C++ - wurde nur modernisiert... Da gefällt mit D mit seinen nativen EXE's doch viel besser...

@vertex - was du da machst, ist deine Sprache zu beschreiben - es gibt fertige progs die das programm dann in token zerlegen

Genauso kann man es auch ohne so eine Beschreibung zu machen direkt einprogrammieren. Ein Parser wäre dann nicht mehr flexibel - aber viel schneller... Ein Parser ist an sich der einfachste Part. Die Token danach in Tree zu wandeln ist aufwendiger...

Zitat:
FreeBlitz würde natürlich wieder mit simpler IDE kommen, und das Kompilieren erfolgt wie gehabt über einen Button.


Ich empfehle Programmers Notepad
http://www.pnotepad.org/


Zitat:
ngefangen bei banalen Dingen wie portierbarkeit <-> Hardwarenähe (niemand käme bspw wohl auf die idee, ein os zu bauen, was erst die JRE vorraussetzt); Abstraktion und anderen komfort <-> schlanke binaries, einflussnahme <-> einfache bedienung, ...


Das alles soll die ultimative Sprache schon können... Die Library selbst wäre jedoch OS-abhängig - d.h. eine Lib für Win kann man nicht für Linux nutzen - diese muss man extra schon entwickeln/anpassen
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Blitzcoder

Newsposter

BeitragDo, Nov 01, 2007 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn das ein Community Projekt werden sollte, würde ich wohl auch mitmachen. Allerdings sollte dann doch erstmal eine lange Planungsphase sein, da das ganze sonst garantiert nichts wird.


Übrigends halte ich es eindeutig für sinnvoller, das ganze für eine Sprache zu entwickeln, als aus verschiedenen Sprachen XML zu generieren. Das erspart doch eine Menge Arbeit, wenn die Sprachen nicht sehr nah beieinander liegen. Man sollte sich lieber auf eine Sprache konzentrieren, um die dafür relativ Bugfrei zu bekommen. Eine gute Integration von externen Libs sollte ja durch den gcc/g++ am Ende sehr einfach möglich sein.

XML als Zwischenschritt sollte es schon sein, auch wenn das wieder ein zeitraubender Schritt ist. Man hat in der Regel bei größeren Projekten nicht alles in einer Source-Datei, sodass sowieso nur das neu kompiliert werden müsste, was man ändert (Die anderen Object-Files können ja so bleiben). Man sollte auf keinen Fall an dem BB Konzept festhalten, die Includes einfach direkt einzufügen. Das macht zwar Dinge wie
Code: [AUSKLAPPEN]

function blubb()
     include "blubb_func.xy";
end function


unmöglich, aber diese braucht auch niemand.

Die Idee, eine "Supersprache" zu entwickelt halte ich für keine gute Idee. Es kann einfach keine Supersprache geben. Erfahrene Programmierer großer Projekte werden immer C/C++, manchmal vielleicht auch Pascal oder Java bevorzugen, während für den kleinen JumpnRun-Coder ein BlitzBasic genial ist.

MfG
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
 

E. Urbach

ehemals "Basicprogger"

BeitragDo, Nov 01, 2007 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Basicprogger, nunja, dieser Compiler für alle Sprachen zu XML will mir dabei noch nicht richtig einleuchten. Du verfolgst also das Konzept, so viele Sprachen wie möglich in XML umzuwandeln und daraus dann ein C++ Output zu erzeugen.

Erstmal: Die einzige Sprachsyntax, die ich bis jetzt einigermaßen implementiert habe, ist BPC - eine BMax-Erweiterung. Ob es noch andere Sprachen geben wird, weiß ich nicht, denn in meinen Augen ist nunmal BPC die "Next-Gen-Sprache" oder wie man es auch nennen will. Da der Compiler/Parser OpenSource ist und die Schnittstelle abstrakt ist, kann jeder, der gerne eine andere Syntax verwenden möchte - TheShadow z.B. - seine eigene Syntax entwickeln.
Ob nun diese Person, die eine andere Syntax haben will, dies nun macht oder nicht, ist eine andere Frage.
Es steht aber in jedem Fall fest, dass die Schnittstelle für den Parser weiterhin abstrakt bleibt und der Code vorher in XML umgewandelt wird, und daran werde ich nichts ändern.
Ob tatsächlich andere Syntaxen implementiert werden, hängt, wie schon gesagt, von den Personen hier ab, die sich daran beteiligen würden. Für mich reicht BPC, der ein oder andere wird vielleicht lieber die C#-Syntax bevorzugen.
Erzähl einem C++ Fanatiker mal, dass er von jetzt an sein ganzes Leben lang in BASIC programmieren muss, wenn das mal gut geht...

Code: [AUSKLAPPEN]
BlitzBasic |
BlitzMax   | -> XML -> C++
QBasic     |
FreeBasic  |

Hmm, QBasic, FreeBasic und BlitzBasic sind im Moment noch nicht vorgesehen, siehe meinen letzten Absatz. Aber ich wollte beim Output sogar noch viel weiter gehen Smile Als Output sollte auch JavaScript/AJAX möglich sein, weil:
1.) Die GUI lässt sich ohne Probleme nach JavaScript/AJAX portieren. Ich habe dazu schon einen Test gemacht, es funktioniert wunderbar mit meinem Blitzprog WUI (Web User Interface) Smile
2.) Dank JavaScript-Events muss ich mich nicht selbst um Callbacks kümmern, das übernimmt alles der Browser.
3.) Reine GUI-Anwendungen sollten im Zeitalter von Web 2.0 auch nach JS/AJAX portierbar sein, Google selbst ist Vertreter dieser Philosophie.
Wenn ich genug Zeit und Lust habe, wird es am Ende so aussehen:
Code: [AUSKLAPPEN]
C++         |
BlitzMax    | -> XML -> C++
Java        |        -> AJAX //Nur GUI-Anwendungen, keine (grafischen) Spiele

Der derzeitige Stand sieht so aus:
Code: [AUSKLAPPEN]
BlitzMax    | -> XML -> C++

Ich möchte es noch einmal betonen: Man muss nicht mehrere Syntaxen/Outputs implementieren, es ist aber theoretisch möglich.

Zitat:
Genauso kann man es auch ohne so eine Beschreibung zu machen direkt einprogrammieren. Ein Parser wäre dann nicht mehr flexibel - aber viel schneller... Ein Parser ist an sich der einfachste Part. Die Token danach in Tree zu wandeln ist aufwendiger...

Genauso mache ich es im Moment. Und das Umwandeln in einen Tree ist nicht schwer, wie gesagt, Rekursion hilft Smile

Zitat:
sinnvoller, das ganze für eine Sprache zu entwickeln, als aus verschiedenen Sprachen XML zu generieren

Zitat:
XML als Zwischenschritt sollte es schon sein, auch wenn das wieder ein zeitraubender Schritt ist.

1.) Es gibt nur eine Sprache. Es gibt theoretisch mehrere Syntaxen für die Sprache. Theoretisch...
2.) Was den Arbeitsaufwand angeht, so teile ich deine Meinung nicht. Ich finde es ziemlich einfach dank meiner API einen XML/BPC-Parser zu schreiben, der das ganze in (vorzugsweise) C++ umwandelt.
3.) Zeitraubend? 5ms, maximal 25ms pro Datei empfindest du als zeitraubend? Na dann Hut ab, ich würd auch gern Compiler mit Null-Overhead programmieren können...

Zitat:
Die Idee, eine "Supersprache" zu entwickelt halte ich für keine gute Idee. Es kann einfach keine Supersprache geben. Erfahrene Programmierer großer Projekte werden immer C/C++, manchmal vielleicht auch Pascal oder Java bevorzugen, während für den kleinen JumpnRun-Coder ein BlitzBasic genial ist.

Stimm ich dir vollkommen zu.

Zitat:
Wenn das ein Community Projekt werden sollte, würde ich wohl auch mitmachen. Allerdings sollte dann doch erstmal eine lange Planungsphase sein, da das ganze sonst garantiert nichts wird.

*räusper*
Es ist bereits alles bis ins Detail geplant, nur leider sind alle Zeichnungen/Texte auf meinem Papierstapel zu finden, nicht aber auf meinem PC. Wenn das wirklich ein Teamprojekt werden soll - was ich aufgrund der Meinungen von Vertex und TheShadow bezweifle - dann müsste ich diese gesamten Zettel nochmal abtippen, darauf habe ich zwar wenig Lust, aber wenn sich hier ein paar engagierte Entwickler zusammenfinden würden, dann würde ich dies tun.

Ich frage nochmal direkt: Hat jemand Interesse daran, bei meinem Projekt (Screenshots und Beschreibung sind weiter oben) mitzumachen und den ein oder anderen Part beim Schreiben der Standard-Lib zu übernehmen?

Wenn nicht, dann werde ich das weiterhin als Einzelprojekt weiterführen und ich bin mir sicher, dass es ein Erfolg werden wird. Ob mit oder ohne Hilfe, ist mir persönlich egal. Pixelshooter hat sich schon dazu bereit erklärt, ein kleines GUI-Front-End für meinen Parser mit Qt zu schreiben und dafür bin ich ihm auch dankbar, denn ich verstehe nicht viel von Qt, ich programmiere nur in GTK, das ist mal wieder das typische Prinzip der Arbeitsteilung Wink
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik

TheShadow

Moderator

BeitragDo, Nov 01, 2007 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Genauso mache ich es im Moment. Und das Umwandeln in einen Tree ist nicht schwer, wie gesagt, Rekursion hilft


wie machst du das genau? meiner Meinung muß so ein tree je nach dem anders aussehen...

z.B.

x=a*b+7

Code: [AUSKLAPPEN]
  =
 / \
x  +
   / \
  *   7
 / \
a  b



bei

IF x=1 THEN a=0

bin ich mir nicht sicher wie man es sinnvoll machen soll

erstmal würde ich es intern splitten

IF x=1
a=0
END

Code: [AUSKLAPPEN]
Irgendwas
  / \
IF   Bedingung
        |
       =
       / \
      a  0
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Gehe zu Seite 1, 2, 3, 4  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group