2010-09-26 3 views
5

Abgesehen von Dll-Konzept, das die Möglichkeit zum Laden/Entladen von Methoden oder Funktionen zur Laufzeit bietet, frage ich mich, ob ein Compiler jemals etwas wie sagen kann, ok, da dieser bestimmte Teil des Codes erhebliche Platz im Code-Segment nimmt und es wird nie wieder nach diesem Punkt während der Programmausführung verwendet werden, es wäre gut, Code zu generieren, um diesen Teil des Codesegments nach dem Erreichen dieses bestimmten Punktes während der Programmausführung zu entladen, so dass der gesamte Platzbedarf des Codesegments kleiner wird. Ist es etwas nur Fiktives oder kann das passieren?Kann ein Compiler jemals Code zum Entladen von Teilen des Codesegments während der Ausführung generieren?

+2

+1 interessante Frage – delnan

Antwort

3

Ein Compiler kann alles tun, was er will, solange dies nicht gegen den Standard verstößt. Wenn es herausfinden kann, dass der Code nie wieder aufgerufen wird, kann er es vollständig ablegen.

Es könnte sogar durch eine kleinere Stub-Funktion ersetzen, die den Code neu laden würde, wenn es erforderlich wäre.

Aber Sie werden sehr wahrscheinlich nie in einem modernen Betriebssystem sehen, da das Betriebssystem selbst diese Fähigkeit unter den Abdeckungen bietet.

Betriebssysteme (zumindest die üblichen) werden Ihre physischen Seiten austauschen, wenn der Arbeitsspeicher knapp wird, und sie werden erst wieder geladen, wenn sie benötigt werden (normalerweise durch einen Seitenfehler beim Zugriff).

1

Ich weiß nicht von einem Compiler, der dies tut, aber es gibt keine Regel, die es verbietet. Wenn der Compiler beweisen kann, dass dies die Semantik des Programms nicht ändert, ist dies unter der Als-ob-Regel erlaubt.

Dies ist jedoch normalerweise nicht erforderlich, da nicht verwendeter Code bereits als Teil des dem virtuellen Speicher zugeordneten Auslagerungsdateimechanismus ausgelagert werden kann. (und weil Sie wahrscheinlich nur ein paar KB Speicherplatz sparen würden)

4

Sicher. Es gibt eine Technik namens overlaying, die zu unterschiedlichen Zeiten unterschiedlichen Code in das gleiche Adressraumbit lädt. Manchmal wurde es manuell gemacht, manchmal halfen Compiler. Manchmal erfolgt das Laden in Software, manchmal in Hardware (mit Adreßmultiplexen, so daß beispielsweise während der Startzeit ein Bit Adreßraum von einem ROM-Chip liest, aber nach dem Booten stattdessen zu Adreß-RAM oder einem anderen ROM wechselt).

Überlagerung war viel häufiger, wenn Computer weniger Speicher hatten, z. in den frühen Tagen von DOS, wo man bestenfalls 640K hatte und oft nicht einmal das. Heutzutage gibt es immer noch Anwendungen für Embedded-Systeme, bei denen Speicher und/oder Adressraum knapp sind.

3

Ja, Windows-Gerätetreiber verwenden diese Technik. Im Format LE file sind bestimmte Codesegmente als verwerfbar gekennzeichnet. Das Betriebssystem kann auch zu bestimmten Zeiten eine Entscheidung treffen, Code-Segmente auszutauschen, die lange Zeit nicht benutzt wurden.

Streng genommen ist dies jedoch nicht der Bereich für den Compiler zu spielen. Es ist vor allem der Linker/Loader/OS, die dies beeinflussen.

+0

Discardable Codesegmente gibt es auch in dem üblicheren PE-Format, das von EXEs und DLLs verwendet wird. Der Compiler spielt hier sicherlich eine Rolle; Es platziert Funktionen in bestimmten Segmenten. Aber es hat wenig Sinn, wie Sie angemerkt haben: Ein Betriebssystem kann alle schreibgeschützten Seiten löschen, die neu geladen werden können, und Seiten verwerfen, die in letzter Zeit nicht berührt wurden. – MSalters