Dinamik tiplashtirish nima? Statik va dinamik yozish. Aniq yozish

Golovna / 2 Ajoyib o'quvchilar

Kerakli minimal jim nutqlardan o'ch olish uchun, chunki dinamik yozishni yomon deb atamaslik uchun matn terish haqida bilish kerak, Lisp - yozilmagan mening va C - mening qattiq tiplashim.

Da yangi versiya topilsin hisobot tavsifi barcha turdagi, kodga dumba bilan ziravorlar, mashhur kino dasturlari va ko'rgazmali rasmlar yuborilgan.

Men sizga maqolaning qisqa versiyasini teskari, keyin esa xulosani o'qishni tavsiya qilaman.

Qisqa versiya

Matn terish orqali kino dasturlash ikkita katta lagerga bo'lingan deb qabul qilinadi - matn terish va yozilmagan (tiplanmagan). Birinchi misol C, Python, Scala, PHP va Lua, ikkinchisi esa assembler tili, Forth va Brainfuck.

Shunday qilib, uning sutty uchun "hayvon turi" sifatida, u mantar kabi oddiy; Va filmni tiplashtirish o'qi o'zgartirilgan ko'proq toifalarga bo'linadi:

  • Statik/dinamik yozish. O'zgarishlar va funktsiyalarning oxirgi turlari kompilyatsiya bosqichida o'rnatilganligi bilan statik ravishda aniqlanadi. Tobto. allaqachon kompilyator 100% siz qaysi turni bilishingizga ishonch hosil qiladi. Dinamik tiplashda barcha turlar dastur oxirida allaqachon z'yasovyatsya bo'ladi.

    Qo'llash:
    Statik: C, Java, C#;
    Dinamik: Python, JavaScript, Ruby.

  • Kuchli/zaif tiplashtirish (qattiq/qattiq bo'lmagan deb ham ataladi). Kuchli tipizatsiya ko'rinib turibdiki, til virazahda tilni ishlatishga ruxsat bermaydi turli xil turlari va avtomatik yashirin o'zgarishlarni yutmang, masalan, siz shaxssiz tartibni ko'ra olmaysiz. Zaif tipizatsiyaga ega filmlar hech qanday yashirin o'zgarishlarsiz avtomatik ravishda o'zgartirilishi mumkin, shuning uchun bu aniqlikni yo'qotishi yoki transformatsiya noaniq bo'lishi mumkin.

    Qo'llash:
    Kuchli: Java, Python, Haskell, Lisp;
    Zaif: C, JavaScript, Visual Basic PHP.

  • Aniq/to'g'ridan-to'g'ri yozish. Yangi o'zgarishlar/funksiyalar/argumentlar turi aniq belgilanishi kerakligi sababli aniq yozilgan movslar kiritiladi. Shubhasiz, yashirin terish bilan film kompilyator/tarjimonga uzatiladi.

    Qo'llash:
    Yavna: C++, D, C#
    Yashirin: PHP, Lua, JavaScript

Shuni ham ta'kidlash kerakki, barcha toifalar bir-birini almashtiradi, masalan, C tili statik jihatdan zaif aniq yozilishi mumkin va Python tili - dinamik jihatdan kuchli.

Prote emas buvaê mov zí staticí̈ va dynamíchní̈ typízatsiy kechada. Men bu erda nima haqida yolg'on gapirayotganimni oldindan aytmoqchiman - badbo'y hid haqiqat, lekin boshqa narsa haqida.

Batafsil versiya

Qisqa versiya kabi, siz yaxshi ish qildingiz, yaxshi. Bekorga emas, men hisobot yozyapmanmi? Golovna, qisqa versiyada butun korisnu sig'dirish shunchaki imkonsiz edi va ma'lumot, lekin terini zo'riqishsiz o'qish uchun uzoq vaqt oldin xabar berish mumkin edi.

Tursiz tiplashtirish

Tilsiz til dasturlarida barcha kunlar oddiy zarbalar ketma-ketligi, turli kunlar bilan kiritiladi.

Tipsiz tiplashtirish past darajadagi (assembler tili, Forth) va ezoterik (Brainfuck, HQ9, Piet) tillarga tanish eshitiladi. Biroq, unda, nedolikami tartibida, ê deakí perevagi.

Perevagi
  • Bu sizga juda past darajada yozishga imkon beradi, bundan tashqari, kompilyator/tarjimonga hech qanday turdagi tekshiruvlar ta'sir qilmaydi. Vílni robiti ma'lumotlarning be-yakim turlari bo'yicha be-yakí operatsiyalari.
  • Tanlovni bekor qilish kodi samarali bo'ladi.
  • Vkazivokning shaffofligi. Tilni bilish bilan, keyingi kod nima ekanligiga shubha yo'q.
Nedoliki
  • Katlama. Ko'pincha ro'yxatlar, qatorlar va tuzilmalar kabi berilgan murakkab qiymatlarga bo'lgan ehtiyojda ayblanadi. Iz cimni qo'lsizligi uchun ayblash mumkin.
  • Vídsutníst perevyrok. Be-yakí bezgluzdí díí̈, masalan vídnímannya pokazhchika massivida íz ramzi vvazhatimuetsya tsílkom normal, scho tutib bo'lmaydigan avf olib kelishi mumkin.
  • Kam mavhumlik. Katlanadigan turdagi ma'lumotlarga ega robot raqamlarga ega robotga o'xshamaydi, uni yaratish juda qiyin.
Tipsiz tipifikatsiya kuchlimi?

Ha, ha, ha. Masalan, mov assemblerda (x86 / x86-64 arxitekturasi uchun, boshqalarni bilmayman) dasturni yig'ish mumkin emas, shuning uchun siz cx registrida (16 bit) ma'lumotlarni rax registridan olishga harakat qilishingiz mumkin. (64 bit).

mov cx,eax; soat yig'ilishini kechiring

Keyin boring, asemlerdagi tur nima? Menga bir nechta tuzatishlar bor. Va sizning fikringiz, zvysno, sizdan kamroq yotadi.

Statik va dinamik tiplashtirish

Golovne, u statik (statik) tiplashni dinamik (dinamik) deb hisoblaydi, barcha turdagi qayta tekshirishlar terish bosqichida emas, balki kompilyatsiya bosqichida tekshiriladi.

Deyakim odamlar qochishlari mumkin, bu statik tipizatsiya juda kichik (aslida shunday, ko'p odamlar uzoq vaqtdan beri bunday usullardan yordam so'rashgan). Deyakim, scho dinamik tarzda tasvirlangan film - tse gra z fire, lekin ularni qanday ko'rish mumkin? Biror sababga ko'ra imkoniyatlarni ko'rmayapsizmi? Nega yo'q, nega statik va dinamik ravishda terilgan juda ko'p mov?

Keling, bir ko'rib chiqaylik.

Statik yozishning afzalliklari
  • Turni qayta ko'rib chiqish faqat bir marta - kompilyatsiya bosqichida amalga oshiriladi. Va bu shuni anglatadiki, agar biz raqamni ketma-ket qo'shishga harakat qilmasak (va kechirimli bo'lsak, aks holda biz o'zgartirish kiritamiz) oldinga siljishimiz shart emas.
  • Shvidkist vykonannya. Oldingi nuqtadan ko'rinib turibdiki, statik tarzda yozilgan filmlar amalda ko'proq dinamik tarzda teriladi.
  • Deyakih dodatkovyh aqli uchun siz kompilyatsiya bosqichida allaqachon potentsial kechirim ko'rsatish imkonini beradi.
Dinamik tiplashtirishning afzalliklari
  • Umumjahon kollektsiyalarni yaratishning soddaligi - hamma narsa va hamma narsaning kombinatsiyasi (kamdan-kam hollarda bunday ehtiyojni ayblaydi, lekin agar siz dinamik tipizatsiyani ayblasangiz, buni qilishingiz mumkin).
  • Murakkab algoritmlarni tavsiflash qulayligi (masalan, massivni tartiblash, qoida tariqasida, nafaqat butun sonlar ro'yxatida, balki nutq raqamlari ro'yxatida va qatorlar ro'yxatida ham).
  • O'zlashtirish oson - dinamik matn terish xususiyatiga ega filmlar dasturlashni xohlaydiganlar uchun yanada yaxshi eshitiladi.

Yangilangan dasturlash

Yaxshi, dinamik yozish uchun eng muhim dalil - bu murakkab algoritmlar tavsifining ravshanligi. Keling, o'z muammomizni bilib olaylik - bizga qancha massiv (yoki ro'yxat) - butun sonlar massivi, nutq massivi va belgilar massivini qidirish uchun funksiya kerak.

Qanday qilib biz virishuvatememo qilamiz? Virishimo її 3 xil til: biri dinamik tipifikatsiyaga ega va ikkitasi statik.

Hazil uchun algoritm, men eng oddiylaridan birini - sanab o'tishni olaman. Funktsiya izlanadigan elementni, massivni (yoki ro'yxatni) o'rnatish va element indeksini aylantirishdir, aks holda element noma'lum - (-1).

Dinamik yechim (Python):

Def find(required_element, list): uchun (indeks, element) bittada (ro'yxat): agar element == zarur_element: indeksni qaytarish (-1)

Yak bachite, hamma narsa oddiy va kundalik muammolar scho, scho ro'yxatida istalgan raqam, har qanday ro'yxat bo'lishi mumkin, hatto boshqa massivlar bo'lmasa ham. Yaxshi. Davom etaylik - keling, vazifani C dagi ko'rib chiqaylik!

Statik yechim (Si):

unsigned int find_int (int required_element, int array, unsigned int size) ( uchun (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); }

Teri funktsiyasi Python-ning 3-versiyasiga juda o'xshaydi, lekin nima uchun uchtasi bor? Statik dasturlash muvaffaqiyatsiz tugadimi?

men shunday í ni. Bir nechta dasturlash usullari mavjud, ulardan birini biz bir vaqtning o'zida ko'rib chiqishimiz mumkin. Bu chet el dasturlash deb ataladi, bu C++ tilini qo'llab-quvvatlaydi. Keling, yangi versiyani ko'rib chiqaylik:

Statik yechim (ilg'or dasturlash, C++):

Shablon unsigned int find(T required_element, std::vector massiv) ( uchun (unsigned int i = 0; i< array.size(); ++i) if (required_element == array[i]) return i; return (-1); }

Dobre! Bu juda izchil ko'rinmaydi, Python-dagi pastki versiya va shu bilan birga men ko'p yozish imkoniyatiga ega emas edim. Bundan tashqari, biz vazifani bajarish uchun zarur bo'lgan uchta massiv uchun emas, balki barcha massivlar uchun dasturni olib tashladik!

Ushbu versiya zarur bo'lganlarga o'xshaydi - biz bir vaqtning o'zida dinamikning ortiqcha va statik yozuvlarini va faol plyuslarini olamiz.

Bu ajoyib, nima bo'lishi mumkin, lekin bundan ham chiroyliroq. Ilg'or dasturlash aqlli va chiroyli bo'lishi mumkin (masalan, ko'proq Haskell bilan). Boshqa yo'l bilan, yanada murakkab dasturlashdan tashqari, polimorfizm (natija yuqori bo'ladi), revantaging funktsiyalari (xuddi shunday) yoki makrolarni zastosuvat qilish ham mumkin.

Statika va dinamika

Bundan tashqari, qanday ko'p statik til dinamik yozishda g'alaba qozonishga imkon berishini taxmin qiling, masalan:

  • C# dinamik pseudo turini qo'llab-quvvatlaydi.
  • F# operator kabi sintaktik kodni qo'llab-quvvatlaydimi?
  • Xaskellning dinamik yozishi Data.Dynamic moduli tomonidan ta'minlanadi.
  • Delphi - maxsus Variant turi yordami uchun.

Shuningdek, filmni dinamik ravishda yozish harakatlari statik yozish yordamida tezlashtirishga imkon beradi:

  • Common Lisp - turdagi deklaratsiyalar.
  • Perl - s versiyasi 5.6, dosit obzhezheno.

Kuchli - bu zaif tur

Kuchli tipifikatsiyaga ega filmlar har xil turdagi viruslarning kundalik tabiatini o'zgartirishi va kundalik avtomatik o'zgarishlarni yutib bo'lmaydi. Ular, shuningdek, "Suvoroy tiplashidan olingan film" deb ataladi. Buning uchun inglizcha atama kuchli yozishdir.

Zaif terilgan kinolar, navpaki, spriyako kuchli, yig'lab dasturchi zmishuvav turli xil turlari bitta versiyada va kompilyatorning o'zi hamma narsani bitta turga aylantiradi. Ularni "suvoroy tipik bo'lmagan filmlar" deb ham atashadi. Buning uchun inglizcha atama zaif terishdir.

Zaif tiplashtirish ko'pincha dinamik bilan aralashtiriladi, bu unday emas. Dinamik tarzda terilgan til zaif va kuchli tarzda yozilishi mumkin.

Biroq, kamdan-kam odam tipifikatsiyaning qat'iyligi muhimligini biladi. Ko'pincha til statik tarzda yozilganligi aytiladi, keyin siz kompilyatsiya qilish uchun cheksiz potentsial kechirimlardan foydalanishingiz mumkin. Aldading!

Mova ona va kuchli tipizatsiya uchun aybdor. To'g'ri, agar kompilyator sizga kechirim haqida gapirsa, u shunchaki qatorni raqamga qo'shib qo'yadi, aks holda u yuqoriroq, biz bitta massivdan boshqa massivni ko'ramiz, bu bizga nima foyda, qanday "qayta tekshirish" turlari kompilyatsiya bosqichida bo'ladi? To'g'ri - kuchsiz - statik tiplashtirish kuchliroq, pastroq - kuchli dinamik! (Xo'sh, bu mening fikrim)

Xo'sh, nega zaif turlarning ortiqcha afzalliklari yo'q? Bu shunday ko'rinishga ega bo'lishi mumkin, men kuchli tipizatsiya uchun qattiq mosman, men aybdorman, kuchsizlar bir xil perevaga ega ekanligini hurmat qilmasdan.

Qanday qilib bilmoqchimisiz?

Kuchli tipifikatsiya belgilari
  • Nadyynyst - Siz kompilyatsiya kechirish, noto'g'ri xatti natomíst uchun aybdor.
  • Shvidkíst - zamíst prihovannyh qayta ishlash, yakí vitratnymi bilan amalga oshirilishi mumkin, íz kuchli typízíêyu u í̈h aniq yozish kerak, scho zamushuê dasturchi minimal sifatida tsya dilyanka kodi povilnoy bo'lishi mumkin, deb bilaman.
  • Robotlar va dasturlarni bilish - yana, yashirin turlarni almashtirish, dasturchi hamma narsani o'zi yozadi, bu taxminan aql-idrokni anglatadi, bu qator va raqamning hizalanishi jozibali ko'rinmaydi.
  • Uchrashuv - agar siz o'zgartirishni qo'lda yozsangiz, nimaga aylantirayotganingizni aniq bilasiz. Shunday qilib, siz doimo bunday o'zgarishlar aniqlik va noto'g'ri natijalarni yo'qotishga olib kelishi mumkinligini bilib olasiz.
Zaif xarakteristikalar
  • Aralash oyatlarning g'alabalarining ko'p qirraliligi (masalan, z tsilih chi nutq raqamlari).
  • Tiplashtirish va vazifalarga e'tiborni qaratish ko'rinishidagi abstraksiya.
  • Qisqa eslatma.

Harazd, biz o'sib chiqdik, tipografiyaning zaif turida, ya'ni perevagida paydo bo'ladi! Va zaif turdagi plyuslarni kuchliga o'tkazish usullari qanday?

Bu ko'rinadi, ê men ikki navit.

Bir ma'noli vaziyatlarda va ma'lumotlarni yo'qotmasdan turni aniq qisqartirish

Uh ... Uzoq paragrafni tugating. "Obmezhene inplicit transformation" ga tez yoga beraman.

Vaziyat aniq; Masalan, ikkita raqamni qo'shish o'qi bir ma'noli holatdir. Raqamni massivga aylantirish esa no (bir elementdan massiv yaratish mumkin, massivni shunday uzoq vaqt davomida bloklash uchun elementlarni to‘ldirish mumkin va raqamni o‘zgartirish mumkin) qatorga, so'ngra belgilar qatoriga).

Ma'lumotlarni qaytarish yanada sodda. Nutqning 3,5 raqamini raqamga qanday o'zgartirishimiz mumkin - biz ma'lumotlarning bir qismini sarflaymiz (aslida, operatsiya noaniq - yaxlitlash qanday amalga oshiriladi? Kattaroq tomonda? Kichikroq tomonda?

Noaniq vaziyatlarda reenkarnasyon, ikkinchi ma'lumotlar bilan qayta tashkil etish - bu yaxshiroq, yomonroq. Dasturlash uchun maxsus narsa yo'q.

Agar menga ishonmasangiz, PL/I tilini o‘qing yoki bu xususiyatni qidirib toping. Yangisi HAMMA ma'lumotlar turlarini o'zgartirish qoidalariga ega! Faqat jahannam!

Harazd, keling, yashirin transformatsiyaning o'zgarishi haqida o'ylab ko'raylik. Qanday harakat? Shunday qilib, masalan, Paskalda siz butun sonni nutqda aylantirishingiz mumkin, lekin noto'g'ri emas. Shunga o'xshash mexanizmlar C#, Groovy va Common Lisp tillarida mavjud.

Garazd, kuchli tildan zaif turdan bir-ikki plyus olishning yana bir yo'li borligini ko'rsatdim. Shunday qilib, sharob konstruktorlarning polimorfizmi deb ataladi.

Men Haskellning mo''jizaviy filmi ilovasida yoga tushuntiraman.

Polimorf konstruktorlar ehtiyotkorlik natijalarini tasdiqladilar, bu asosan raqamli harflardan foydalanish soati uchun zarur bo'lgan xavfsiz yashirin konvertatsiyadir.

Misol uchun, siz pi + float(1) o'rniga pi + 1.0 yozishni xohlamaysiz. Men faqat pi + 1 yozmoqchiman!

U Haskellda buzilgan, chunki literal 1 o'ziga xos turga ega emas. Narx ní cíle, ní nutq, ny murakkab. Bu shunchaki raqam!

Natijada, x dagi barcha raqamlarni y ga (1 ga o'sish bilan) ko'paytiruvchi oddiy sum x y funksiyasini yozishda biz versiyalar sonini - butun sonlar uchun sum, nutq uchun yig'indi, ratsional uchun yig'indi, yig'indini hisobga olamiz. kompleks raqamlar uchun va o'zingiz belgilagan barcha raqamli turlar uchun summani yozing.

Zvichayno ryatuê tsey priyom faqat qachon vikoristanní zmíshanih virazív íz sonli harflar, lekin aysbergning faqat uchi.

Shunday qilib, eng yaxshi yo'l kuchli va zaif tipizatsiya o'rtasidagi chegarada muvozanat bo'ladi, deb aytishimiz mumkin. Menda biron bir tilda mukammal muvozanat yo'q ekan, men zaif terilgan harakatlarga (masalan, C, JavaScript, Lua, PHP kabi) emas, balki qattiq terilgan harakatlarga (masalan, Haskell, Java, C#, Python) moyilman. ).

Aniq va yashirin yozish

Mova aniq tipifikatsiyasi bilan dasturchi barcha o'zgarishlar va funktsiyalarning turini ko'rsatishda aybdor ekanligini bildiradi, go'yo kar bo'ladi. Buning uchun inglizcha atama aniq yozishdir.

To'g'ridan-to'g'ri yozish, navpaki, proponuê bilan Mova turlarini unutib, tur ta'rifini kompilyator yoki tarjimonga o'tkazing. Ingliz tilidagi so'z bilvosita yozishni anglatadi.

Orqa tomonda, yashirin tipizatsiya bir xil darajada kuchli dinamik va aniq - statik deb aytishingiz mumkin, ammo bundan tashqari, unday emas.

Chi ê terining ko'rinishining afzalliklari va yana chi ê í̈x kombinatsiyalari í chi ê movi z ikkala usulni ham qo'llab-quvvatlaydimi?

Aniq tiplashtirishning afzalliklari
  • Imzoning teri funksiyasining mavjudligi (masalan, int add(int, int)) qaysi funksiya ishlashini oson aniqlash imkonini beradi.
  • Dasturchi ma'lum bir o'zgarishdan qanday turdagi qiymatni olish mumkinligini darhol yozib qo'yadi, bu esa eslab qolish zaruratini keltirib chiqaradi.
Yashirin yozish xususiyatlari
  • Qisqa eslatma - def add(x, y) int add(int x, int y) dan aniq qisqaroq.
  • O'zgarishlarga chidamli. Misol uchun, agar vaqtni o'zgartirish funktsiyasi kirish argumenti bilan bir xil turga ega bo'lsa, unda aniq yozilgan harakatda, kiritish argumentining turini o'zgartirganda, vaqtni o'zgartirish turini o'zgartirish kerak bo'ladi.

Yaxshi, haqoratlar plyuslar va minuslar kabi kelishi va ketishi aniq (va kimda yana nima bor?), unda keling, bu ikki yondashuvni birlashtirish yo'lini so'raylik!

Vibirda aniq tiplashtirish

Ê ko'chiring, qisqartmalar uchun yashirin terish va iste'mol uchun qiymat turini belgilash qobiliyati. Tsey turi virazu tarjimoni avtomatik ravishda vivede. Ushbu harakatlardan biri Xaskell, aniqlik uchun sizga oddiy misol keltiraman:

Aniq turdagi deklaratsiya qo'shilmaydi (x, y) = x + y - Aniq turdagi deklaratsiya qo'shiladi: (Integer, Integer) -> Integer add (x, y) = x + y

Eslatma: Men egri bo'lmagan funktsiyani yozishim mumkin, shuningdek, keng tarqalgan qo'shimchalar o'rniga shaxsiy imzo yozishim mumkin: (Num a) -> a -> a -> a , chunki Men Haskellning sintaksisini tushuntirmasdan, fikrni ko'rsatmoqchiman.

Hm. Yak bachimo, u ham chiroyli va qisqa. Funktsiya yozuvi har bir satrga atigi 18 ta belgidan, shu jumladan bo'shliqlarni oladi!

Biroq, turdagi avtomatik o'rash buklanadigan bo'lib, u Haskellning bunday salqin tili bilan yaxshi ishlamaydi. (Misol sifatida siz monomorfizmga o'zgartirish kiritishingiz mumkin)

Qulflash va yashirin talab uchun aniq tipizatsiya bilan Chi ê movi? Kon
albatta.

Tanlov bo'yicha yashirin tiplash

C++ 11 (ilgari C++ 0x deb nomlangan) deb nomlangan yangi C++ tili standarti auto kalit so‘zini taqdim etdi, shuning uchun kompilyator sizga turni kontekstdan tashqari kiritishni aytishi mumkin:

Mumkin: // unsigned int a = 5 yozish uchun qo'lda kiritish; unsigned int b = a + 3; // Avtomatik o'rash turi unsigned int a = 5; avtomatik b = a + 3;

Yomon emas. Ale, rekord unchalik qisqarmadi. Keling, iteratorlar bilan dumbani hayratda qoldiraylik (agar tushunmasangiz, urushmang, zavodkani avtomatik vysnovkaga yozib olish allaqachon tez ekanligini hurmat qiling):

// std::vektor turiga qo'lda tayinlash vec = randomVector(30); uchun (std::vector::const_iterator it = vec.cbegin(); ...) ( ... ) // Avtomatik vec turi auto vec = randomVector (o'ttiz); uchun (auto it = vec.cbegin(); ...) ( ... )

Voy-buy! Eksa qisqa. Garazd, lekin qanday qilib Haskell ruhi bilan ishlashingiz mumkin, qanday turdagi qiymat, nimani aylantirish kerak, bahslar turlarida yotadi?

Men buni shunday takrorlayman, zavdyaki kalit so'z decltype auto bilan birgalikda:

// Qo'lda turdagi int bo'linishi (int x, int y) (...) // Avtomatik turdagi avtomatik bo'linish (int x, int y) -> decltype (x / y) (...)

Belgilanish shakli unchalik yaxshi bo'lmagan bo'lishi mumkin, ammo ilg'or dasturlash (shablonlar/generiklar) bilan birgalikda yashirin terish yoki avtomatik turdagi hosila div hosil qiladi.

Ushbu tasnif uchun Deyaki movi dasturlash

Men mashhur movning kichik ro'yxatini tuzaman va hidning "turlari" teri toifasiga qanday mos kelishini yozaman.

JavaScript - Dinamik / Zaif / Yashirin Ruby - Dinamik / Kuchli / Yashirin Python - Dinamik / Kuchli / Yashirin Java - Statik / Kuchli / Ochiq PHP - Dinamik / Zaif / Yashirin C - Statik / Zaif / Aniq C++ - Statik / Kuchli / Aniq - Dinamik / Zaif / Implicit Objective-C - Statik / Zaif / Aniq C# - Statik / Kuchli / Aniq Haskell - Statik / Kuchli / Yashirin Common Lisp - Dinamik / Kuchli / Implicit

Ehtimol, men bu erda rahm-shafqat qilaman, ayniqsa CL, PHP va Obj-C bilan, go'yo sizda boshqa fikr bor - sharhlarda yozing.



Ushbu maqola statik tiplashtirilgan va dinamik tiplashtirilgan tillar o'rtasidagi farq, "kuchli" va "zaif" tipifikatsiyani tushunish va turli tillardagi tiplashtirish tizimlarining o'xshashligi haqida. Qolgan soatlarda dasturlashda eng ilg'or va ilg'or matn terish tizimlarining aniq oqimi bo'ladi, shuning uchun maslahatlar va tiplash haqida gapiradigan bo'lsangiz, nima qilish kerakligi haqida o'ylash muhimdir.



Tur - mumkin bo'lgan qiymatlarning butun to'plami. Butun raqam ona qiymati bo'lishi mumkin 0, 1, 2, 3 va hokazo. Bulova haqiqat yoki yolg'on bo'lishi mumkin. Siz o'zingizning turingizni taxmin qilishingiz mumkin, masalan, "DayFive" turi, bu holda "berish" va "5" ma'nosi va boshqa hech narsa emas. Satr va raqam emas, narx, okremium turi.


mov ning statik tiplanishi o'zgartirish turlari orasida: mov dasturlash, masalan, x butun son ekanligini bilishi mumkin. Qanday dasturchi robit x = true dan qo'rqadi, agar kod to'g'ri bo'lmasa. Kompilyator kompilyatsiya qilishi kerak, shuning uchun biz uni bunday kodni ishga tushira olmaymiz. Bundan tashqari, til statik tarzda yozilishi mumkin, lekin u yanada xilma-xil bo'lishi mumkin va bizning DayFive tipimizdan mashhur tipdagi tizimlardan foydalanish mumkin emas (garchi boy bo'lsa ham, kimdir boshqa, yanada murakkab g'oyalardan foydalanishi mumkin).


Dinamik terilgan mov qiymatlarni turlar bo'yicha tayinlaydi: mov butun son nima ekanligini biladi, 2 butun son, lekin siz butun sonni almashtirish uchun x nima o'zgartirilishini bilishingiz mumkin.


Vikonannya movi pereviryaê tsí belgilarining o'rtasi turli daqiqalarda va soatlarda. Agar biz ikkita qiymatni birga qo'shishga harakat qilsak, ularni bekor qilishingiz mumkin, ular raqamlar, qatorlar va massivlardir. ning aktsiyadorlik va qiymati chiqib qilaylik, bir kechirim ko'rish uchun ularni bir-biriga elim, kuzda turi.

Statik yoziladigan filmlar

Statik filmlar dastur ishga tushishidan bir soat oldin dastur tomonidan qayta tekshiriladi. Dastur bo'lsin, ba'zi bir tiplarda film qoidalarini buzsa, uni noto'g'ri deb biladi. Misol uchun, ko'proq statik mov vídhilyaê viraz "a" + 1 (harakat Sí - tse bu qoidadan aybdor). Kompilyator "a" butun son, 1 esa butun son ekanligini va chap va o'ng qism bitta turga qadar bo'lishi mumkin bo'lgan taqdirdagina ishlashini biladi. Shunday qilib, muammo nimada ekanligini aniqlash uchun dasturni ishga tushirishingiz shart emas. Statik tarzda yozilgan filmning terisi kodni ishga tushirmasdan aniqlanishi mumkin bo'lgan bitta turga aylantirilishi mumkin.


Turni belgilash uchun statik tarzda terilgan ko'plab mov. Java funksiyasi public int add(int x, int y) ikkita butun sonni oladi va uchinchi raqamni aylantiradi. Boshqa statik tarzda yozilgan filmlar avtomatik ravishda turni belgilashi mumkin. Haskell-dagi katlama funktsiyasi quyidagicha ko'rinadi: x y = x + y ni qo'shing. Biz mov turlarini aytmaymiz, lekin siz ularni o'zingiz belgilashingiz mumkin, chunki siz + faqat raqamlarda ishlashini bilasiz, shuning uchun x va y raqamlar bo'lishi kerak, shuning uchun qo'shish funktsiyasi argument sifatida ikkita raqamni oladi.


Bu "statik" turdagi tizimni o'zgartirmaydi. Haskelldagi tip tizimi o'ziga xos statik, qat'iy va qattiqlikka ega va umuman olganda Haskell Java'dan ustundir.

Dinamik tarzda yozilgan filmlar

Dinamik tiplashtirilgan movslar turini ko'rsatishi kerak va ular buni o'zlari bajarishlari kerak. Tipi zminnyh nevidomí lahzaga qadar hidi mayut o'ziga xos ma'nolar ishga tushirishda. Masalan, Pythondagi funksiya


def f(x, y): qaytish x + y

Siz ikkita butun sonni qo'shishingiz mumkin, qatorlarni, ro'yxatlarni va hokazolarni yopishtirishingiz mumkin va biz nima deb o'ylayotganimizni aniqlay olmaymiz, doklar dasturni ishga tushirmaydi. Ehtimol, f funktsiyasi ikki qatorda va keyinroq ikkita raqamda chaqirilsa. Bunday vaqtda, x va y har xil soatlarda har xil turdagi har xil qiymatlarga ega bo'ladi. Ko'rinishidan, dinamik tildagi ma'no turni belgilaydi, ammo bu funktsiyani o'zgartirish emas. 1 qiymati har doim butun son, lekin x va y har qanday bo'lishi mumkin.

Porivnyannia

Dinamik harakatlarning aksariyati kechirim berish uchun, go'yo ular noto'g'ri yozilgan (JavaScript - ayblash; agar ma'no bo'lmasa, har qanday ifoda uchun qiymatni aylantirish mumkin). Qachon vikoristanny dinamik typyzovanyh mov navyt oddiy avf shakli "a" + 1 jangovar charxlash dan oqlanishi mumkin. Statik filmlar bunday kechirimlardan qo'rqishadi, lekin, shubhasiz, turlar tizimining qattiqligida yolg'on gapirishdan qo'rqish qadamlari.


Statik va dinamik harakatlar dasturlarning to'g'riligi haqidagi tubdan farqli g'oyalardan ilhomlangan. Dinamik harakat "a" + 1 to'g'ri dasturga ega: kod ishga tushiriladi va kechaning yarmida kechirim paydo bo'ladi. Biroq, eng statik terilgan mov viraz "a" + 1 - ce dastur emas: Kompilyatsiya qilinmaydi va ishga tushirilmaydi. Bu noto'g'ri kod, shuningdek joker belgilarni kiritish!&%^@*&%^@* - bu noto'g'ri kod. To'g'rilik va noaniqlik haqidagi qo'shimcha tushunchalar dinamik tilda teng bo'lishi mumkin emas.

Kuchli - bu zaif tur

"Kuchli" va "zaif" tushunchalari ko'proq noaniqdir. Axis deyaki qo'llaniladi í̈x vikoristannya:

    Ba'zan "kuchli" "statik" degan ma'noni anglatadi.
    Bu erda hamma narsa oddiy, ammo g'alaba qozonish va yoga tushunish uchun "statik" atamasini ishlatish yaxshiroqdir.

    Ba'zan "kuchli" "turlarning yashirin o'zgarishini talon-taroj qilmang" degan ma'noni anglatadi.
    Misol uchun, JavaScript sizga "a" + 1 yozish imkonini beradi, uni "zaif yozish" deb atash mumkin. Ale bo'lishi mumkin bo'lgan barcha filmlar o'sha chi ynshiy yashirin o'zgarishlarni berishi mumkin, chunki bu sizga avtomatik ravishda butun sonlardan suzuvchi koma bilan raqamga 1 + 1.1 ga o'tish imkonini beradi. Darhaqiqat, ko'pchilik qabul qilinadigan va qabul qilib bo'lmaydigan o'zgarishlarni belgilash uchun "kuchli" so'zini yutadi. Kordon degan narsa yo'q, barcha badbo'y hidlar noto'g'ri va ma'lum bir odamning ongida yotadi.

    Ba’zan “kuchli” tilda tiplashtirish qoidalarini buzish mumkin emasligini bildiradi.

  • Ba'zan kuchli xotira uchun xavfsiz vositalar (xotira uchun xavfsiz).
    Cí - kino xotirasi uchun xavfsiz ko't emas. Agar xs bir nechta raqamlardan iborat massiv bo'lsa, u holda Sí z xs yoki xs ning kodi bo'lib, uni xotiradagi qiymat sifatida aylantiradi, chunki u xs ning orqasida ma'lum.

Keling, qo'ng'iroq qilaylik. deyakí mov vydpovídat tsim deputatlari kabi oqi. Aytishim mumkinki, Xaskell har tomonlama "eng kuchli". Ko'proq so'zlar unchalik aniq emas.



("Yashirin transformatsiya" ustunidagi "Agar yak" kuchli va kuchsizlarning qo'shimcha ravishda yolg'on gapirishlari mumkinligini anglatadi, chunki transformatsiyalar hurmat bilan qabul qilinadi).


Ko'pgina hollarda, "kuchli" va "zaif" atamalari bu erda ko'rsatilmagan boshqa funktsiyalardan ko'ra ko'proq boshqa funktsiyalarning aniqlanmagan kombinatsiyasi sifatida qaralishi mumkin. "Kuchli" va "zaif" so'zlarini o'g'irlashning barcha qiyinchiliklari amalda ahmoqdir. Agar siz tí shartlarni vikoristovuvat qilmoqchi bo'lsangiz, uvazida aniq nima borligini qisqacha tasvirlab bering. Misol uchun, "agar raqamlar qatori qo'shilsa, JavaScript qiymatni aylantiradi, Python esa kechirimlilikni aylantiradi" deb ayta olasiz. Bunday paytda biz "kuchli" so'zining shaxsiy ma'nosini o'rganishga harakat qilish uchun o'z kuchimizga ega emasmiz. Ammo bundan ham yomoni: keling, terminologiya orqali tushunarsiz tushunarsizlikka kelaylik.


Internetdagi "kuchli" va "zaif" vipadkiv atamalarining aksariyati tushunarsiz va jirkanch tarzda tayinlangan fikrlardir. aniq odamlar. Vikoristovuyutsya hidi, schob tilini "yomon" yoki "yaxshi" deb ataydi va bu fikr texnik jargonga aylanadi.



Kuchli tipizatsiya Turlar tizimi menga yoqadi va o'zimni qulay his qilaman.

Zaif tipizatsiya: Turlar tizimi kamroq notinch yoki men uchun qulay emas.

Progressiv yozish (asta-sekin yozish)

Dinamik harakatlarga statik maslahatlar qo'sha olasizmi? Ba'zi vipadkalarda - shunday. Boshqalarida bu qiyin va imkonsizdir. Eng aniq muammo - dinamik tilning baholash va boshqa shunga o'xshash imkoniyatlari. Pythonda Vikonannya 1 + eval("2") 3. Lekin 1 + eval(read_from_the_network()) haqida nima deyish mumkin? Yig'ilish vaqtida hovlida bo'lgan narsa shaklida yotqizishga arziydi. Agar raqam olib tashlansa, u to'g'ri. Bir qator kabi, keyin yo'q. Ishga tushirishdan oldin tanib bo'lmaydi, shuning uchun turni statik ravishda tahlil qilish mumkin emas.


Eval() turini har qanday turiga o'rnatish amaliy yechim emas, bu Object-ga Go'da ba'zi ob'ektga yo'naltirilgan dasturlash interfeysi () ni taxmin qiladi: bu turdagi, bu sizni mazmunli yoki yo'qligini xursand qiladi.


Har qanday turdagi qiymatlar hech narsa bilan ajratilmagan, ya'ni turdagi tizim bizga baholash kodi bilan yordam berishi mumkin. Filmlar, har qanday ê eval í turlari tizimida, terining varikozini baholashda xavfsiz turlar uchun aybdor.


Ba'zi harakatlar ixtiyoriy yoki bosqichma-bosqich yozishga ega: ular qisqartmalar uchun dinamikdir, lekin ular ba'zi statik izohlarni qo'shishga imkon beradi. Python yaqinda ixtiyoriy turlarni qo'shdi; TypeScript - ba'zi ixtiyoriy turlar uchun JavaScript orqali yuqori skript; Oqim eski yaxshi JavaScript kodining statik tahlilidir.


Tsí movi deakí perevagi statik typízatsíí beradi, lekin ular o'ng statik moví kabi mutlaq kafolatlar bermaydi. Faol funksiyalar statik, faol funksiyalar esa dinamik tarzda yoziladi. Dasturchilar chakana savdoni bilishlari va qo'rqishlari kerak.

Statik tarzda terilgan kodni kompilyatsiya qilish

Statik tarzda yozilgan kodni kompilyatsiya qilishda har qanday kompilyator kabi sintaksis teskari bo'ladi. Keling, maslahatlarni o'zgartiraylik. Tse, statik tilni bir sintaktik avf qilish uchun kechirish mumkin, keyin esa 100 tiplashtirish kechirish uchun tuzatiladi. Sintaktik afvni tuzatish 100 ta tipifikatsiya afv hosil qilmadi. Kompilyator oddiygina turdagi kechirimlarni ko'rsata olmaydi, sintaksis hujjatlar tomonidan tuzatilmagan.


Statik mov kompilyatorlari aqlli kodni yaratishi mumkin, ammo dinamik kompilyatorlar qila olmaydi. Misol uchun, kompilyator qo'shish funksiyasi butun sonlarni qabul qilishini bilganligi sababli, u protsessorning mahalliy ADD buyrug'ini yengishi mumkin. Dinamik tilning qaytariladigan turi viconann, qo'shimcha turdagi shaxssiz qo'shish funksiyalaridan birini tanlashda (butun sonlar yoki float qo'shish yoki qatorlar yoki, ehtimol, ro'yxatlarni yopishtirishmi?) Yoki siz qasam ichishingiz kerak, chunki vinil afv va turi bir-biriga mos kelmaydi. . Usí ts_ qayta tekshirish bir soat davom etadi. Dinamik harakatlar optimallashtirish uchun turli xil fokuslarga ega, masalan, JIT kompilyatsiyasi (faqat o'z vaqtida), dekodlash turlar haqida barcha kerakli ma'lumotlarni olgandan keyin qayta kompilyatsiya qilinadi. Biroq, har qanday dinamik tilni Rustda mening tilimning aniq yozilgan statik kodi bilan svidkist bilan taqqoslab bo'lmaydi.

Statik va dinamik turlarning melankoliyasi bo'yicha dalillar

Statik turdagi tizim qo'shimchalari tip tizimi bo'lmaganlar haqida gapiradi shunchaki kechir ishlab chiqarish muammolariga olib kelishi mumkin. Tse, aniq, haqiqat. Dinamik tilni yutgan odam bo'ling, uni o'zingiz sinab ko'ring.


Dinamik movs tarafdorlari shuni ta'kidlashadiki, bunday mov bilan kod yozish osonroq. Bu biz boshqacha yozadigan har qanday kod uchun mutlaqo to'g'ri, masalan, bu kod baholash. Bu muntazam ish uchun boshqa yechim va bu erda "oson" so'zini taxmin qilish oqilona. Rich Hiki mo''jizaviy tarzda "oson" so'zi haqida gapirdi va yogo zv'yazok zí "shunchaki" so'zini. Bu taklifdan hayratlanib, “oson” so‘zini to‘g‘ri talaffuz qilish oson emasligini tushunasiz. "Oson" dan ehtiyot bo'ling.


Statiklarning ortiqcha va kamchiliklari dinamik tizimlar tipizatsiya hali ham yomon vivcheni, lekin badbo'y hid ma'lum bir aniq vazifa uchun telbalarcha yotibdi.


JavaScript robotni davom ettirishga yordam beradi, lekin bu ko'r-ko'rona konvertatsiya qilishni anglatmaydi ("a" + 1 kvadratida, "a1" ni beradi). Python konservativ bo'lishga intiladi va "a" + 1 misolida bo'lgani kabi tez-tez kechirimlarni aylantiradi.


Turli xil xavfsizlik darajalariga ega turli yondashuvlardan foydalaning, ammo Python va JavaScript dinamik tarzda yozilgan tillardir.



Haskell butun sonlar va floatlarni cymdan oldin aniq konvertatsiya qilmasdan katlamaga ruxsat bermaydi. Sí í Haskell bunday katta xilma-xillikka hayron bo'lmay, statik tarzda yozilganidan xafa bo'ladi.


Ê dinamik va statik tilning shaxssiz o'zgarishlari. "Statik harakat yanada chiroyliroq, dinamikroq pastroq, agar X o'ng tomonda tursa" degan fikrga befarq osilgan bo'ladimi - ce aqldan ozish kafolatlangan bo'lishi mumkin. Siz ma'lum tillarga sodiq bo'lishingiz mumkin yoki shunchaki "X o'ng tomonda bo'lsa, Xaskell yaxshiroq, Pythonni pastroq" deb ayting.

Statik tiplashtirish tizimlarining xilma-xilligi

Keling, statik tarzda yozilgan movning ikkita mashhur misolini ko'rib chiqaylik: Go va Haskell. Go yozish tizimida aniqlangan turlar, "parametrlar" dan turlar va boshqa turlar mavjud emas. Misol uchun, siz MyList ro'yxatlari uchun o'zingizning turingizni yaratishingiz mumkin, biz uchun ma'lumotlar kerakmi yoki yo'qligini saqlashingiz mumkin. Biz MyList chiqish kodini o'zgartirmasdan MyList butun raqamlarini, MyListdagi qatorlarni va hokazolarni yaratish imkoniyatiga ega bo'lishni xohlaymiz. Matnni yozishda kompilyator aybdor: chunki MyList butun son bo‘lsa va biz ataylab qator qo‘shsak, matn terish dasturida kompilyator aybdor.


Go maxsus tarzda ishlab chiqilganki, MyList-ga tipi o'rnatishning iloji yo'q edi. Siz qila oladigan eng yaxshi narsa bu MyList uchun "bo'sh interfeyslar" yaratish: MyList ob'ektlarni yaratishi mumkin, ammo kompilyator uning turini bilmaydi. Agar bizga MyList-dan ob'ektlar kerak bo'lsa, biz kompilyator turini tekshirishimiz kerak. “Qatma qo‘l uzataman” deganimizdek, rost bo‘lsa, raqam bo‘lsa, dinamik nutqlari bilan vipadka kabi avf bo‘ladi.


Go'da, shuningdek, bugungi statik tarzda yozilgan harakatlar (yoki 1970-yillarning boshqa tizimlariga o'xshash) kabi shaxsiy bo'lmagan boshqa imkoniyatlar ham mavjud. Go ijodkorlarining o'z qarorlari uchun o'z sabablari bor edi, ammo bu diskdagi odamlarning fikri ba'zida qo'pol tuyulishi mumkin.


Keling, Haskellni ko'rib chiqaylik, u tip tizimini biroz qiyinlashtiradi. Agar siz MyList turini belgilasangiz, u holda raqamlar ro'yxatining turi oddiygina MyList Integer bo'ladi. Haskell bizga roʻyxatga qator qoʻshish va tartibni oʻzgartirishga ruxsat bermaydi, shuning uchun biz roʻyxatdagi elementni qator oʻzgarishiga sigʻdira olmaymiz.


Xaskell o'rta turlarsiz juda ko'p yig'iladigan g'oyalarni ifodalashi mumkin. Misol uchun, Num a => MyList a "Mening ro'yxatim raqamlarning bir turini ifodalovchi qiymat" degan ma'noni anglatadi. Sizda "iv, float"iv yoki butun sonlar ro'yxati bo'lishi mumkin o'nlab raqamlar belgilangan aniqlik bilan, lekin hech qanday istisnosiz, kompilyatsiya paytida o'zgartiriladigan qatorlar ro'yxati bo'lmaydi.


Har qanday raqam turlari bilan ishlaydigan qo'shish funksiyasini yozishingiz mumkin. Bu funksiya matime tipidagi Num a => (a -> a -> a) . Tse degani:

  • a raqamli tur bo'lishi mumkin (Num a =>).
  • Funktsiya a tipidagi ikkita argumentni oladi va a turini o'zgartiradi (a -> a -> a).

Qolgan misol. Funktsiya turi String -> String bo'lsa, u qatorni oladi va qatorni aylantiradi. Shu bilan bir qatorda, agar String -> IO String bo'lsa, unda kirish/ko'rinish ham mavjud. Shuningdek, siz diskka yuklab olishingiz, o'lchashingiz, terminaldan o'qishingiz va hokazo.


Funktsiyaning turi borligi kabi yo'q IO, biz bilamizki, u hech qanday kiritish-chiqarish operatsiyalarini bajarmaydi. Masalan, veb-xost yordamida siz faqat turga qarab ma'lumotlar bazasini qaysi funksiya o'zgartirayotganini aniqlashingiz mumkin. Xuddi shu dinamik va mayzhe níyakí statik movi xuddi shu tarzda amalga oshirilmaydi. Typlashning eng ilg'or tizimidan movning o'ziga xos xususiyati nimada.


Eng ko'p mov, biz ma'lumotlar bazasini nima o'zgartirayotganini bilishga harakat qilib, funktsiyalar va barcha funktsiyalarni, masalan, tovushlar va hokazolarni saralash imkoniyatiga ega bo'ldik. Qimmatbaho jarayon, unda kechirish oson. Va Haskell tipidagi tizim oziq-ovqat zanjirida ishlatilishi mumkin, bu faqat kafolatlangan.


MyList-ning oddiy g'oyasi uchun konstruktiv bo'lmagan Go bilan bu keskinlikni tenglashtiring, bu "ikkita argumentni qabul qiladigan va bir xil turdagi haqoratli raqamlarning hidini chiqaradigan funktsiya va kirish / kirishni qanday o'g'irlash haqida emas". ."


Go dasturi - Go dasturlash vositalarini yozishning oddiy usuli (dasturlash, kompilyatorni amalga oshirish oddiy bo'lishi mumkin). Ungacha kamroq tushunchalarni o'rganish kerak. Qi perevagi kabi muhim almashinuvlar - sub'ektiv oziq-ovqat bilan tenglashtirilishi mumkin. Biroq, Haskell Go'dan ko'ra muhimroq, Haskell tipidagi tizim ancha qattiqroq va Haskell kompilyatsiya qilishda ko'proq xato turlaridan foydalanishi mumkin, deb bahslasha olmaysiz.


Go va Haskell "statik mov" ning bir sinfiga to'plangan turli xil filmlar, atama to'g'ri yozilganidan qat'i nazar, Ummonga kiritilishi mumkin. Xavfsizlikning amaliy afzalliklarini sindirish uchun Go dinamik harakatlarga yaqinroq, Haskellgacha.


Boshqa tomondan, deyakí dynamíchny movi ê bezpechníshimi, nízh deyaki statik movi. (Umuman olganda, Python xavfsizroq, pastroq C). Agar siz statik yoki dinamik harakatni guruh sifatida o'rganmoqchi bo'lsangiz, mov orasidagi vakolatlar sonining kattaligi haqida unutmang.

Tipifikatsiya tizimlarining imkoniyatlarini aniq qo'llash

Qattiqroq tiplashtirish tizimlarida ko'proq quruq tenglarning almashinuvini ko'rsatish mumkin. Kílka o'qi qo'llaniladi, lekin ulardagi tsikllarda bormang, chunki johillik sintaksisi.


Go yordamida siz “qo‘shish funksiyasi ikkita butun sonni oladi” va butun sonni aylantiradi” deyishingiz mumkin:


func add(x int, y int) int (qaytish x + y)

Haskellda siz "funktsiyani qabul qilish" deyishingiz mumkin kabi bo'lish bir xil turdagi sonlarni o'zgartiradigan raqamli tur":


f:: Num a => a -> a -> a qo'shing x y = x + y

Idris "funksiya ikkita butun sonni qabul qiladi" deb aytishi va butun sonni aylantirishi mumkin, aks holda birinchi argument boshqa argument uchun kichikroq uchun aybdor bo'ladi:


qo'shish: (x: Nat) -> (y: Nat) -> (avtomatik kichikroq: LT x y) -> Nat qo'shish x y = x + y

Agar birinchi argument ikkinchisidan kattaroq bo'lgan qo'ng'iroq funksiyasini qo'shish 2 1 ni sinab ko'rsangiz, kompilyator dasturni to'xtatadi. kompilyatsiya soati ostida. Birinchi argumentni boshqasidan kattaroq qiladigan dastur yozish mumkin emas. Rídkísna mova maíê bunday imkoniyat. Ko'pchilik mov vikonann qachon bunday reverb bor: biz faqat masalan, agar x >= y yozgan edi: rise SomeError() .


Haskellda bu turdagi ekvivalenti yo'q, masalan, Idris ilovasida ko'proq va Go'da na Haskell ilovasiga, na Idris ilovasiga ekvivalenti yo'q. Xulosa qilib aytganda, Idris anonim xatolarni yengishi mumkin, shuning uchun u Haskellni mag'lub eta olmaydi va Haskell Go'ni eslamaslik uchun soqov xatolarni mag'lub etishi mumkin. Ikkala yo'nalishda ham sizga kerak qo'shimcha qobiliyat tiplashtirish tizimlari, go'yo til katlamasini buzish uchun.

Ba'zi statik mov uchun tiplashtirish tizimlari

O'q - deyaky movni germetiklikni oshirish tartibida tipifikatsiya qilish tizimlarining qo'pol tarjimasi. Men sizga ro'yxat beraman oshkoralik tizimlarning qattiqligi haqida, mutlaq haqiqatning yangi darajasiga ko'tarilish talab qilinmaydi. Bir guruhda tanlangan mov birma-bir kuchli bezovtalanishi mumkin. Teri terish tizimining o'ziga xos muammolari bor va ularning ko'pi murakkabroq.

  • C (1972), Go (2009): Belgilangan turlarni ko'rsatmasdan, tizim raqamini bosish kerak emas MyList turini ko'rsatish mumkin emas, bu "butun sonlar ro'yxati", "satrlar ro'yxati" va boshqalarni anglatadi. Natom_st "ahamiyatsiz qadriyatlar ro'yxati" bilan ishlaydi. Dasturchi "qatorlar ro'yxati" ni vaqti-vaqti bilan qayta ko'rib chiqishda aybdor, agar qator ro'yxatda bo'lsa va siz uni keyingi soat davomida kechirishingiz mumkin.
  • Java (1995), C# (2000): Filmning jinoyatlari og'irlashtirilgan turlar tomonidan qo'llab-quvvatlanadi, shuning uchun MyList nima deyish mumkin u qatorlar ro'yxatiga ega, qaysi kompilyator haqida biladi va ko'proq turdagi qoidalarga amal qilishi mumkin. Ro'yxatdagi elementlar String tipida bo'ladi, kompilyator har doimgidek kompilyatsiya qilishda qoidalarni majburlaydi, shuning uchun kompilyatsiya qilishda kechirimlar kichikroq bo'ladi.
  • Xaskell (1990), Rust (2010), Svift (2014): Ularning barchasi bir oz fohishaviy imkoniyatlarga ega bo'lishi mumkin, jumladan, umumiy turlar, ma'lumotlarning algebraik turlari (ADT) va turlar sinflari yoki shunga o'xshash (sinflar turlari, belgilar (belgilar) va protokollar, shubhasiz). Rust va Swift mashhur, kamroq Haskell va ko'proq mashhur tashkilotlar (Mozilla va Apple, shubhasiz).
  • Agda (2007), Idris (2011): Tsí movi pídrimuyut eskirgan tipi, sizga kshtaltda tipi yaratish imkonini beradi "funktsiya, yak ikkita butun sonni qabul qiladi x í y, de y ko'proq, pastki x". Navit obezhennya "y ko'proq pastki x" kompilyatsiya qilishda majburlanadi. Qachon vikonanna y, nima bo'lishidan qat'i nazar, chi bir x dan kam bo'lmaydi. Hatto nozikroq, ammo muhimroq hokimiyat tizimlari ularning tilida statik ravishda buzilishi mumkin. Allaqachon dasturchilar kam, ammo ular baribir ulardan ulug'vor ishtiyoqni chaqirishadi.

Kelajakdagi tiplashtirish tizimlarida aniq yorilish bor, ayniqsa mov asosining oddiy faktiga ko'ra emas, balki movning mashhurligi bilan baholanadi. Vídomy vynyatok - tse Go, nima uchun statik mov vvazhayut Yogo Croc orqaga qaramlar ko'p bor tushuntiradi.


Ikkinchi guruh (Java va C#) - asosiy filmlar, zryli va keng tarqalgan hindibo.


Uchinchi guruh Mozilla (Rust) va Apple (Swift) kompaniyalarining katta yordami bilan asosiy oqimga kirish ostonasida turibdi.


Chotiri guruhi (Idris va Agda) asosiy oqimdan uzoqda, lekin u soat bilan o'zgarishi mumkin. Film guruhi o'n yil oldin asosiy oqimdan uzoqda joylashgan uchta boules.

Suvora turi- til dasturlashda g'olib bo'lgan ma'lumotlar turlari bilan ishlash siyosatining variantlaridan biri.

vykonannya haqoratli obov'yazykovyh aql o'tkazish Suvora typyzatsyya:

  1. Mening tilimda ma'lumotlar ob'ekti (o'zgartirilgan, doimiy, viraz) mavjud bo'ladimi, bu suvoro qo'shiq turi bo'lib, u dasturlarni tuzish (statik tiplash) vaqtida belgilanadi va har soatda terish (dinamik tiplash) aniqlanadi. .
  2. Faqat o'zgartirilganlar bilan bir xil turdagi ma'lumotlar bo'lishi mumkin bo'lgan qiymatlarni o'zgartirishga ruxsat beriladi, parametrlarni qanday o'tkazish va funktsiyalar natijalarini aylantirish bo'yicha bir xil almashish mumkin.
  3. Teri jarrohligi bir xil turdagi parametrlarni talab qiladi.
  4. Turlarni bilvosita oʻzgartirishga ruxsat berilmaydi (shuning uchun tarjimon notoʻgʻri turdagi qiymatni oʻzgartirishga urinayotganligini, masalan, oʻzgarish, parametr, funksiya yoki operatsiya tavsifini sintaktik kechirim sifatida qabul qiladi).

To'liq dotrimanní bilan suvoro í̈ typízatsíí navít víní vídní vídní vídní v znachení í ruxsat etilgan operatsiyalar í turi íníê aqldan ozish mumkin edi. Agar dastur bir turdagi ma'lumotlarning qiymatini boshqa turga belgilashi kerak bo'lsa, buni amalga oshirish mumkin, lekin faqat turni o'zgartirish uchun maxsus operatsiyani aniq sozlash yo'li bilan, chunki bunday hollarda u ma'lumotlarning bir qismiga o'xshaydi. dasturlash (agar iloji bo'lsa, rasmiy ravishda, lekin standart bo'lmasangiz).

Bir amaliy vykoristovuvan mov dasturlash zí qat'iy typízatsíêyu - tse Ada. To'ldirish uchun juda ko'p kengroq til dasturlari va qat'iy bo'lmagan statik yozish mavjud. Bunday mov uchun, masalan, Paskal, Modula-2, Java. Agar o'zgartirish turlari, parametrlari va funktsiyalarining tilga xos tavsifi mavjud bo'lsa va agar bilvosita translyatsiya turlariga ruxsat berilsa - har xil hollarda, agar bir turdagi qiymat boshqa o'zgarishlarga tayinlangan bo'lsa, kompilyator avtomatik ravishda konvertatsiya kodini yaratadi. kerakli turdagi qiymat, shuning uchun faqat bunday konvertatsiya amalga oshirilmaydi. Demak, masalan, butun songa oʻzgartirish belgilanishi mumkin, u suzuvchi nuqtali raqam kabi aytiladi va qaytish turi aniq qisqartirilmasdan tayinlanadi, u oʻraladi, yuqori taqlidga ega boʻlaklar kechiriladi. . Deyakí movi, yaki rasmiy ravishda ma'lumotlar turini tushunadi, haqiqatan ham tipifikatsiya qilmaydigan deb hisoblash mumkin. Bunday harakatlardan oldin, klassik C kiritiladi, bu holda, turlar ovozli bo'lsa-da va zarur bo'lsa-da, aslida, barcha ma'lumotlar turlari topshiriqlar uchun jamlangan (hozirgi C kompilyatorlari bu erkinlik o'rtasida va eng kam oldinga qarab ko'ring. turlarini xavfli konvertatsiya qilish holatlari).

Dasturlash nazariyasida suvor tipizatsiyasi rivojlanishning ishonchliligini ta'minlashning ajralmas elementidir. dastur hissalari. To'g'ri zastosuvanni bilan (nima uzatiladi, nima dasturda aytiladi va mantiqiy aqldan ozgan qiymatlar uchun ma'lumotlar turlari uchun ishlatiladi) u dasturchini oddiy, ammo muhim kechirimlardan himoya qiladi. uxlab yotgan g'alabalar mantiqiy aqldan ozgan ma'nolar, ba'zi odamlar oddiy yozuv xatosi orqali ayblashadi. Shunga o'xshash kechirimlar dasturlarni tuzish bosqichida yanada ko'proq paydo bo'ladi, ammo deyarli har qanday turlarning bir-biriga nisbatan yashirin qisqarishi mumkinligi sababli (masalan, Cí klassik tilida), cí afvlar faqat sinov uchun paydo bo'ladi, bundan tashqari, jami obsya va vydrazu yilda. Boshqa tomondan, ko'plab professional dasturchilar noto'g'ri ishlash orqali qattiq yozishni yoqtirmaydilar - ko'proq dasturlar va ko'proq yozish soatlari bo'ladi, bu esa zayvim uchun yanada boyroq bo'lgan haqiqiy kod bilan ishlashni anglatadi.

  • Dinamik terish - bu tilni dasturlashda va til spetsifikatsiyasida keng qo'llaniladigan usul bo'lib, u o'zgarganda, u ovozli o'zgarish vaqtida emas, balki qiymatni belgilash paytidagi turi bilan chaqiriladi. Ushbu darajadagi, turli dilerlik do'konlarida, dastur bir xil va har xil turdagi qiymatlarni o'zgartirishi mumkin. Amaliy dinamik yozish - Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Lisp, xBase, Erlang, Visual Basic.

    Protilezhny qabul qilish - statik tipizatsiya.

    Kuchsiz dinamik terishli ba'zi harakatlar qiymatlarni tenglashtirish muammosiga ega, shuning uchun, masalan, PHPda "==", "!=" va "===", "!==" tenglashtirish operatsiyalari bo'lishi mumkin, yana bir juft qiymatlarni tenglashtiruvchi operatsiyalar, bu turdagi ilonlar. "===" operatsiyasi faqat to'liq ishga tushirilganda, "==" ko'rinishida, qaysi turdagi ishlatilsa, rostni beradi: (1=="1"). Shuni ta'kidlash kerakki, bu boshning dinamik tipifikatsiyasi va o'ziga xos mov dasturlash muammosi.

Po'yazaní tushunish

Mova dasturlash - rasmiy til, rekord uchun tan olingan kompyuter dasturlari. Til dasturlash leksik, sintaktik va semantik qoidalar to'plamini belgilaydi eski ko'rinish dasturlari va podíí̈, yakí vikonaê vykonavets (ovoz - EOM) kerívnitstvom ostida.

Movi dasturlashda sintaktik shakar (eng. Sintaktik shakar) - ce sintaktik fizibilite, dasturlarning bunday o'rnatish xatti-harakatlarini zastosuvannya, lekin odamlar uchun vikoristannya movi zruchníshim talon-taroj qilish.

Quvvat - qo'shiq turining o'zgarishiga taqlid qiluvchi ob'ektning ichki holatiga kirish usuli. Ob'ektning kuchiga aylanish strukturaviy maydonga (strukturaviy dasturlashda) aylanish kabi ko'rinadi, lekin aslida u tez bosish funktsiyasi orqali amalga oshiriladi. Sinab ko'rganingizda, qiymatni kiriting berilgan kuch bir usul chaqiriladi va bu kuchning ma'nosini topishga harakat qilganda - boshqa.

Kengaytirilgan Backus shakli - Naur (kengaytirilgan Backus - Naur shakli (RBNF)) - sintaksisni belgilashning rasmiy tizimi bo'lib, unda bir sintaktik toifa boshqalari orqali ketma-ket tayinlanadi. Kontekstga xos rasmiy grammatikalarni tavsiflash uchun g'alaba. Niklaus Virt tomonidan targ'ib qilingan. Bekus-Naur shakllarini kengaytirilgan qayta ishlash bilan ular BNFga kattaroq "yarim" konstruktsiyalar bilan kiritiladi, bu esa bir xil turdagi binolar bilan so'rashga imkon beradi ...

Amaliy dasturlash - deklarativ dasturlash turlaridan biri bo'lib, unda dasturlar bir ob'ektni boshqasiga tizimli ravishda o'zgartiradigan tarzda yoziladi. Bunday turg'unlikning natijasi yangi ob'ekt bo'lib, u zastosuvanniyada funktsiya roli sifatida ishtirok etishi mumkin, shuningdek, argument va hokazo. Maqsad dasturni matematik jihatdan aniq yozishdir. Funktsiyaning virus bilan ko'rsatilishi, funktsiyalarning boshqa ma'nosi - funktsional ... mavjudligidan dalolat beradi.

Konkatenativ til dasturlash koddagi ikkita fragmentning birlashishi uning tarkibini o'zgartirishiga asoslangan asosiy til dasturlashidir. Bunday tilda argument funksiyalarini bilvosita kiritish (div. maʼnosiz dasturlash) keng qoʻllaniladi, yangi funksiyalar funksiyalar tarkibi sifatida aniqlanadi va ilovani almashtirish birlashtiriladi. Ushbu yondashuv amaliy dasturlashga qarshi.

O'zgartirish - bu, qoida tariqasida, raqamli qiymatni o'zgartirishi mumkin bo'lgan jismoniy yoki mavhum tizimning atributi. O'zgarish tushunchasi matematika, tabiiy fanlar, texnologiya va dasturlash kabi to'garaklar tomonidan keng qo'llaniladi. O'zgaruvchan butalar bo'lishi mumkin: haroratni tekshirish, funktsiya parametri va boshqalar.

Língvístitsí va ínformatící da sintaktik tahlil (abo parsing, jargon parsing ← English parsing) - líníynoí poslídovností leksemalarni (slív, tokenív) tabiiy yoki rasmiy tilni rasmiy grammatika bilan oʻrnatish jarayoni. Natijada tahlil qilish daraxti (sintaktik daraxt) hosil bo'ladi. Ovoz leksik tahlil bilan bir vaqtning o'zida zastosovuêtsya.

Umumlashtirilgan algebraik ma'lumotlar turi (GADT) algebraik ma'lumotlar turlaridan biri bo'lib, uning konstruktori u bilan bog'liq bo'lmagan turdagi qiymatni o'zgartirishi mumkinligi bilan tavsiflanadi. O'rta tarixdan oldingi kuzgi tiplarning induktiv oilalari haqida ko'plab ish bilan yaratilgan.

Dasturlashdagi semantika - bu mov dasturlash dizaynining ma'nosini rasmiylashtirishni, ularning rasmiy matematik modellarini qo'llab-quvvatlashni rivojlantiruvchi fan. Bunday modellarni rag'batlantirish vositalari sifatida turli misollardan foydalanish mumkin, masalan, matematik mantiq, l-son, ko'plik nazariyasi, kategoriyalar nazariyasi, modellar nazariyasi, universal algebra. Kino dasturining semantikasini rasmiylashtirish kinoni tasvirlash, kino kuchini ifodalash usuli sifatida ishlatilishi mumkin.

Ob'ektga yo'naltirilgan dasturlash (OOP) - bu taqdim etilgan dasturlarga asoslangan dasturlash metodologiyasi bo'lib, u ob'ektlarning umumiy yig'indisini, birinchi sinfning har qanday namunasi bilan terini ko'rib chiqadi va sinf parchalanish ierarxiyasini qondiradi.

Dinamik o'zgarish - dasturni o'zgartirish, joylashtirish operativ xotira píd yaku vídílyaêtsya píd híkonannya dasturi. Aslini olganda, xotira yo'q, bir soatlik robot dasturlari ostida aniq maqsadlar uchun dasturlar tizimi. Tsim vídíznyaêtsya víd globalí í̈ staticíí̈ zminnoí̈ - dilyanki pomyatí, robotlashtirilgan dasturning boshoqchasidan oldin maxsus maqsadlar uchun dastur tizimi tomonidan ko'rilgan. Dinamik o'zgarish - xotirani o'zgartirish sinflaridan biri.

Kerakli minimal jim nutqlardan o'ch olish uchun, chunki dinamik yozishni yomon deb atamaslik uchun matn terish haqida bilish kerak, Lisp - yozilmagan mening va C - mening qattiq tiplashim.

Eng so'nggi versiyada barcha turdagi turdagi hisobot tavsifi, kodga ziravorlar, mashhur filmlar haqidagi xabarlar va dasturlash va ekran rasmlari mavjud.

Men sizga maqolaning qisqa versiyasini teskari, keyin esa xulosani o'qishni tavsiya qilaman.

Qisqa versiya

Matn terish orqali kino dasturlash ikkita katta lagerga bo'lingan deb qabul qilinadi - matn terish va yozilmagan (tiplanmagan). Birinchi misol C, Python, Scala, PHP va Lua, ikkinchisi esa assembler tili, Forth va Brainfuck.

Shunday qilib, uning sutty uchun "hayvon turi" sifatida, u mantar kabi oddiy; Va filmni tiplashtirish o'qi o'zgartirilgan ko'proq toifalarga bo'linadi:

  • Statik/dinamik yozish. O'zgarishlar va funktsiyalarning oxirgi turlari kompilyatsiya bosqichida o'rnatilganligi bilan statik ravishda aniqlanadi. Tobto. allaqachon kompilyator 100% siz qaysi turni bilishingizga ishonch hosil qiladi. Dinamik tiplashda barcha turlar dastur oxirida allaqachon z'yasovyatsya bo'ladi.

    Qo'llash:
    Statik: C, Java, C#;
    Dinamik: Python, JavaScript, Ruby.

  • Kuchli/zaif tiplashtirish (qattiq/qattiq bo'lmagan deb ham ataladi). Kuchli tiplashtirish ko'rinib turibdiki, til har xil turlarda aralashishga yo'l qo'ymaydi va avtomatik yashirin transformatsiyani yutib yubormaydi, masalan, shaxssizni ko'rish mumkin emas. Zaif tipizatsiyaga ega filmlar hech qanday yashirin o'zgarishlarsiz avtomatik ravishda o'zgartirilishi mumkin, shuning uchun bu aniqlikni yo'qotishi yoki transformatsiya noaniq bo'lishi mumkin.

    Qo'llash:
    Kuchli: Java, Python, Haskell, Lisp;
    Zaif: C, JavaScript, Visual Basic, PHP.

  • Aniq/to'g'ridan-to'g'ri yozish. Yangi o'zgarishlar/funksiyalar/argumentlar turi aniq belgilanishi kerakligi sababli aniq yozilgan movslar kiritiladi. Shubhasiz, yashirin terish bilan film kompilyator/tarjimonga uzatiladi.

    Qo'llash:
    Yavna: C++, D, C#
    Yashirin: PHP, Lua, JavaScript

Shuni ham ta'kidlash kerakki, barcha toifalar bir-birini almashtiradi, masalan, C tili statik jihatdan zaif aniq yozilishi mumkin va Python tili - dinamik jihatdan kuchli.

Prote emas buvaê mov zí staticí̈ va dynamíchní̈ typízatsiy kechada. Men bu erda nima haqida yolg'on gapirayotganimni oldindan aytmoqchiman - badbo'y hid haqiqat, lekin boshqa narsa haqida.

Batafsil versiya

Qisqa versiya kabi, siz yaxshi ish qildingiz, yaxshi. Bekorga emas, men hisobot yozyapmanmi? Golovnening so'zlariga ko'ra, qisqa versiyada barcha makkajo'xori va sirk ma'lumotlarini o'z ichiga olishning iloji yo'q edi, lekin siz uni zo'rg'a o'qib chiqishingiz uchun uzoq vaqt davomida xabar berishingiz mumkin edi.

Tursiz tiplashtirish

Tilsiz til dasturlarida barcha kunlar oddiy zarbalar ketma-ketligi, turli kunlar bilan kiritiladi.

Tipsiz tiplashtirish past darajadagi (assembler tili, Forth) va ezoterik (Brainfuck, HQ9, Piet) tillarga tanish eshitiladi. Biroq, unda, nedolikami tartibida, ê deakí perevagi.

Perevagi
  • Bu sizga juda past darajada yozishga imkon beradi, bundan tashqari, kompilyator/tarjimonga hech qanday turdagi tekshiruvlar ta'sir qilmaydi. Vílni robiti ma'lumotlarning be-yakim turlari bo'yicha be-yakí operatsiyalari.
  • Tanlovni bekor qilish kodi samarali bo'ladi.
  • Vkazivokning shaffofligi. Tilni bilish bilan, keyingi kod nima ekanligiga shubha yo'q.
Nedoliki
  • Katlama. Ko'pincha ro'yxatlar, qatorlar va tuzilmalar kabi berilgan murakkab qiymatlarga bo'lgan ehtiyojda ayblanadi. Iz cimni qo'lsizligi uchun ayblash mumkin.
  • Vídsutníst perevyrok. Be-yakí bezgluzdí díí̈, masalan vídnímannya pokazhchika massivida íz ramzi vvazhatimuetsya tsílkom normal, scho tutib bo'lmaydigan avf olib kelishi mumkin.
  • Kam mavhumlik. Katlanadigan turdagi ma'lumotlarga ega robot raqamlarga ega robotga o'xshamaydi, uni yaratish juda qiyin.
Tipsiz tipifikatsiya kuchlimi?

Ha, ha, ha. Masalan, mov assemblerda (x86 / x86-64 arxitekturasi uchun, boshqalarni bilmayman) dasturni yig'ish mumkin emas, shuning uchun siz cx registrida (16 bit) ma'lumotlarni rax registridan olishga harakat qilishingiz mumkin. (64 bit).

mov cx,eax; soat yig'ilishini kechiring

Keyin boring, asemlerdagi tur nima? Menga bir nechta tuzatishlar bor. Va sizning fikringiz, zvysno, sizdan kamroq yotadi.

Statik va dinamik tiplashtirish

Golovne, u statik (statik) tiplashni dinamik (dinamik) deb hisoblaydi, barcha turdagi qayta tekshirishlar terish bosqichida emas, balki kompilyatsiya bosqichida tekshiriladi.

Deyakim odamlar qochishlari mumkin, bu statik tipizatsiya juda kichik (aslida shunday, ko'p odamlar uzoq vaqtdan beri bunday usullardan yordam so'rashgan). Deyakim, scho dinamik tarzda tasvirlangan film - tse gra z fire, lekin ularni qanday ko'rish mumkin? Biror sababga ko'ra imkoniyatlarni ko'rmayapsizmi? Nega yo'q, nega statik va dinamik ravishda terilgan juda ko'p mov?

Keling, bir ko'rib chiqaylik.

Statik yozishning afzalliklari
  • Turni qayta ko'rib chiqish faqat bir marta - kompilyatsiya bosqichida amalga oshiriladi. Va bu shuni anglatadiki, agar biz raqamni ketma-ket qo'shishga harakat qilmasak (va kechirimli bo'lsak, aks holda biz o'zgartirish kiritamiz) oldinga siljishimiz shart emas.
  • Shvidkist vykonannya. Oldingi nuqtadan ko'rinib turibdiki, statik tarzda yozilgan filmlar amalda ko'proq dinamik tarzda teriladi.
  • Deyakih dodatkovyh aqli uchun siz kompilyatsiya bosqichida allaqachon potentsial kechirim ko'rsatish imkonini beradi.
Dinamik tiplashtirishning afzalliklari
  • Umumjahon kollektsiyalarni yaratishning soddaligi - hamma narsa va hamma narsaning kombinatsiyasi (kamdan-kam hollarda bunday ehtiyojni ayblaydi, lekin agar siz dinamik tipizatsiyani ayblasangiz, buni qilishingiz mumkin).
  • Murakkab algoritmlarni tavsiflash qulayligi (masalan, massivni tartiblash, qoida tariqasida, nafaqat butun sonlar ro'yxatida, balki nutq raqamlari ro'yxatida va qatorlar ro'yxatida ham).
  • O'zlashtirish oson - dinamik matn terish xususiyatiga ega filmlar dasturlashni xohlaydiganlar uchun yanada yaxshi eshitiladi.

Yangilangan dasturlash

Yaxshi, dinamik yozish uchun eng muhim dalil - bu murakkab algoritmlar tavsifining ravshanligi. Keling, o'z muammomizni bilib olaylik - bizga qancha massiv (yoki ro'yxat) - butun sonlar massivi, nutq massivi va belgilar massivini qidirish uchun funksiya kerak.

Qanday qilib biz virishuvatememo qilamiz? Virishimo її 3 xil til: biri dinamik tipifikatsiyaga ega va ikkitasi statik.

Hazil uchun algoritm, men eng oddiylaridan birini - sanab o'tishni olaman. Funktsiya izlanadigan elementni, massivni (yoki ro'yxatni) o'rnatish va element indeksini aylantirishdir, aks holda element noma'lum - (-1).

Dinamik yechim (Python):

Def find(required_element, list): uchun (indeks, element) bittada (ro'yxat): agar element == zarur_element: indeksni qaytarish (-1)

Yak bachite, hamma narsa oddiy va kundalik muammolar scho, scho ro'yxatida istalgan raqam, har qanday ro'yxat bo'lishi mumkin, hatto boshqa massivlar bo'lmasa ham. Yaxshi. Davom etaylik - keling, vazifani C dagi ko'rib chiqaylik!

Statik yechim (Si):

unsigned int find_int (int required_element, int array, unsigned int size) ( uchun (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); }

Teri funktsiyasi Python-ning 3-versiyasiga juda o'xshaydi, lekin nima uchun uchtasi bor? Statik dasturlash muvaffaqiyatsiz tugadimi?

men shunday í ni. Bir nechta dasturlash usullari mavjud, ulardan birini biz bir vaqtning o'zida ko'rib chiqishimiz mumkin. Bu chet el dasturlash deb ataladi, bu C++ tilini qo'llab-quvvatlaydi. Keling, yangi versiyani ko'rib chiqaylik:

Statik yechim (ilg'or dasturlash, C++):

Shablon unsigned int find(T required_element, std::vector massiv) ( uchun (unsigned int i = 0; i< array.size(); ++i) if (required_element == array[i]) return i; return (-1); }

Dobre! Bu juda izchil ko'rinmaydi, Python-dagi pastki versiya va shu bilan birga men ko'p yozish imkoniyatiga ega emas edim. Bundan tashqari, biz vazifani bajarish uchun zarur bo'lgan uchta massiv uchun emas, balki barcha massivlar uchun dasturni olib tashladik!

Ushbu versiya zarur bo'lganlarga o'xshaydi - biz bir vaqtning o'zida dinamikning ortiqcha va statik yozuvlarini va faol plyuslarini olamiz.

Bu ajoyib, nima bo'lishi mumkin, lekin bundan ham chiroyliroq. Ilg'or dasturlash aqlli va chiroyli bo'lishi mumkin (masalan, ko'proq Haskell bilan). Boshqa yo'l bilan, yanada murakkab dasturlashdan tashqari, polimorfizm (natija yuqori bo'ladi), revantaging funktsiyalari (xuddi shunday) yoki makrolarni zastosuvat qilish ham mumkin.

Statika va dinamika

Bundan tashqari, qanday ko'p statik til dinamik yozishda g'alaba qozonishga imkon berishini taxmin qiling, masalan:

  • C# dinamik pseudo turini qo'llab-quvvatlaydi.
  • F# operator kabi sintaktik kodni qo'llab-quvvatlaydimi?
  • Xaskellning dinamik yozishi Data.Dynamic moduli tomonidan ta'minlanadi.
  • Delphi - maxsus Variant turi yordami uchun.

Shuningdek, filmni dinamik ravishda yozish harakatlari statik yozish yordamida tezlashtirishga imkon beradi:

  • Common Lisp - turdagi deklaratsiyalar.
  • Perl - s versiyasi 5.6, dosit obzhezheno.

Kuchli - bu zaif tur

Kuchli tipifikatsiyaga ega filmlar har xil turdagi viruslarning kundalik tabiatini o'zgartirishi va kundalik avtomatik o'zgarishlarni yutib bo'lmaydi. Ular, shuningdek, "Suvoroy tiplashidan olingan film" deb ataladi. Buning uchun inglizcha atama kuchli yozishdir.

Zaif terilgan mov, navpak, spriyat hamma narsani shunday qilib, dasturchi har xil turlarni bir yo'l bilan o'zgartirdi va kompilyatorning o'zi hammasini bitta turga keltirdi. Ularni "suvoroy tipik bo'lmagan filmlar" deb ham atashadi. Buning uchun inglizcha atama zaif terishdir.

Zaif tiplashtirish ko'pincha dinamik bilan aralashtiriladi, bu unday emas. Dinamik tarzda terilgan til zaif va kuchli tarzda yozilishi mumkin.

Biroq, kamdan-kam odam tipifikatsiyaning qat'iyligi muhimligini biladi. Ko'pincha til statik tarzda yozilganligi aytiladi, keyin siz kompilyatsiya qilish uchun cheksiz potentsial kechirimlardan foydalanishingiz mumkin. Aldading!

Mova ona va kuchli tipizatsiya uchun aybdor. To'g'ri, agar kompilyator sizga kechirim haqida gapirsa, u shunchaki qatorni raqamga qo'shib qo'yadi, aks holda u yuqoriroq, biz bitta massivdan boshqa massivni ko'ramiz, bu bizga nima foyda, qanday "qayta tekshirish" turlari kompilyatsiya bosqichida bo'ladi? To'g'ri - kuchsiz - statik tiplashtirish kuchliroq, pastroq - kuchli dinamik! (Xo'sh, bu mening fikrim)

Xo'sh, nega zaif turlarning ortiqcha afzalliklari yo'q? Bu shunday ko'rinishga ega bo'lishi mumkin, men kuchli tipizatsiya uchun qattiq mosman, men aybdorman, kuchsizlar bir xil perevaga ega ekanligini hurmat qilmasdan.

Qanday qilib bilmoqchimisiz?

Kuchli tipifikatsiya belgilari
  • Nadyynyst - Siz kompilyatsiya kechirish, noto'g'ri xatti natomíst uchun aybdor.
  • Shvidkíst - zamíst prihovannyh qayta ishlash, yakí vitratnymi bilan amalga oshirilishi mumkin, íz kuchli typízíêyu u í̈h aniq yozish kerak, scho zamushuê dasturchi minimal sifatida tsya dilyanka kodi povilnoy bo'lishi mumkin, deb bilaman.
  • Robotlar va dasturlarni bilish - yana, yashirin turlarni almashtirish, dasturchi hamma narsani o'zi yozadi, bu taxminan aql-idrokni anglatadi, bu qator va raqamning hizalanishi jozibali ko'rinmaydi.
  • Uchrashuv - agar siz o'zgartirishni qo'lda yozsangiz, nimaga aylantirayotganingizni aniq bilasiz. Shunday qilib, siz doimo bunday o'zgarishlar aniqlik va noto'g'ri natijalarni yo'qotishga olib kelishi mumkinligini bilib olasiz.
Zaif xarakteristikalar
  • Aralash oyatlarning g'alabalarining ko'p qirraliligi (masalan, z tsilih chi nutq raqamlari).
  • Tiplashtirish va vazifalarga e'tiborni qaratish ko'rinishidagi abstraksiya.
  • Qisqa eslatma.

Harazd, biz o'sib chiqdik, tipografiyaning zaif turida, ya'ni perevagida paydo bo'ladi! Va zaif turdagi plyuslarni kuchliga o'tkazish usullari qanday?

Bu ko'rinadi, ê men ikki navit.

Bir ma'noli vaziyatlarda va ma'lumotlarni yo'qotmasdan turni aniq qisqartirish

Uh ... Uzoq paragrafni tugating. "Obmezhene inplicit transformation" ga tez yoga beraman.

Vaziyat aniq; Masalan, ikkita raqamni qo'shish o'qi bir ma'noli holatdir. Raqamni massivga aylantirish esa no (bir elementdan massiv yaratish mumkin, massivni shunday uzoq vaqt davomida bloklash uchun elementlarni to‘ldirish mumkin va raqamni o‘zgartirish mumkin) qatorga, so'ngra belgilar qatoriga).

Ma'lumotlarni qaytarish yanada sodda. Nutqning 3,5 raqamini raqamga qanday o'zgartirishimiz mumkin - biz ma'lumotlarning bir qismini sarflaymiz (aslida, operatsiya noaniq - yaxlitlash qanday amalga oshiriladi? Kattaroq tomonda? Kichikroq tomonda?

Noaniq vaziyatlarda reenkarnasyon, ikkinchi ma'lumotlar bilan qayta tashkil etish - bu yaxshiroq, yomonroq. Dasturlash uchun maxsus narsa yo'q.

Agar menga ishonmasangiz, PL/I tilini o‘qing yoki bu xususiyatni qidirib toping. Yangisi HAMMA ma'lumotlar turlarini o'zgartirish qoidalariga ega! Faqat jahannam!

Harazd, keling, yashirin transformatsiyaning o'zgarishi haqida o'ylab ko'raylik. Qanday harakat? Shunday qilib, masalan, Paskalda siz butun sonni nutqda aylantirishingiz mumkin, lekin noto'g'ri emas. Shunga o'xshash mexanizmlar C#, Groovy va Common Lisp tillarida mavjud.

Garazd, kuchli tildan zaif turdan bir-ikki plyus olishning yana bir yo'li borligini ko'rsatdim. Shunday qilib, sharob konstruktorlarning polimorfizmi deb ataladi.

Men Haskellning mo''jizaviy filmi ilovasida yoga tushuntiraman.

Polimorf konstruktorlar ehtiyotkorlik natijalarini tasdiqladilar, bu asosan raqamli harflardan foydalanish soati uchun zarur bo'lgan xavfsiz yashirin konvertatsiyadir.

Misol uchun, siz pi + float(1) o'rniga pi + 1.0 yozishni xohlamaysiz. Men faqat pi + 1 yozmoqchiman!

U Haskellda buzilgan, chunki literal 1 o'ziga xos turga ega emas. Narx ní cíle, ní nutq, ny murakkab. Bu shunchaki raqam!

Natijada, x dagi barcha raqamlarni y ga (1 ga o'sish bilan) ko'paytiruvchi oddiy sum x y funksiyasini yozishda biz versiyalar sonini - butun sonlar uchun sum, nutq uchun yig'indi, ratsional uchun yig'indi, yig'indini hisobga olamiz. kompleks raqamlar uchun va o'zingiz belgilagan barcha raqamli turlar uchun summani yozing.

Zvichayno ryatuê tsey priyom faqat qachon vikoristanní zmíshanih virazív íz sonli harflar, lekin aysbergning faqat uchi.

Shunday qilib, eng yaxshi yo'l kuchli va zaif tipizatsiya o'rtasidagi chegarada muvozanat bo'ladi, deb aytishimiz mumkin. Menda biron bir tilda mukammal muvozanat yo'q ekan, men zaif terilgan harakatlarga (masalan, C, JavaScript, Lua, PHP kabi) emas, balki qattiq terilgan harakatlarga (masalan, Haskell, Java, C#, Python) moyilman. ).

Aniq va yashirin yozish

Mova aniq tipifikatsiyasi bilan dasturchi barcha o'zgarishlar va funktsiyalarning turini ko'rsatishda aybdor ekanligini bildiradi, go'yo kar bo'ladi. Buning uchun inglizcha atama aniq yozishdir.

To'g'ridan-to'g'ri yozish, navpaki, proponuê bilan Mova turlarini unutib, tur ta'rifini kompilyator yoki tarjimonga o'tkazing. Ingliz tilidagi so'z bilvosita yozishni anglatadi.

Orqa tomonda, yashirin tipizatsiya bir xil darajada kuchli dinamik va aniq - statik deb aytishingiz mumkin, ammo bundan tashqari, unday emas.

Chi ê terining ko'rinishining afzalliklari va yana chi ê í̈x kombinatsiyalari í chi ê movi z ikkala usulni ham qo'llab-quvvatlaydimi?

Aniq tiplashtirishning afzalliklari
  • Imzoning teri funksiyasining mavjudligi (masalan, int add(int, int)) qaysi funksiya ishlashini oson aniqlash imkonini beradi.
  • Dasturchi ma'lum bir o'zgarishdan qanday turdagi qiymatni olish mumkinligini darhol yozib qo'yadi, bu esa eslab qolish zaruratini keltirib chiqaradi.
Yashirin yozish xususiyatlari
  • Qisqa eslatma - def add(x, y) int add(int x, int y) dan aniq qisqaroq.
  • O'zgarishlarga chidamli. Misol uchun, agar vaqtni o'zgartirish funktsiyasi kirish argumenti bilan bir xil turga ega bo'lsa, unda aniq yozilgan harakatda, kiritish argumentining turini o'zgartirganda, vaqtni o'zgartirish turini o'zgartirish kerak bo'ladi.

Yaxshi, haqoratlar plyuslar va minuslar kabi kelishi va ketishi aniq (va kimda yana nima bor?), unda keling, bu ikki yondashuvni birlashtirish yo'lini so'raylik!

Vibirda aniq tiplashtirish

Ê ko'chiring, qisqartmalar uchun yashirin terish va iste'mol uchun qiymat turini belgilash qobiliyati. Tsey turi virazu tarjimoni avtomatik ravishda vivede. Ushbu harakatlardan biri Xaskell, aniqlik uchun sizga oddiy misol keltiraman:

Aniq turdagi deklaratsiya qo'shilmaydi (x, y) = x + y - Aniq turdagi deklaratsiya qo'shiladi: (Integer, Integer) -> Integer add (x, y) = x + y

Eslatma: Men egri bo'lmagan funktsiyani yozishim mumkin, shuningdek, keng tarqalgan qo'shimchalar o'rniga shaxsiy imzo yozishim mumkin: (Num a) -> a -> a -> a , chunki Men Haskellning sintaksisini tushuntirmasdan, fikrni ko'rsatmoqchiman.

Hm. Yak bachimo, u ham chiroyli va qisqa. Funktsiya yozuvi har bir satrga atigi 18 ta belgidan, shu jumladan bo'shliqlarni oladi!

Biroq, turdagi avtomatik o'rash buklanadigan bo'lib, u Haskellning bunday salqin tili bilan yaxshi ishlamaydi. (Misol sifatida siz monomorfizmga o'zgartirish kiritishingiz mumkin)

Qulflash va yashirin talab uchun aniq tipizatsiya bilan Chi ê movi? Kon
albatta.

Tanlov bo'yicha yashirin tiplash

C++ 11 (ilgari C++ 0x deb nomlangan) deb nomlangan yangi C++ tili standarti auto kalit so‘zini taqdim etdi, shuning uchun kompilyator sizga turni kontekstdan tashqari kiritishni aytishi mumkin:

Mumkin: // unsigned int a = 5 yozish uchun qo'lda kiritish; unsigned int b = a + 3; // Avtomatik o'rash turi unsigned int a = 5; avtomatik b = a + 3;

Yomon emas. Ale, rekord unchalik qisqarmadi. Keling, iteratorlar bilan dumbani hayratda qoldiraylik (agar tushunmasangiz, urushmang, zavodkani avtomatik vysnovkaga yozib olish allaqachon tez ekanligini hurmat qiling):

// std::vektor turiga qo'lda tayinlash vec = randomVector(30); uchun (std::vector::const_iterator it = vec.cbegin(); ...) ( ... ) // Avtomatik vec turi auto vec = randomVector (o'ttiz); uchun (auto it = vec.cbegin(); ...) ( ... )

Voy-buy! Eksa qisqa. Garazd, lekin qanday qilib Haskell ruhi bilan ishlashingiz mumkin, qanday turdagi qiymat, nimani aylantirish kerak, bahslar turlarida yotadi?

Decltype kalit so'zini auto bilan birgalikda ishlatib, shunday takrorlayman:

// Qo'lda turdagi int bo'linishi (int x, int y) (...) // Avtomatik turdagi avtomatik bo'linish (int x, int y) -> decltype (x / y) (...)

Belgilanish shakli unchalik yaxshi bo'lmagan bo'lishi mumkin, ammo ilg'or dasturlash (shablonlar/generiklar) bilan birgalikda yashirin terish yoki avtomatik turdagi hosila div hosil qiladi.

Ushbu tasnif uchun Deyaki movi dasturlash

Men mashhur movning kichik ro'yxatini tuzaman va hidning "turlari" teri toifasiga qanday mos kelishini yozaman.

JavaScript - Dinamik / Zaif / Yashirin Ruby - Dinamik / Kuchli / Yashirin Python - Dinamik / Kuchli / Yashirin Java - Statik / Kuchli / Ochiq PHP - Dinamik / Zaif / Yashirin C - Statik / Zaif / Aniq C++ - Statik / Kuchli / Aniq - Dinamik / Zaif / Implicit Objective-C - Statik / Zaif / Aniq C# - Statik / Kuchli / Aniq Haskell - Statik / Kuchli / Yashirin Common Lisp - Dinamik / Kuchli / Implicit

Ehtimol, men bu erda rahm-shafqat qilaman, ayniqsa CL, PHP va Obj-C bilan, go'yo sizda boshqa fikr bor - sharhlarda yozing.

Visnovok

OK. Nezabar tushunarli bo'ladi va men tushunamanki, tiplashtirish haqida ko'p gapirish mumkin emas. Oh yak? Mavzu tubsizmi? Duzhe boy tugallanmagan yo'qotgan? Men sharhlar so'rayman, asosiy ma'lumotlarni baham ko'raman.

© 2022 androidas.ru - Android haqida hamma narsa