Hallo! Hab unter MS-DOS 6.22 per QBasic mehrere Programme geschrieben, und dann mit QuickBasic 4.5 kompiliert. Nun ist mir aufgefallen, dass die ersten zwei Programme, welche ziemlich kurz sind größer sind, als das dritte, das wesentlich länger ist... woran kann das liegen? Die .BAS Datei vom dritten Programm ist schon größer, als die von ersten zwei Programmen, aber bei den .EXE Dateien sind die kleineren Programme kleiner??? Danke :-)
:
Verschoben durch User
da du die programme nicht gepostet hast: peep *peeep* peeeep Kein Anschluß unter dieser Glaskugel
Hab leider nur von einem der ersten zwei Programme die .BAS Datei gefunden... Bitte nicht blöd lachen, das sind wirklich nur ganz einfache Sachen, denn ich wollt mich halt mal dran versuchen... :-)
Hallo! Ganz einfach: in einem Programm gibt es nur String- und Integerverarbeitung; im anderen muss per Floatingpoint berechnet werden. Der gleiche Effekt findet sich bei jedem Compiler, auch bei Mikrocontrollern.
Die Mathematikroutibe ist im Quiz nicht benötigt und somit auch in der EXE nicht drinn
in anlehnung an die vorigen antworten: die DOS_QUIZ.BAS .exe wird wahrscheinlich größer sobald du ein printf benutzt (soweit "bas" das unterstützt). anscheinend ist es so, dass externe libs mit eingebunden werden sobald du eine funktion aus dieser lib verwendest - sqr() zum beispiel. bei anderen sprachen wird das offensichtlicher, weil man die einzubindenden libs im quellcode angeben muss, z.b. über "include", "use", "import" - je nach sprache.
c.m. schrieb: > bei anderen sprachen wird das offensichtlicher, weil man die > einzubindenden libs im quellcode angeben muss Da gibt es riesige Unterschiede - manche Compiler binden der Einfachheit halber alles dazu was es überhaupt gibt, egal ob verwendet oder nicht, so dass ein "Hallo Welt" schon MB gross sein kann - oft in Foren besprochen. Andere arbeiten paketweise, also math wird gelinkt wenn irgendeine mathematische Funktion vorkommt. Besonders gute Compiler arbeiten da auf Funktionsebene, also sin wird gelinkt wenn verwendet aber cos und tan usw. nicht. Naturgemäss erzeugen die den kleinstmöglichen Code, ist aber auch der grösste Aufwand. Wenn unbedingt nötig kann man das auch selber machen, indem man die Object-Dateien editiert - ich habe selbst schon aus Libraries solange Funktionen entfernt bis der Linker gemeckert hat. Auf die Arbeit kann ich aber auch gern verzichten, besonders in Zeiten wo sich Speicher nach GByte statt kByte bemessen. Georg
Philipp S. schrieb: > mit QuickBasic 4.5 kompiliert. Ich bin mir nicht sicher, ob QB wirklich ein Compiler ist, glaube eher, der schleppt einen Interpreter in die .exe. Ein echter Compiler war Microsoft-Power Development System "PDS", mit dem habe ich vor vielen Jahren gespielt.
Manfred schrieb: > Ich bin mir nicht sicher, ob QB wirklich ein Compiler ist, glaube eher, > der schleppt einen Interpreter in die .exe. Und der Interpreter ist nur 2kb groß?
Me schrieb: > Und der Interpreter ist nur 2kb groß? Damals als Programmierer noch richtige Programmierer waren und so weiter... da ging das schon. Ob aber Microsoft das jemals geschafft hat ist leider nicht überliefert.
Manfred schrieb: > Ich bin mir nicht sicher, ob QB wirklich ein Compiler ist, glaube eher, > der schleppt einen Interpreter in die .exe. QBasic: Interpreter (extern) qbasic /run bla.bas QuickBasic: Compiler
Philipp S. schrieb: > mit QuickBasic 4.5 kompiliert Sobald Dein anderer Befehl hinzukommt, muß der Compiler auch das nötige Programm mitliefern. So könnten z.B. aus einer Zeile A=7 als .bas 12k Programm.exe werden. Je nach benutzten Compiler-Optionen kann die Größe auch noch verschieden sein.
Philipp S. schrieb: > welche ziemlich kurz sind größer sind, als das dritte, > das wesentlich länger ist... woran kann das liegen? Im kurzen Programm PYTH.BAS verwendest Du eine Quadratwurzel, hinter dieser verbirgt sich ein relativ großer Code. Dieser kann in C so ausehen:
1 | if( a < 0. ) |
2 | {
|
3 | printf("\n\nFehler: Radikand ist negativ\n"); |
4 | return 0; |
5 | }
|
6 | |
7 | /* falls Radikand gueltig */
|
8 | |
9 | for(x_alt = a; fabs( x_neu - sqrt(a) ) >= 1e-2; x_alt == x_neu) |
10 | x_neu = 0.5*(x_alt + a/x_alt); |
11 | |
12 | printf("\nWurzel %f = %f\n", a, x_neu); |
(schnippsel von hier: http://www.informatikerboard.de/board/archive/1496/thread.html) Der Quadratwurze-Code widerum verwendet eine Division, welche den Maschinencode zusätzlich aufbläht. Im anderen Programm wird der Compiler (außer Print) nur IF-Anfragen übersetzen und die realisieren sich aus Vergleichen und relativen Sprüngen. Deshalb hat das kleinere Basic-Program PYTH.BAS einen größeren Maschinencode als das längere Programm QUIZ.BAS Alles sehr grob gesagt...
Mist. Ich habe Dir einen Fehlerhaften Code für die Division verlinkt. Habe nur kurz darauf geschaut, als ich nach dem Heron-Verfahren gesucht habe. Sorry. Der hier sollte stimmen:
1 | double heronverfahren(double a) { |
2 | |
3 | double xn = 1.0; |
4 | |
5 | do { |
6 | xn = (xn + (a / xn)) / 2; |
7 | }
|
8 | while (((xn * xn) - a) > 0.0001); |
9 | return xn; |
10 | }
|
link von hier: https://www.drwho.de/forum/index.php/Thread/2958-So-rechnet-der-Computer-die-Wurzel-aus/
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.