Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

Witam!

Czy znacie jakieś sposoby na przyspieszenie kompilacji w Delphi 7 dla dużego projektu? Organizacja ścieżek, jakieś zewnętrzne wtyczki...? Oczywiście rozbudowa sprzętu nic nie daje...

Przy okazji, często zdarza mu się "wywalać" - out of memory, albo cały szereg błędów linkera... Czy na to macie jakieś sposoby?

ps. oczywiście nie ma szans na przepisanie projektu ani nic z tych rzeczy ;)
Roman Wilk

Roman Wilk Tak właściwie, to
gram dużo w squash'a
:), ale to wciąż
z...

Temat: Duży projekt - wolna kompilacja

Witam,
mieliśmy takie same problemy w D7 (to było 3 lata temu), kod źródłowy to 850 tys. linii. Niestety jedynym rozwiązaniem była migracja kodu do D2010 (spore koszty migracji kodu, bo trzeba to przenieś do Unicode), ale obecnie D2010 daje radę (co prawda są inne problemy, ale to chyba standard w tej materii)

Pozdrawiam
Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

No niestety to nie wchodzi w grę... (polityka firmy :/).

ps. 850 tys. to jest średni projekt :) My mamy 2 500 000 ;)Ten post został edytowany przez Autora dnia 27.10.13 o godzinie 10:04

konto usunięte

Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

Oczywiście mam DelphiSpeedUp i takie tam :) Pytam raczej o jakieś sposoby na modularyzację projektu... etc...

konto usunięte

Temat: Duży projekt - wolna kompilacja

Michał P.:
Oczywiście mam DelphiSpeedUp i takie tam :) Pytam raczej o jakieś sposoby na modularyzację projektu... etc...

To popatrz na takie projekty jak OpenOffice i jak to jest zbudowane. Pewna ilość plików exe zawierająca może kilkaset kb i większa ilość dll-ek. Nie mów mi że 2,5 mln linii kodu (potrafię sobie wyobrazić ile to może być plików .pas i dfm) w ramach projektu chcesz skompilować do jednego większego exe. Część funkcji może być w dll-ach.

Tak najprościej to chyba zwrócić się do producenta Delphi 7 i uzyskać jakąś pomoc bo faktycznie refaktoryzacja czy migracja do nowszych wersji to potworne koszty.

konto usunięte

Temat: Duży projekt - wolna kompilacja

Można podzielić projekt na dynamiczne moduły.
Trochę pewnie trudniej debugować, ale kompilacja będzie szybsza - jeśli kompilujesz tylko to co zmieniasz.

http://edn.embarcadero.com/article/27178
http://delphi.about.com/od/objectpascalide/l/aa012301a...Ten post został edytowany przez Autora dnia 27.10.13 o godzinie 14:58
Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

Dziękuje za odpowiedzi, oczywiście macie Panowie racje. Ale jeśli projekt ma ponad 20 lat to uwierzcie mi że próbowano już wszystkiego :) I mam nadzieje raczej na jakąś genialną idee :P
Oczywiście projest jest podzielony na 10, czy tam 11 dllek, ale teraz jest już tak, że zależności między nimi są tak duże, że kompilując jedą kompilują sie tak na prawde wszystkie.
I wychodzi z tego 40MB potwór :-)
A więc jeśli ktoś ma doświadczenie w separowaniu modułów między sobą, np. poprzez ukrywanie implementacji (np. w dll) to czekam na wskazówki!

konto usunięte

Temat: Duży projekt - wolna kompilacja

40mb to potworek, widziałem 60mb lub więcej, dokładnie nie pamiętam, projekt ma ok 13 lat, jedyne DLL w nim to raporty, reszta kompilowana do tego samego bin-a.
Jeżeli dobrze pamiętam to migracja na nowsze delphi (XE ) jeszcze go powiększyła.
Na SSD też długo się kompiluje ?
Tomasz Kaczanowski

Tomasz Kaczanowski Ot, programista

Temat: Duży projekt - wolna kompilacja

Michał P.:
Dziękuje za odpowiedzi, oczywiście macie Panowie racje. Ale jeśli projekt ma ponad 20 lat to uwierzcie mi że próbowano już wszystkiego :) I mam nadzieje raczej na jakąś genialną idee :P
Oczywiście projest jest podzielony na 10, czy tam 11 dllek, ale teraz jest już tak, że zależności między nimi są tak duże, że kompilując jedą kompilują sie tak na prawde wszystkie.
I wychodzi z tego 40MB potwór :-)
A więc jeśli ktoś ma doświadczenie w separowaniu modułów między sobą, np. poprzez ukrywanie implementacji (np. w dll) to czekam na wskazówki!


Niestety czasami przychodzi taki czas, że trzeba zacząć przepisywać projekt. Jeśli jest tak, że między dll-kami są duże zależności, to obawiam się, że program jest źle zaprojektowany, albo źle podzielony....
Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

Grzegorz, dobrze kombinujesz :-) Na SSD Intelowskim jest troche lepiej, jedyne 20s. :-)

konto usunięte

Temat: Duży projekt - wolna kompilacja

Tomasz K.:
Niestety czasami przychodzi taki czas, że trzeba zacząć przepisywać projekt.

Przede wszystkim należałoby wyjść z założenia, że przepisywanie takiego kodu niemal od nowa (nawet wzorując się przynajmniej częściowo) na tym co zostało stworzone, biorąc pod uwagę ilość linii kodu (a właściwie nie chodzi może o samą ilość linii ale złożoność projektu) to ogromne koszty i dużo roboty więc można by się zastanawiać która poważna firma zdecydowałaby się na taki krok. Jest jakieś uzasadnienie w przyszłych zyskach?
Jeśli jest tak, że między dll-kami są duże zależności, to obawiam się, że program jest źle zaprojektowany, albo źle podzielony....

No jest jeszcze kwestia jakie to zależności bo można wziąść pod uwagę że kilka dll-i, realizujących jakieś ważniejsze funkcje może być zależna od pewnej ilości realizujących te mniejsze, np. biblioteka odpowiedzialna za jakieś połączenia z HTTP może korzystać z takich bibliotek jak np. ssleay32 i libeay32 itp.

Nie rozumiem w czym jest problem dotyczący czasu kompilacji (wyczerpuje się cierpliwość?). Jeszcze jak kiedyś używałem Delphi 7 to było ustawienie, że kompilator wyświetlał co jakiś czas ile linii kodu jest skompilowane, można było też z tego zrezygnować. Zresztą kompilacja przebiegała dość szybko. Większy problem to wywalanie się linkera itp. co prawdę mówiąc nie powinno mieć miejsca.
Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

No tak, w zasadzie masz racje, nie tyle chodzi o szybkosc co o wywalanie sie...

konto usunięte

Temat: Duży projekt - wolna kompilacja

Podział na moduły powinien być hierarchiczny, w formie drzewa.

Najniżej w drzewie (liście) leżą komponenty/biblioteki/DLL-ki/programy/systemy które są niezależne.
Przykład: DLL do obsługi HTTP, szyfrowania, tworzenia PDF-ów.

Trochę wyżej komponenty samej aplikacji, które wykorzystują niższy poziom, ale niewiele się zmieniają.

A najwyżej komponenty które ciągle się zmieniają i wykorzystują największy obszar systemu (np. controllery w MVC).

Jeśli zależności nie są ukierunkowane, to zmieniając jeden kawałek kodu musimy przekompilowywać wszystko.

Jak unikać tego? Trzeba zbadać co się najczęściej zmienia w aplikacji i to odseparować od reszty.

Było o tym chyba w GoF - http://en.wikipedia.org/wiki/Design_Patterns

lub w:

http://helion.pl/ksiazki/head-first-design-patterns-ed...
Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

Wzorce mniej więcej ogarnąłem już jakiś czas temu, natomiast jeśli chodzi o ścieżki, jestem mniej więcej w połowie pracy. Mam nadzieje że tak jak piszesz przyniesie to jakikolwiek efekt - bo roboty na ładne kilkanaście godzin... :)

konto usunięte

Temat: Duży projekt - wolna kompilacja

Jak chcesz uniknąć łączenia wszystkiego ze wszystkim to przyda się stosowanie interfejsów.

1) słowo kluczowe interface
za: pozwala opisać funkcjonalność do której możesz się odwołać nie wciągając (uses) kodu (a tylko jego interface)
przeciw: zmienia obiekt na wersję z liczeniem referencji i samo zwalnia obiekt przy usunięciu ostatniej

Przykład: IJvDataSource, IJvHotTrack (JVCL)

2) obiekt interfejsujący
za: zwykła klasa w której nic się nie dzieje w tle
przeciw: dużo więcej kodu

Przykład (JVCL):
TJvFieldDataConnector
- abstrakcyjna klasa bazowa interfejsu, opisuje wymagane funkcjonalności niekoniecznie je implementując

TJvCustomComboEditDataConnector
- obiekt interfejsujący (bridge?, wywołuje metody na właścicielu - TJvCustomComboEdit)
- bazuje na TJvFieldDataConnector

TJvCustomComboEdit
- obiekt intefejsowany (właściciel TJvCustomComboEditDataConnector)

IJvDataSourceConnectorHandler
- konsument obiektów interfejsujących typu TJvFieldDataConnector (nie musi być interfejsem)

Obiekty interfejsujące lub interfejsy przechowujesz w modułach o nazwie {nazwa-bazowa}Intf.pas

Przykład: JvDataSourceIntf.pasTen post został edytowany przez Autora dnia 01.11.13 o godzinie 09:01
Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

Hmm, ja rozumiem jak działają interfejsy, ale nie rozumiem jak ma to pomóc w ukryciu implementacji. W końcu, nie ważne ile interfejsów wyżej zrobisz i tak musisz zaincludować ten unit z implementacją (z klasą implementacyjną) i finalnie wszystko się pociągnie. Wydaje mi się że ukrywanie implementacji, jest możliwe tylko przez dll... (?)

konto usunięte

Temat: Duży projekt - wolna kompilacja

Michał P.:
Hmm, ja rozumiem jak działają interfejsy, ale nie rozumiem jak ma to pomóc w ukryciu implementacji. W końcu, nie ważne ile interfejsów wyżej zrobisz i tak musisz zaincludować ten unit z implementacją (z klasą implementacyjną) i finalnie wszystko się pociągnie. Wydaje mi się że ukrywanie implementacji, jest możliwe tylko przez dll... (?)

Masz plik interfejsów: BazaIntf.pas
Wciągasz go do każdego modułu (lub DLL-ki).
Gdy zmieniasz interfejs - przebudowujesz wszystkie wykorzystujące go moduły.
Gdy zmieniasz implementację (częstsze) - przebudowujesz tylko moduł(y) implementujące interfejs.

To będzie działać pod warunkiem że zmiany w interfejsach są nie tak częste jak w implementacji.
Czyli pod interfejsem kryje się jakaś zamknięta całość.
Jeśli interfejs służy tylko do przesyłania danych z modułu do modułu i krąży po całej aplikacji to będzie często zmieniany, co będzie się wiązać z częstymi przebudowaniami.

Oczywiście najlepiej byłoby gdybyś miał jeden plik na jeden interfejs, ale w Delphi to raczej trudne.

Raczej dzieliłem interfejsy na moduły - czyli

unit1.pas
unit1Intf.pas
unit2.pas
unit2Intf.pasTen post został edytowany przez Autora dnia 01.11.13 o godzinie 10:12
Michał Pyclik

Michał Pyclik Architekt
Oprogramowania,
Biuro Projektowania
Systemów Cy...

Temat: Duży projekt - wolna kompilacja

No i wyszło szydło z worka :) Interface musi być w innej dll-ce, bpl-ce, a więc tak na prawdę nie potrzeba żadnych interfejsów żeby to zrealizować. Wystarczy z tej pierwszej dll-ki, nazwijmy ją interfejsową, wyeksportować wszystkie funkcje i wywoływać tylko w tych miejscach które nas interesują.
Oczywiście nie chcę ujmować nic temu rozwiązaniu, bo jest świetne, zresztą, chyba jedyne słuszne, ale mojego problemu na tą chwilę nie rozwiązuje...
Oczywiście popraw mnie jeśli się mylę albo czegoś nie rozumiem...

konto usunięte

Temat: Duży projekt - wolna kompilacja

Podział na DLL-ki to osobna sprawa.

Masz tak:
Moduł A (ModulA.pas) : implementuje interfejs I1 oraz używa modułu który go definiuje - ModulAIntf.pas
Moduł B (ModulB.pas): używa obiektów typu I1 oraz używa modułu ModulAIntf.pas

Gdy zmieniasz ModulAIntf.pas musisz przekompilować wszystkie moduły (unity i DLLe) go używające.
Gdy zmieniasz tylko ModulA.pas musisz przekompilować tylko ModulA.pas ( i DLL go zawierający)

Czy interfejsem jest unit zawierający obiekty typu "interface" czy funkcje eksportowane z DLL-ki to rzecz raczej drugorzędna, przy czym oczywiście "interface" jest obiektowy a DLL-ka nie.

Czyli podsumowując, możesz to zrobić w oparciu o obiekty typu "interface" lub unity eksportujące dla BPL / DLL.

Tyle teoria. Jak jest praktycznie - do przetestowania.

Jeszcze coś dodatkowo:
pliki *Intf.pas ograniczają wpływ zmian na pozostałe moduły (gdy zmieniasz części prywatne / protected to nie musisz przekompilowywać modułów klienckich).

Gdy masz normalne klasy z częścią private / protected, to mimo że nie udostępniasz tych elementów na zewnątrz, zmiana tej części powoduje, że struktura obiektu / klasy się zmienia i trzeba przekompilować resztę.
Na szczęście kompilator sam to wyłapuje.

Następna dyskusja:

AvERP - open source delphi ...




Wyślij zaproszenie do