Autor Beitrag
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 05.03.08 03:26 
Hi,

erstmal vorweg - ich weiß, dass es so ein Programm vor kurzem schonmal in der DP gab (DupeChecker). Tatsächlich hat mich dieses Programm sogar dazu inspiriert meine eigene Version zu schreiben, da ich in einigen Punkten nicht ganz glücklich damit war (siehe dazu mein Posting im Thread zu dem Programm).
Ich habe daher beschlossen mein eigenes Programm zu schreiben und versucht die von mir kritisierten Punkte zu verbessern.

Features:
  • Sehr schnelle Duplikatssuche
  • Kommentare werden vor dem Vergleichen entfernt -> unterschiedliche Kommentare in identischen Codeblöcken spielen keine Rolle mehr; auskommentierter Code wird nicht als Duplikat erkannt
  • "Überflüssige" Leerzeichen werden vor dem Vergleichen ebenfalls entfernt (aus "i : integer ;" wird "i:integer;") -> Unterschiede in der Formatierung werden ignoriert
  • Übersichtliche Aufbereitung der Ergebnisse in einem Treeview
Anmerkung: Treeview Einträge die kursiv sind sind "Subduplikate", sie sind also ein Teil eines größeren Duplikats. Diese werden nur dann angezeigt, wenn sie identisch mit anderen gefundenen Dupliakten sind, die selbst keine Subdupliakte sind.

v0.4.1
  • Speicherverbrauch wurde drastisch gesenkt
  • Geschwindigkeit wurde um das 4-5 fache gesteigert
  • Rekursive Suche in Unterordnern kann optional deaktiviert werden
  • Comboboxen wurden durch "erweiterte" Versionen ersetzt
  • Es wird nun überall der volle Pfad als Hint angezeigt


v0.3.1
  • Analyse findet nun in einem eigenen Thread statt und kann abgebrochen werden
  • Geschwindigkeit wurde nochmals gesteigert
  • Speicherverbrauch wurde deutlich reduziert
  • Splitter-Problem beseitigt
  • Die Schriftart des Treeview wurde auf Verdana umgestellt - damit gibt es keine Probleme mit den kursiven Zahlen mehr.


v0.2.2
  • Es gibt jetzt eine SettingsForm - die Einstellungen werden in einer ini-Datei und einer txt-Datei gespeichert (siehe weiter unten)
  • Alle Sources eines Duplikats können nun in einem eigenen Fenster direkt verglichen werden
  • Sowohl im "Compare-Fenster" als auch in der MainForm werden die Duplikate im Source durch eine eigene Hintergrundfarbe gekennzeichnet
  • Duplikate die nur aus Keywords bestehen können ignoriert werden
  • Geschwindigkeit wurde um das bis zu 4-fache beschleunigt
Folgende Einstellungen sind möglich:
  • Minimale Zeilenanzahl
  • Extensions der Files die beim Durchsuchen von Ordnern berücksichtigt werden sollen
  • Ignorieren von Duplikaten die nur aus Keywords bestehen
  • Es sollen nur Zeilen gezählt werden die nicht nur aus einem Keyword bestehen (betrifft minimale Zeilenanzahl)
  • Liste der Keywords die ignoriert werden sollen - betrifft die beiden obigen Einstellungen (diese List wird in keywords.txt gespeichert)


v0.1.2
  • Das Programm kann jetzt auch für ganze Ordner angewendet werden. Dabei werden alle pas und dpr Files aus dem gewählten Ordner und allen Unterordnern zur Duplikatssuche herangezogen.
  • Die Duplikatsanzeige wurde korrigiert, es sollten jetzt immer die korrekten Zeilen angezeigt werden
  • Das Ergebnis kann nach Files gefiltert werden, dabei werden nur jene Duplikate angezeigt die in dem ausgewählten File vorkommen. Wenn zusätzlich noch "strict" aktiviert ist werden alle Sources aus anderen Files ebenfalls ausgeblendet.
  • Optional kann nun das gesamte File im Edit angezeigt werden, das Duplikat wird dabei markiert.
  • Während der Duplikatssuche wird jetzt ein Dialog mit Progressbar angezeigt. Im Moment verwende ich noch Application.ProcessMessages damit das UI upgedatet wird was sich natürlich auf die Laufzeit auswirkt. In Zukunft wird das per Multithreading gelöst.


TODO:

  • Einstellungsmöglichkeiten - Kommentare beim Preprocessing entfernen, Compiler-Schalter als Kommentar behandeln, ...
  • Subduplikate mit "Eltern"-Duplikat verknüpfen
  • Eventuell noch bessere Anpassung während des preprocessing um unterschiedliche Formatierungen noch besser auszugleichen
  • ...


Gruß, Motzi
Einloggen, um Attachments anzusehen!
_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!


Zuletzt bearbeitet von Motzi am Sa 15.03.08 20:22, insgesamt 6-mal bearbeitet
kkausp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Mi 05.03.08 10:02 
Erst mal ein Lob.

Ich habe aber noch einen Vorschlag:

Führe bitte eine Liste ein, in der man Elemente einträgt, so das wenn nur diese enthalten sind, kein Duplikat vorhanden ist.

d.h es muss mindestens ein Element vorhanden sein welches nicht in der Liste ist.

z.B. Listen elemente:

begin
end
try
finally
except
else

Ziel ist solche Sequencen nicht angezeigt zu bekommen.

end;
end;
end;
end;

oder


end;
end;
finally
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 05.03.08 10:49 
(1) Na ja, für den Anfang nicht schlecht, dringend erfoderlich, das ganze Projekte durchsucht werden, Datei und Odrner sind für mich nicht relevant.
(2) Warum in Englisch?

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Motzi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 05.03.08 12:10 
@kkausp: Gute Idee, wird eingebaut!
user profile iconKroko hat folgendes geschrieben:
(1) Na ja, für den Anfang nicht schlecht, dringend erfoderlich, das ganze Projekte durchsucht werden, Datei und Odrner sind für mich nicht relevant.

Naja, üblicherweise hat man ja einen eigenen Ordner für ein Projekt. Wenn ein Ordner ausgewählt wird werden alle Files aus diesem Ordner inkl. Unterordner zur Analyse herangezogen. Oder gibt es bessere Vorschläge?
user profile iconKroko hat folgendes geschrieben:
(2) Warum in Englisch?

Ganz einfach weil ich es mir angewöhnt habe alle meine Projekte in Englisch zu machen! ;)

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mi 05.03.08 13:38 
user profile iconKroko hat folgendes geschrieben:
(2) Warum in Englisch?


Weil englisch jeder auf der welt verstehen sollte und dadurch das programm für jeden auf der welt nutzbar wird. ;-)

@Motzi: Coole Idee. getestet hab ichs noch nicht. (Hab keine Programm am PC mit dem internet) Wir aber noch nachgeliefert.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 05.03.08 16:28 
user profile iconMotzi hat folgendes geschrieben:
...
Naja, üblicherweise hat man ja einen eigenen Ordner für ein Projekt. Wenn ein Ordner ausgewählt wird werden alle Files aus diesem Ordner inkl. Unterordner zur Analyse herangezogen.

Habe ich auch, aber ständig wiederkehren Units mit Klassen, Proc/Func und Forms habe ich in Extra-Ordnern. Man kann ja die Projekt-Datei und die Optionen-Datei analysieren!
user profile iconMotzi hat folgendes geschrieben:
user profile iconKroko hat folgendes geschrieben:
(2) Warum in Englisch?

Ganz einfach weil ich es mir angewöhnt habe alle meine Projekte in Englisch zu machen! ;)

Gruß, Motzi
Finde ich persönlich nicht gut! :cry:

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Tarry
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 213
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.08 19:26 
ALs erstes: Super Idee ;)

Ich hab auch noch zwei Verbesserungsvorschläge:

1) Man bekommt den Code nur in Großbuchstaben zu sehen, es wäre schöner wenn du ihn in der Orginalformatierung (auch mit Kommentaren) anzeigen würdest.

2) Ich würde gerne den Kontext des Codes sehen könne, vielleicht den ganzen Code und die einzelnen Wiederholungen nur in unterschiedlichen Farben hervorgehoben, oder so ;)

Also: Bleib dran :!:

Gruß
Tarry

_________________
"Es gibt zwei Dinge, die unendlich sind. Das Universum und die menschliche Dummheit. Beim Universum bin ich mir noch nicht ganz sicher." -Albert Einstein
Motzi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 06.03.08 02:30 
Neue Version ist online, Details siehe erstes Posting.

user profile iconTarry hat folgendes geschrieben:
1) Man bekommt den Code nur in Großbuchstaben zu sehen, es wäre schöner wenn du ihn in der Orginalformatierung (auch mit Kommentaren) anzeigen würdest.

Im Treeview sind 2 "Ebenen" - die erste Ebene enthält die Duplikate, wenn du einen Knoten aus dieser Ebene auswählst wird der "preprocessed code" angezeigt. In der zweiten Ebende (also die Kindknoten der Duplikate) sind die "Sources", das sind all jene Stellen im Sourcecode deren Code nach dem Preprocessing mit dem des Duplikats identisch ist. Sprich: alle Kindknoten eines Duplikats sind semantisch äquivalent.

user profile iconTarry hat folgendes geschrieben:
2) Ich würde gerne den Kontext des Codes sehen könne, vielleicht den ganzen Code und die einzelnen Wiederholungen nur in unterschiedlichen Farben hervorgehoben, oder so ;)

Das ist seit der neuen Version möglich. Einfach "Show complete file" über dem Editor aktivieren und du bekommst immer das komplette File in dem das jeweilige Duplikat markiert ist.

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 06.03.08 10:11 
(a) neue Version -> schon mal ganz gut, aber
(b) Fenster zu breit, vielleicht kannst Du es etwas verkleinern bzw. poScreenCenter setzen!
(c) Ist das Auslesen der Pfade aus der cfg-Datei noch im ToDo?

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Motzi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 06.03.08 10:49 
user profile iconKroko hat folgendes geschrieben:
(b) Fenster zu breit, vielleicht kannst Du es etwas verkleinern bzw. poScreenCenter setzen!
poScreenCenter kommt noch (hab ich in der Version vergessen)
user profile iconKroko hat folgendes geschrieben:
(c) Ist das Auslesen der Pfade aus der cfg-Datei noch im ToDo?

Ja, aber im Moment eher weiter hinten. Ich denke der Ordner-Ansatz ist fürs erste mal ausreichend. Eventuell mach ich es so, dass in Zukunft mehrere Files/Ordner ausgewählt werden können, die alle durchsucht werden.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 06.03.08 10:59 
(a) mehrere Ordner wäre auch okay
(b) per Ini-Datei etc. sollten die Einstellungen speicherbar sein, man hat wenig Lust die Ordner jedesmal neu zu suchen

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Motzi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 06.03.08 11:42 
user profile iconKroko hat folgendes geschrieben:
(b) per Ini-Datei etc. sollten die Einstellungen speicherbar sein, man hat wenig Lust die Ordner jedesmal neu zu suchen

Ist ebenfalls in Planung - zusammen mit einigen anderen Einstellungen (siehe erstes Posting): :)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 08.03.08 17:14 
Führst Du eine textuelle oder eine syntaktische Duplikatsuche durch?

Heißt: Wird auch sowas erkannt?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Procedure Proc1;
var
    I: Integer;
begin
    For I := 0 To 15 do
        WriteLn('Hello World!');
end;

Procedure Proc2;
var
    A: Integer;
begin
    For A := 0 To 15 do
        WriteLn('Hello World!');
end;


Das kommt nämlich auch häufig vor, dass Variablen einfach auch anders heißen, als im Original-Source.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Sa 08.03.08 17:40 
Darf ich mal fragen, wozu so ein Programm gut sein soll? :gruebel:

_________________
Na denn, dann. Bis dann, denn.
Motzi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Sa 08.03.08 18:01 
user profile iconBenBE hat folgendes geschrieben:
Führst Du eine textuelle oder eine syntaktische Duplikatsuche durch?

Heißt: Wird auch sowas erkannt?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Procedure Proc1;
var
    I: Integer;
begin
    For I := 0 To 15 do
        WriteLn('Hello World!');
end;

Procedure Proc2;
var
    A: Integer;
begin
    For A := 0 To 15 do
        WriteLn('Hello World!');
end;


Das kommt nämlich auch häufig vor, dass Variablen einfach auch anders heißen, als im Original-Source.

Ich führe eine textbasierte Suche durch, so etwas wird also nicht erkannt. Eine semantische Duplikatssuche wäre in vielerlei Hinsicht besser, allerdings erfodert diese ein völlig anders Vorgehen und wäre um einiges komplizierter umzusetzen. Ich denke aber, dass auch der textbasierte Ansatz kann durchaus hilfreich sein.

@alzaimar: ganz einfach, wenn du feststelltst, dass du in deinem Projekt ein und denselben Code mehrmals hast, dann ist es unter Umständen sinnvoll diesen Teil in eine eigene Funktion auszulagern, was den Code wiederum besser wartbar macht. Es liefert einfach ein paar Ansätze zum Refactoring. Ich hab zum Beispiel vor einigen Wochen ein Projekt übernommen das ~40.000 Zeilen hatte. Einige Tausend davon waren aber vollkommen unnötig, da der ursprüngliche Programmierer Funktionen bis zu 8 mal in unterschiedliche Units kopiert hat. Solche Sachen lassen sich mit diesem Programm schnell feststellen. (dieses besagte Projekt war es auch, das mich auf die Idee gebracht hat dieses Programm zu schreiben).

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 08.03.08 18:01 
Das ist für die Leute gut, die viel redundanten Source schreiben, und nun versuchen, diesen zu kürzen.

Im Endeffekt kann man damit auch Codestellen suchen, die im Falle eines Fehlers einen solchen aufweisen werden. Daher auch mein Hinweis in Bezug auf Syntaktische oder rein textuelle Vergleiche. Mit der syntaktischen Variante, kann man feststellen, dass beide Routinen in meinem Beispiel den gleichen Fehler haben werden, mit einer rein Textuellen Analyse geht dies nicht.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Motzi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Sa 08.03.08 18:25 
user profile iconBenBE hat folgendes geschrieben:
Das ist für die Leute gut, die viel redundanten Source schreiben, und nun versuchen, diesen zu kürzen.

Im Endeffekt kann man damit auch Codestellen suchen, die im Falle eines Fehlers einen solchen aufweisen werden. Daher auch mein Hinweis in Bezug auf Syntaktische oder rein textuelle Vergleiche. Mit der syntaktischen Variante, kann man feststellen, dass beide Routinen in meinem Beispiel den gleichen Fehler haben werden, mit einer rein Textuellen Analyse geht dies nicht.

Eine solche Analyse wäre ohne Zweifel wesentlich besser, da sie vollkommen unabhängig von Namen, Formatierung, Reihenfolge von Variablendeklarationen etc wäre, aber so etwas ist wie gesagt wesentlich komplizierter zu implementieren! Ich mache im Prinzip nichts anderes als Kommentare etc entfernen und die übrig gebliebenen Zeilen in ein paar Datenstrukturen zu verpacken die mit geeigneten Algorithmen sortiert/durchsucht etc werden (Details wären hier jetzt zu kompliziert). Auf jeden Fall war das recht schnell und einfach zu implementieren und das war das einzige worauf es mir angekommen ist. Für eine syntaktische Analyse müsste man einen kompletten Syntax-Parser schreiben und einen Syntaxbaum aufbauen welcher dann so transformiert werden müsste, dass man eine entsprechende Duplikatssuche durchführen kann. Ist sicher sehr interessant sowas zu machen, aber ich tu mir die Arbeit nicht an! :)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Motzi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Sa 08.03.08 21:13 
Neue Version ist fertig (siehe erstes Posting)!

Hab gerade einen Hardcore-Test gemacht:
Files: 947
Original lines: 292.041
Preprocessed lines: 152.783
Comparisons: 665.512.367
Duplicates: 544
Duplicates sources: 1675
Time: 52.250ms

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 09.03.08 10:19 
user profile iconMotzi hat folgendes geschrieben:

@alzaimar: ...in deinem Projekt ein und denselben Code mehrmals hast, ...

Die erste Version funktionierte ja nur mit einer einzigen PAS-Datei und da war mir der Sinn nicht klar. So ist es natürlich ein extrem praktisches Tool für Entwickler, die den Mist anderer Frickler aufräumen müssen. :zustimm:

_________________
Na denn, dann. Bis dann, denn.
kkausp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Mi 12.03.08 17:21 
Hallo

ich hätte noch einen Wunsch, das als hint des Filenamens der vollständige Pfad angezeigt wird, da bei mir einige Dateien offensichtlich doppelt in der Folderstruktur sind.

PS: Ansonsten hat er auch 500.000 Original lines mit 260.000 Preprocessed lines überstanden.
PPS: Ist das nächste dann die IDE-Integration? ;-)