Bu cevapta önerildiği gibi, bu donanım desteği konusudur, ancak dil tasarımındaki gelenek de rol oynar.
bir işlev döndüğünde, belirli bir kayıt defterinde dönen nesneye bir işaretçi bırakır
İlk üç dilden Fortran, Lisp ve COBOL, birincisi matematiğe göre modellenirken tek bir geri dönüş değeri kullandı. İkincisi, rastgele sayıda parametreyi, aldığı şekilde değiştirdi: liste halinde (yalnızca geçtiği ve tek bir parametre döndürdüğü de iddia edilebilir: listenin adresi). Üçüncüsü sıfır veya bir değer döndürür.
Bu ilk diller, onları takip eden dillerin tasarımını çok etkiledi, ancak birden fazla değer veren tek, Lisp hiçbir zaman popüler olmadı.
C geldiğinde, ondan önceki dillerden etkilenirken, donanım kaynağının verimli kullanılmasına ve C dilinin ne yaptığı ile onu uygulayan makine kodu arasında yakın bir ilişki kurmaya odaklandı. "Auto" vs "register" değişkenleri gibi en eski özelliklerinden bazıları, bu tasarım felsefesinin bir sonucudur.
Ayrıca derleme dilinin, ana akım gelişimin dışına çıkmaya başladığı 80'li yıllara kadar yaygın bir şekilde popüler olduğu belirtilmelidir. Derleyiciler yazan ve dilleri oluşturan insanlar , derleme hakkında bilgi sahibi oldular ve çoğunlukla orada en iyi olanı yapmaya devam ettiler.
Bu normdan ayrılan dillerin çoğu hiçbir zaman fazla popülerlik bulamadı ve bu nedenle, dil tasarımcılarının (elbette bildiklerinden ilham alan) kararlarını etkileyen güçlü bir rol oynamadılar.
Öyleyse gidip derleme dilini inceleyelim. Önce Apple II ve VIC-20 mikrobilgisayarları tarafından kullanılan bir 1975 mikroişlemci olan 6502'ye bakalım . Programlama dillerinin şafağında, 20, 30 yıl önceki ilk bilgisayarlara kıyasla daha güçlü olmasına rağmen, zamanın anabilgisayarında ve minibilgisayarlarında kullanılanlarla karşılaştırıldığında çok zayıftı.
Teknik açıklamaya bakarsanız, 5 yazmaç artı birkaç tane bitlik bayrak bulunur. Tek "tam" kayıt programı Program Sayacı (PC) idi - kayıt işlemi yapılacak bir sonraki talimatı işaret ediyor. Diğer, akümülatörün (A), iki "endeks" in (X ve Y) ve bir yığın göstergesinin (SP) kaydedildiği yerde saklanır.
Alt yordamın çağrılması, bilgisayarı SP'nin belirttiği belleğe koyar ve ardından SP'yi azaltır. Bir alt rutinden geri dönüş ters çalışır. Biri yığındaki diğer değerleri itip çekebilir, ancak SP'ye göre belleğe başvurmak zordur, bu nedenle yeniden giren alt programları yazmak zordu. Aldığımız, istediğimiz zaman bir alt rutin olarak adlandırdığımız bu mimari bu kadar yaygın değildi. Genellikle, ayrı bir "yığın" yaratılır, böylece parametreler ve alt rutin geri dönüş adresi ayrı tutulur.
Eğer 6502, ilham işlemci bakacak olursak 6800 , bu SP değeri alabileceği ilave bir kayıt, Index Kayıt (IX), kadar geniş SP vardı.
Makinede, yeniden giriş yapan bir alt yordamı çağırmak, parametreleri istifte zorlamak, PC'yi itmek, PC'yi yeni adrese değiştirmek ve ardından alt yordamı yerel değişkenleri yığında zorlamaktan ibaretti . Yerel değişkenlerin ve parametrelerin sayısı bilindiğinden, bunları adresleme yığına göre yapılabilir. Örneğin, iki parametre alan ve iki yerel değişkene sahip bir işlev şöyle görünür:
SP + 8: param 2
SP + 6: param 1
SP + 4: return address
SP + 2: local 2
SP + 0: local 1
Tüm geçici boşluk yığında olduğundan, herhangi bir sayıda çağrılabilir.
8080 dolaylı sicil, HL üzerine haşhaş sonra yığın SP bastırıyor ve tarafından, 6800 benzer bir şey yapabileceğini TRS-80 ve CP / M tabanlı mikro bilgisayarların bir ana bilgisayarda kullanılan.
Bu, işleri uygulamak için çok yaygın bir yöntemdir ve daha kolay dönmeden önce tüm yerel değişkenleri terk etmeyi sağlayan Base Pointer ile daha modern işlemciler konusunda daha da fazla destek aldı.
Sorun, bir şeyi nasıl iade edersiniz ? İşlemci kayıtları çok erken sayılmadı ve çoğu zaman hangi bellek parçasını ele alacağını bulmak için bile bazılarını kullanmak gerekiyordu. Yığındaki şeylerin geri dönüşü karmaşık olacaktır: her şeyi açmanız, bilgisayarı kaydetmeniz, geri dönüş parametrelerini itmeniz (bu arada nerede saklanır?), Sonra bilgisayarı tekrar itip geri dönmeniz gerekir.
Genelde yapılan şey , geri dönüş değeri için bir kayıt ayırmaktı . Çağıran kod, dönüş değerinin belirli bir sicilde olacağını, kaydedilmesi veya kullanılması için korunmasının gerekli olacağını biliyordu.
Birden fazla dönüş değerine izin veren bir dile bakalım: İleri. Forth'un yaptığı, ayrı bir geri dönüş yığını (RP) ve veri yığını (SP) tutmak, böylece bir işlevin yapması gereken, tüm parametrelerini açıp geri dönüş değerlerini yığında bırakmaktı. Dönüş yığını ayrı olduğundan, yoluna girmedi.
Bilgisayarlarda edinilen ilk altı aylık dönemde, montaj dilini ve İleri'yi öğrenen biri olarak, çoklu iade değerleri benim için tamamen normal görünüyor. /mod
Tam sayıyı ve geri kalanını döndüren Forth's gibi operatörler açık görünüyor. Öte yandan, ilk deneyimleri C zihin olan birinin bu kavramı nasıl tuhaf bulduğunu kolayca görebiliyorum: bir "fonksiyonun" ne olduğu konusundaki yerleşik beklentilerine aykırı.
Matematik gelince ... pekala, matematik derslerinde fonksiyonlara başlamadan önce bilgisayarları programlıyordum. Orada olduğu değil bütün bir bölüm bulunmaktadır, sonra tekrar, CS ve matematik etkilenir programlama dillerinin bir bölüm ama.
Bu nedenle matematiğin erken dil tasarımını etkilediği, donanım kısıtlamalarının kolaylıkla uygulanabilen şeyleri dikte ettiği ve popüler dillerin donanımın nasıl geliştiğini etkilediği (Lisp makinesi ve Forth makine işlemcileri bu süreçte yol tutkunlarıydı) faktörlerin birleştiğine sahibiz.