AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Schleifenvariable ausserhalb der Schleife benutzen

Schleifenvariable ausserhalb der Schleife benutzen

Ein Thema von hoika · begonnen am 18. Nov 2011 · letzter Beitrag vom 20. Nov 2011
Antwort Antwort
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 18. Nov 2011, 17:58
Wobei der Compiler ja auch intelligent genug sein könnte, um zu erkennen, daß die Variablen nicht gleichzeitig verwendet werden
und würde dann den selben Speicher für Beide gemeinsam nutzen.
Gleichzeitig nicht, aber eine Variable kann sequentiell bzw. zeitversetzt für alles mögliche genutzt werden. Bei Werteüberschneidungen wegen gleichzeitiger Benutzung, die wahrscheinlich zu inkosistentem Verhalten des Compilates führen, erwarte ich von einem Delphi der Generation XE2, daß es das grundsätzlich bemerkt und warnt, sofern das nach der (Un-)Logik des Quelltextes nicht ausgeschlossen werden kann.

Compiler kann man durchaus noch viel intelligenter bauen. So kann z.B. ein Compiler Codeabschnitte bzw. einzelne Befehle, die nicht kausal im Zusammenhang stehen, automatisch parallelisieren, sozusagen bei so etwas wie ein selbständiges "Threadmanagemen" erstellen bzw. durchführen (natürlich mit Compilerschaltern zu-/abschaltbar, abhängig von der Prozessoren- oder Prozessorenkernanzahl, auch die ungefähre Codegröße, die das auslöst usw.). Was man alles in einen solchen Compiler hineinzaubern könnte...! Und daß Delphi dergleichen bis heute nicht bietet....Mit solchen Mosereien hielt ich mich bisher aber bewußt zurück, und daß Delphi das nicht bietet, ist für mich als Hobbyprogrammierer kein echter Nachteil. Und die Sprache Pascal ist ja zum Glück gut les- und strukturierbar, deshalb mag ich (auch) Delphi.

Geändert von Delphi-Laie (18. Nov 2011 um 18:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 18. Nov 2011, 18:28
Compiler kann man durchaus noch viel intelligenter bauen. So kann z.B. ein Compiler Codeabschnitte bzw. einzelne Befehle, die nicht kausal im Zusammenhang stehen, automatisch parallelisieren, sozusagen bei so etwas wie ein selbständiges "Threadmanagemen" erstellen bzw. durchführen
Gibt es solche Compiler schon? Das Problem ist, woher weiß der Compiler, dass keine Abhängigkeiten bestehen? Woher weiß der Compiler dass keine Synchronisation statt findet, denn nur dann geht das. Der Compiler müsste ja die Programm Logik erfassen und erkennen, was der Programmierer will. Und dann wäre es ja nur noch ein kleiner Schritt bis zu: "Computer mach mal." Und hinten kommt das fertige Programm raus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 18. Nov 2011, 18:35
Ob es so etwas wirklich gibt, ist mir nicht bekannt. Allerdings las ich davon in einem - dezent formuliert - nicht mehr ganz taufrischen Sonderheft der Reihe "Spektrum der Wissenschaft", und zwar eines der Reihe "Verständliche Forschung" von 1989(!). Die Konzepte sind also schon jahrzehntealt. Und Hand auf's Herz: Schon beim flüchtigen Überblicken eine Quellcodes kann man oft sicher parallelisierbare und sicher abhängige (und dann sequentiell auszuführende) Befehle und Blöcker erkennen bzw. unterscheiden.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 18. Nov 2011, 18:37
Auto-Threading ist heikel wie sonst was! Hab mich damit mal ne Zeit theoretisch beschäftigt, und die Generalaussage in der meisten Literatur war (grob): Um eine im allgemeinen Fall überhaupt merkbare Beschleunigung zu erreichen, ist die Komplexität und Fehleranfälligkeit des Vorhabens - aus praktischen Gesichtspunkten - zu groß. Die meisten Autoren waren sich einig, dass es in Summe wohl weniger Arbeit machen würde, an den paar Stellen, an denen es hochspezialisiert effektiv einsetzbar wäre, wenn die Programmierer die jeweils angepasste Lösung manuell implementierten.
Das wird vor allem dann nachvollziehbar, wenn man bedenkt, dass gerade für Multithreading so günstiges Streaming (Operationen wie Daten) derart stark mit den verwendeten Strukturen und der Aufgabe verwoben sind, dass ein Compiler im Grunde "verstehen" müsste, was der Programmierer da gerade machen will, um auch semantische Optimierungen vornehmen zu können - sonst wäre der Gewinn im Mittel kaum merkbar, und wirtschaftlich Unsinn. (Theoretisch nach wie vor höchst interessant!)
Da finde ich es auch irgendwie okay, dass ein Entwickler, der Parallelität herstellen will, sich dieser Sache sehr bewusst sein muss. Dadurch ist er quasi gezwungen geeignete Datenstrukturen und Abläufe zu implementieren, und ggf. sogar einen Algorithmus komplett zu reformulieren um die nötigen Eigenschaften herzustellen.

Ergo: Ein einfacher, "dummer" parallelisierender Compiler wäre sicher machbar, der praktische Nutzen im Mittel aber nicht gegeben. Zumal man sich einen Haufen möglicher Fehlerquellen einbrockt, und sei es schon nur das "wackelige" Debuggen in Threads (vor allem anonymen). Ein intelligenter dieser Art wäre so hochkomplex und würde teilweise in die KI gehen, dass der nötige Entwicklungsaufwand den Nutzen im Mittel kaum gerecht würde, bzw. teilweise nichtmals Theorien zu manchen Details der Umsetzung bestehen. Hochparallele DV ist, gerade durch die Öffnung der GPUs für unspeziellen Code vor kurzem, auch erst recht kurz ein in der Breite diskutiertes Thema. Zuvor war das eher den Spezis von Cray und Co überhaupt ein Anliegen, und so viel Theorie gibt's da einfach noch garnicht zu. Schon garnicht in Punkto Auto-Parallelisierung.

Was du so laks in ein paar Worten als "nice-to-have" nennst, ist ein Universum an Theorie und Komplexität
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 18. Nov 2011, 20:16
Hallo,

um noch mal zum Thema zu kommen

Mir ist schon bewusst, dass man das nicht macht (Schleifen-Variable ausserhalb benutzen).
Zum Verständnis:
der Compiler verwendet AX/EAX mit jnz,
was sehr effizient ist, daher auch das Rückwärtszählen,
falls die Variable in der Schleife nicht verwendet wird.
AX/EAX ist aber ein sehr oft verwendetes Register,
es wird also mit grosser Wahrscheinlichkeit
sofort für was anderes benutzt und damit ist der Schleifenzähl-Wert futsch.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 18. Nov 2011, 21:14
zu meiner Zeit war das noch CX
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#7

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 18. Nov 2011, 23:23
Der Compiler nimmt, hierfür das, wo er meint das sei noch frei und eigne sich gut dafür.

ECX ist zwar oftmals das Counter-Register, aber es ist nicht zwingend vorgeschrieben.
(das Assemblerbefehl LOOP nutzt zwar dieses Register, aber Delphi nutzt das langsame LOOP eh nicht)

Jenachdem was frei ist, nutzt Delphi EAX, ECX, EDX oder doch ein Plätzchen auf'm Stack.
EBX nutzt Delphi eher ungern, da dieses eine besondere Rolle spielt. (hat aber nix mit dem B zu tun )

Und da wo der Variablenwert noch lange der Schleife verfügbar war, wurde entweder dieses Register nicht neu beschrieben oder eben die Stelle auf'm Stack war (zufällig) noch unberührt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 19. Nov 2011, 08:29
Zur Ehrenrettung des Compilers sei gesagt: Eine diesbezügliche (berechtigte!) Warnung gibt der Compiler schon bei Delphi 2.0 aus (die Version 1 kann ich dahingehend nicht prüfen, habe sie nicht installiert), vielleicht war das sogar zu Turbo-Pascal-Zeiten schon implementiert....schnell mal eben Turbo-Pascal 6.0 (nie wieder einen solch schnelle und stabile IDE wahrgenommen) gestartet: Dort gibt es keine solche Warnung, und die Variable hat auch den Wert, der ihr zum Ende der Schleife (also zum Start des letzten Schleifendurchlaufes) mit auf den Weg gegeben wurde.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#9

AW: Schleifenvariable ausserhalb der Schleife benutzen

  Alt 19. Nov 2011, 09:33
Der Grund ist ganz einfach:

OK, wenn man die schleife abbricht, dann hat die Variable diesen letzten Wert, aber wie ist das, wenn die Schleife sich ordentlich beendet?

Hat die dann den letzen Wert
- erst prüfen, dann weiterzählen und danach zurückspringen
- erst prüfen, dann zurückspringen und danach weiterzählen
oder ist sie da schon weiter?
- weiterzähen, prüfen ob noch im Bereich dann verlassen oder zurückspringen

PS: Intern läuft die Variable auch manchmal rückwärts, oder eben aus Optimierungsgründen irgendwie anders.
Sie wird dann innerhalb der Schleife umgerechnet, bei deren Nutzung (falls sie überhaupt genutzt wird).

Aber auchßerhalb der Schleife gibt es diese Umrechnung nicht mehr.



Da nun also die Variable nicht unbedingt den Wert hat, welchen man sich vorstellt, kann man dieses danach einfach nicht nutzen,
bzw. manchmal gibt es diese Variable nicht wirklich lange (im RAM), da die nur kurz in einem CPU-Register drin lag.

Und jetzt auf den blosen Verdacht hin, daß diese irgendwer nachher noch verwenden könnte, schaltet der Compiler hier eben nicht alle Optimierungen ab.
Oder komt gar auf die Idee alle Zählervariablen, nach der Schleife, nochmal auf deren "wirklichen" Wert umzurechnen, was reichlich sinnlos wäre und überall einen nutzlosen Overhad bedeuten würde.



Lösung: Geh zu Emba ins EDN, erstelle einen Antrag (QC), man möge doch bitte statt dieser Fehlermeldung eine Umrechnung der Variable einbauen, bzw. dafür sorgen, daß deren Wert in eine richtige Variable kopiert wird.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz