Güçlü ve zayıf yazma - Strong and weak typing

Gelen bilgisayar programlama , birçok yoldan biri programlama dilleri halk dilinde sınıflandırılır dilin olup olmadığıdır tür sistemi yapar kesinlikle yazılı veya daktilo zayıf ( gevşek daktilo ). Bununla birlikte, terimlerin ne anlama geldiğine dair kesin bir teknik tanım yoktur ve farklı yazarlar, terimlerin ima edilen anlamları ve ana akım programlama dillerinin tip sistemlerinin "gücünün" göreli sıralamaları konusunda anlaşamazlar.

Genel olarak, güçlü yazılan bir dilin derleme zamanında daha katı yazım kuralları vardır , bu da derleme sırasında hataların ve istisnaların meydana gelme olasılığının daha yüksek olduğu anlamına gelir. Bu kuralların çoğu değişken atamasını, işlev dönüş değerlerini, prosedür bağımsız değişkenlerini ve işlev çağrısını etkiler. Dinamik Yazılan diller (burada tür denetlemesi de olur çalışma zamanında ) da güçlü yazılabilir. Dinamik olarak yazılan dillerde değerlerin değişkenleri değil türleri olduğunu unutmayın.

Zayıf yazılmış bir dilin daha gevşek yazım kuralları vardır ve öngörülemeyen, hatta hatalı sonuçlar üretebilir veya çalışma zamanında örtük tür dönüşümü gerçekleştirebilir. Dinamik olarak yazılmış (genellikle "zayıf yazılmış") dillerin savunucuları, bu tür endişelerin abartılı olduğunu düşünüyor ve statik yazmanın aslında katlanarak daha büyük bir dizi sorun ve verimsizlik getirdiğine inanıyor. Farklı ancak ilgili bir kavram, gizli yazmadır .

Tarih

1974 yılında Liskov ve S. Zilles hangi "bir nesne olarak adlandırılan işleve bir çağıran işleve geçirilen her nekadar onun tipi denilen fonksiyonunda belirtilen türüne uyumlu olmalıdır." Biri olarak bir kuvvetle-Yazılan dili tanımlanmış 1977'de K. Jackson, "Güçlü bir şekilde yazılmış bir dilde, her veri alanı ayrı bir türe sahip olacak ve her süreç iletişim gereksinimlerini bu türler açısından belirtecek" diye yazdı.

"Güçlü" veya "zayıf" tanımları

Bir dizi farklı dil tasarımı kararına "güçlü" veya "zayıf" yazımın kanıtı olarak atıfta bulunulmuştur. Bunların çoğu, tür güvenliğinin , bellek güvenliğinin , statik tür denetiminin veya dinamik tür denetiminin varlığı veya yokluğu olarak daha doğru anlaşılır .


"Güçlü yazım" genellikle, hem kodun değişmezlerini yakalamak hem de doğruluğunu sağlamak ve belirli programlama hataları sınıflarını kesinlikle hariç tutmak için programlama dili türlerinin kullanılması anlamına gelir. Bu nedenle, bu hedeflere ulaşmak için kullanılan birçok "güçlü tipleme" disiplini vardır.

Örtük tür dönüşümleri ve "tip punning"

Bazı programlama dilleri, bir türün değerini başka bir türün değeriymiş gibi kullanmayı kolaylaştırır. Bu bazen "zayıf yazma" olarak tanımlanır.

Örneğin, Aahz Maruch, " Statik olarak yazılmış bir dile sahip olduğunuzda ve dilin sözdizimsel özelliklerini kullanarak bir türün kullanımını farklı bir türmüş gibi kullandığınızda zorlama meydana gelir (C'de void*'in yaygın kullanımını düşünün) ) Zorlama genellikle zayıf yazmanın bir belirtisidir. Öte yandan dönüştürme, uygun türde yepyeni bir nesne yaratır."

Başka bir örnek olarak, GCC bunu tip punning olarak tanımlar ve katı aliasing'i bozacağı konusunda uyarır . Thiago Macieira, yazım denetimi derleyicinin uygunsuz optimizasyonlar yapmasına neden olduğunda ortaya çıkabilecek birkaç sorunu tartışıyor .

Örtük tür dönüşümlerine izin veren , ancak tür açısından güvenli bir şekilde birçok dil örneği vardır . Örneğin, hem C++ hem de C#, programların, iyi tanımlanmış anlambilimle bir değeri bir türden diğerine dönüştürmek için operatörleri tanımlamasına izin verir. Bir C++ derleyicisi böyle bir dönüşümle karşılaştığında, işlemi bir işlev çağrısı gibi ele alır. Buna karşılık, bir değeri C tipi void*' e dönüştürmek , derleyici tarafından görülmeyen güvenli olmayan bir işlemdir.

işaretçiler

Bazı programlama dilleri, işaretçileri sayısal değerlermiş gibi gösterir ve kullanıcıların bunlar üzerinde aritmetik yapmasına izin verir. İşaretçi aritmetiği, dilin tür sistemini atlamak için kullanılabildiğinden, bu dillere bazen "zayıf yazılmış" denir.

etiketlenmemiş sendikalar

Bazı programlama dilleri , bir türün değerinin başka bir türün değeriymiş gibi görüntülenmesine izin veren etiketsiz birleşimleri destekler .

Statik tip denetimi

Gelen Luca Cardelli makalesi Typeful Programlama , 'güçlü bir tip sistem', bir kontrolsüz zamanı tür hata olasılığı yoktur ki burada biri olarak tanımlanmaktadır. Başka bir yazıda, denetlenmeyen çalışma zamanı hatalarının olmaması, güvenlik veya tip güvenliği olarak adlandırılır ; Tony Hoare'nin ilk makaleleri buna mülk güvenliği diyor .

Dinamik tip denetimi

Bazı programlama dillerinde statik tip denetimi yoktur. Bu tür birçok dilde, çoğu statik tip denetleyicisi tarafından reddedilecek programlar yazmak kolaydır. Örneğin, bir değişken bir sayıyı veya "false" Boole değerini depolayabilir.

Programlama dilleri arasında varyasyon

Bu tanımlardan bazılarının çelişkili olduğunu, diğerlerinin yalnızca kavramsal olarak bağımsız olduğunu ve yine de bazılarının diğer, daha "liberal" (daha az güçlü) tanımların özel durumları (ek kısıtlamalarla birlikte) olduğuna dikkat edin. Bu tanımlar arasındaki geniş farklılıklar nedeniyle, çoğu programlama dili hakkında güçlü veya zayıf yazılmış oldukları iddialarını savunmak mümkündür. Örneğin:

  • Java , Pascal , Go , Ada ve C , tüm değişkenlerin bildirilmiş bir türe sahip olmasını gerektirir ve diğer aritmetik türlere açık aritmetik değer atamalarının kullanımını destekler. Java, C#, Ada ve Pascal'ın bazen C'den daha güçlü yazıldığı söylenir; bu, muhtemelen C'nin daha fazla türde örtük dönüştürmeyi desteklediği ve C'nin Java ve Pascal iken işaretçi değerlerinin açıkça yayınlanmasına izin verdiği gerçeğine dayanan bir iddiadır. yapamaz. Java'da statik tip sisteminden kaçınma yolları Java sanal makinesinin tip sistemi tarafından kontrol edildiğinden, Java'nın kendisi Pascal'dan daha güçlü yazılmış olarak kabul edilebilir . C# ve VB.NET bu açıdan Java'ya benzerler, ancak kod bölümlerini açıkça "güvenli olmayan bir bağlamda" koyarak dinamik tip kontrolünün devre dışı bırakılmasına izin verirler. Pascal'ın tür sistemi "çok güçlü" olarak tanımlanmıştır, çünkü bir dizinin veya dizenin boyutu, türünün bir parçası olduğundan bazı programlama görevlerini çok zorlaştırır.
  • Smalltalk , Perl , Ruby , Python ve Self , yazım hatalarının çalışma zamanında önlenmesi ve çok az örtük tip dönüştürmesi yapmaları anlamında "güçlü bir şekilde yazılmıştır" , ancak bu diller statik tip kontrolünü kullanmaz: derleyici kontrol etmez veya tür kısıtlama kurallarını uygulayın. Terimi ördek yazarak şimdi açıklamak için kullanılan dinamik yazarak bu gruptaki dillerin kullandığı paradigma.
  • Lisp dil ailesi tüm yazım hatası çalışma zamanında engellenir anlamında "türü kesin" dir. Common Lisp veya Clojure gibi bazı Lisp lehçeleri, çeşitli tür bildirimleri biçimlerini destekler ve bazı derleyiciler ( CMUCL ve ilgili) , çeşitli optimizasyonları ve ayrıca sınırlı derleme zamanı tür denetimlerini etkinleştirmek için bu bildirimleri tür çıkarımıyla birlikte kullanır .
  • Standart ML , F# , OCaml , Haskell ve Rust statik olarak tür denetimine tabidir, ancak derleyici çoğu değer için otomatik olarak kesin bir tür çıkarır.
  • Assembly dili ve Forth , türlenmemiş olarak karakterize edilebilir . Tip kontrolü yoktur; fonksiyonlara verilen verilerin uygun tipte olmasını sağlamak programcıya bağlıdır. Gerekli herhangi bir tür dönüştürmesi açıktır.

Bu nedenle, tip sistemleri hakkında açık bir şekilde yazmak isteyen yazarlar, genellikle " tip güvenliği " gibi belirli ifadeler lehine "güçlü yazım" teriminden kaçınırlar .

Ayrıca bakınız

Referanslar