Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Test Ricası
#31
(08-03-2019, Saat: 13:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Başlı başına garip durumlar söz konusu zaten. Normalde, bir metod çağrımına geçilen parametrelerin stack'a itilmesi gerekeceği için; parametreler önceden değerlendirilir ve division by zero hatası alınması da son derece normal olur. Lâkin, Math.pas içinde tanımlı olan bahse konu metod için bu durum gerçekleşmiyor. Hadi diyelim ki, const olduğu için parametre değeri kontrol edilmeden adresi geçiliyor olsun, bu durumda bizim metodumuzun da hata vermemesi gerekirdi.

 Ayrıca, zaten implementation bloğunun üstünde tanımı bulunan bir metodun, implementation'un altında nerede tanımlandığının da bir önemi olmamalı. Ama görünen o ki, onun da bir önemi var. Dediğim gibi bir değil, birden fazla gariplik söz konusu.

Bu durumda, IfThen metodunun kullanımı son derece riskli, kullanmamanızı öneriyorum.

Merhaba,

Delphi'nin dokümanlarında durum açık şekilde belirtiliyor aslında. Aşağıdaki linke bir göz atın:
http://docs.embarcadero.com/products/rad...s_xml.html

Özellikle Delphi 2009 linkini gönderdim, bu linkteki bilgileri Rio için de geçerli.

Bu fonksiyonlardaki asıl sorun inline direktifinden kaynaklanıyor. Zaten kafa karıştıran da bu. İinline direktifinin açıklamalarına bakalım:

Alıntı:- The inline directive is a suggestion to the compiler.

Inline direktifi derleyiciye bir tavsiyedir. Bu da şu anlama geliyor: inline yazdık diye illa inline olmayacak Smile  Ama daha da önemlisi, bazı fonksiyonlarda inline gözardı ediliyormuş:

Alıntı:1. Inlining will not occur on any form of late-bound method. This includes virtual, dynamic, and message methods.
2. Routines containing assembly code will not be inlined.
3. Constructors and destructors will not be inlined.
4. The main program block, unit initialization, and unit finalization blocks cannot be inlined.
5. Routines that are not defined before use cannot be inlined.
6. Routines that take open array parameters cannot be inlined.
7. Code can be inlined within packages, however, inlining never occurs across package boundaries.
8. No inlining will be done between units that are circularly dependent. This included indirect circular dependencies, for example, unit A uses unit B, and unit B uses unit C which in turn uses unit A. In this example, when compiling unit A, no code from unit B or unit C will be inlined in unit A.
9. The compiler can inline code when a unit is in a circular dependency, as long as the code to be inlined comes from a unit outside the circular relationship. In the above example, if unit A also used unit D, code from unit D could be inlined in A, since it is not involved in the circular dependency.
10. If a routine is defined in the interface section and it accesses symbols defined in the implementation section, that routine cannot be inlined.
11. If a routine marked with inline uses external symbols from other units, all of those units must be listed in the uses statement, otherwise the routine cannot be inlined.
12. Procedures and functions used in conditional expressions in while-do and repeat-until statements cannot be expanded inline.
13. Within a unit, the body for an inline function should be defined before calls to the function are made. Otherwise, the body of the function, which is not known to the compiler when it reaches the call site, cannot be expanded inline.

Hepsini çevirmeyeceğim, ama 5. maddemiz bizim asıl açıklamamız olduğu için onu özel olarak çevireceğim:
5. Routines that are not defined before use cannot be inlined.
5. Kullanılmadan önce tanımlanmamış (aslında kodu yazılmamış) rutinler inline edilemez.

Yani IfthenEx fonksiyonunu TForm1.Button1Click methodundan önce yazarsanız bu kod hata vermeyecek, çünkü inline edilecek (yine de kesin değil, çünkü inline aslında derleyiciye bir tavsiye). Inline edilince de kendiliğinden lazy evaluation olacak. Bütün bu karmaşa aslında inline direktifinin özel durumundan kaynaklanıyor. 

İyi çalışmalar
Cevapla
#32
(08-03-2019, Saat: 15:09)Bahadir.Alkac Adlı Kullanıcıdan Alıntı: Yani IfthenEx fonksiyonunu TForm1.Button1Click methodundan önce yazarsanız bu kod hata vermeyecek, çünkü inline edilecek (yine de kesin değil, çünkü inline aslında derleyiciye bir tavsiye).

Bu cumleye kuçük bir dokunuş gerek diye düşünüyorum. Eger inline yapmak istedigimiz prosedur inline olmanin gereklerini taşıyorsa yani yukarida listeledigin şartlari yerine getiriyorsa inline olacaktir. Konunu derleyicinin o anki haliyet-i ruhiyesi ne bagli oldugunu düşünmeyelim Smile) Tavsiye ettik ama bakalim derleyici bu işe ne der durumu yoktur yani ...

lazy evaluation hic bilmedigim bir konuydu. teşekkürler.

(08-03-2019, Saat: 13:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Başlı başına garip durumlar söz konusu zaten. Normalde, bir metod çağrımına geçilen parametrelerin stack'a itilmesi gerekeceği için; parametreler önceden değerlendirilir ve division by zero hatası alınması da son derece normal olur.

Buraya da küçük bir dokunuş yapalim:  prosedur inline olarak derlendiyse artik onu standart bir çagri gibi degerlendirmemek lazim. Burada stack kullanilmayacaktir
Cevapla
#33
(08-03-2019, Saat: 15:52)cexx Adlı Kullanıcıdan Alıntı:
(08-03-2019, Saat: 15:09)Bahadir.Alkac Adlı Kullanıcıdan Alıntı: Yani IfthenEx fonksiyonunu TForm1.Button1Click methodundan önce yazarsanız bu kod hata vermeyecek, çünkü inline edilecek (yine de kesin değil, çünkü inline aslında derleyiciye bir tavsiye).

Bu cumleye kuçük bir dokunuş gerek diye düşünüyorum. Eger inline yapmak istedigimiz prosedur inline olmanin gereklerini taşıyorsa yani yukarida listeledigin şartlari yerine getiriyorsa inline olacaktir. Konunu derleyicinin o anki haliyet-i ruhiyesi ne bagli oldugunu düşünmeyelim Smile) Tavsiye ettik ama bakalim derleyici bu işe ne der durumu yoktur yani ...

lazy evaluation hic bilmedigim bir konuydu. teşekkürler.

Delphi'nin şu anki sürümlerine göre dediğiniz doğru, ben biraz kestirmeden yazmışım. Kestirmeden diyorum, çünkü C/C++ dünyasında derleyici optimize ederken hız veya boyut önceliğine alarak optimize edebiliyor. Eğer hız derseniz inline, boyut derseniz inline olmayacak şekilde derlemek daha doğru oluyor. Sonuçta derleyicinin ruh haline göre değil belki ama, derleyicide yapılacak her türlü değişikliğe açık demek bu. İnşallah günün birinde Delphi'nin derleyicisi de hız veya boyuta göre optimize edecek derecede gelişir. O yüzden IfThen veya IfThenEx'in inline olacağını varsaymak bana biraz rislik geliyor.

İyi çalışmalar
Cevapla
#34
(08-03-2019, Saat: 15:09)Bahadir.Alkac Adlı Kullanıcıdan Alıntı:
(08-03-2019, Saat: 13:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Başlı başına garip durumlar söz konusu zaten. Normalde, bir metod çağrımına geçilen parametrelerin stack'a itilmesi gerekeceği için; parametreler önceden değerlendirilir ve division by zero hatası alınması da son derece normal olur. Lâkin, Math.pas içinde tanımlı olan bahse konu metod için bu durum gerçekleşmiyor. Hadi diyelim ki, const olduğu için parametre değeri kontrol edilmeden adresi geçiliyor olsun, bu durumda bizim metodumuzun da hata vermemesi gerekirdi.

 Ayrıca, zaten implementation bloğunun üstünde tanımı bulunan bir metodun, implementation'un altında nerede tanımlandığının da bir önemi olmamalı. Ama görünen o ki, onun da bir önemi var. Dediğim gibi bir değil, birden fazla gariplik söz konusu.

Bu durumda, IfThen metodunun kullanımı son derece riskli, kullanmamanızı öneriyorum.

Merhaba,

Delphi'nin dokümanlarında durum açık şekilde belirtiliyor aslında. Aşağıdaki linke bir göz atın:
http://docs.embarcadero.com/products/rad...s_xml.html

Özellikle Delphi 2009 linkini gönderdim, bu linkteki bilgileri Rio için de geçerli.

Bu fonksiyonlardaki asıl sorun inline direktifinden kaynaklanıyor. Zaten kafa karıştıran da bu. İinline direktifinin açıklamalarına bakalım:

Alıntı:- The inline directive is a suggestion to the compiler.

Inline direktifi derleyiciye bir tavsiyedir. Bu da şu anlama geliyor: inline yazdık diye illa inline olmayacak Smile  Ama daha da önemlisi, bazı fonksiyonlarda inline gözardı ediliyormuş:

Alıntı:1. Inlining will not occur on any form of late-bound method. This includes virtual, dynamic, and message methods.
2. Routines containing assembly code will not be inlined.
3. Constructors and destructors will not be inlined.
4. The main program block, unit initialization, and unit finalization blocks cannot be inlined.
5. Routines that are not defined before use cannot be inlined.
6. Routines that take open array parameters cannot be inlined.
7. Code can be inlined within packages, however, inlining never occurs across package boundaries.
8. No inlining will be done between units that are circularly dependent. This included indirect circular dependencies, for example, unit A uses unit B, and unit B uses unit C which in turn uses unit A. In this example, when compiling unit A, no code from unit B or unit C will be inlined in unit A.
9. The compiler can inline code when a unit is in a circular dependency, as long as the code to be inlined comes from a unit outside the circular relationship. In the above example, if unit A also used unit D, code from unit D could be inlined in A, since it is not involved in the circular dependency.
10. If a routine is defined in the interface section and it accesses symbols defined in the implementation section, that routine cannot be inlined.
11. If a routine marked with inline uses external symbols from other units, all of those units must be listed in the uses statement, otherwise the routine cannot be inlined.
12. Procedures and functions used in conditional expressions in while-do and repeat-until statements cannot be expanded inline.
13. Within a unit, the body for an inline function should be defined before calls to the function are made. Otherwise, the body of the function, which is not known to the compiler when it reaches the call site, cannot be expanded inline.

Hepsini çevirmeyeceğim, ama 5. maddemiz bizim asıl açıklamamız olduğu için onu özel olarak çevireceğim:
5. Routines that are not defined before use cannot be inlined.
5. Kullanılmadan önce tanımlanmamış (aslında kodu yazılmamış) rutinler inline edilemez.

Yani IfthenEx fonksiyonunu TForm1.Button1Click methodundan önce yazarsanız bu kod hata vermeyecek, çünkü inline edilecek (yine de kesin değil, çünkü inline aslında derleyiciye bir tavsiye). Inline edilince de kendiliğinden lazy evaluation olacak. Bütün bu karmaşa aslında inline direktifinin özel durumundan kaynaklanıyor. 

İyi çalışmalar

Teşekkür ederim, çok güzel bir açıklama. Tam 12'den vuran bir açıklama. inline metodlar ile ilgili bu açıklamaları ilk çıktığı zamanlardan beri biliyorum ama 5nci maddede belirtilen açıklamanın implementation üstünde yapılan tanımlamaya ait olduğunu düşünüyordum. Metod body'sinin kullanıldığı yerden önce yazılması zarureti olarak hiç düşünmemiştim. @narkotik arkadaşımız da bu hususu dillendirdiğinde; bana çok saçma gelmişti.

Teşekkür ederim, bir beceriksizliğin itirafını görmemizi sağladınız. Hâla bu durum bana saçma gelmekle birlikte, tüm sisler bir anda dağılıyor elbette. Bizim yazdığımız metod inline olmadığı için, metoda parametreler geçilmeden önce değerlemeye alınmak zorunda kalınıyor çünkü parametreler stack'a itilimeli. (Normal metod çağrımı). Oysa inline olduğunda, metodun içindeki "if then else" aynen çağrılan noktaya kopyalandığı için sorun yaşamıyoruz.

Bence faydalı bir sohbet oldu. En azından ben, inline metodların body'lerinin illa çağrıldıkları noktadan önce yazılması gerektiğini bilmiyordum.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#35
(08-03-2019, Saat: 15:52)cexx Adlı Kullanıcıdan Alıntı:
(08-03-2019, Saat: 15:09)Bahadir.Alkac Adlı Kullanıcıdan Alıntı: Yani IfthenEx fonksiyonunu TForm1.Button1Click methodundan önce yazarsanız bu kod hata vermeyecek, çünkü inline edilecek (yine de kesin değil, çünkü inline aslında derleyiciye bir tavsiye).

Bu cumleye kuçük bir dokunuş gerek diye düşünüyorum. Eger inline yapmak istedigimiz prosedur inline olmanin gereklerini taşıyorsa yani yukarida listeledigin şartlari yerine getiriyorsa inline olacaktir. Konunu derleyicinin o anki haliyet-i ruhiyesi ne bagli oldugunu düşünmeyelim Smile) Tavsiye ettik ama bakalim derleyici bu işe ne der durumu yoktur yani ...

lazy evaluation hic bilmedigim bir konuydu. teşekkürler.

(08-03-2019, Saat: 13:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Başlı başına garip durumlar söz konusu zaten. Normalde, bir metod çağrımına geçilen parametrelerin stack'a itilmesi gerekeceği için; parametreler önceden değerlendirilir ve division by zero hatası alınması da son derece normal olur.

Buraya da küçük bir dokunuş yapalim:  prosedur inline olarak derlendiyse artik onu standart bir çagri gibi degerlendirmemek lazim. Burada stack kullanilmayacaktir

"Normalde, bir metod çağrımına geçilen parametrelerin stack'a itilmesi gerekeceği için...." Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi