Umfrage für Programmierer

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

@remi_meier
Das ist nur noch ein Beispiel dafür wie man etwas kompliziert machen kann, muss aber nicht.

@125
>Ist PB net in Asm geschrieben?

Nicht alles.
An diese stelle wäre es am besten wenn netterwiese jemand, der genau weiss welche Teile von PB in welcher Programiersprache geschrieben wurden, es posten wurde (z.B jemand aus PB-Team) .
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Nicht alle Beispiele! Und ausserdem hab ich im einleitenden Satz gesagt, dass es mir nicht um den Programmierstil sondern um die Möglichkeit geht!

Welche Libraries in C und welche in ASM sind kann man im Library SDK Ordner im File "PureBasic library descriptor" nachlesen. Nur beim Compiler selbst bin ich mir nicht sicher.

Cu
Remi :)
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Wie gesagt es ist auch völlig wurscht womit die Programmiersprache erstellt wurde die man Porgrammiert...
Es ist wichtig worin man selbst porgrammiert ...
Das man die Sprache versteht und sie gut Strukturiert ist.....
Denn die Frage womit es Programmiert wurde ist egal weil es die Programmiersprache vorher noch nicht gab = man kann PB net in PB schreiben weils PB noch net gab....

Man muss das nehm was da ist und damit was besseres machen:

Man nimmt CPP und macht damit PB.....
Xin
Beiträge: 10
Registriert: 11.03.2005 02:10
Wohnort: http://sascha.atrops.com

Beitrag von Xin »

remi_meier hat geschrieben:C++ ist eine Katastrophe in Syntax, weil es unbedingt kompatibel zu C sein musste... (wer will kann Beispiele sehen!)
Stroustrup selbst stimmt Dir bzgl. der Probleme aufgrund der Kompatiblität zu C zu, er schreibt es in seinen Büchern. Die Sprache selbst finde ich gut gelungen, das gilt auch für C.
In Sachen C++ man muss auch sehen, dass es 25 Jahre her ist und das C++ eigentlich gar nicht geplant war. Erst kam "C mit Klassen", dann "Cfront" und am Schluss wurde "versehentlich" C++ draus. "C mit Klassen" und "Cfront" waren lediglich Präprozessor-Erweiterungen, die auf allen C Kompilern kompilierbar waren. Damit war C++ auf allen Systemen portabel für die damalige Zeit (graphische Oberflächen gab es ja noch nicht).

Wenn Du gute Beispiele hast, schick' sie mir gerne mal zu, für den Fall, dass ich was übersehen habe.
remi_meier hat geschrieben:OOP wird in C++ vereinfacht und ein bisschen zusätzlich erweitert. OOP ist nur ein Programmierstil! Mit so gut wie jeder Sprache kann man OO-Programmieren.
Eine wichtige Erkenntnis, die den meisten Programmieren fehlt.
remi_meier hat geschrieben: Mit PB kann man auch Funktionen in Strukturen integrieren (Funktionspointer) und sie dann mit CallFunctionFast(Objekt\funktion) ansprechen. Mit C++ wird es einfach vereinfacht (und zusätzlich noch komfortable Vererbung, die ich persönlich nie benutzen würde (fragt nicht wieso))!
Das ist nicht direkt vergleichbar. Du baust eine dynamische Funktion in eine Struktur ein. Das ist in C über das Schlüsselwort 'virtual' machbar, aber grundsätzlich werden Funktionen statisch gebunden. Dadurch werden die Funktionsaufrufe schneller.
remi_meier hat geschrieben:Was mich noch interessieren würde wäre, warum alle sagen, dass mit OOP die Wiederverwertbarkeit besser sei.. (ich sehe da keinen grossen Unterschied zu Prozeduren)
Das beliebte Flaechenspiel:
Statt nur Dreiecke und Vierecke zu definieren, baut man eine Klasse Flaeche drüber und leitet davon ab. Damit haben Dreiecke und Vierecke die gleichen Möglichkeiten wie Flaechen.

Code: Alles auswählen

class Flaeche
{
  double x, y, x2, y2;
  public: 
  virtual double groesse();
};

class Dreieck : public Flaeche
{
  double groesse()
  {
     return (x-x2)*(y-y2) / 2; // vereinfacht
  }
};

class Viereck : public Flaeche
{
  double groesse()
  {
     return (x-x2)*(y-y2);
  }
};
Folgende Funktion soll wiederverwendet werden:
Anstelle einer kleinen Funktion, stelle man sich ein riesiges Framework vor, das halt mit Flächen rechnet.

Code: Alles auswählen

bool recyclingfunction( Flaeche f )
{
  return f.groesse() > 50;
}
In einer nicht objektorientierten Sprache müsste man nun die Unterscheidung treffen, ob es sich um ein Dreieck oder ein Viereck handelt.

Würde man jetzt auf die Idee kommen, Polygone einzuführen, würde man diese ebenfalls von Flaechen ableiten und hätte am monströsen Framework keine Änderungen, man muss lediglich dem Polygon beibringen, alles zu leisten, was eine Fläche kann.

OOP ist nur ein Programmierstil, der aber viele Vorteile bei großen Projekten hat. Bietet die Sprache entsprechende Unterstützung, spart das extrem viel Entwicklungszeit und hilft Fehler zu vermeiden und vorhandene Fehler zu lokalisieren.

Es ist niemandem vorzuwerfen, dass er die Möglicheiten von C++ nicht kennt oder keine Lust sich als Hobbyprogrammierer mit den Möglichkeiten zu beschäftigen.
Aber C++ zu verteufeln, wie schon gelesen, oder schlecht zu machen, ist kurzsichtig. Je größer die Projekte werden, desto deutlicher werden die Vorteile von Sprachen, die objektorientierte Programmierung unterstützen. Für große Projekte der Systemprogrammierung bleibt am Schluss dann ausschließlich C/C++. Darum sind alle aktuellen Betriebsysteme in dieser Sprache geschrieben.
Je nach Projekt kann Purebasic für Anwendungsprogramme durchaus bessere Ergebnisse mit weniger Aufwand liefern.
--
Mit freundlichen Grüßen
Sascha 'Xin' Atrops

It's a kind of fun to do the impossible.
(Walt Disney)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Xin

sorry, war letzte nacht leicht angenervt....

also, good luck :allright:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Mist, hab jetzt ein bißchen lange gebraucht für den Beitrag... ;-)

@remi:
...zur Syntax:
Es ist und bleibt Gewöhnungs- und Geschmackssache.

... zur OOP:
Man kann leider die Vorzüge von oop nicht gut in ein paar Sätze packen, aber hier ein Versuch:
Die Modellierung des Problems ist von vorneherein anders, man schaut, was gibt es für seperate Einheiten in der Problemstellung, welche lassen sich ggf. aufgrund von Gemeinsamkeiten zusammenfassen (zu Klassen), wo gibt es ggf. Grundgemeinsamkeiten, welche es wert sind, in eine eigene 'abstrakte' Klasse gepackt zu werden, welche Daten gehören zu welchen Klassen, und welche müssen auf welche Zugriff haben. Welche Funktionen greifen auf welche Daten zu, und können somit in welche Klasse gepackt werden? So kann man selbst sehr komplexe Probleme unter Zusammenarbeit von vielen Leuten Schritt für Schritt in eine wohlstrukturierte Klassenstruktur bannen, wofür dann noch Dinge wie Schnittstellen festgelegt werden müssen.

Schließlich kann man dann die gesamte Klassenstruktur unter vielen Leuten aufteilen, jeder programmiert seinen eigenen Teil davon (die Schnittstellen sind ja vorher geklärt), und schließlich kann man das alles zusammensetzen, und es läuft.

:lol: naja - im Idealfall.




Ein anschauliches Beispiel:
Z.B. könnte im 3D-Spiel eine Unterklasse der Klasse Spielwelt die Klasse Entity sein, und die Attribute x,y,z-Position, Geschwindigkeit u.a. beinhalten, sowie Funktionen 'bewege', etc.
Davon erben wiederum die Klassen Menschmodell, Baum, Terrain, und Licht, welche nun ebenfalls über x,y,z-Position und 'bewege' verfügen. Außerdem können sie nun Entity erweitern, z.B. die Klasse Licht um Intensität, Farbzusammensetzung, Flackergeschwindigkeit, sowie 'Anschalten' und 'Ausschalten'. Dann kann man Licht wieder erweitern auf Spotlicht oder Rundumlicht, wobei Spotlicht noch Winkeldaten bekommt.
Jetzt wollen wir mit einer Methode ein Licht, ein Motorrad oder einen Menschen bewegen. Dazu bewegen wir das Objekt einfach, indem wir die Methode 'bewege' aufrufen, die ja alle von Entity geerbt haben. Allerdings hat dabei z.B. die Klasse Mensch diese Methode 'überschrieben', d.h., Bäume und Lichter nutzen die ganz normale Bewegen-Funktion aus der Entity-Klasse, während Mensch seine eigene Bewegungsfunktion mitbringt, da er z.B. beim Gehen noch rauf- und runterwippen muss, also die y-Werte verändern muss. (Bäume wippen nicht beim gehen ;-) )



Vorteile:
- bei sehr großen Projekten kann man methodisch von der Problemstellung schrittweise ggf. über Diagramme bis runter auf Source-Ebene vorgehen.
- alle einzelnen Klassen und Interfaces sind für sich alleine eine abgeschlossene Einheit und können aus alten Projekten einfach übernommen werden, ggf. durch Vererbung erweitert werden, etc. Man ist also in Zukunft sehr schnell, da man vieles einfach wiederverwerten kann
- Erweiterungen können lokal in der entsprechenden Klasse stattfinden, ohne dass man Sorge haben muss, dass irgendwas anders nun nicht mehr funktioniert
- Fehler lassen sich leichter finden
- Die Programmiersprache kann cool weiterwachsen: Z.B. im Java-Klassenbaum kann Person XY irgendetwas anfügen, und es läuft überall! Daher gibt es so abgefahrene Dinge wie z.B. speichern von Objektinstanzen inkl. sämtlicher Unterobjekte in eine Datei - mit einer Zeile Code!
Stell dir ein Objekt vor, dass mehrere Arrays, Hashtable, Listen, etc. und zig Unterobjekte enthält, die wiederum massig Daten haben. Eine Zeile Code, und alles ist gespeichert, egal, welches Projekt Du wann wie in Zukunft mit welchen Klassen programmierst !
Oder z.B. bei komplizierten Fenstern mit hunderten von Gadgets:
Da hat man keine Riesen-Haupt-Event-Schleife, welche ALLES verarbeiten und weiterdeligieren muss, sondern man hat einfach direkt an jedes Gadget einen Listener gehängt, der die relevanten Ereignisse behandelt, und direkt 'vor Ort' weiterverarbeitet. Dabei können auch wieder bei diesen Listenern ähnliche Dinge zusammengefasst werden und für mehrere gleichzeitig implementiert werden.

Aber:
PureBasic ist trotzdem saucool und ich erziele damit oft 10-mal schneller Ergebnisse. Außerdem läßt sich ALLES was mit oop geht, auch rein prozedural machen, und ebenso auch mit Brainfuck oder Whitespace ;-)
oop ist aber ein mächtiges Hilfsmittel, um komplexe Strukturen optimal zu fassen zu kriegen.
!UD2
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ausserdem, wie schon jemand sagte...

auch in PB kann man OOP proggen... man muss nur ein wenig dippsen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Xin
Beiträge: 10
Registriert: 11.03.2005 02:10
Wohnort: http://sascha.atrops.com

Beitrag von Xin »

remi_meier hat geschrieben:Es geht mir v.a. auch darum, dass sowas erlaubt ist, nicht dass das schlechter Programmierstil ist! (Wenn es die Möglichkeit gibt, dann wird sie auch ausgenützt (auch im negativen Sinn!))
Pascal ist bekannt dafür, dass man es sauber programmieren muss. Die Regeln sind strikter als in C. Und haben mich immer behindert, also blieb ich bei C.
Wer ein Programm entwickeln möchte, wird das auch sauber schreiben.
remi_meier hat geschrieben:

Code: Alles auswählen

main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)
for(x=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))
for(i=k=r=0;j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}
Wer das versteht :allright:
Das erste, was ich sehe, ist, dass das kein aktueller Compiler kompilert. Das Zweite ist, dass man in jeder Sprache schlecht formatieren kann, ergo lohnt sich hierüber definitiv keine Diskussion.
remi_meier hat geschrieben:

Code: Alles auswählen

if (z == 0)
  if (k >= 6)
     //do that
else
  //etwas anderes!

Ist falsch eingerückt, ich weiss ;-D, wenn ich das in C++ so will wies eingerückt ist, dann mach ich das so:
if (z == 0)
  if (k >= 6)
     //do that
  else {}
else
  //etwas anderes!
Der Code ist unschön und syntaktisch falsch.
Das falsch eingerückte else ist fürwahr ein unschöner Effekt bei C/C++, aber sehr bekannt und fällt zumindest bei mir selten auf.

Code: Alles auswählen

if (z == 0)
{
  if (k >= 6) 
    do_anything();
}
else
  do_anything_else();
remi_meier hat geschrieben:

Code: Alles auswählen

Ganz lustig sind auch die nicht der Leserlichkeit dienenden Symbole && ||.
Bei guter Formtierung sind sie leserlicher, da sie als Operatoren im Text besser auffallen, als Schlüsselworter.

Code: Alles auswählen

if(    ( a == 4 || b == 3 )
    && ( c == 7 || d == 8 ) )
  do_anything();

a = b && c;
remi_meier hat geschrieben:

Code: Alles auswählen

Etwas vom Schlimmsten finde ich die {}
Bei langen for() und if und bei genug tiefer Verschachtelung und Länge weiss man nicht mehr wofür jetzt diese komische } steht (for? if? do?).
Natürlich, man kann Kommentare schreiben, aber wer macht das schon? (<- Scherz)
Im Regelfall empfinde ich die geschweiften Klammern als besser, weil sie beim Überfliegen des Sourcecodes optisch nicht auffallen. Beim Lesen sind sie genauso präsent wie begin und end oder if und endif.

Bezüglich der Frage, zu welchem for diese komische Klammer steht, gebe ich Dir vollkommen recht. Da kommt man ohne Kommentierung nicht aus.
remi_meier hat geschrieben: Ich weiss einfach, dass diese Probleme da oben alle in PB nicht existieren!
Ich kann in Purebasic also nicht unsinnig formatieren?
In PB gibt es Endif, richtig?

Code: Alles auswählen

------------------Bildschirmanfang
        Endif
      Endif
    Endif
  Endif
Endif

Woher weißt Du ohne Kommentierung, zwischen welchen Endifs Du einfügen musst?

Das sind ganz allgemeine Probleme von allen mir bekannten Programmiersprachen. Ich habe für einen Teil Lösungsansätze, aber das so hier aufzuführen, als wäre das Problem von C, ist eigentlich indiskutabel.
MARTIN hat geschrieben: @Xin
Aus reiner Neugier: Wenn dein Compiler fertig wird, wird es frei verfügbar sein ?
Und für welche Betriebsysteme ?
Ich gebe aus Prinzip keinen Termin an, da mir wichtiger ist, dass die Sachen sauber und orthogonal implementiert werden. Das impliziert auch schonmal, dass ich große Teile des Compilers in die Tonne haue, selbst wenn nur Kleinigkeiten nicht stimmen, weil sich Konzepte vergrößern oder verallgemeinern. Das Typisierungssystem schreibe ich jetzt zum vierten Mal, ich habe angefangen wie in C, das war zu einschränkend, jetzt gibt's definitiv keine Einschränkung mehr. ;-)
Es wird aber definitiv noch dauern, da auch noch viele Sachen wie Templates oder Mehrfach-Vererbung überhaupt noch nicht im Compiler auftauchen. Und nebenher muss ich noch Geld verdienen. ;-)

Zur Verfügbarkeit: Steht noch nicht fest Ich überlege derzeit über eine Lizenz, die ihn für Studienzwecke, Freeware oder GPL Software kostenlos zur Verfügung stellt, für Shareware oder komerzielle Projekte jedoch kostenpflichtig wird.

Zu den Betriebsystemen: Ich weiß, wie ich Executables auf Linux(x86) und AmigaOS erzeuge. Auf beiden Systemen sind bereits Programme meines GeCCo Compilers gelaufen. Windows Executables werden sich von Linux-Executables nicht groß unterscheiden. Das Hauptproblem ist da eher effektiven x86 Code zu erzeugen. Vorrangig kompiliere ich zur Zeit für eine selbstgeschriebene Testumgebung, die auf allen Systemen läuft.
Also easy going... erstmal muss ich das Diplom hinter mich bringen, die ich extra über den Compiler schreibe, damit ich mehr Zeit da reinstecken kann.
--
Mit freundlichen Grüßen
Sascha 'Xin' Atrops

It's a kind of fun to do the impossible.
(Walt Disney)
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »


Ich kann in Purebasic also nicht unsinnig formatieren?
In PB gibt es Endif, richtig?

Code: Alles auswählen

------------------Bildschirmanfang
        Endif
      Endif
    Endif
  Endif
Endif
Lern PB.... ich kann selbst bei einem:

Code: Alles auswählen

------------------Bildschirmanfang
               Endif
              EndIf
             Endif
            Endif
           EndIf
          EndIf
         Endif
        Endif
      Endif
    Endif
  Endif
Endif

Zeilgenau einfügen....
Ausserdem verwendet man in solchen fällen eher Select und Case .....
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

remi_meier hat geschrieben:

Code: Alles auswählen

main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)
for(x=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))
for(i=k=r=0;j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}

Code: Alles auswählen

Procedure.l RC4Mem(Mem.l,memLen.l,Key.s):Dim S.w(255):Dim K.w(255):i.l=0:j.l=0:t.l=0:x.l=0:temp.w=0:Y.w=0:Outp.s="":For i = 0 To 255:S(i)=i:Next:j=1:For i=0 To 255:If j>Len(key):j=1:EndIf:K(i)=Asc(Mid(key,j,1)):j=j+1:Next i:j=0:For i=0 To 255:j=Mod(j+S(i)+K(i),256):temp=S(i):(i)=S(j):S(j)=temp:Next i:i=0:j=0:For x=0 To memLen-1:i=Mod(i+1,256):j=Mod(j+S(i),256):temp=S(i):S(i)=S(j):S(j)=temp:t=Mod(S(i)+Mod(S(j),256),256):Y = S(t):PokeB(Mem+x, PeekB(Mem+x)!Y):Next:ProcedureReturn Mem:EndProcedure
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten