Jacek K.

Jacek K. Software Developer,
Telecetera Ltd.

Temat: Migracja Delphi4 na 7 czy 8?

Czeka mnie przepisanie pewnej aplikacji napisanej w pelni w Delphi4. Bede pisal nowa, rozszerzona wersje, zachowujac algorytmy obliczeniowe (oraz dopisujac nowe). Calkowicie od nowa ma zostac napisany GUI. Aplikacja musi powstac w bardzo ograniczonym czasie. Ma dostepne wersje delphi umieszczone w temacie i musze zdecydowac czy pozostac w Delphi4 czy przeniesc sie wyzej.
Oczywista rzecza jest, iz im wyzej tym lepiej, jednakze zastanawia mnie problem kompatybilnosci. Czy algorytmy, ktore musze przeniesc bez wiekszych zmian (od lat dzialaja i sa sprawdzone) beda dzialaly bez problemow wyzej. Czy sa jakies powazne problemy?

Temat: Migracja Delphi4 na 7 czy 8?

Dużo zależy od tego czy korzystasz z obcych modułów.

Przenosiłem ostatnio aplikację z Delphi5 na Delphi 2007 (Delphi10?)
a dokładniej na CodeGear RAD Studio 2007.

Niby proste, bo projekty "same" się upgradowały
ale z kompilacją i uruchomieniem było gorzej.
To co w Delphi4 było normą, w Delphi5 dopuszczalne
to teraz już nie jest - mówię o konieczności rozdzielenia
części projektowej modułów od wykonywalnej.
http://www.borland.pl/tech/dsgnintf.shtml
Wymagane są nowe wersje bibliotek/modułów
bo ze starymi mogą być problemy.

Jeżeli chcesz pisać od nowa GUI to zastanów się czy ma to być Win32
czy .NET ale... ma to powstać w ograniczonym czasie :(

>Czy algorytmy, ktore musze przeniesc bez wiekszych zmian
>(od lat dzialaja i sa sprawdzone)
>beda dzialaly bez problemow wyzej.

Teoretycznie tak (jeżeli uda ci się skompilować i zlinkować aplikację), ale jak zwykle diabeł tkwi w szczegółach
np. opcje kompilatora mogą skutecznie utrudnić życie
Przy niektórych ustawieniach Delphi optymalizuje kod do tego stopnia, że niektórych fragmentów nie dołącza do programu.
np. test := dodatkowa_funkcja_z_efektami_ubocznymi( dane);
jeżeli zmiennej "test" nie używasz dalej w programie to cała linia
może zostać pominięta po co męczyć procesor ;)

To co kiedyś było ok. w nowej wersji wyświela ostrzeżenia,
to co wyświetlało ostrzeżenia może "działać inaczej"

Kiedyś przy zmianie wesji PHP okazało się, że raporty wyświetlają inne wyniki, bo funkcja przedtem zwracała 0 a teraz bardziej poprawnie zwraca NULL, ale cały skomplikowany algorytm zwraca "coś"
niezupełnie to co powinien zwracać.
Piotr M.

Piotr M. programista

Temat: Migracja Delphi4 na 7 czy 8?

Piotr Wolański:
Teoretycznie tak (jeżeli uda ci się skompilować i zlinkować aplikację), ale jak zwykle diabeł tkwi w szczegółach
np. opcje kompilatora mogą skutecznie utrudnić życie
Przy niektórych ustawieniach Delphi optymalizuje kod do tego stopnia, że niektórych fragmentów nie dołącza do programu.
np. test := dodatkowa_funkcja_z_efektami_ubocznymi( dane);
jeżeli zmiennej "test" nie używasz dalej w programie to cała linia
może zostać pominięta po co męczyć procesor ;)

Dokładnie, tak ma być. Gdzie tu problem, gdzie tu błąd?... ;->

konto usunięte

Temat: Migracja Delphi4 na 7 czy 8?

Piotr F.:
Piotr Wolański:
Przy niektórych ustawieniach Delphi optymalizuje kod do tego stopnia, że niektórych fragmentów nie dołącza do programu.
np. test := dodatkowa_funkcja_z_efektami_ubocznymi( dane);
jeżeli zmiennej "test" nie używasz dalej w programie to cała linia
może zostać pominięta po co męczyć procesor ;)

Dokładnie, tak ma być. Gdzie tu problem, gdzie tu błąd?... ;->

Jeśli wcześniej Delphi tak nie optymalizowało, a funkcja jest "z efektami ubocznymi" to jest problem: wcześniej funkcja się wykonywała, a teraz się nie wykona. Choć taka zmiana i tak będzie prosta do wychwycenia, D wyświetli hinta/warninga... ;-)
Piotr M.

Piotr M. programista

Temat: Migracja Delphi4 na 7 czy 8?

Tak, tylko pytanie na ile nasza ocena potrzeby wykonania "efektów ubocznych" jest właściwa skoro kompilator postanowił inaczej? ;>

Temat: Migracja Delphi4 na 7 czy 8?

Piotr F.:
Tak, tylko pytanie na ile nasza ocena potrzeby wykonania "efektów ubocznych" jest właściwa skoro kompilator postanowił inaczej? ;>

To pewnie nigdy nie pisałeś programu w ten sposób:

test = funkcja1();
// print(test);
test = funkcja2();
// print(test);

a po stwierdzeniu, że program działa poprawnie i "zakometarzowaniu"
linii program zaczyna nagle "działać inaczej" bo np. funkcja1()
ustawiała jakieś zmienne globalne a teraz nie wykonuje się i ich nie ustawia.
Piotr M.

Piotr M. programista

Temat: Migracja Delphi4 na 7 czy 8?

Ustawiać to one sobie mogą, ale jak nic z nich (z tych zmiennych globalnych) nie korzysta to można je olać z góry na dół.Piotr F. edytował(a) ten post dnia 01.03.08 o godzinie 21:57

Temat: Migracja Delphi4 na 7 czy 8?

Piotr F.:
Ustawiać to one sobie mogą, ale jak nic z nich (z tych zmiennych globalnych) nie korzysta to można je olać z góry na dół.Piotr F. edytował(a) ten post dnia 01.03.08 o godzinie 21:57

No właśnie problem polega na tym, że ze zmiennych globalnych się korzysta, ale wystarczy, że ze zmiennej "test" się nie korzysta np. przestanie się ją drukować, to Delphi może wykonać optymalizację i nie wykona wywołania: funkcja1() :(
bo stwierdzi, że zmienna "test" nie jest wykorzystana więc po co wywoływać funkcję ;)
Maciej Kuś

Maciej Kuś właściciel, ibex.pl

Temat: Migracja Delphi4 na 7 czy 8?

No właśnie problem polega na tym, że ze zmiennych globalnych się korzysta, ale wystarczy, że ze zmiennej "test" się nie korzysta np. przestanie się ją drukować, to Delphi może wykonać optymalizację i nie wykona wywołania: funkcja1() :(
bo stwierdzi, że zmienna "test" nie jest wykorzystana więc po co wywoływać funkcję ;)

Wątpię, żeby "optymalizator" zakładał, że jedyną rolą funkcji Funkcja1 jest ustawienie wartości zmiennej "test".

Z moich obserwacji wynika, że "optymalizacji" poddane zostaną zmienne lokalne - nie zauważyłem żeby kompilator pomijał w jakimkolwiek stopniu zmienne globalne, czy pola klasy.

Poza tym funkcja nigdzie nie wywoływana zostanie "usunięta" z kodu wynikowego - ale to akurat słusznie.

Pozdr.
Maciek
Piotr M.

Piotr M. programista

Temat: Migracja Delphi4 na 7 czy 8?

Piotr Wolański:
No właśnie problem polega na tym, że ze zmiennych globalnych się korzysta, ale wystarczy, że ze zmiennej "test" się nie korzysta np. przestanie się ją drukować, to Delphi może wykonać optymalizację i nie wykona wywołania: funkcja1() :(
bo stwierdzi, że zmienna "test" nie jest wykorzystana więc po co wywoływać funkcję ;)

Musisz podać w końcu te magiczne ustawienia kompilatora dla konkretnej wersji Delphi, bo dorabianiem teorii do własnej tezy raczej nic nie udowodnisz.

Następna dyskusja:

Firebird/Interbase - sprawd...




Wyślij zaproszenie do