PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechnen mit Bascom



Pedder
22.09.2009, 11:40
Hallo ersma, :lol:

ich hab da mal eine Frage:

so eine Zeile:

a = X+Y*3

oder

a= (x+Y)*4

Geht das in Bascom nicht so wie in anderen BASIC-Dialekten?

Willa
22.09.2009, 12:03
Hi!
Bascom kann nur eine Rechenoperation pro Zeile. Das ist eine fiese Stolperfalle, die irgendwie nicht offensichtlich ist...

Vitis
22.09.2009, 12:56
a=y*3
a=a+x

leider nur so rechenbar in bascom

recycle
22.09.2009, 13:22
Geht das in Bascom nicht so wie in anderen BASIC-Dialekten?

Dabei sollte man vielleicht im Auge behalten, dass Bascom speziell auf die Programmierung von Microcontrollern ausgelegt ist. Da hat das meiner Meinung nach auch Vorteile.

Wenn man statt "a= (x+Y)*4 "
a = x +y
a = a * 4
schreibt, hat man einen etwas besseren Überblick, was man seinem kleinen Controller da überhaupt alles zumutet.

Das ist bei obigem Beispiel zwar trivial, aber wenn es möglich ist mehrere Ausdrücke zu verketten, verketten viele Programmierer gleich massenweise Rechenoperationen in einer Zeile.

Bei den Einzelschritten sieht man auch wo die einfachen Operationen, z.B. Addition stehen und wo man aufwendigere Operationen, z.B. Divisionen eventuell ganz sparen oder durch Bitverschiebung oder ähnliches optimieren kann.

Besonders in kurzen Interrupt Routinen ist es ja schon interessant einen Eindruck zu behalten, wieviele Rechenschritte der Controller da machen muss.

Ein weiteres Problem dürfte das Casting (Datentypumwandlung) sein.
Da wäre es bei langen verketteteten Ausdrücken sicherlich auch schwieriger zu sehen, wo Daten durch Typzuweisung verloren gehen und die ganze Sache wäre wesentlich fehleranfälliger.

Bei Basic Dialekten für den PC interessieren diese Punkte meist nicht.
Da interessiert es meist niemanden, ob der Rechner ain paar Takte mehr oder weniger rödelt und ein paar MB mehr oder weniger Speicher belegt.
Bei einigen Basic Dialekten muss man Datentypen nichtmals deklarieren und bei der Umwandlung wird automatisch immer der grösste Datentyp in den alles "reinpasst" verwendet.

Das wäre für die Programmierung von Microcontrollern bei der man immer einen Blick auf die Resourcen haben sollte alles eher unschön.

pyr0skull
22.09.2009, 13:49
Dabei sollte man vielleicht im Auge behalten, dass Bascom speziell auf die Programmierung von Microcontrollern ausgelegt ist. Da hat das meiner Meinung nach auch Vorteile.
...
Das wäre für die Programmierung von Microcontrollern bei der man immer einen Blick auf die Resourcen haben sollte alles eher unschön.

Naja, trotz der eventuellen Vorteile ist es letztendlich doch eine nervige Einschränkung, die zumindest bei mir einen Anteil daran hatte, mich zu C zu bringen.

recycle
22.09.2009, 16:20
Naja, trotz der eventuellen Vorteile ist es letztendlich doch eine nervige Einschränkung, die zumindest bei mir einen Anteil daran hatte, mich zu C zu bringen.

Klar, was ich da geschrieben habe ist ja auch nur meine persönliche Meinung.
Welche Programmiersprache man lieber mag ist sicherlich immer geschmacksache und welche am besten geeignet ist hängt auch vom Anwendungszweck ab.

Ich mag Bascom Basic, weil man da sehr wenig Lern- und Einarbeitungszeit braucht.
Für einfache Sachen, reichen da ja oft schon einfache Englischkenntnisse und die Liste der Befehle und Beispiele in der Online-Hilfe.
Wenn man wie ich mit so wenig Kenntnissen and die Programmierung ran geht, finde ich es halt hilfreich, wenn der Compiler einen vor Fehlern und Resourcenverschwendung schützt.

In C muss man sich da meiner Meinung nach schon wesentlich mehr einarbeiten, und wenn ein Programmierer weiss was er tut, ist es sicherlich ok, wenn er mehrere Schritte zusammenfassen und verknüpfen kann.

Vielleicht steckt da bei mir auch ein bischen Schadenfreude mit drin ;-)
Ich musste früher öfter mal in Quellcodes von PC Programmierern reinsehen und es hat mich oft genervt, wenn die zig Funktionen in einer Zeile zusammengefasst und verschachtelt haben, und kaum noch nachvollziehbar war, was da alles abgeht.

Vitis
22.09.2009, 19:28
es ist auf alle fälle nervig, aber "so what"
hab gerade n projekt, bei dem mit funktionen 5ten grades
als single gerechnet wird, der code dazu ist recht
"abenteuerlich" und nicht gerade einfach zu lesen ... ist halt so

Besserwessi
22.09.2009, 20:27
Die Einschränkung auf nur eine Operation pro Zeile macht den Compiler einfach, macht aber den Quellcode unübersichtlicher und auch den erzeugten Code länger und langsamer. Ein einigermaßener Compiler ist in aller Regel besser dabei solche mathematischen Ausdrücke aufzuteilen und kann auch noch etwas optimieren indem nicht alle Zwischenergebnisse ins RAM kommen. Wenn man unbedingt will kann man sich ja auf ein operation pro Zeile beschränken, wenn man wirklich die volle Kontrolle haben will.

Einen Vorteil für den Benutzer kann ich da beim besten Willen nicht sehen. Für mich war das auch ein Hauptgrund mich nicht so viel mit BASCOM zu beschäftigen.

kolisson
22.09.2009, 22:33
... und vielleicht zum thema passend:

sollten double verwendet werden , die nachher mit integer (oder long) verrechnet werden sollen, scheint immer der schritt über eine temporäre single nötig zu sein.... sonst kommt nur müll raus

gruss klaus

Dnerb
26.09.2009, 20:47
und auch den erzeugten Code länger und langsamer.


Das glaube ich nicht. Der Compiler muß die Rechenoperationen sowieso in kleine Häppchen (Assembler!) zerlegen.

Und ob ich das nun in einer oder 2 Zeilen machen, ist völlig irrelevant.

Zu meiner Schulzeit (vor gefühlten 150 Jahren) haben wir das ausprobiert, mit C.

Der auslöser war der "naive" Programmierstil eines Schulkamaraden.
Der Lehrer meinte damals das es egal sein und wir es ausprobieren sollen.
Nun, wir haben es getan.

Ergebnis: Complimiertes Programm genau gleich lang und gleich schnell.

Gruß Dnerb

Besserwessi
26.09.2009, 23:07
Ob der Code bei der Berechnung in einer Zeile schneller ist als mit vielen Zwischenschritten, hängt vom Compiler ab. Bei den meisten C Compilern wird das egal sein. Viele Temporäre Variablen haben bei GCC zum Beispiel gar keinen Platz im RAM und die Daten bleiben in Registern. Das könnte auch vor 20 Jahren schon so gewesen sein.

BASCOM kennt kein Equivalent zum "volatile" in C, und behandelt alle Variablen so, als wären sie in C volatile. Das heißt die Werte müssen alle in RAM geschrieben, und auch wieder aus dem RAM gelesen. Das macht den Compiler etwas einfacher, da viele Optimierungen so gar nicht möglich sind. Wenn in C ein variable nicht volatile ist, weiss der Compiler, dass sich der Inhalt nicht durch Interrupts, oder direkten Hardwareeinfluß ändert. Entsprechend sind mehr Optimierungen möglich.

Wenn mehrere Operationen in einer Zeile möglich wären, hätte der Complier die Möglichkeit Zwischenergebnisse in Registern zu lassen und erst am Ende des BASIC-befehls die Daten ins RAM zu schreiben. Der transfer der Daten ins RAM und zurück kann durchaus länger dauern als eine Addition oder ähnliches. So wie es aussieht führt BASCOM ohnehin nur sehr wenige Optimierungen durch, wenn überhaupt.

Ein paar Vorteil hat der Recht einfache Compiler auch: viele Register werden von BASCOM gar nicht genutzt und können bei Inline ASM frei genutzt werden. Außerdem enfällt für Inline ASM eine aufwendige Syntax für die Datenübergabe, denn die geht immer über das RAM.

Man muß aber auch sagen, das die Optimierungen des Compilers auch Nachteile haben. Bei der Simulation kann man nicht immer den VErlauf im Quelltext nachvollziehen und so Fehler eventuell schwerer finden. Vor allem ein vergessenes "volatile" ist ein beliebter Fehler, den es ohne Optimierungen nicht gäbe.