Dilin varlığını biliyorum, ancak parmağımı üzerine koyamıyorum.Dinamik kapsam ve statik yazım ile programlama dili nedir?
dinamik kapsam ve statik yazarak?
Dilin varlığını biliyorum, ancak parmağımı üzerine koyamıyorum.Dinamik kapsam ve statik yazım ile programlama dili nedir?
dinamik kapsam ve statik yazarak?
Böyle bir dilin nasıl görünebileceğine dair mantıklı bir mantığı deneyebiliriz. açık anlamı ile Açıkçası böyle bir şey (gösteri amaçlı bir C-benzeri sözdizimi kullanılarak) izin verilemez veya en azından:
int x_plus_(int y) {
return x + y; // requires that x have type int
}
int three_plus_(int y) {
double x = 3.0;
return x_plus_(y); // calls x_plus_ when x has type double
}
Yani, bu nasıl engellenebilir?
Ben hazırlıksız birkaç yaklaşımlar düşünebilirsiniz: Ön '77 Fortran söz yukarıda
Yorum yapanlar bu davranışı vardı. Bu işe yaradı çünkü bir değişkenin adı türünü belirledi; Yukarıdaki x_plus_
gibi bir işlev geçersiz olacaktır, çünkü x
hiçbir zaman bir tamsayı türüne sahip olamaz. (Ve bu konuda three_plus_
gibi aynı şekilde biri, y
aynı kısıtlama olurdu çünkü.) Tamsayı değişkenler i
, j
, k
, l
, m
veya n
ile başlayan isimler olması gerekiyordu. Perl, skalerlere karşı diziler (normal diziler) ve karmalar (birleştirici diziler) gibi birkaç geniş değişken kategorisini ayırt etmek için sözdizimi kullanır. Farklı kategorilere ait değişkenler aynı ada sahip olabilir, çünkü sözdizimi hangisinin kastedildiğini ayırt eder. Örneğin, ifade foo $foo, $foo[0], $foo{'foo'}
fonksiyonu foo
, skaler $foo
, dizi @foo
(@foo
ilk elemanı olarak $foo[0]
) ve karma %foo
(anahtar 'foo'
tekabül %foo
içinde değerini $foo{'foo'}
) içerir. Orada birçok farklı sayısal tipleri vardır ve bunlar sözdizimsel ayırt türleri değil çünkü Şimdi, oldukça açık olmak gerekirse, Perl statik olarak yazılan değil vardır. (Özellikle: tüm referanslar skalerdir, hatta fonksiyonlara veya dizilere ya da hashlara yapılan göndermelerdir. Bu nedenle, bir diziye yapılan bir referansa ilişkin derex sözdizimini kullanırsanız, Perl değerin gerçekten bir dizi referansı olup olmadığını görmek için çalışma zamanında kontrol etmelidir.) Ama bu aynı yaklaşım tür sistemi çok basit sendin, özellikle bir iyi niyetli tip sistem için kullanılabilir. bu anlayışla, x_plus_
yöntem türü int
bir x
kullanarak olurdu ve tamamen three_plus_
tarafından ilan x
görmezden. (Bunun yerine, three_plus_
denilen her ne kapsamından sağlanan gerekiyordu tip int
bir x
kullanırsınız.) Bu, yukarıda bulunan bazı tip açıklamaları gerektirebilir ya, ya da tür kesmesi çeşit kullanabilirsiniz.
Bir işlevin imzası olmayan yerel kullandığı değişkenleri ve beklenen tiplerini gösterebilir. Yukarıdaki örnekte, x_plus_
imzası "int
türünde bir bağımsız değişken alır; x
türünde bir türünü kullanır; int
türünü kullanır; int
türünde bir değer döndürür".Daha sonra, x_plus_
numaralı aramaların, int
türünde bir argümanda nasıl geçeceği gibi, türünde int
— türünde bir değişken belirtmek zorundadır, ya kendi başına ya da türünün imzası (x_plus_
numaralı çağrı, türünün int
türüne eşdeğerdir) ve bu gereksinimi numaralı telefona arayanlara iletiyor. Bu yaklaşımla, yukarıdaki three_plus_
işlevi geçersiz olacaktır, çünkü bu double
argümanını double
argümanı olarak iletmeye çalıştığı gibi —'u çağırır ve x_plus_
yönteminin imzasını ihlal eder.
Yukarıdakiler yalnızca "tanımlanmamış davranışlara" sahip olabilir; Derleyici bunu açıkça algılamak ve reddetmek zorunda kalmayacaktı, ancak bu teknik, bunun nasıl ele alınması gerektiği konusunda herhangi bir özel zorunluluk getirmeyecekti. Yanlış yazılmamış yerel olmayan değişkenlerle bir işlevi hiçbir zaman çağırmamalarını sağlamak programcıların sorumluluğundadır.
Profesörünüz muhtemelen # 1'i düşünmüştü, çünkü '77 öncesi Fortran bu özelliğe sahip gerçek bir dünya diliydi. Ancak diğer yaklaşımlar düşünmek için ilginçtir. :-)
Yaklaşım 3 temel olarak bir başvuru kaynağı veya ad-soyad çağırma disiplindir. – Marcin
@Marcin: Üzgünüm, benzerliği göremiyorum. Detaylandırmaya özen gösterilsin mi? – ruakh
Yaklaşım 3, fonksiyonun kapsamı içinde olması gereken değişkenleri tanımlar ve bu değişkenler başka bir yığın çerçevesinde (veya muhtemelen, global olarak) saklanır. Bu çağrı disiplinlerinin tam tanımı (esas olarak uygulamalarında farklı olan). – Marcin
Fortran dinamik bir kapsam oluşturmuyor mu? En azından 1977 öncesi eski versiyonlar? –
@ JörgWMittag Evet. Aslında F77, istediğiniz türlerini içerdiği şekilde görüntüleyebileceğiniz bellek alanları olan bellek alanlarını paylaştı. – Marcin
Görünüşe göre, dinamik tiplendirme olan, çalışma zamanı türü etiketleme değerleri olmadan dinamik tipte kapsamı uygulayamazsınız. Bu sadece benim ilk izlenimim. –