Konzept: Sinnvoll oder nicht?

Übersicht Sonstiges Smalltalk

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen

 

E. Urbach

ehemals "Basicprogger"

BeitragDo, Okt 04, 2007 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Das ist zwar ein bisschen aus der Luft gegriffen, aber ich hab mir etwas wegen deinem Problem mit <add /> usw. ueberlegt. Du solltest einfach

<result of="12+24/13-(12*12)" />

oder so verwenden.

Ich habe mich bereits dazu entschieden, die C++ Schreibweise für solche Dinge zu verwenden.
Zitat:
Du versuchst also so eine Art-Metakonverter für Sprachen zu basteln.

Ich versuche Programme in Modellen auszudrücken. XML ist für diese Aufgabe das perfekte Werkzeug.
Zitat:
Sinnvoller ist aber sicher das DotNet od. Javakonzept welches aus Programmcode ByteCode erzeugt welcher von entsprechenden VMs interpretiert werden kann.

Bytecode und interpretierte Sprachen sind schlecht für die Effizienz des Programms, auch wenn Java in dieser Hinsicht zunehmend besser wird. Außerdem möchte ich die XML-Modelle nicht von einem speziellen Interpreter bzw. einer VM abhängig machen.
Zitat:
Einfacher wäre sicher ein entsprechender Blitz, Eiffel, Brainfuck-Compiler od. ä. welcher ByteCode für eines der vielen FrameWorks ausspuckt.

Wäre einfacher.
Zitat:
In DotNet kannst du C++ / J++ / VB Programmieren und es kommt immer das selbe raus -> Durch die grosse Ähnlichkeit und die Möglichkeit auf die Gleichen Libs zuzugreifen ist meines wissens sogar Konvertierung zwischen den Sprachen möglich.

1. .NET kommt von Microsoft und ich möchte meine Linux-Programme nicht von Mono abhängig machen.
2. Erreicht die XML-Zwischenstufe genau dasselbe.
3. Es gäbe wieder einmal das Effizienzproblem.
Zitat:
Ich schliesse mich wohl TheShadow an wenn ich sage das so ein Projekt ob der (durchaus gewollten) Vielfalt der Programmiersprachen weder realisierbar noch sinnvoll ist.

Das möchte ich nicht weiter kommentieren, trotzdem danke, dass du deine Meinung erläutert hast. Ob das Projekt sinnvoll ist, kann dann jeder für sich selbst entscheiden, wenn er die endgültige Releaseversion sieht. Ich möchte noch darauf hinweisen, dass mein erstes Posting in diesem Thread bereits veraltet ist, weil sich einiges geändert hat, insbesondere der Umgang mit der Standardlibrary. Deshalb hat es IMHO keinen Sinn, weiter zu diskutieren.
 

E. Urbach

ehemals "Basicprogger"

BeitragSo, Okt 14, 2007 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Entschuldigt bitte wegen Doppelpost^^

Ich habe noch einige offenstehende Fragen, bei denen ich mir nicht sicher bin, welche Entscheidung die richtige wäre bzw. ob es überhaupt eine allgemeine Lösung dafür gibt. Die Entwicklung (für Basic -> XML -> C++) geht zwar gut voran, aber ich muss mich nun für einen Basic-Dialekt entscheiden, wobei ich zu BMax tendiere. Selbstverständlich wird es eine modifizierte Version der BMax-Syntax sein, die beispielsweise Templates, Operatoren und Cast-Methoden unterstützt. Zu den folgenden Themen würde ich gerne eure Meinung hören:

Arrow 1. = vs. ==
Das einfache Gleichzeichen scheint ja in der Basic-Welt absoluter Standard zu sein.
Allerdings gibt es einige Dinge, die mir nicht so recht gefallen wollen, wie z.B. der Ausdruck:
Code: [AUSKLAPPEN]
x = y = z

Jeder Leser würde von diesem Code - das ist zumindest meine Auffassung - erwarten, dass z an y und anschließend an x zugewiesen wird, was ja bekanntlich nicht der Fall ist, denn x wird der bool-Wert vom Vergleich y = z zugewiesen.
In Basic sollte man zur besseren Lesbarkeit schreiben:
Code: [AUSKLAPPEN]
x = (y = z)

Ebenso kann man in den If-Konstrukten keine Zuweisungen erstellen, wie bspw. in C++:
Code: [AUSKLAPPEN]
if(bedingung1 && (var2 = 5) != 3)
{
   DoSomething();
}

Somit müsste man in Basic einen Workaround schreiben:
Code: [AUSKLAPPEN]
If bedingung1
   var2 = 5
   If var2 <> 3
      DoSomething()
   EndIf
EndIf

Deshalb wäre mein Fazit: Das einfache Gleichheitszeichen sollte durch das doppelte Gleicheitszeichen bei Vergleichen ersetzt werden.
Falls jemand Vorschläge hat, wie man es besser machen kann, immer her damit Smile

Arrow 2. Not vs. !, And vs. &&, Or vs. ||
Hier habe ich mich einfach dazu entschieden, beides zuzulassen.
Ob das eine gute Lösung ist, weiß ich nicht, schließlich spricht es gegen die Codeeinheitlichkeit.

Hier sind 2 identische Beispiele:
Code: [AUSKLAPPEN]
If a And b
   If c Or d
      If Not e
         DoSomething()
      EndIf
   EndIf
EndIf

Code: [AUSKLAPPEN]
If a && b
   If c || d
      If !e
         DoSomething()
      EndIf
   EndIf
EndIf

Das erste Beispiel gefällt mir bis auf das Not eigentlich besser, denn es sieht mehr nach Basic aus.
Eure Meinung? Smile

Arrow 3. <> vs. !=
Siehe 2. Ich würde prinzipiell beide Versionen zulassen.

Arrow 4. Kommentare
Singeline: Semikolon
Code: [AUSKLAPPEN]
;Kommentar

Multiline: Semikolon + Multiplikationszeichen:
Code: [AUSKLAPPEN]
;*
   Dies
   ist
   ein
   Kommentar
*;

Wenn jemand andere Vorschläge hat und Gründe für anderen Zeichen nennen kann, dann werde ich dies möglicherweise noch ändern. Das Semikolon finde ich besser als das Apostroph in BMax, weil es auf der Tastatur einfacher erreichbar ist, vielleicht bin ich auch der einzige der dieses Gefühl hat Confused

Arrow 5. Const-Correctness
In C++ hat man das Problem so gelöst, dass man den User entscheiden lässt, ob die Methode das Objekt verändert oder nicht. Ich würde hier aufgrund der Abstraktion und dem Nicht-Vorhandensein von Zeigern dazu tendieren, eine automatische Const-Correctness zu entwickeln. Sobald der Kompiler erkennt, dass eine Zuweisung einer Membervariablen vorliegt, ist die Methode automatisch nicht mehr "const". Das Problem könnte hierbei sein, dass man versucht den Kompiler durch spezielle Funktionen auszutricksen:
Code: [AUSKLAPPEN]
Type XYZ
   Field a:Int
   
   Method GetA:Int()
      memset(AddrOf(a), SizeOf(a), 0)
      Return a
   End Method
End Type

In diesem Fall würde einfach der Wert von a auf 0 zurückgesetzt werden und der Kompiler nimmt trotzdem an, dass die Funktion "const" ist. Das Feature, direkt auf C(++)-Funtionen zuzugreifen, sollte deshalb nicht verwendet werden. Es gibt nur eine Funktion, die das darf, nämlich die Wrapperfunktion:
Code: [AUSKLAPPEN]
Template <T:Type>
Function MemSet(a:Ref<T>, num:Size, val:Int)
   memset(AddrOf(a), val, num)
End Function

Template <T:Type>
Function MemSet(a:Ptr<T>, num:Size, val:Int)
   memset(a, val, num)
End Function

Bei diesem konkreten Beispiel könnte man natürlich SizeOf direkt in MemSet einbinden, aber das ist im Moment unwichtig.
Ich würde nun an dieser Stelle folgendes versuchen:
1. Suche alle Zuweisungen von Member-Variablen, wenn eine gefunden wurde -> Methode ist nicht "const"
2. Suche alle Funktionsaufrufe, bei denen eine Membervariable oder die Objektreferenz selbst übergeben wird, wenn der Parameter der Funktion nicht konstant, also nicht "Const" ist -> Methode ist nicht "const"

Bei Punkt 1 müsste man beachten, dass der Kompiler auch etwas komplexere Zuweisungen erkennt:
Code: [AUSKLAPPEN]
Field member1:Int
Method foo()
   Local a:Int
   a = 7 + (member1 += 5) + (a = 7) - 3
End Method


Punkt 2 bedeutet einfach, dass der Kompiler bei dem vorherigen Beispiel sehen muss, dass der Parameter selbst keine Konstante ist. Wenn man nun die Standard-Library benutzt, die die gegebenen Funktionen (durch Inlining) kapselt, dann ist es nicht mehr schwer zu erkennen, welche Funktion "const" ist und welche nicht:
Code: [AUSKLAPPEN]
Import Core.Memory   ;Hier ist MemSet definiert

Type XYZ
   Field a:Int
   Field b:Int
   
   Method GetA:Int()
      MemSet(a, SizeOf(a), 0)      ;Übergibt a als nicht-konstanten Parameter
      Return a
   End Method

   Method GetB:Int()            ;Alles ok, die Funktion ist const
      Return b
   End Method
End Type

GetA ist Nicht-Const, weil GetA eine (möglicherweise konstante) Membervariable als einen nicht-konstanten Parameter übergibt. GetB ist Const, weil es nichts anderes tut als einen Wert zurückzugeben.
Meine Frage wäre: Gibt es einen Haken? Wo könnte der Algorithmus scheitern, solange man nur die Standard-Library und nicht direkt die C++ Funktionen nutzt?
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

BeitragMo, Okt 15, 2007 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Deshalb wäre mein Fazit: Das einfache Gleichheitszeichen sollte durch das doppelte Gleicheitszeichen bei Vergleichen ersetzt werden.


Find ich nicht...
x=y=z ist gervorragend zu lesen...

Zitat:
2. Not vs. !, And vs. &&, Or vs. ||
Hier habe ich mich einfach dazu entschieden, beides zuzulassen.


warum? Symbole sind schwer zu lesen. Außerdem & und && kann zu einem Keyword AND zusammengefasst werden - den ein guter Konverter kann selbst erkennen ob loschische Bedingungen vorliegen und entsprechend logischen Operator einschalten...

Zitat:
3. <> vs. !=
Siehe 2. Ich würde prinzipiell beide Versionen zulassen.


!= find ich unlogisch... Je mehr Varianten du hast, desto uneinheitlicher werden die codes...

Zitat:
Das Feature, direkt auf C(++)-Funtionen zuzugreifen, sollte deshalb nicht verwendet werden


ist das gut?



Jetzt überleg mal... Deine Sprache tendiert überraschenderweise immer mehr Richtung C++... außer du hast keine Semikolons und hier und da andere Syntax... lohnt da neue Sprache?
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

E. Urbach

ehemals "Basicprogger"

BeitragDi, Okt 16, 2007 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Find ich nicht...
x=y=z ist gervorragend zu lesen...

Ok, ein Kompromiss: Ich nehme das einfache Gleichheitszeichen für Vergleiche, aber wenn der Kompiler so etwas wie x = y = z findet, dann sollte er zumindest eine Warnung ausgeben, um solche logischen Fehler von vornherein auszuschließen. Eine Warnung ist ja noch lange keine Fehlermeldung wo der Kompiler den Kompiliervorgang abbrechen muss Wink

Zitat:
warum? Symbole sind schwer zu lesen.

Hmm...na gut, wenn Syntaxhighlighting zum Einsatz kommt, dann dürfte es sicherlich einfacher zu lesen sein, ich hatte in meinen Tests nur einen einfachen Texteditor, dort war es dann teilweise einfacher zu lesen, wenn man Symbole nahm, aber da ich doch lieber einheitlich bleiben möchte, belasse ich es bei der BB/BMax-Syntax.

Zitat:
Außerdem & und && kann zu einem Keyword AND zusammengefasst werden - den ein guter Konverter kann selbst erkennen ob loschische Bedingungen vorliegen und entsprechend logischen Operator einschalten...

Das ist allerdings nicht richtig, man kann nämlich nicht wissen, was der User gerne hätte.
Dazu das folgende C++-Beispiel:
Code: [AUSKLAPPEN]
while(window->IsAlive() && window2->IsAlive()) Delay(10);

Hier wäre das logische And nicht sinnvoll, da dieser Operator die zweite Bedingung nicht mehr beachtet, wenn die erste bereits wahr ist. Wenn nun TWindow::IsAlive() die Nachrichtenschleife für die Fenster abfragt, dann "hängt" das zweite Fenster (window2) und der User fragt sich natürlich woran das liegt, wo er doch einen korrekten Code geschrieben hat:
Code: [AUSKLAPPEN]
While window.IsAlive() And window2.IsAlive() Delay(10) Wend

Um nun Workarounds zu vermeiden, kann man den binären And-Operator nehmen:
Code: [AUSKLAPPEN]
while(window->IsAlive() & window2->IsAlive()) Delay(10);

Deswegen sollte man die binären Operatoren anders benennen als die logischen Operatoren. Wenn die C++ Symbole zu "unleserlich" sind, kann man ja BinAnd bzw. BinOr verwenden. Dies ist nur ein einziges Beispiel, es gibt noch viel mehr, falls dich dieses eine Beispiel nicht überzeugt Wink

Zitat:
!= find ich unlogisch... Je mehr Varianten du hast, desto uneinheitlicher werden die codes...

Deinen ersten Grund kann ich nicht nachvollziehen, aber der zweite ist wohl der Ausschlaggebende.
Da es ja sowieso nur eine Erweiterung der BMax-Syntax ist, nehme ich <>.

Zitat:
ist das gut?

Ja, es wird sowieso "geinlined". Außerdem, die Möglichkeit, C++ Funktionen zu nutzen, ist ja weiterhin gegeben. Nur ist dies nicht empfohlen, wegen der oben genannten Const-Correctness-Gründe, wegen der einheitlichen Groß/Klein-Schreibung und weil der Compiler somit Fehler schneller erkennen kann. Wie schon gesagt, man kann sie nutzen, sollte es aber nicht Wink

Nicht betroffen von dieser Empfehlung sind natürlich extern eingebundene Libraries wie z.B. Ogre oder Irrlicht. Denn es wäre quasi unmöglich und sinnlos, für alles und jede externe Library einen Wrapper zu schreiben. Deshalb ist es "erlaubt", direkt auf die Funktionen der externen Libs zuzugreifen.

Zitat:
Jetzt überleg mal... Deine Sprache tendiert überraschenderweise immer mehr Richtung C++... außer du hast keine Semikolons und hier und da andere Syntax... lohnt da neue Sprache?

Sprache? Wohl eher Syntax. Eine Erweiterung der BMax-Syntax. Es soll ja generell möglich sein, auch andere Eingabesprachen zu benutzen, bloß hast du ja selbst gesagt, dass es erstmal wichtig wäre, eine Syntax (Basic) zu vollenden, die dann korrekt nach C++ übersetzt wird, da stimm ich dir auch zu Wink
Was die Ähnlichkeit mit C++ angeht: Du hast Recht. Es ist mir anfangs gar nicht aufgefallen^^
Durch die Änderungen ist die Ähnlichkeit zumindest etwas gemindert.
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

BeitragDi, Okt 16, 2007 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Das ist allerdings nicht richtig, man kann nämlich nicht wissen, was der User gerne hätte.


Doch das geht...

bei deinem Code:

while(window->IsAlive() && window2->IsAlive()) Delay(10);

mit höher priorität würde man bitweise AND's nehmen - sollten links und rechts von AND bool's sein oder etwas sein was bool zurückliefert, dann wird losches AND genommen

ist isAlive vom typ bool, dann wäre hier logisches AND
hast du keine bool's in der Syntax (ich pers. würde bools nicht einbauen) dann wäre es bitweises AND

bei

IF x=1 AND y=1...

ist es eindeutig - da x=1 und y=1 je bool "zurückliefern"
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

E. Urbach

ehemals "Basicprogger"

BeitragDi, Okt 16, 2007 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast gerade selbst bewiesen, dass es nicht geht Wink

IsAlive ist nämlich vom Typ bool und der Kompiler setzt ein logisches And ein.

Noch ein Beispiel?

Code: [AUSKLAPPEN]
Local a:Int = 255
Local b:Int = 127
Local result:Int = (a And b) * 5


Ist result nun 635 oder 5? Richtig, der Kompiler kann nicht wissen, was der User möchte.

Den Datentyp bool vollständig zu entfernen halte ich nicht für sinnvoll, weil dann jede Abfrage dieser Art ein binäres And zur Folge hätte. Dies ist erstens nicht immer erwünscht und zweitens ein Geschwindigkeitsverlust, weil die zweite Bedingung dann immer überprüft werden würde.
Aber ich muss zugeben, dass die Methode nicht schlecht ist, nur leider funktioniert sie nicht in allen Fällen.
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

BeitragDi, Okt 16, 2007 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
a und b sind keine bool's - darum soll bitweises AND genommen werden

erst wenn auf beiden Seiten bool's sind, dann kann logisches AND genommen werden

im prinzip ganz einfach...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group