2010-12-04 9 views
6

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?

+1

Fortran dinamik bir kapsam oluşturmuyor mu? En azından 1977 öncesi eski versiyonlar? –

+0

@ 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

+0

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. –

cevap

1

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

  1. 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.

  2. 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.

  3. 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. :-)

+0

Yaklaşım 3 temel olarak bir başvuru kaynağı veya ad-soyad çağırma disiplindir. – Marcin

+0

@Marcin: Üzgünüm, benzerliği göremiyorum. Detaylandırmaya özen gösterilsin mi? – ruakh

+0

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