Hangi zorunlu programlama dilleri özyinelemeyi desteklemez?


21

Bildiğim kadarıyla, tüm modern zorunlu programlama dilleri, bir prosedürün kendisini çağırabileceği anlamında özyinelemeyi desteklemektedir. Bu her zaman böyle değildi, ancak hızlı bir Google aramasıyla hiçbir zor gerçek bulamıyorum. Benim sorum şu:

Hangi diller başlangıçtan itibaren özyinelemeyi desteklemedi ve bu destek ne zaman eklendi?

Yanıtlar:


21

Eminim COBOL (kesinlikle bir seferde yoktu), ama ben de çok önemseyen kimseyi hayal bile edemiyorum.

Fortran, Fortran 90'dan beri var, ancak recursivebir alt yordamın özyinelemeli olduğunu söylemek için anahtar kelimeyi kullanmanızı gerektiriyor .

PL / Ben hemen hemen aynıydım - özyineleme desteklendi, ancak hangi prosedürlerin özyinelemeli olduğunu açıkça belirtmeniz gerekiyordu.

Bundan daha fazlası olduğundan şüpheliyim. Aşağı indiğinizde, özyinelemeyi yasaklamak, IBM'in (360/370/3090 / ...) ana çerçevelerinin donanım yığınını desteklememesinin basit bir nedeni olarak, IBM'in dil tasarımlarında yaptığı bir şeydi. Çoğu dil IBM'den geldiğinde, çoğunlukla yinelemeyi yasakladılar. Artık hepsi başka yerlerden geldiğine göre, özyineleme her zaman izinlidir (yine de birkaç diğer makinenin, özellikle orijinal Cray 1'in, bir yığın için donanım desteğine sahip olmadığını eklemeliyim).


Kontrol Dönemi Veri bilgisayarları da özyinelemeyi desteklemedi (alt rutin çağrılar, çağrı yönergesine + 1 atlamak için kodu değiştiren bir talimatla yapıldı). Wirth, 6600'de Pascal'ı geliştirdiğinde, muhtemelen alt rutinleri çağırmanın yeni bir yolunu bulmak zorundaydı.
David Thornley

@David: evet - ve tesadüf yok, onlar da Seymour Cray tarafından tasarlandı. Bir keresinde Pascal 6000 derleyicisine bakmalıydım, ancak yığın kareleri oluşturmak için ne yaptığına baktığımı hatırlamıyorum.
Jerry Coffin

notably the original cray 1Yani, dinozorları klonlamak için özyineye ihtiyacınız yok mu? Sanırım ağaçların arasından sallanmak gerçekten maymunlara kalmış.
normanthesquid

2
CAML (ve OCAML, F #) bile açıkça işaretlenmiş özyinelemeli işlevlere ihtiyaç duyar.
jk.

1
@Panzercrisis: IBM'in x86'ya dahil olup olmadığından emin değilim, ancak mevcut ana çerçeveleri doğrudan 1964'te piyasaya sürülen IBM 360'a geri döndü, bu nedenle temel tasarım x86'yı birkaç on yıl öncesine dayanıyor.
Jerry Coffin

16

Wikipedia diyor ki:

Fortran gibi erken diller başlangıçta özyinelemeyi desteklemedi çünkü değişkenler statik olarak ve dönüş adresinin konumu ayrıldı.

http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy

FORTRAN 77 özyinelemeye izin vermez, Fortran 90 bunu yapar (özyinelemeli rutinler açıkça bildirilmelidir).

Çoğu FORTRAN 77 derleyicisi özyinelemeye izin verir, bazıları (örneğin DEC) bir derleyici seçeneği gerektirir (derleyici seçenekleri bölümüne bakın). Fortran 77 standardına tam olarak uyan GNU g77, tekrarlamaya hiç izin vermez.

http://www.ibiblio.org/pub/languages/fortran/ch1-12.html


iirc, teknik olarak özyinelemeyi desteklerken en az bir FORTRAN 77 derleyicisi vardı, bu nedenle sahip olabileceğiniz toplam yığın karesi sayısı çok küçük özyineleme birçok sorun için etkili bir şekilde kullanılabilir değildi
jk.

6

OpenCL programlama dili özyinelemeyi desteklemez. ( OpenCL Spesifikasyonu bölüm 6.8'e bakınız )

Bunun için mevcut motivasyon a) derin yığınlar için yer eksikliği b) büyük kayıt kümeleri ve geniş iç astarın varlığında performansı optimize etmek için gereken toplam tahsisi statik olarak bilmek arzusu.

Bu, gölgelendirici dilleri gibi diğer GPU programlama dilleri için de geçerli olabilir.


2

Küçük mikrodenetleyiciler için bazı c derleyicileri, büyük olasılıkla son derece sınırlı bir yığın boyutuna sahip oldukları için özyinelemeyi desteklemez.


Bu mikrodenetleyicilerin bazılarında (örn. PIC16 ailesi) yalnızca bir donanım çağrısı yığını (talimatlarla erişilemez) bulunur ve başka bir yığın biçimi yoktur, bu nedenle özyineleme kullanılırken işlevlerin yerel değişkenleri olamaz (veri yığını açıkça gerekli olduğundan) bunun için ...) Referans: en.wikipedia.org/wiki/PIC_microcontroller#Stacks
Ale

1

BASIC, satır numaraları günlerinde yinelemenin zayıf desteğine sahip olma eğilimindeydi. O zamanın çoğu (tümü?) TEMEL, iç içe gosub çağrılarını destekledi, ancak parametreleri veya değerleri kendi kendine arama için yararlı olacak şekilde iletmenin kolay bir yolunu desteklemedi.

İlk bilgisayarların çoğunda özyineleme ile ilgili sorunlar vardı, çünkü dönüş adresini (PDP8, IAS makine ailesi, muhtemelen daha fazla aşina olmadığım daha fazla mimari) adlı rutinin başına yazan çağrı talimatlarını kullandılar. "Rutin adı verilen komuttan sonra talimata atla" makine koduydu.


1

" Destek " ile ne demek istediğinize bağlı . Özyinelemeyi desteklemek için, her girişte yerel değişkenleri yeniden somutlaştırabileceğiniz bir yığın gerekir.

Dil yerel değişkenler kavramına sahip olmasa bile, "altyordam" kavramına sahipse ve özdeş değişkenler (aka dizi) arasındaki bir dizinlemeyi yönetmenin bir yolu varsa, her giriş / çıkışta genel bir dizini artırabilir / azaltabilirsiniz ve bir veya daha fazla dizinin bir üyesi aracılığıyla erişim sağlar.

Bunun "destek" olarak adlandırılıp adlandırılamayacağını bilmiyorum. Gerçekler, ZB-Spectrum BASIC ile özyineli işlev yazdım, çünkü Fortran77'de COBOL'da olduğu gibi ... her zaman bu hile ile.


1

Montaj dili özyinelemeyi doğrudan desteklemez - tipik olarak parametreleri makine yığınına iterek "kendiniz yapın".


2
Yöntem çağrılarını desteklediği sürece özyinelemeyi destekler. Genellikle CALL, altyordamına atlamadan önce IP'yi otomatik olarak yığına iten bir RETyönerge ve dönüş adresini IP'ye açan bir yönerge vardır. CALLKendi giriş noktanızı yapamamanız için hiçbir neden yok .
Blorgbeard

@Blorgbeard - kesinlikle doğru, ancak bunun yinelemeli çağrı için gerekli parametreleri işlemediği için yaygın olarak anlaşılan anlamda "özyinelemeyi destekliyor" olarak sayılmasının yeterli olmadığını iddia ettim.
mikera

1
Özyinelemeli çağrıların teknik olarak parametrelere ihtiyacı yoktur, değil mi? void f() { f(); }özyinelemelidir.
Blorgbeard

Teknik olarak hayır. Ancak önemsiz bir vakayı kodlayabilmek IMHO'yu, derlemeyi "destekleyici özyineleme" olarak tanımlamanız gerektiği anlamına gelmez. Özyinelemenin en pratik kullanımları parametreler gerektirir.
mikera

Sanırım bunu söyleyebilirsin. Ancak bu durumda, montaj döngüleri de desteklemez (CMP ve JNZ'yi manuel olarak yapmanız gerekir). Sanırım buna “destekleme” dediğiniz şey meselesi.
Blorgbeard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.