Bir tür yığın kullanmadan işlev çağrısı anlambilimi uygulamak mümkün değildir. Sadece kelime oyunları oynamak mümkündür (örneğin "FILO return buffer" gibi farklı bir isim kullanın).
İşlev çağrısı anlambilimi uygulamayan bir şey kullanmak (örneğin, devam geçiş tarzı, aktörler) ve daha sonra bunun üzerine işlev çağrısı anlambilimi oluşturmak mümkündür; ancak bu, işlev döndüğünde denetimin geçildiği yeri izlemek için bir tür veri yapısı eklemek anlamına gelir ve bu veri yapısı bir tür yığın (veya farklı bir ad / açıklamaya sahip bir yığın) olacaktır.
Birbirinizi çağırabilecek birçok fonksiyonunuz olduğunu düşünün. Çalışma zamanında, her bir işlev, işlevden çıkıldığında nereye dönüleceğini bilmelidir. first
Aramalar varsa second
o zaman var:
second returns to somewhere in first
Ardından, second
aramalarınız third
varsa:
third returns to somewhere in second
second returns to somewhere in first
Ardından, third
aramalarınız fourth
varsa:
fourth returns to somewhere in third
third returns to somewhere in second
second returns to somewhere in first
Her fonksiyon çağrıldıkça, daha fazla "nereye dönüleceği" bilgisi bir yerde saklanmalıdır.
Bir işlev geri dönerse, onun "nereye döneceği" bilgileri kullanılır ve artık gerekli değildir. Örneğin, bir fourth
yere geri dönerse third
, bilgi "nereye geri dönülür" miktarı şu şekilde olur:
third returns to somewhere in second
second returns to somewhere in first
Temelde; "işlev çağrısı anlambilimi" şu anlama gelir:
- "nereye döneceğiniz" bilgisine sahip olmalısınız
- fonksiyonlar çağrıldıkça bilgi miktarı artar ve fonksiyonlar döndüğünde azalır
- depolanan "nereye dönülecek" bilgisinin ilk parçası atılan "nereye dönülecek" bilgisinin son parçası olacaktır
Bu bir FILO / LIFO tamponunu veya istifini tanımlar.
Bir ağaç türü kullanmaya çalışırsanız, ağaçtaki her düğümün asla birden fazla çocuğu olmaz. Not: birden fazla çocuğa sahip bir düğüm, ancak bir işlev aynı anda 2 veya daha fazla işlevi çağırdığında gerçekleşebilir , bu da bir çeşit eşzamanlılık gerektirir (örneğin, iş parçacıkları, çatal (), vb.) Ve "işlev çağrısı semantiği" olmaz. Ağaçtaki her düğümün asla birden fazla çocuğu olmazsa; o zaman bu "ağaç" sadece bir FILO / LIFO tamponu veya bir yığın olarak kullanılır; ve sadece FILO / LIFO tamponu veya bir yığın olarak kullanıldığından, "ağaç" ın bir yığın olduğunu iddia etmek doğrudur (ve tek fark kelime oyunları ve / veya uygulama detaylarıdır).
Aynı şey, "işlev çağrısı anlambilimi" uygulamak için akla yatkın olarak kullanılabilecek diğer tüm veri yapıları için de geçerlidir - yığın olarak kullanılacaktır (ve tek fark kelime oyunları ve / veya uygulama detaylarıdır); "işlev çağrısı anlambilimi" ni kırmazsa. Not: Mümkünse diğer veri yapılarına örnekler verebilirim, ancak biraz akla yatkın başka bir yapı düşünemiyorum.
Elbette bir yığının nasıl uygulandığı bir uygulama detayıdır. Bu bir bellek alanı olabilir ("mevcut yığın üstünü" takip ettiğiniz yerde), bir çeşit bağlantılı liste olabilir ("listedeki geçerli girişi" izlediğiniz yerde) veya bazılarına uygulanabilir Diğer yol. Donanımın yerleşik desteği olup olmadığı da önemli değildir.
Not: Herhangi bir prosedürün sadece bir çağrılması herhangi bir anda etkin olabilirse; "nereye geri dönüleceği" bilgilerine statik olarak yer ayırabilirsiniz. Bu hala bir yığıntır (örneğin FILO / LIFO yolunda kullanılan statik olarak tahsis edilmiş girdilerin bağlantılı bir listesi).
Ayrıca, "işlev çağrısı anlambilimi" ni takip etmeyen bazı şeyler olduğunu unutmayın. Bunlar arasında "potansiyel olarak çok farklı semantikler" (örn. Devam etme, aktör modeli); aynı zamanda eşzamanlılık (iplikler, lifler, ne olursa olsun), setjmp
/ longjmp
, istisna işleme vb. gibi "işlev çağrısı anlambilimi" için ortak uzantılar içerir