Dinamik tipleştirme nedir? Statik ve dinamik yazım Açık yazım

Golovna / 2 Harika Okuyucu

Gerekli minimum sessiz konuşmaların intikamını almak için, dinamik yazmaya kötü dememek için yazmayı bilmek gerekli olduğundan, Lisp - yazılmamış benim ve C - benim katı tiplemem.

-de Yeni sürüm bulunan rapor açıklaması popüler film programlarına ve gösterişli resimlere gönderilen her türlü koda dipnotlarla tatlandırılmış.

Makalenin kısa versiyonunu tersten okumanızı ve ardından alt satırda okumanızı tavsiye ederim.

Kısa versiyon

Yazarak film programlamanın iki büyük kampa ayrıldığı kabul edilir - yazarak ve yazmayan (türlenmemiş). İlk örnek C, Python, Scala, PHP ve Lua, ikincisi ise birleştirici dil olan Forth ve Brainfuck.

Yani, sütü için bir "hayvan tipi" olarak, bir mantar kadar basittir; Ve filmin tipleştirme ekseni, değiştirilen daha fazla kategoriye bölünmüştür:

  • Statik/dinamik yazım. Son değişiklik türlerinin ve işlevlerin derleme aşamasında yüklenmesi gerçeğiyle statik olarak belirlenir. Toto. derleyici zaten ne tür bildiğinizden %100 emin. Dinamik tiplemede, tüm tipler zaten programın sonunda z'yasovyatsya'dır.

    Uygulamak:
    Statik: C, Java, C#;
    Dinamik: Python, JavaScript, Ruby.

  • Güçlü/zayıf tipleştirme (katı/katı olmayan olarak da adlandırılır). Dilin virazahta dilin kullanılmasına izin vermediği güçlü tipleme görülmektedir. farklı şekiller ve otomatik örtük dönüşümleri kazanmayın, örneğin kişisel olmayan bir satır göremezsiniz. Zayıf bir tipleştirmeye sahip filmler, herhangi bir örtülü değişiklik olmaksızın otomatik olarak değiştirilebilir, bu nedenle doğruluk kaybı olabilir veya dönüşüm belirsiz olabilir.

    Uygulamak:
    Güçlü: Java, Python, Haskell, Lisp;
    Zayıf: C, JavaScript, Visual Basic PHP.

  • Açık/örtük yazım. Açıkça yazılan hareketler, yeni değişiklik/işlevlerin/bağımsız değişkenlerin türünün açıkça ayarlanması gerektiğinden sunulur. Açıkçası, örtülü yazım içeren film, derleyiciye/tercümana aktarılır.

    Uygulamak:
    Yazılım: C++, D, C#
    Örtülü: PHP, Lua, JavaScript

Ayrıca, tüm kategorilerin birbirinin yerine geçebileceğini de belirtmek gerekir, örneğin, C dili statik olarak zayıf, açıkça yazılabilir ve dil dili Python - dinamik olarak güçlü, dolaylı olarak.

Bir gecede buvaє mov zі staticї ve dynamіchnї typіzatsiy değil. Burada ne hakkında yalan söylediğimi önceden söylemek istiyorum - pis koku doğru, ama başka bir şey hakkında.

Ayrıntılı sürüm

Kısa bir versiyon gibi, iyi iş çıkardın, iyi. Boşuna değil, rapor mu yazıyorum? Golovna, kısa versiyonda tüm korisnu sığdırmak imkansızdı ve cіkavu bilgileri, ancak cildi zorlamadan okuyabilmeniz için uzun zaman önce rapor vermek mümkün olacaktır.

Tipsiz tipleme

Tipsiz dil programlarında, tüm günler farklı günler olan vuruş dizileriyle girilir.

Tipsiz tipleştirme, düşük seviyeli (assembler dili, Forth) ve ezoterik (Brainfuck, HQ9, Piet) dile tanıdık geliyor. Bununla birlikte, içinde nedolіkami sırasına göre, є deakі perevagi.

Perevagi
  • Marjinal olarak düşük bir seviyede yazmanıza izin verir, ayrıca derleyici / yorumlayıcı herhangi bir tür kontrolünden etkilenmez. Vіlnі robiti be-yakі be-yakim veri türleri üzerindeki işlemler.
  • Seçimi kaldırma kodu kulağa etkili gelecektir.
  • Vkazivok'un saydamlığı. Dil bilgisi ile bir sonraki kodun ne olduğu konusunda hiçbir şüphe yoktur.
Nedoliki
  • Katlama Genellikle listeler, satırlar ve yapılar gibi verilen karmaşık değerlere olan ihtiyaçtan sorumlu tutulur. Іz cim, teslim olmamakla suçlanabilir.
  • Vіdsutnіst perevіrok. Be-yakі bezgluzdі dії, örneğin dizideki vіdnіmannya pokazhchika іz sembolü vvazhatimuetsya tsіlkom normal, scho zor aflar getirebilir.
  • Düşük soyutlama. Katlanan veri türüne sahip bir robot, oluşturulması son derece zor olan, sayıları olan bir robota hiç benzemez.
Tipsiz tipleme güçlü müdür?

Evet evet evet. Örneğin, mov birleştiricide (x86 / x86-64 mimarisi için, diğerlerini bilmiyorum) programı birleştirmek mümkün değildir, bu nedenle cx kaydında (16 bit) rax kaydından veri yakalamayı deneyebilirsiniz. (64 bit).

hareket cx,eax; pardon saat meclisi

O zaman git, asemlerdeki tip nedir? Birkaç revizyon olmasını önemsiyorum. Ve senin düşüncen, zvіsno, senden daha az uzan.

Statik ve dinamik tipleştirme

Statik (statik) tipleştirmeyi, türlerin tüm yeniden kontrollerinin yazma aşamasında değil derleme aşamasında kontrol edildiği dinamik (dinamik) olarak gören Golovne.

Deyakim insanları, statik tiplemenin çok küçük olduğunu (aslında, öyle, birçok insan uzun zamandır bu tür yöntemlerden yardım istiyor) kaçabilir. Deyakim, scho dinamik olarak tipikleştirilmiş film - tse gra z fire, ama onları nasıl görebilirsin? Bir nedenden dolayı şansı göremiyor musun? Neden olmasın, neden bu kadar çok statik ve dinamik olarak yazılmış mov?

Hadi bir bakalım.

Statik yazmanın avantajları
  • Tip revizyonları sadece bir kez yapılır - derleme aşamasında. Ve bu, sayıyı arka arkaya eklemeye çalışmazsak (ve bir af görün, aksi takdirde bir değişiklik yaparız) hızlı ileri almamıza gerek kalmayacağı anlamına gelir.
  • Shvidkіst vykonannya. Önceki noktadan, statik olarak yazılan filmlerin pratik olarak daha dinamik olarak yazıldığı açıktır.
  • Deyakih dodatkovyh zihinleri için zaten derleme aşamasında potansiyel afları göstermenize izin verir.
Dinamik tipleştirmenin avantajları
  • Evrensel koleksiyon oluşturmanın basitliği, her şeyin ve her şeyin bir kombinasyonudur (nadiren böyle bir ihtiyaç suçlanır, ancak suçu dinamik tipleştirmeye atarsanız, bunu yapabilirsiniz).
  • Gelişmiş algoritmaların açıklama kolaylığı (örneğin, bir diziyi kural olarak yalnızca tamsayılar listesinde değil, aynı zamanda konuşma numaraları listesinde ve satırlar listesinde de sıralamak).
  • Ustalaşması kolay - dinamik yazım özelliğine sahip filmler, programlama yapmak isteyenler için daha da iyi ses verir.

Güncellenmiş programlama

Güzel, dinamik yazım için en önemli argüman, karmaşık algoritmaların tanımının netliğidir. Kendi problemimizi bulalım - bir tamsayı dizisi, bir konuşma dizisi ve bir sembol dizisi için kaç dizi (veya liste) arayacak bir işleve ihtiyacımız var.

Nasıl її virishuvatememo yaparız? Virishimo її 3 farklı dil: biri dinamik tipleme ve ikisi statik.

Şaka amaçlı algoritma, en basitlerinden birini alacağım - numaralandırma. İşlev, aranacak öğeyi, dizinin kendisini (veya listeyi) ayarlamak ve öğenin dizinini döndürmektir, aksi halde, öğe bilinmediğinden - (-1).

Dinamik çözüm (Python):

Def find(required_element, list): for (index, element) in one (liste): if element == gerekli_element: dönüş indeksi dönüş (-1)

Yak bachite, her şey basit ve günlük problemler s scho, scho liste herhangi bir sayıda, herhangi bir listede yer alabilir, başka dizi olmasa bile. İyi gibi. Devam edelim - C'deki görevi görelim!

Statik çözüm (Сі):

unsigned int find_int(int gerekli_element, int dizisi, unsigned int size) ( for (unsigned int i = 0; i< size; ++i) if (required_element == array[i]) return i; return (-1); } unsigned int find_float(float required_element, float array, unsigned int size) { for (unsigned int i = 0; i < size; ++i) if (required_element == array[i]) return i; return (-1); } unsigned int find_char(char required_element, char array, unsigned int size) { for (unsigned int i = 0; i < size; ++i) if (required_element == array[i]) return i; return (-1); }

Dış görünüm işlevi, Python'un 3. sürümüne oldukça benzer, ancak neden üç tane var? Statik programlama başarısız oldu mu?

І çok і ні. Bir tanesine hemen bakabileceğimiz birkaç programlama yöntemi vardır. Buna yabancı programlama denir, bu C++ dili haince desteklenir. Yeni sürüme bir göz atalım:

Statik çözüm (daha gelişmiş programlama, C++):

Şablon işaretsiz int bul(T gerekli_element, std::vector dizi) ( for (işaretsiz int i = 0; i< array.size(); ++i) if (required_element == array[i]) return i; return (-1); }

Dobre! Python'daki alt sürüm çok tutarlı görünmüyor ve aynı zamanda çok fazla yazma şansım olmadı. Ek olarak, görevin tamamlanması için gerekli olan yalnızca üç dizi için değil, tüm diziler için uygulamayı kaldırdık!

Bu sürüm, gerekli olanlara benzer - dinamik olanın artılarını ve statik yazımlarını ve aktif artılarını hemen alacağız.

Harika, ne mümkün olabilir, ama belki daha güzel. Daha gelişmiş programlama akıllı ve güzel olabilir (örneğin, daha fazla Haskell ile). Başka bir şekilde, daha karmaşık programlamaya ek olarak, polimorfizmi (sonuç daha yüksek olacaktır), işlevleri (benzer şekilde) veya makroları gözden geçirmek de mümkündür.

Statik ve dinamik

Ayrıca, ne kadar çok statik dilin dinamik yazmayı kazanmanıza izin verdiğini tahmin edin, örneğin:

  • C#, dinamik sözde türü destekler.
  • F#, bir operatör gibi sözdizimsel kodu destekliyor mu?
  • Haskell'in dinamik yazımı Data.Dynamic modülü tarafından sağlanmaktadır.
  • Delphi - özel Varyant türünün yardımı için.

Ayrıca, bir filmi dinamik olarak yazma eylemleri, statik yazmanın yardımıyla hızınızı artırmanıza olanak tanır:

  • Common Lisp - tür bildirimleri.
  • Perl - sürüm 5.6, dosit obzhezheno.

Güçlü o zayıf tiptir

Güçlü bir tipleştirmeye sahip filmlerin virazlarda farklı türlerin günlük doğasını değiştirmesi ve günlük otomatik dönüşümleri kazanması imkansızdır. Ayrıca "Suvoroy Typization'dan Movi" olarak da adlandırılırlar. Bunun İngilizce karşılığı güçlü yazımdır.

Zayıf yazılmış filmler, navpaki, spriyako şiddetle, programcı zmishuvav'ı ağla farklı şekiller tek bir sürümde ve derleyicinin kendisi her şeyi tek bir türe dönüştürür. Ayrıca "suvoroy olmayan tiplemeli filmler" olarak da adlandırılırlar. Bunun İngilizce karşılığı zayıf yazımdır.

Zayıf tipleme genellikle dinamik ile karıştırılır, durum böyle değildir. Dinamik olarak yazılan dil, zayıf ve güçlü bir şekilde yazılabilir.

Bununla birlikte, çok az kişi tipleştirme titizliğinin önemini bilir. Genellikle bir dilin statik olarak yazıldığı belirtilir, bu durumda derleme için sınırsız potansiyel af kullanabilirsiniz. Yalan söyle!

Mova, anne ve güçlü tiplemeden suçludur. Ve derleyici size af hakkında bilgi verirse, sadece sayıya bir satır ekleyecektir, aksi takdirde daha yüksektir, birden başka bir dizi görüyoruz, bizim için ne kadar iyi, tüm "yeniden doğrulamalar" ne türleri derleme aşamasında olacak? Bu doğru - zayıf olan statik tipleme daha güçlüdür, düşük olan güçlü dinamiktir! (Eh, bu benim düşüncem)

Öyleyse neden zayıf tiplerin artıları yok? Böyle görünmek mümkün, güçlü bir tiplemeye sıkı sıkıya uyduğumu söyleyenlere saygı duymamak, zayıfların aynı perevaga sahip olmasını beklemekten suçluyum.

Nasıl olduğunu bilmek ister misin?

Güçlü tipleştirme belirtileri
  • Nadіynіst - Yanlış davranışın en doğal örneği olan derlemenin affedilmesinin suçunu üstleniyorsunuz.
  • Shvidkіst - zamіst prihovannyh rework, yakі vitratnymi ile yapılabilir, güçlü typeіzієyu açıkça їх yazmak gerekir, scho zamushuє programcısı minimum olarak tsya dilyanka kodunun povilnoy olabileceğini bilir.
  • Robotlar ve programlar hakkında bilgi - yine, örtük türlerin değiştirilmesi, programcı her şeyi kendisi yazar, bu da yaklaşık olarak zeka anlamına gelir, sıra ve sayı hizalamasının çekici görünmediği anlamına gelir.
  • Randevu - dönüşümü elle yazarsanız, neyi neye dönüştürdüğünüzü tam olarak bilirsiniz. Böylece, bu tür dönüşümlerin doğruluk israfına ve hatalı sonuçlara yol açabileceğini her zaman bileceksiniz.
Zayıf tipleştirmeler
  • Karışık dizelerin zaferlerinin çok yönlülüğü (örneğin, z tsilih chi konuşma sayıları).
  • Tipleştirme şeklinde soyutlama ve görevlere odaklanma.
  • Kısa bir not.

Harazd, ortaya çıktık, zayıf tipografide, yani perevagi'de ortaya çıkıyoruz! Ve zayıf bir tipin artılarını güçlü olana aktarmanın yolları nelerdir?

Görünüyor, є iki geziyorum.

Belirsiz olmayan durumlarda ve veri kaybı olmadan örtük tür azaltma

Uh ... Uzun bir paragrafı bitirin. "Obmezhene örtük dönüşüm" için hızlı bir yoga vereyim

Durum açık; Eksen, örneğin iki sayının toplanması kesin bir durumdur. Ve sayının bir diziye dönüştürülmesi nі (bir öğeden bir dizi oluşturmak mümkündür, bu kadar uzun bir süre ile bir dizinin kilitleme için öğeleri doldurması mümkündür ve sayıyı dönüştürmek mümkündür. bir satıra ve ardından bir sembol dizisine).

Verilerin dönüşü daha da basittir. Sayıdaki 3.5 konuşma sayısını nasıl dönüştürebiliriz - verilerin bir kısmını harcayacağız (aslında işlem belirsizdir - yuvarlama nasıl yapılacak? Büyük tarafta mı? Küçük tarafta mı?

Belirsiz durumlarda reenkarnasyon, yani ikinci verilerle yeniden yapılanma - daha iyi, daha kötü. Programlama için özel bir şey yok.

Bana inanmıyorsanız, PL/I dilini okuyun veya sadece bu belirtimi arayın. Yenisi, TÜM veri türleri arasında dönüşüm kurallarına sahiptir! Bu sadece cehennem!

Harazd, örtük dönüşümün dönüşümünü düşünelim. Hareket ne? Örneğin, Pascal'da tam sayıyı konuşmada çevirebilirsiniz, ancak yanlış şekilde çeviremezsiniz. Benzer mekanizmalar C#, Groovy ve Common Lisp'tedir.

Garazd, güçlü bir dilden zayıf bir türden birkaç artı almanın başka bir yolu olduğunu gösterdim. Ve böylece şarap, yapıcıların polimorfizmi olarak adlandırılır.

Yogayı Haskell'in mucize filmi uygulamasında anlatacağım.

Polimorfik oluşturucular, sayısal sabit değerlerin kullanıldığı saat için gerekli olan çoğunlukla güvenli örtük dönüştürme olan ihtiyati sonuçları doğruladı.

Örneğin, pi + float(1) yerine pi + 1.0 yazmak istemezsiniz. Sadece pi + 1 yazmak istiyorum!

Haskell'de bozuldu, çünkü sabit değer 1'in belirli bir türü yok. Fiyat nіle, nі konuşma, nі karmaşık. Bu sadece bir sayı!

Sonuç olarak, x ila y'deki tüm sayıları (1 artışla) çarpan basit bir x y toplamı işlevi yazarken, sürüm sayısını hesaba katarız - tamsayılar için toplam, konuşma için toplam, rasyonel için toplam, toplam karmaşık sayılar için ve kendi belirlediğiniz tüm sayısal türler için toplam yazın.

Zvichayno ryatuє tsey priyom yalnızca vikoristannі zmіshanih virazіv sayısal değişmezler olduğunda, ancak buzdağının yalnızca görünen kısmı.

Bu şekilde en iyi çıkış yolunun güçlü ve zayıf tipleme arasındaki sınırda denge kurmak olduğunu söyleyebiliriz. Herhangi bir dilin mükemmel dengesine sahip olmadığım sürece, zayıf yazılmış hareketlerden (C, JavaScript, Lua, PHP gibi) ziyade güçlü yazılmış hareketlere (Haskell, Java, C#, Python gibi) daha meyilliyim. ).

Açık ve örtük yazım

Açık tiplendirmeye sahip Mova, programcının sağır edici gibi tüm değişikliklerin ve işlevlerin türünü belirtmekten suçlu olduğunu aktarır. Bunun için kullanılan İngilizce terim açık yazımdır.

Örtük yazım, navpaki, proponuє içeren Mova türleri unutun ve tür tanımını derleyiciye veya tercümana aktarın. örtük yazma anlamına gelen İngilizce terim.

Arkada, örtük tipleştirmenin eşit derecede güçlü dinamik ve açık - statik olduğunu söyleyebilirsiniz, ancak dahası, öyle olmayan şey.

Cilt görünümünün Chi є artıları ve yine chi є їх kombinasyonları і chi є movi z her iki yöntemi de destekliyor mu?

Açık tiplendirmenin avantajları
  • İmzanın dış görünüm işlevinin varlığı (örneğin, int add(int, int)) hangi işlevin çalışacağını kolayca belirlemenizi sağlar.
  • Programcı, belirli bir değişiklikten ne tür bir değer alınabileceğini hemen yazar, bu da hatırlamayı gerekli kılar.
Örtülü yazma özellikleri
  • Kısa not - def add(x, y) açıkça int add(int x, int y)'den daha kısadır.
  • Değişime karşı dirençli. Örneğin, zaman değiştirme işlevi, giriş bağımsız değişkeniyle aynı türe sahipse, açıkça yazılan bir harekette, giriş bağımsız değişkeninin türünü değiştirirken, zaman değiştirme türünün değiştirilmesi gerekli olacaktır.

Güzel, hakaretlerin artılar ve eksiler gibi gelip gittiği açık (ve kimde başka ne var?), o zaman bu iki yaklaşımı birleştirmenin bir yolunu isteyelim!

Vibir'de açık tipleme

Є kısaltmalar için örtük yazım ve tüketim için değer türünü belirleme yeteneği ile taşıyın. Tsey tipi virazu çevirmeni otomatik olarak vivede. Bu hamlelerden biri Haskell, netlik için basit bir örnek vereyim:

Açık tür bildirimi yok add (x, y) = x + y - Açık tür bildirimi add:: (Tamsayı, Tamsayı) -> Tamsayı add (x, y) = x + y

Not: Eğri olmayan bir işlev yazabilirim ve ayrıca daha yaygın add:: (Num a) -> a -> a -> a yerine özel bir imza yazabilirim çünkü Haskell'in sözdizimini açıklamadan bir fikir göstermek istiyorum.

Hm. Yak bachimo, aynı zamanda güzel ve kısa. İşlev girişi, boşluklar dahil satır başına yalnızca 18 karakter alır!

Ancak türün otomatik sarması katlanabilir ve bu kadar havalı bir Haskell dili ile pek iyi çalışmıyor. (Örnek olarak monomorfizme değişiklik getirebilirsiniz)

Kilitleme ve örtülü talep için açık tipleme ile Chi є movi? Kon
kesinlikle.

Seçimde örtük tipleştirme

C++11 (önceki adı C++0x) olarak adlandırılan yeni C++ dil standardı, auto anahtar kelimesini kullanıma sunmuştur, böylece derleyici size türü bağlam dışında girmenizi söyleyebilir:

Muhtemelen: // unsigned int a = 5 yazmak için manuel ekleme; işaretsiz int b = a + 3; // Otomatik sarma tipi unsigned int a = 5; otomatik b = a + 3;

Fena değil. Ale, rekor pek küçülmedi. Yineleyicilerle popoya hayret edelim (anlamıyorsanız, kavga etmeyin, zavodka'nın otomatik vysnovka'ya kaydının zaten hızlı olduğuna saygı gösterdiğinizden emin olun):

// std::vector tipine manuel atama vec = randomVector(30); for (std::vector::const_iterator it = vec.cbegin(); ...) ( ... ) // Otomatik vec türü auto vec = randomVector (otuz); for (auto it = vec.cbegin(); ...) ( ... )

Vay! Eksen kısa. Garazd, ama Haskell ruhuyla nasıl çalışabilirsin, argüman türlerinde ne tür bir değer, neye dönüşecek?

Böyle tekrar edeceğim, zavdyaki anahtar kelime otomatik ile birlikte decltype:

// Manuel tip int bölme(int x, int y) (...) // Otomatik tip otomatik bölme(int x, int y) -> decltype(x / y) (...)

Gösterimin biçimi o kadar iyi olmayabilir, ancak daha gelişmiş programlama (şablonlar/jenerikler) ile birlikte örtülü yazma veya otomatik tür türetme bir div oluşturacaktır.

Bu sınıflandırma için Deyaki film programlama

Popüler filmlerin küçük bir listesini yapacağım ve kokunun "türler" cilt kategorisine nasıl uyduğunu yazacağım.

JavaScript - Dinamik / Zayıf / Örtülü Ruby - Dinamik / Güçlü / Örtülü Python - Dinamik / Güçlü / Örtülü Java - Statik / Güçlü / Açık PHP - Dinamik / Zayıf / Örtülü C - Statik / Zayıf / Açık C++ - Statik / Güçlü / Açık - Dinamik / Zayıf / Örtük Amaç-C - Statik / Zayıf / Açık C# - Statik / Güçlü / Açık Haskell - Statik / Güçlü / Örtük Ortak Lisp - Dinamik / Güçlü / Örtük

Belki burada, özellikle CL, PHP ve Obj-C ile merhamet ediyorum, sanki başka bir fikriniz varmış gibi - yorumlara yazın.



Bu makale, "güçlü" ve "zayıf" tipleştirme anlayışına ve farklı dillerdeki tiplendirme sistemlerinin benzerliğine bakarak, statik olarak tiplendirilmiş ve dinamik olarak tiplendirilmiş diller arasındaki fark hakkındadır. Bir saatin geri kalanında, programlamadaki en gelişmiş ve en gelişmiş yazım sistemlerinin net bir akışı olacak, bu nedenle ipuçlarından ve tiplemeden bahsediyorsanız ne yapacağınızı düşünmek önemlidir.



Tür - olası değerlerin tüm koleksiyonu. Tam sayı bir ana değer olabilir 0, 1, 2, 3 vb. Bulova doğru ya da yanlış olabilir. Türünüzü tahmin edebilirsiniz, örneğin, "DayFive" türü, bu durumda "ver" ve "5" anlamı ve daha fazlası değil. Satır ve numara değil, fiyat, okremium türü.


Hareketin statik tiplendirmesi, değişiklik türleri arasındadır: mov programlama, örneğin, x'in bir Tamsayı olduğunu bilebilir. Ne tür bir programcı, kod doğru değilse robit x = true'dan korkar. Derleyicinin derlemesi gerekiyor, bu yüzden böyle bir kodu çalıştıramayız. Ek olarak, dil statik olarak yazılabilir, ancak daha çeşitli olabilir ve DayFive türümüzü popüler yazı sistemlerinden kullanmak mümkün değildir (zengin olsa da, birisi başka, daha karmaşık fikirleri kullanabilir).


Dinamik olarak yazılan mov, türlere göre değerler atayın: mov, tam sayının ne olduğunu bilir, 2 tam sayıdır, ancak tamsayı yerine x'in ne değiştirildiğini bilebilirsiniz.


Vikonannya movi pereviryaє tsі'nın ortası farklı anlarda ve saatlerde işaretler. İki değeri birlikte toplamaya çalışırsak ters çevirebilirsiniz, bunlar sayılar, satırlar ve dizilerdir. Stoktan ve değerden çıkalım, af, nadas tipi görmek için bunları birbirine yapıştıralım.

Statik yazılan filmler

Statik filmler, program başlatılmadan önce bir derleme saati boyunca program tarafından yeniden doğrulanır. Bir program olsun, bazı durumlarda filmin kurallarını çiğneyin, yanlış olarak kabul edilir. Örneğin, daha statik mov vіdhilyає viraz "a" + 1 (hareket Сі - tse bu kuraldan sorumludur). Derleyici, "a"nın bir tam sayı, 1'in de bir tam sayı olduğunu ve yalnızca sol ve sağ kısım bir türe kadar olabiliyorsa çalıştığını bilir. Yani sorunun ne olduğunu anlamak için programı çalıştırmanıza gerek yok. Statik olarak yazılan bir filmin dış görünümü, kod çalıştırılmadan tanımlanabilen tek bir türe dönüştürülebilir.


Bir türü belirlemek için çok sayıda statik olarak yazılmış mov. Java işlevi public int add(int x, int y) iki tam sayı alır ve üçüncü sayıyı döndürür. Statik olarak yazılan diğer filmler otomatik olarak bir tür atayabilir. Haskell'deki bu katlama işlevi şöyle görünür: x y = x + y ekleyin. mov türleri demiyoruz, ancak bunları kendiniz atayabilirsiniz, çünkü +'nın yalnızca sayılar üzerinde çalıştığını biliyorsunuz, bu nedenle x ve y sayı olmalıdır, bu nedenle toplama işlevi bağımsız değişken olarak iki sayı alır.


Bu, "statik" tip sistemini değiştirmez. Haskell'deki yazı sistemi kendi statik, titiz ve sıkılığına sahiptir ve genel olarak Haskell, Java'dan üstündür.

Dinamik olarak yazılan filmler

Dinamik olarak tiplendirilmiş hareketler, türü belirtmeli ve bunu kendileri yapmalıdır. Tipi zminnyh nevidomі kıyametin koptuğu ana kadar belirli anlamlar başlangıçta. Örneğin, Python'da bir işlev


def f(x, y): x + y döndürür

İki tam sayı, yapıştırma satırları, listeler vb. Ekleyebilirsiniz ve ne düşündüğümüzü çözemeyiz, rıhtımlar programı çalıştırmaz. Muhtemelen, f fonksiyonu iki satırda ve daha sonra iki sayıda çağrılırsa. Böyle bir zamanda x ve y farklı saatlerde farklı türde farklı değerlere sahip olacaktır. Görünüşe göre dinamik dildeki anlam türü belirliyor, ancak bu işlevi değiştirmek değil. 1 değeri her zaman bir tamsayıdır, ancak x ve y herhangi bir şey olabilir.

Porivnyanniya

Dinamik hareketlerin çoğu, sanki yanlış yazılmışlarmış gibi bir af dilemek için hareket ediyor (JavaScript - suçlama; anlamsızsa, herhangi bir ifade için değeri çevirmek mümkündür). Vikoristannі dinamik olarak typeіzovanіh mov navіt "a" + 1 biçimine basit bir af, muharebe bilemesinden haklı çıkarılabilir. Statik filmler bu tür aflardan korkar ama belli ki korkmanın adımları tipler sisteminin sıkılığında yatmaktadır.


Programların doğruluğu hakkında temelde farklı fikirlerden ilham alan statik ve dinamik hareketler. Dinamik hareket "a" + 1 doğru bir programa sahiptir: kod başlatılacak ve gecenin bir yarısı bir af belirecektir. Ancak, çoğu statik olarak yazılan mov viraz "a" + 1 - ce program değil: Derlenmeyecek ve çalıştırılmayacak.Bu yanlış bir kod ve ayrıca joker karakterler giriliyor!&%^@*&%^@* - bu yanlış kod. Doğruluk ve yanlışlık hakkındaki bu ek anlayış, dinamik dilde eşdeğer olamaz.

Güçlü o zayıf tiptir

"Güçlü" ve "zayıf" kavramları daha belirsizdir. Eksen deyaki їх vikoristannya'yı uygular:

    Bazen "güçlü", "statik" anlamına gelir.
    Burada her şey basit, ancak "statik" terimini kullanmak daha iyidir, böylece daha muzaffer olur ve yogayı anlarsınız.

    Bazen "güçlü", "türlerin örtük dönüşümünü soyma" anlamına gelir.
    Örneğin JavaScript, "zayıf yazma" olarak adlandırılabilecek "a" + 1 yazmanıza izin verir. Ale, tam sayılardan 1 + 1.1'e kayan bir koma ile sayıya otomatik olarak geçmenize izin verdiği için, bu chi'nin örtük dönüşümden arındırılmış tüm movi olabilir. Gerçekte, çoğu insan kabul edilebilir ve kabul edilemez dönüşümleri belirtmek için "güçlü" kelimesini kazanır. Kordon diye bir şey yoktur, tüm pis kokular yanlıştır ve belirli bir kişinin zihninde yatmaktadır.

    Bazen "güçlü", dilde tiplendirme kurallarını çiğnemenin imkansız olduğu anlamına gelir.

  • Bazen güçlü, bellek için güvenli anlamına gelir (bellek için güvenli).
    Cі - filmin hatırası için güvenli bir popo değil. Eğer xs birkaç sayıdan oluşan bir diziyse, o zaman Сі z, xs veya xs'nin kodudur ve xs'nin hemen arkasında bilindiği gibi onu bellekteki değer olarak döndürür.

İçeri girelim. Deyakі mov vіdpovіdat tsim milletvekilleri gibi eksen. Söyleyebileceğim kadarıyla, Haskell her bakımdan tartışmasız "en güçlü". Daha fazla kelime o kadar net değil.



("Örtülü dönüşüm" sütunundaki yak ise, dönüşümler saygıyla kabul edilebilir olduğundan, güçlü ve zayıfın ek olarak yalan söylemesinin mümkün olduğu anlamına gelir).


Çoğu durumda, "güçlü" ve "zayıf" terimleri, burada belirtilmeyen diğerlerinden daha fazla, diğer işlevlerin tanımsız bir kombinasyonu olarak görülebilir. "Güçlü" ve "zayıf" kelimelerini soymak için tüm zahmetler neredeyse aptalca. Terimleri vikoristovuvat yapmak istiyorsanız, uvazi'de tam olarak ne olduğunu daha kısaca açıklayın. Örneğin, "Bir satır sayı eklenirse JavaScript bir değeri döndürür, ancak Python bir pardon döndürür" diyebilirsiniz. Böyle bir zamanda, "güçlü" kelimesinin kişisel olmayan anlamını öğrenmeye çalışmak için kendi gücümüz yok gibi görünüyor. Ama daha da kötüsü terminoloji üzerinden anlaşılmaz anlaşılmazlığa gelelim.


İnternetteki "güçlü" ve "zayıf" vipadkiv terimlerinin çoğu belirsizdir ve kötü bir şekilde belirlenmiş düşüncelerdir. belirli insanlar. Pis koku vikoristovuyutsya, schob dili "iğrenç" veya "iyi" olarak adlandırır ve bu düşünce teknik jargona dönüşür.



Güçlü tipleştirme Tipler sistemini seviyorum ve rahat hissediyorum.

Zayıf tipleme: Tipler sistemi benim için daha az çalkantılı veya rahat değil.

Aşamalı yazma (kademeli yazma)

Dinamik hareketlere statik ipuçları ekleyebilir misiniz? Bazı vipadkahlarda - yani. Diğerlerinde zor ve imkansızdır. En bariz sorun, değerlendirmenin maliyeti ve dinamik dilin diğer benzer olasılıklarıdır. Python'da Vikonannya 1 + eval("2") 3'tür. Peki ya 1 + eval(read_from_the_network())? Toplantı anında bahçede bulunanlar şeklinde döşenmeye değer. Bir sayı alınırsa, doğrudur. Bir kavga gibi, sonra hayır. Başlatmadan önce tanımak mümkün değildir, bu nedenle türü statik olarak analiz etmek imkansızdır.


Eval() tipini Any olarak ayarlamak pratik bir çözüm değil, Go'da Object bazı nesne yönelimli programlama arayüzlerini () tahmin eden: Bu tip, anlamlı olup olmadığı sizi mutlu ediyor.


Any türünün değerleri hiçbir şeyle ayrılmaz, bu da tür sisteminin eval kodunda bize yardımcı olabileceği anlamına gelir. Filmler, herhangi bir tür değerlendirme sisteminde, cilt varis değerlendirmesi durumunda güvenli türlerden suçludur.


Bazı hareketlerde isteğe bağlı veya adım adım yazım vardır: kısaltmalar için dinamiktirler, ancak bazı statik açıklamaların eklenmesine izin verirler. Python son zamanlarda isteğe bağlı türleri ekledi; TypeScript - bazı isteğe bağlı türler için JavaScript yerine üst simge; Akış, eski güzel JavaScript kodunun statik bir analizidir.


Tsі movi deakі perevagi static typіzatsії verir, ancak doğru bir statik movі'daki gibi mutlak garantiler vermezler. Etkin işlevler statik olarak yazılır ve etkin işlevler dinamik olarak yazılır. Programcıların perakendeciliği bilmesi ve korkması gerekir.

Statik olarak yazılan kodun derlenmesi

Statik olarak yazılan kodu derlerken, herhangi bir derleyici gibi sözdizimi tersine çevrilir. İpuçlarını değiştirelim. Tse, statik bir dilin bir sözdizimsel af için affedilebileceği ve bundan sonra 100 tipleştirme affı için düzeltilebileceği anlamına gelir. Sözdizimsel affın düzeltilmesi 100 tipleştirme affı yaratmadı. Derleyici, tür aflarını gösteremez, sözdizimi belgeler tarafından düzeltilmedi.


Statik hareket derleyicileri akıllı kod üretebilir, ancak dinamik derleyiciler üretemez. Örneğin, derleyici toplama işlevinin tam sayıları kabul ettiğini bildiğinden, CPU'nun yerel ADD yönergesini yenebilir. Viconann olduğunda dinamik dil tersine çevrilebilir tür, yedek türdeki kişisel olmayan ekleme işlevlerinden birini seçerek (tamsayılar veya değişkenler ekleme veya satırları veya belki de listeleri yapıştırma?) Veya yemin etmeniz gerekir, çünkü vinil af ve tür bire bir eşleşmez . Usі ts_ yeniden doğrulamaları bir saat sürer. Dinamik hareketlerin optimizasyon için çeşitli püf noktaları vardır, örneğin JIT derlemesi (tam zamanında), türler hakkında gerekli tüm bilgiler alındıktan sonra kod çözme yeniden derlenir. Bununla birlikte, herhangi bir dinamik dil, benim dilimin Rust'ta düzgün bir şekilde yazılmış statik koduna sahip swidkist ile karşılaştırılamaz.

Statik ve dinamik tiplerin melankolisi üzerine argümanlar

Statik tip sistem ekleri, tip sistemi olmayanları anlatır pardonüretim sorunlarına yol açabilir. Açıkçası, doğru. Dinamik bir dil kazanmış, kendi üzerinde denemiş biri olun.


Dinamik hareketlerin taraftarları, bu tür hareketlerle kod yazmanın daha kolay olduğunu belirtir. Bu, farklı yazdığımız her türlü kod için kesinlikle geçerlidir, örneğin, bu kod eval'dır. Bu, normal çalışma için farklı bir çözümdür ve burada "kolay" kelimesini tahmin etmek mantıklıdır. Rich Hiki mucizevi bir şekilde "kolay" kelimesinden bahsetti ve yogo zv'yazok zі "basitçe" kelimesinden bahsetti. Bu öneriye hayret ederek, "kolay" kelimesini doğru yazmanın kolay olmadığını anlayacaksınız. "Kolay" a dikkat edin.


Statik olanların artıları ve eksileri dinamik sistemler tipleştirme hala iğrenç vivcheni, ancak pis koku, belirli bir görev için delice ortalıkta yatıyor.


JavaScript, robotun devam etmesine yardımcı olur, ancak kör dönüşüm anlamına gelmez ("a" + 1 karesinde "a1" verir). Python muhafazakar olma eğilimindedir ve "a" + 1 durumunda olduğu gibi sık sık afları döndürür.


Farklı güvenlik düzeyleriyle farklı yaklaşımlar kullanın, ancak Python ve JavaScript dinamik olarak yazılan dillerdir.



Haskell, tamsayıların ve değişkenlerin, cym'den önce açıkça dönüştürülmeden katlanmasına izin vermez. Сі і Haskell, bu kadar büyük çeşitliliğe hayret etmeden, statik olarak yazılmış olmaktan rahatsız.


Є dinamik ve statik dilin kişisel olmayan varyasyonları. İster "statik hareket daha güzel, daha düşük dinamik, eğer X sağda duruyorsa" zihne savunmasız bir şekilde asılıyor olsun - cenin delilik olduğu garanti edilebilir. Belirli dillere sadık kalabilirsiniz veya "X sağdaysa Haskell daha iyi, daha düşük Python," diyebilirsiniz.

Statik tiplendirme sistemlerinin çeşitliliği

Statik olarak yazılmış iki ünlü mov örneğine bir göz atalım: Go ve Haskell. Go yazma sisteminde tanımlanmış türler, "parametreler" ve diğer türlerden türler yoktur. Örneğin, MyList listeleri için kendi türünüzü oluşturabilir, bizim için veriye ihtiyacınız varsa kaydedebilirsiniz. MyList çıkış kodunu değiştirmeden MyList tam sayıları, MyList'te satırlar vb. oluşturabilmek istiyoruz. Yazmaktan derleyici sorumludur: çünkü MyList bir tam sayıysa ve kasıtlı olarak bir satır eklersek, o zaman yazma programından derleyici sorumludur.


Go, MyList'te tipi ayarlamak imkansız olacak şekilde özel olarak tasarlanmıştır. Yapabileceğiniz en iyi şey, MyList için "boş arabirimler" oluşturmaktır: MyList nesneler yaratabilir, ancak derleyici onun türünü bilmez. MyList'ten nesnelere ihtiyacımız varsa derleyici tipini kontrol etmemiz gerekir. "Arka arkaya uzanıyorum" dediğimiz gibi, ancak bu doğruysa, bu bir sayıysa, o zaman dinamik konuşmaları olan bir vipadka gibi bir af olacaktır.


Go ayrıca, günümüzün statik olarak yazılan hareketlerinde olduğu gibi (veya 1970'lerin diğer sistemlerine benzer) pek çok kişisel olmayan başka olasılığa da sahiptir. Go'nun yaratıcılarının kararları için kendi nedenleri vardı, ancak bu sürücüden gelen insanların düşüncesi bazen kulağa sert gelebilir.


Şimdi yazım sistemini biraz daha zorlayabilecek olan Haskell'e bir göz atalım. MyList türünü belirtirseniz, sayı listesinin türü basitçe MyList Integer olur. Haskell bir listeye satır eklememize ve yeniden sıralamamıza izin vermiyor, bu nedenle listedeki bir öğeyi satır değişikliğine sığdıramıyoruz.


Haskell, orta tipler olmadan zengin bir şekilde katlanabilir fikirleri ifade edebilir. Örneğin, Num a => MyList a, "Listem, bir tür sayıyı temsil eden bir değerdir" anlamına gelir. "ів, float"ів tamsayılarının bir listesine sahip olabilirsiniz veya onlarca sayı sabit bir doğrulukla, ancak herhangi bir istisna olmaksızın, derleme sırasında değiştirilen satırların bir listesi olmayacaktır.


Herhangi bir sayı türüyle çalışan bir toplama işlevi yazabilirsiniz. Bu işlev, mate türünde Num a => (a -> a -> a) şeklindedir. Tse'nin anlamı:

  • a sayısal bir tür olabilir (Num a =>).
  • İşlev, a türünden iki argüman alır ve a türünü (a -> a -> a) dönüştürür.

Kalan örnek. İşlev türü String -> String ise, bir satırı alır ve bir satırı döndürür. Alternatif olarak, eğer String -> IO String ise, ayrıca bir giriş/görünüm vardır. Ayrıca diske indirebilir, ölçebilir, terminalden okuyabilir vb.


Bir işlevin bir türü olduğu gibi hayır G/Ç, herhangi bir G/Ç işlemi gerçekleştirmeyeceğini biliyoruz. Örneğin, bir web barındırıcısında, yalnızca türe bakarak hangi işlevin veritabanını değiştirdiğini anlayabilirsiniz. Aynı dinamik ve mayzhe nіyakі statik film aynı şekilde yapılamaz. En gelişmiş tipleştirme sisteminden hareketin özelliği nedir?


Çoğu harekette, veri tabanını neyin değiştirdiğini öğrenmeye çalışırken, işlevleri ve tüm işlevleri, seslerin çağrılması vb. Gibi sıralama şansımız oldu. Affetmenin kolay olduğu maliyetli bir süreç. Ve Haskell'in tip sistemi bir gıda zincirinde kullanılabilir, bu garanti edilir.


Bu gerilimi, MyList'in basit fikri için yapıcı olmayan, "iki argüman alan ve aynı türden aşağılayıcı sayıların kokan bir işlevi ve giriş / girişin nasıl soyulacağı" gibi görünmeden Go ile eşitleyin. ."


Go programı, Go programlama araçlarını yazmanın basit bir yoludur (programlama, derleyicinin uygulanması basit olabilir). O zamana kadar daha az kavram öğrenmek gerekiyor. Qi perevagi gibi, önemli değişimler - sübjektif gıda ile dengelenebilir. Ancak Haskell'in Go'dan daha önemli olduğu, Haskell'in tip sisteminin çok daha sıkı olduğu ve Haskell'in derleme sırasında çok daha fazla hata tipinden yararlanabileceği iddia edilemez.


Bir "statik mov" sınıfında gruplanan Go ve Haskell farklı movs, terimin doğru yazıldığından bağımsız olarak Umman'a tanıtılabilir. Güvenliğin pratik avantajlarını ortadan kaldırmak için Go, Haskell'e kadar dinamik hareketlere daha yakın.


Diğer taraftan deyakі dynamіchnі movi є bezpechnіshimi, nіzh deyaki static movi. (Python genel olarak daha güvenli, daha düşük C olarak kabul edilir). Bir grup gibi statik veya dinamik hareket hakkında çalışmak istiyorsanız, hareketler arasındaki otorite sayısının büyüklüğünü unutmayın.

Tiplendirme sistemleri yeteneklerinin somut uygulamaları

Daha sıkı tipleştirme sistemlerinde, daha kuru eşdeğerlerin mübadelesini belirtmek mümkündür. Kіlka'nın ekseni uygulanır, ancak cehaletin sözdizimi olarak içlerinde döngülere girmeyin.


Go ile "ekleme işlevi iki tamsayı alır" ve bir tamsayıyı döndürür" diyebilirsiniz:


func add(x int, y int) int ( dönüş x + y )

Haskell'de "işlev kabul et" diyebilirsiniz gibi ol aynı türden bir sayıyı dönüştüren sayısal tür":


f:: Num a => a -> a -> a ekle x y = x + y

Idris, "işlev iki tam sayı kabul eder" diyebilir ve bir tam sayıyı döndürür, aksi takdirde ilk bağımsız değişken, diğer bağımsız değişken için küçük olanı suçlar":


ekle: (x: Nat) -> (y: Nat) -> (otomatik küçültme: LT x y) -> Nat x y = x + y ekle

İlk bağımsız değişkenin diğerinden büyük olduğu add 2 1 işlevini denerseniz, derleyici programı sonlandırır. derleme saatinin altında. İlk bağımsız değişkeni diğerinden daha büyük yapan bir program yazmak imkansızdır. Rіdkіsna mova böyle bir olasılık olabilir. vikonann: sadece örneğin if x >= y: rise SomeError() yazdık.


Haskell'de bu türün bir muadili yoktur, tıpkı Idris uygulamasında daha fazlası olduğu gibi ve Go'nun da Haskell uygulaması veya Idris uygulamasının bir muadili yoktur. Özetle, Idris anonim böcekleri yenebilir, böylece Haskell'i yenemez ve Haskell aptal böcekleri yenebilir, böylece Go'yu anmaz. Her iki yönde de ihtiyacınız var ek yetenek tipleştirme sistemleri, sanki dil katlamasını kırmak istercesine.

Bazı statik hareketler için tiplendirme sistemleri

Eksen, artan sıkılık sırasına göre deyaky mov tipleştirme sistemlerinin kaba bir çevirisidir. sana bir liste vereceğim tanıtım sistemlerin sıkılığı hakkında, yeni bir mutlak hakikat düzeyine getirilmesi gerekli değildir. Bir grupta seçilen hareketler tek tek şiddetle rahatsız edilebilir. Cilt tipleme sisteminin kendi sorunları vardır ve bunların çoğu daha karmaşıktır.

  • C (1972), Git (2009): Belirtilen türler belirtilmeden sistemin numarasına basılmasına gerek yoktur. "Tam sayılar listesi", "satırlar listesi" vb. anlamına gelen MyList türünün belirtilmesi mümkün değildir. Natom_st, "önemsiz değerlerin bir listesi" olarak çalışır. Programcı, satır listedeyse, arada sırada "satır listesini" manuel olarak yeniden ziyaret etmekten suçludur ve sonraki saat için onu affedebilirsiniz.
  • Java (1995), C# (2000): Filmin suçları ağırlaştırılmış türlerle desteklenmiştir, peki ne diyebilirsiniz MyList hangi derleyici hakkında bildiği ve daha fazla tür kuralı için takip edebileceği bir satır listesi var. Listedeki öğeler String türünde olacaktır, derleyici her zaman olduğu gibi derleme sırasında kuralları zorlayacaktır, bu nedenle derleme sırasında aflar daha küçüktür.
  • Haskell (1990), Rust (2010), Swift (2014): Hepsi, ortak türler, cebirsel veri türleri (ADT'ler) ve tür sınıfları veya benzerleri (açıkça sınıf türleri, işaretler (özellikler) ve protokoller) dahil olmak üzere biraz karışık olasılıklara sahip olabilir. Rust ve Swift popülerdir, daha az Haskell ve daha popüler kuruluşlardır (tabii ki Mozilla ve Apple).
  • Ağda (2007), İdris (2011): Tsі movi pіdrimuyut bayat tipi, kshtalt "işlevinde tip oluşturmanıza olanak tanır, yak iki tam sayı kabul eder x і y, de y daha fazla, daha düşük x". Navit obezhennya "y daha düşük x" derlenirken zorlanır. Vikonanna y olduğunda, ne olursa olsun, chi one x'ten daha azı olmayacak. Daha da ince ama daha önemli güç sistemleri kendi dillerinde statik olarak çarpıtılabilir. Halihazırda çok az programcı var, ancak yine de onlardan büyük bir coşku duyuyorlar.

Geleceğin tipleştirme sistemlerinde, özellikle de mov'un popülaritesine göre değerlendirildiğinde ve mov'un temelinin basit gerçeğiyle değil, açık bir kopuş var. Vіdomy vynyatok - tse Go, statik mov vvazhayut yogo croc'da neden çok sayıda bağımlı olduğunu açıklıyor.


İkinci grup (Java ve C#) - ana akım filmler, zrіlі ve yaygın olarak hindiba.


Üçüncü grup, Mozilla (Rust) ve Apple'ın (Swift) büyük desteğiyle ana akıma girmenin eşiğinde.


Chotiri grubu (İdris ve Ağda) ana akımdan uzak ama saate göre değişebilir. Film grubu üç boules ana akımdan on yıl önce uzakta.

suvora türü- dil programlamada kazanan veri türleri ile çalışma politikası seçeneklerinden biri.

Suvora typіzatsіya vykonannya saldırgan obov'yazykovyh zihinlerini aktarıyor:

  1. Dilimde bir veri nesnesi (değişmiş, sabit, viraz) olup olmadığı, programları derlerken sabitlenen (statik tipleştirme) ve her saat yazıldığında belirlenen (dinamik tipleştirme) bir suvoro şarkı söyleme türüdür. .
  2. Sadece değiştirilenlerle tamamen aynı veri türü olabilecek değerlerin değiştirilmesine izin verilir, aynı değişim, parametrelerin nasıl aktarılacağı ve fonksiyonların sonuçlarının döndürüleceği şekilde yapılabilir.
  3. Cilt cerrahisi aynı tipte parametreler gerektirecektir.
  4. Türlerin örtülü dönüştürülmesine izin verilmez (bu nedenle çevirmen, sözdizimsel bir af olarak bir değişiklik, parametre, işlev veya işlem açıklamaları gibi yanlış türdeki bir değeri dönüştürmeye çalışıp çalışmadığını kabul edecektir).

Kesin dotrimannі ile suvoro ї typіzatsії navіt vіnі vіdnі vіdnі vіdnі v znachenі і tip іnі є deli gibi kabul edilebilir operasyonlar olabilir. Programın bir veri türünün değerini farklı bir türe ataması gerekiyorsa, bu yapılabilir, ancak yalnızca bir türü dönüştürmek için özel bir işlemin açıkça ayarlanması şeklinde, bu gibi durumlarda olduğu gibi, kulağa bir parçası gibi geliyor. programlama (yapabilirseniz, resmi olarak, ancak bir standart olamazsınız).

Bir pratik vykoristovuvan mov programlama zі katı tipіzatsієyu - tse Ada. Tamamlanması gereken çok sayıda daha geniş dil programı ve katı olmayan bir statik yazım vardır. Bu tür hareketlere, örneğin Pascal, Modula-2, Java. Değişiklik türlerinin, parametrelerin ve işlevlerin dile özgü bir açıklaması varsa ve dolaylı olarak türlere izin verilirse - farklı durumlarda, bir türün değeri başka bir değişikliğe atanırsa, derleyici otomatik olarak aşağıdakiler için bir dönüştürme kodu üretir: gerekli türün değeri, böylece yalnızca bu tür dönüştürme yapılmaz. Bu nedenle, örneğin, bir tam sayıya bir değişiklik atanabilir, kayan bir nokta ile bir sayı gibi seslendirilebilir ve türün açık bir şekilde azaltılması olmadan bir dönüş atanabilir, çitle çevrilir, yüksek taklitli kırıklar affedilir. . Deyakі movi, yakі resmi olarak veri türünü anlıyor, gerçekten tipsiz olarak kabul edilebilir. Bu tür hamlelerden önce klasik C tanıtılır ki bu durumda tipler seslendirilse ve gerekli olsa da aslında atamalar için tüm veri tipleri toplanmıştır (mevcut C derleyicileri bu serbestlik arasındadır ve en az ilerlemeyi görürler). türlerin güvenli olmayan dönüşümleri durumunda).

Programlama teorisinde tipleştirme, geliştirmenin güvenilirliğini sağlamanın vazgeçilmez bir unsurudur. program katkıları. Doğru zastosuvanni ile (aktarılanlar, programda seslendirilenler ve kötü niyetli olanlar, mantıksal olarak çılgın değerler için veri türleri için kullanılır), programcıyı aşağıdakilerin neden olduğu basit ama önemli aflardan koruyacaktır: uyuyan zaferler bazı insanların basitçe basit bir yazım hatasıyla suçladığı mantıksal olarak çılgınca anlamlar. Bununla birlikte, benzer aflar, programların derlenmesi aşamasında daha da fazla görünür, ancak, pratik olarak herhangi bir türün birbirine örtülü olarak indirgenmesi olasılığı nedeniyle (örneğin, klasik Cі dilinde olduğu gibi), cі aflar yalnızca test için görünür, ayrıca, toplam obsya ve vіdrazu'da. Öte yandan, pek çok profesyonel programcı її elverişsizlik yoluyla katı yazmayı sevmez - daha fazla program ve daha fazla yazma saati olacak, bu da zayvim için daha zengin olan daha gerçek dünya kod işlemi anlamına gelir.

  • Dinamik yazım, dil programlamasında ve dil belirtiminde yaygın olarak kullanılan bir tekniktir, değiştiğinde, değişikliğin seslendirildiği sırada değil, değerin ayarlandığı andaki türle çağrılır. Bu sıralamada, farklı bayiliklerde, program aynı ve farklı tiplerde değer değiştirebilir. Uygulamalı dinamik yazma - Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Lisp, xBase, Erlang, Visual Basic.

    Protilezhny alımı - statik tipleme.

    Zayıf dinamik tiplemeye sahip bazı hareketler, değerlerin eşitlenmesi sorununa sahiptir, bu nedenle, örneğin PHP, "==", "!=" ve "===", "!==", başka bir çift eşitleme işlemine sahip olabilir. değerleri eşitleyen işlemler, bu tür yılanlar. "===" işlemi, hangi tür kullanılırsa kullanılsın, "==" görünümünde yalnızca tam çalıştırma durumunda doğru verir: (1=="1"). Bunun, kafa tarafından dinamik tipleştirme ve belirli hareket programlama sorunu olduğuna dikkat edilmelidir.

Po'yazanі anlayışı

Mova programlama - kayıt için tanınan resmi dil bilgisayar programları. Dil programlama, tanımlayan bir dizi sözcüksel, sözdizimsel ve anlamsal kural tanımlar. eski görünüm programlar ve podії, kerіvnitstvom altında yakі vikonaє vykonavets (ses - EOM).

Movi programlamada sözdizimsel şeker (eng. sözdizimsel şeker) - ce sözdizimsel fizibilite, zastosuvannya programların bu tür gömme davranışları, ancak vikoristannya movi zruchnіshim'i insanlar için soymak.

Güç - şarkı türünün değişimini taklit eden nesnenin dahili durumuna erişmenin bir yolu. Nesnenin gücüne dönmek, yapısal alana dönmekle aynı görünür (yapısal programlamada), ancak aslında bir hızlı tıklama işlevi aracılığıyla uygulanır. Denediğinizde, değeri girin verilen güç bir yöntem çağrılır ve bu gücün anlamını bulmaya çalışırken - diğeri.

Genişletilmiş Backus formu - Naur (genişletilmiş Backus - Naur formu (RBNF)) - bir sözdizimsel kategorinin diğerleri aracılığıyla art arda atandığı resmi bir sözdizimi atama sistemi. Bağlama özgü resmi gramerlerin açıklaması için zafer. Niklaus Wirth tarafından yayıldı. Bekus-Naur formlarının genişletilmiş yeniden işlenmesiyle, aynı bina çeşitliliği ile sorulmasına izin veren daha büyük "yarı" yapılarla BNF'ye dahil edilirler ...

Uygulamalı programlama, programların sistematik olarak bir nesneyi diğerine değiştirecek şekilde yazıldığı bildirimsel programlama türlerinden biridir. Bu tür bir durgunluğun sonucu, zastosuvannia'da bir işlevin rolü ve ayrıca bir argüman vb. Olarak yer alabilen yeni bir nesnedir. Amaç, programı matematiksel olarak açık bir şekilde yazmaktır. Bir işlevin bir viraz ile gösterilmesi, işlevlerin farklı bir anlamının - işlevsel ...

Birleştirmeli dil programlaması, koddaki iki parçanın birleştirilmesinin bileşimini değiştirmesi gerçeğine dayanan ana dil programlamasıdır. Böyle bir dilde, bağımsız değişken işlevlerinin örtük olarak eklenmesi (div. anlamsız programlama) yaygın olarak kullanılır, yeni işlevler, işlevlerin bileşimi olarak tanımlanır ve uygulamanın değiştirilmesi birleştirilir. Bu yaklaşım, uygulamalı programlamaya karşıdır.

Değişim - fiziksel veya soyut bir sistemin, kural olarak kendi sayısal değerini değiştirebilen bir özelliği. Değişim kavramı matematik, doğa bilimleri, teknoloji ve programlama gibi çevrelerde yaygın olarak kullanılmaktadır. Değiştirilebilir uçlar şunlar olabilir: sıcaklık kontrolü, fonksiyon parametresi ve daha fazlası.

lіngvіstitsі ve іnformatіcі'da sözdizimsel analiz (abo ayrıştırma, jargon ayrıştırma ← İngilizce ayrıştırma) - lіnіynoї poslіdovnostі lexemes (slіv, tokenіv) doğal veya resmi dili biçimsel dilbilgisi ile ayarlama süreci. Sonuç, bir ayrıştırma ağacıdır (sözdizimsel ağaç). Sözlüksel analiz ile aynı anda ses zastosovuєtsya.

Genelleştirilmiş cebirsel veri türü (GADT), oluşturucusunun kendisiyle ilişkili olmayan bir değeri dönüştürebilmesiyle karakterize edilen cebirsel veri türlerinin türlerinden biridir. Orta tarihöncesi nadas türlerinin tümevarımsal aileleri hakkında bir parça çalışmayla tasarlandı.

Programlamada anlambilim, resmi matematiksel modellerini desteklemek için mov programlama tasarımının anlamının resmileştirilmesini geliştiren bir disiplindir. Bu tür modelleri teşvik etmek için araçlar olarak, çeşitli örnekler kullanılabilir, örneğin matematiksel mantık, λ-sayı, çokluk teorisi, kategori teorisi, model teorisi, evrensel cebir. Film programının semantiğinin biçimlendirilmesi, filmi tanımlamanın, filmin gücünü ifade etmenin bir yolu olarak kullanılabilir.

Nesne Yönelimli Programlama (OOP), nesnelerin bütünlüğüne, birinci sınıfın herhangi bir örneğiyle dış görünüme bakan ve sınıfın bozulma hiyerarşisini karşılayan sunulan programlara dayalı bir programlama metodolojisidir.

Dinamik değişim - programda değişiklik, yerleştirme operasyonel hafıza pіd yaku vіdіlyaєtsya pіd hіkonannya programı. Nitekim hafıza yok, bir saatlik robotik programların altında belirli amaçlara yönelik bir programlar sistemi var. Tsim vіdіznyаєtsya vіd globalі ї staticії zminnoї - dilyanki pomyatі, program sistemi tarafından robotik programın koçanından önce belirli amaçlar için görüldü. Dinamik değişim - değişim belleği sınıflarından biri.

Gerekli minimum sessiz konuşmaların intikamını almak için, dinamik yazmaya kötü dememek için yazmayı bilmek gerekli olduğundan, Lisp - yazılmamış benim ve C - benim katı tiplemem.

En son sürümde, her tür türün bir rapor açıklaması, koda uygun baharatlar, popüler filmler ve programlama ve ekran resimleri hakkında mesajlar vardır.

Makalenin kısa versiyonunu tersten okumanızı ve ardından alt satırda okumanızı tavsiye ederim.

Kısa versiyon

Yazarak film programlamanın iki büyük kampa ayrıldığı kabul edilir - yazarak ve yazmayan (türlenmemiş). İlk örnek C, Python, Scala, PHP ve Lua, ikincisi ise birleştirici dil olan Forth ve Brainfuck.

Yani, sütü için bir "hayvan tipi" olarak, bir mantar kadar basittir; Ve filmin tipleştirme ekseni, değiştirilen daha fazla kategoriye bölünmüştür:

  • Statik/dinamik yazım. Son değişiklik türlerinin ve işlevlerin derleme aşamasında yüklenmesi gerçeğiyle statik olarak belirlenir. Toto. derleyici zaten ne tür bildiğinizden %100 emin. Dinamik tiplemede, tüm tipler zaten programın sonunda z'yasovyatsya'dır.

    Uygulamak:
    Statik: C, Java, C#;
    Dinamik: Python, JavaScript, Ruby.

  • Güçlü/zayıf tipleştirme (katı/katı olmayan olarak da adlandırılır). Güçlü bir tipleştirme görülür ki, dil farklı türler içinde karışmaya izin vermez ve otomatik örtük dönüşümü kazanmaz, örneğin kişiliksiz olanı görmek imkansızdır. Zayıf bir tipleştirmeye sahip filmler, herhangi bir örtülü değişiklik olmaksızın otomatik olarak değiştirilebilir, bu nedenle doğruluk kaybı olabilir veya dönüşüm belirsiz olabilir.

    Uygulamak:
    Güçlü: Java, Python, Haskell, Lisp;
    Zayıf: C, JavaScript, Visual Basic, PHP.

  • Açık/örtük yazım. Açıkça yazılan hareketler, yeni değişiklik/işlevlerin/bağımsız değişkenlerin türünün açıkça ayarlanması gerektiğinden sunulur. Açıkçası, örtülü yazım içeren film, derleyiciye/tercümana aktarılır.

    Uygulamak:
    Yazılım: C++, D, C#
    Örtülü: PHP, Lua, JavaScript

Ayrıca, tüm kategorilerin birbirinin yerine geçebileceğini de belirtmek gerekir, örneğin, C dili statik olarak zayıf, açıkça yazılabilir ve dil dili Python - dinamik olarak güçlü, dolaylı olarak.

Bir gecede buvaє mov zі staticї ve dynamіchnї typіzatsiy değil. Burada ne hakkında yalan söylediğimi önceden söylemek istiyorum - pis koku doğru, ama başka bir şey hakkında.

Ayrıntılı sürüm

Kısa bir versiyon gibi, iyi iş çıkardın, iyi. Boşuna değil, rapor mu yazıyorum? Golovne, kısa versiyonda tüm bayat ve sirk bilgilerini içermenin imkansız olduğunu, ancak onu zorlamadan okuyabilmeniz için uzun süre rapor etmenin mümkün olacağını söyledi.

Tipsiz tipleme

Tipsiz dil programlarında, tüm günler farklı günler olan vuruş dizileriyle girilir.

Tipsiz tipleştirme, düşük seviyeli (assembler dili, Forth) ve ezoterik (Brainfuck, HQ9, Piet) dile tanıdık geliyor. Bununla birlikte, içinde nedolіkami sırasına göre, є deakі perevagi.

Perevagi
  • Marjinal olarak düşük bir seviyede yazmanıza izin verir, ayrıca derleyici / yorumlayıcı herhangi bir tür kontrolünden etkilenmez. Vіlnі robiti be-yakі be-yakim veri türleri üzerindeki işlemler.
  • Seçimi kaldırma kodu kulağa etkili gelecektir.
  • Vkazivok'un saydamlığı. Dil bilgisi ile bir sonraki kodun ne olduğu konusunda hiçbir şüphe yoktur.
Nedoliki
  • Katlama Genellikle listeler, satırlar ve yapılar gibi verilen karmaşık değerlere olan ihtiyaçtan sorumlu tutulur. Іz cim, teslim olmamakla suçlanabilir.
  • Vіdsutnіst perevіrok. Be-yakі bezgluzdі dії, örneğin dizideki vіdnіmannya pokazhchika іz sembolü vvazhatimuetsya tsіlkom normal, scho zor aflar getirebilir.
  • Düşük soyutlama. Katlanan veri türüne sahip bir robot, oluşturulması son derece zor olan, sayıları olan bir robota hiç benzemez.
Tipsiz tipleme güçlü müdür?

Evet evet evet. Örneğin, mov birleştiricide (x86 / x86-64 mimarisi için, diğerlerini bilmiyorum) programı birleştirmek mümkün değildir, bu nedenle cx kaydında (16 bit) rax kaydından veri yakalamayı deneyebilirsiniz. (64 bit).

hareket cx,eax; pardon saat meclisi

O zaman git, asemlerdeki tip nedir? Birkaç revizyon olmasını önemsiyorum. Ve senin düşüncen, zvіsno, senden daha az uzan.

Statik ve dinamik tipleştirme

Statik (statik) tipleştirmeyi, türlerin tüm yeniden kontrollerinin yazma aşamasında değil derleme aşamasında kontrol edildiği dinamik (dinamik) olarak gören Golovne.

Deyakim insanları, statik tiplemenin çok küçük olduğunu (aslında, öyle, birçok insan uzun zamandır bu tür yöntemlerden yardım istiyor) kaçabilir. Deyakim, scho dinamik olarak tipikleştirilmiş film - tse gra z fire, ama onları nasıl görebilirsin? Bir nedenden dolayı şansı göremiyor musun? Neden olmasın, neden bu kadar çok statik ve dinamik olarak yazılmış mov?

Hadi bir bakalım.

Statik yazmanın avantajları
  • Tip revizyonları sadece bir kez yapılır - derleme aşamasında. Ve bu, sayıyı arka arkaya eklemeye çalışmazsak (ve bir af görün, aksi takdirde bir değişiklik yaparız) hızlı ileri almamıza gerek kalmayacağı anlamına gelir.
  • Shvidkіst vykonannya. Önceki noktadan, statik olarak yazılan filmlerin pratik olarak daha dinamik olarak yazıldığı açıktır.
  • Deyakih dodatkovyh zihinleri için zaten derleme aşamasında potansiyel afları göstermenize izin verir.
Dinamik tipleştirmenin avantajları
  • Evrensel koleksiyon oluşturmanın basitliği, her şeyin ve her şeyin bir kombinasyonudur (nadiren böyle bir ihtiyaç suçlanır, ancak suçu dinamik tipleştirmeye atarsanız, bunu yapabilirsiniz).
  • Gelişmiş algoritmaların açıklama kolaylığı (örneğin, bir diziyi kural olarak yalnızca tamsayılar listesinde değil, aynı zamanda konuşma numaraları listesinde ve satırlar listesinde de sıralamak).
  • Ustalaşması kolay - dinamik yazım özelliğine sahip filmler, programlama yapmak isteyenler için daha da iyi ses verir.

Güncellenmiş programlama

Güzel, dinamik yazım için en önemli argüman, karmaşık algoritmaların tanımının netliğidir. Kendi problemimizi bulalım - bir tamsayı dizisi, bir konuşma dizisi ve bir sembol dizisi için kaç dizi (veya liste) arayacak bir işleve ihtiyacımız var.

Nasıl її virishuvatememo yaparız? Virishimo її 3 farklı dil: biri dinamik tipleme ve ikisi statik.

Şaka amaçlı algoritma, en basitlerinden birini alacağım - numaralandırma. İşlev, aranacak öğeyi, dizinin kendisini (veya listeyi) ayarlamak ve öğenin dizinini döndürmektir, aksi halde, öğe bilinmediğinden - (-1).

Dinamik çözüm (Python):

Def find(required_element, list): for (index, element) in one (liste): if element == gerekli_element: dönüş indeksi dönüş (-1)

Yak bachite, her şey basit ve günlük problemler s scho, scho liste herhangi bir sayıda, herhangi bir listede yer alabilir, başka dizi olmasa bile. İyi gibi. Devam edelim - C'deki görevi görelim!

Statik çözüm (Сі):

unsigned int find_int(int gerekli_element, int dizisi, unsigned int size) ( for (unsigned int i = 0; i< size; ++i) if (required_element == array[i]) return i; return (-1); } unsigned int find_float(float required_element, float array, unsigned int size) { for (unsigned int i = 0; i < size; ++i) if (required_element == array[i]) return i; return (-1); } unsigned int find_char(char required_element, char array, unsigned int size) { for (unsigned int i = 0; i < size; ++i) if (required_element == array[i]) return i; return (-1); }

Dış görünüm işlevi, Python'un 3. sürümüne oldukça benzer, ancak neden üç tane var? Statik programlama başarısız oldu mu?

І çok і ні. Bir tanesine hemen bakabileceğimiz birkaç programlama yöntemi vardır. Buna yabancı programlama denir, bu C++ dili haince desteklenir. Yeni sürüme bir göz atalım:

Statik çözüm (daha gelişmiş programlama, C++):

Şablon işaretsiz int bul(T gerekli_element, std::vector dizi) ( for (işaretsiz int i = 0; i< array.size(); ++i) if (required_element == array[i]) return i; return (-1); }

Dobre! Python'daki alt sürüm çok tutarlı görünmüyor ve aynı zamanda çok fazla yazma şansım olmadı. Ek olarak, görevin tamamlanması için gerekli olan yalnızca üç dizi için değil, tüm diziler için uygulamayı kaldırdık!

Bu sürüm, gerekli olanlara benzer - dinamik olanın artılarını ve statik yazımlarını ve aktif artılarını hemen alacağız.

Harika, ne mümkün olabilir, ama belki daha güzel. Daha gelişmiş programlama akıllı ve güzel olabilir (örneğin, daha fazla Haskell ile). Başka bir şekilde, daha karmaşık programlamaya ek olarak, polimorfizmi (sonuç daha yüksek olacaktır), işlevleri (benzer şekilde) veya makroları gözden geçirmek de mümkündür.

Statik ve dinamik

Ayrıca, ne kadar çok statik dilin dinamik yazmayı kazanmanıza izin verdiğini tahmin edin, örneğin:

  • C#, dinamik sözde türü destekler.
  • F#, bir operatör gibi sözdizimsel kodu destekliyor mu?
  • Haskell'in dinamik yazımı Data.Dynamic modülü tarafından sağlanmaktadır.
  • Delphi - özel Varyant türünün yardımı için.

Ayrıca, bir filmi dinamik olarak yazma eylemleri, statik yazmanın yardımıyla hızınızı artırmanıza olanak tanır:

  • Common Lisp - tür bildirimleri.
  • Perl - sürüm 5.6, dosit obzhezheno.

Güçlü o zayıf tiptir

Güçlü bir tipleştirmeye sahip filmlerin virazlarda farklı türlerin günlük doğasını değiştirmesi ve günlük otomatik dönüşümleri kazanması imkansızdır. Ayrıca "Suvoroy Typization'dan Movi" olarak da adlandırılırlar. Bunun İngilizce karşılığı güçlü yazımdır.

Zayıf yazılmış mov, navpak, spriyat her şey, böylece programcı farklı türleri tek bir şekilde değiştirdi ve derleyicinin kendisi her şeyi tek bir türe getirdi. Ayrıca "suvoroy olmayan tiplemeli filmler" olarak da adlandırılırlar. Bunun İngilizce karşılığı zayıf yazımdır.

Zayıf tipleme genellikle dinamik ile karıştırılır, durum böyle değildir. Dinamik olarak yazılan dil, zayıf ve güçlü bir şekilde yazılabilir.

Bununla birlikte, çok az kişi tipleştirme titizliğinin önemini bilir. Genellikle bir dilin statik olarak yazıldığı belirtilir, bu durumda derleme için sınırsız potansiyel af kullanabilirsiniz. Yalan söyle!

Mova, anne ve güçlü tiplemeden suçludur. Ve derleyici size af hakkında bilgi verirse, sadece sayıya bir satır ekleyecektir, aksi takdirde daha yüksektir, birden başka bir dizi görüyoruz, bizim için ne kadar iyi, tüm "yeniden doğrulamalar" ne türleri derleme aşamasında olacak? Bu doğru - zayıf olan statik tipleme daha güçlüdür, düşük olan güçlü dinamiktir! (Eh, bu benim düşüncem)

Öyleyse neden zayıf tiplerin artıları yok? Böyle görünmek mümkün, güçlü bir tiplemeye sıkı sıkıya uyduğumu söyleyenlere saygı duymamak, zayıfların aynı perevaga sahip olmasını beklemekten suçluyum.

Nasıl olduğunu bilmek ister misin?

Güçlü tipleştirme belirtileri
  • Nadіynіst - Yanlış davranışın en doğal örneği olan derlemenin affedilmesinin suçunu üstleniyorsunuz.
  • Shvidkіst - zamіst prihovannyh rework, yakі vitratnymi ile yapılabilir, güçlü typeіzієyu açıkça їх yazmak gerekir, scho zamushuє programcısı minimum olarak tsya dilyanka kodunun povilnoy olabileceğini bilir.
  • Robotlar ve programlar hakkında bilgi - yine, örtük türlerin değiştirilmesi, programcı her şeyi kendisi yazar, bu da yaklaşık olarak zeka anlamına gelir, sıra ve sayı hizalamasının çekici görünmediği anlamına gelir.
  • Randevu - dönüşümü elle yazarsanız, neyi neye dönüştürdüğünüzü tam olarak bilirsiniz. Böylece, bu tür dönüşümlerin doğruluk israfına ve hatalı sonuçlara yol açabileceğini her zaman bileceksiniz.
Zayıf tipleştirmeler
  • Karışık dizelerin zaferlerinin çok yönlülüğü (örneğin, z tsilih chi konuşma sayıları).
  • Tipleştirme şeklinde soyutlama ve görevlere odaklanma.
  • Kısa bir not.

Harazd, ortaya çıktık, zayıf tipografide, yani perevagi'de ortaya çıkıyoruz! Ve zayıf bir tipin artılarını güçlü olana aktarmanın yolları nelerdir?

Görünüyor, є iki geziyorum.

Belirsiz olmayan durumlarda ve veri kaybı olmadan örtük tür azaltma

Uh ... Uzun bir paragrafı bitirin. "Obmezhene örtük dönüşüm" için hızlı bir yoga vereyim

Durum açık; Eksen, örneğin iki sayının toplanması kesin bir durumdur. Ve sayının bir diziye dönüştürülmesi nі (bir öğeden bir dizi oluşturmak mümkündür, bu kadar uzun bir süre ile bir dizinin kilitleme için öğeleri doldurması mümkündür ve sayıyı dönüştürmek mümkündür. bir satıra ve ardından bir sembol dizisine).

Verilerin dönüşü daha da basittir. Sayıdaki 3.5 konuşma sayısını nasıl dönüştürebiliriz - verilerin bir kısmını harcayacağız (aslında işlem belirsizdir - yuvarlama nasıl yapılacak? Büyük tarafta mı? Küçük tarafta mı?

Belirsiz durumlarda reenkarnasyon, yani ikinci verilerle yeniden yapılanma - daha iyi, daha kötü. Programlama için özel bir şey yok.

Bana inanmıyorsanız, PL/I dilini okuyun veya sadece bu belirtimi arayın. Yenisi, TÜM veri türleri arasında dönüşüm kurallarına sahiptir! Bu sadece cehennem!

Harazd, örtük dönüşümün dönüşümünü düşünelim. Hareket ne? Örneğin, Pascal'da tam sayıyı konuşmada çevirebilirsiniz, ancak yanlış şekilde çeviremezsiniz. Benzer mekanizmalar C#, Groovy ve Common Lisp'tedir.

Garazd, güçlü bir dilden zayıf bir türden birkaç artı almanın başka bir yolu olduğunu gösterdim. Ve böylece şarap, yapıcıların polimorfizmi olarak adlandırılır.

Yogayı Haskell'in mucize filmi uygulamasında anlatacağım.

Polimorfik oluşturucular, sayısal sabit değerlerin kullanıldığı saat için gerekli olan çoğunlukla güvenli örtük dönüştürme olan ihtiyati sonuçları doğruladı.

Örneğin, pi + float(1) yerine pi + 1.0 yazmak istemezsiniz. Sadece pi + 1 yazmak istiyorum!

Haskell'de bozuldu, çünkü sabit değer 1'in belirli bir türü yok. Fiyat nіle, nі konuşma, nі karmaşık. Bu sadece bir sayı!

Sonuç olarak, x ila y'deki tüm sayıları (1 artışla) çarpan basit bir x y toplamı işlevi yazarken, sürüm sayısını hesaba katarız - tamsayılar için toplam, konuşma için toplam, rasyonel için toplam, toplam karmaşık sayılar için ve kendi belirlediğiniz tüm sayısal türler için toplam yazın.

Zvichayno ryatuє tsey priyom yalnızca vikoristannі zmіshanih virazіv sayısal değişmezler olduğunda, ancak buzdağının yalnızca görünen kısmı.

Bu şekilde en iyi çıkış yolunun güçlü ve zayıf tipleme arasındaki sınırda denge kurmak olduğunu söyleyebiliriz. Herhangi bir dilin mükemmel dengesine sahip olmadığım sürece, zayıf yazılmış hareketlerden (C, JavaScript, Lua, PHP gibi) ziyade güçlü yazılmış hareketlere (Haskell, Java, C#, Python gibi) daha meyilliyim. ).

Açık ve örtük yazım

Açık tiplendirmeye sahip Mova, programcının sağır edici gibi tüm değişikliklerin ve işlevlerin türünü belirtmekten suçlu olduğunu aktarır. Bunun için kullanılan İngilizce terim açık yazımdır.

Örtük yazım, navpaki, proponuє içeren Mova türleri unutun ve tür tanımını derleyiciye veya tercümana aktarın. örtük yazma anlamına gelen İngilizce terim.

Arkada, örtük tipleştirmenin eşit derecede güçlü dinamik ve açık - statik olduğunu söyleyebilirsiniz, ancak dahası, öyle olmayan şey.

Cilt görünümünün Chi є artıları ve yine chi є їх kombinasyonları і chi є movi z her iki yöntemi de destekliyor mu?

Açık tiplendirmenin avantajları
  • İmzanın dış görünüm işlevinin varlığı (örneğin, int add(int, int)) hangi işlevin çalışacağını kolayca belirlemenizi sağlar.
  • Programcı, belirli bir değişiklikten ne tür bir değer alınabileceğini hemen yazar, bu da hatırlamayı gerekli kılar.
Örtülü yazma özellikleri
  • Kısa not - def add(x, y) açıkça int add(int x, int y)'den daha kısadır.
  • Değişime karşı dirençli. Örneğin, zaman değiştirme işlevi, giriş bağımsız değişkeniyle aynı türe sahipse, açıkça yazılan bir harekette, giriş bağımsız değişkeninin türünü değiştirirken, zaman değiştirme türünün değiştirilmesi gerekli olacaktır.

Güzel, hakaretlerin artılar ve eksiler gibi gelip gittiği açık (ve kimde başka ne var?), o zaman bu iki yaklaşımı birleştirmenin bir yolunu isteyelim!

Vibir'de açık tipleme

Є kısaltmalar için örtük yazım ve tüketim için değer türünü belirleme yeteneği ile taşıyın. Tsey tipi virazu çevirmeni otomatik olarak vivede. Bu hamlelerden biri Haskell, netlik için basit bir örnek vereyim:

Açık tür bildirimi yok add (x, y) = x + y - Açık tür bildirimi add:: (Tamsayı, Tamsayı) -> Tamsayı add (x, y) = x + y

Not: Eğri olmayan bir işlev yazabilirim ve ayrıca daha yaygın add:: (Num a) -> a -> a -> a yerine özel bir imza yazabilirim çünkü Haskell'in sözdizimini açıklamadan bir fikir göstermek istiyorum.

Hm. Yak bachimo, aynı zamanda güzel ve kısa. İşlev girişi, boşluklar dahil satır başına yalnızca 18 karakter alır!

Ancak türün otomatik sarması katlanabilir ve bu kadar havalı bir Haskell dili ile pek iyi çalışmıyor. (Örnek olarak monomorfizme değişiklik getirebilirsiniz)

Kilitleme ve örtülü talep için açık tipleme ile Chi є movi? Kon
kesinlikle.

Seçimde örtük tipleştirme

C++11 (önceki adı C++0x) olarak adlandırılan yeni C++ dil standardı, auto anahtar kelimesini kullanıma sunmuştur, böylece derleyici size türü bağlam dışında girmenizi söyleyebilir:

Muhtemelen: // unsigned int a = 5 yazmak için manuel ekleme; işaretsiz int b = a + 3; // Otomatik sarma tipi unsigned int a = 5; otomatik b = a + 3;

Fena değil. Ale, rekor pek küçülmedi. Yineleyicilerle popoya hayret edelim (anlamıyorsanız, kavga etmeyin, zavodka'nın otomatik vysnovka'ya kaydının zaten hızlı olduğuna saygı gösterdiğinizden emin olun):

// std::vector tipine manuel atama vec = randomVector(30); for (std::vector::const_iterator it = vec.cbegin(); ...) ( ... ) // Otomatik vec türü auto vec = randomVector (otuz); for (auto it = vec.cbegin(); ...) ( ... )

Vay! Eksen kısa. Garazd, ama Haskell ruhuyla nasıl çalışabilirsin, argüman türlerinde ne tür bir değer, neye dönüşecek?

decltype anahtar kelimesini auto ile birlikte kullanarak bu şekilde tekrarlıyorum:

// Manuel tip int bölme(int x, int y) (...) // Otomatik tip otomatik bölme(int x, int y) -> decltype(x / y) (...)

Gösterimin biçimi o kadar iyi olmayabilir, ancak daha gelişmiş programlama (şablonlar/jenerikler) ile birlikte örtülü yazma veya otomatik tür türetme bir div oluşturacaktır.

Bu sınıflandırma için Deyaki film programlama

Popüler filmlerin küçük bir listesini yapacağım ve kokunun "türler" cilt kategorisine nasıl uyduğunu yazacağım.

JavaScript - Dinamik / Zayıf / Örtülü Ruby - Dinamik / Güçlü / Örtülü Python - Dinamik / Güçlü / Örtülü Java - Statik / Güçlü / Açık PHP - Dinamik / Zayıf / Örtülü C - Statik / Zayıf / Açık C++ - Statik / Güçlü / Açık - Dinamik / Zayıf / Örtük Amaç-C - Statik / Zayıf / Açık C# - Statik / Güçlü / Açık Haskell - Statik / Güçlü / Örtük Ortak Lisp - Dinamik / Güçlü / Örtük

Belki burada, özellikle CL, PHP ve Obj-C ile merhamet ediyorum, sanki başka bir fikriniz varmış gibi - yorumlara yazın.

Visnovok

TAMAM. Nezabar netleşecek ve tipleştirme hakkında söylenecek fazla bir şey olmadığını anlıyorum. Yak mı? Konu dipsiz mi? Duzhe zengin bir şekilde bitmemiş mi kaybetti? Yorum rica ediyorum, temel bilgileri paylaşıyorum.

© 2022 androidas.ru - Android hakkında her şey