การพิมพ์แบบไดนามิกคืออะไร? การพิมพ์แบบคงที่และไดนามิก

โกลอฟนา / นักอ่านสุดคูล 2 คน

เพื่อล้างแค้นขั้นต่ำที่จำเป็นของการกล่าวสุนทรพจน์อย่างเงียบ ๆ เนื่องจากจำเป็นต้องรู้เกี่ยวกับการพิมพ์เพื่อไม่ให้เรียกการพิมพ์แบบไดนามิกที่ชั่วร้าย Lisp - untyped my และ C - การพิมพ์ที่เข้มงวดของฉัน

ที่ เวอร์ชั่นใหม่ถูกพบ คำอธิบายรายงานการพิมพ์ทุกประเภท เต็มไปด้วยโค้ดก้น ข้อความเกี่ยวกับการเขียนโปรแกรมภาพยนตร์ยอดนิยม และรูปภาพที่ฉูดฉาด

ฉันแนะนำให้คุณอ่านบทความสั้นแบบย้อนกลับ จากนั้นอ่านเนื้อหาด้านล่าง

เวอร์ชั่นสั้น

การเขียนโปรแกรมภาพยนตร์โดยการพิมพ์ได้รับการยอมรับให้แบ่งออกเป็นสองค่ายที่ยอดเยี่ยม - การพิมพ์และไม่พิมพ์ (ไม่พิมพ์) ตัวอย่างแรกคือ C, Python, Scala, PHP และ Lua และตัวอย่างที่สองคือภาษาแอสเซมเบลอร์ Forth และ Brainfuck

ดังนั้นในฐานะที่เป็น "สัตว์ป่า" เพราะมันเรียบง่ายเหมือนจุกไม้ก๊อก และแกนของการพิมพ์ภาพยนตร์ก็ถูกแบ่งออกเป็นหมวดหมู่เพิ่มเติมซึ่งมีการเปลี่ยนแปลง:

  • การพิมพ์แบบคงที่/ไดนามิก ถูกกำหนดโดยสถิตจากข้อเท็จจริงที่ว่าประเภทสุดท้ายของการเปลี่ยนแปลงและฟังก์ชันได้รับการติดตั้งที่ขั้นตอนการคอมไพล์ ทูบโต คอมไพเลอร์นั้นถูกต้องแล้ว 100% ซึ่งเป็นที่รู้จัก ในการพิมพ์แบบไดนามิก ทุกประเภทเป็น z'yasovyatsya แล้วเมื่อสิ้นสุดโปรแกรม

    นำมาใช้:
    คงที่: C, Java, C #;
    ไดนามิก: Python, JavaScript, Ruby

  • การพิมพ์ที่รัดกุม/อ่อนแอ (เรียกอีกอย่างว่าเข้มงวด/ไม่เข้มงวด) ตัวพิมพ์ดีดจะเห็นว่าภาษาไม่อนุญาตให้ใช้ภาษาใน virazah ประเภทต่างๆและไม่ชนะการแปลงโดยนัยโดยอัตโนมัติ ตัวอย่างเช่น คุณไม่เห็นแถวที่ไม่มีตัวตน ภาพยนตร์ที่มีการพิมพ์ไม่ชัดสามารถเปลี่ยนแปลงได้โดยอัตโนมัติโดยไม่มีการเปลี่ยนแปลงใดๆ โดยนัย ดังนั้นอาจทำให้สูญเสียความแม่นยำ หรือการเปลี่ยนแปลงไม่ชัดเจน

    นำมาใช้:
    แข็งแกร่ง: Java, Python, Haskell, Lisp;
    จุดอ่อน: C, JavaScript, Visual Basicพีพี.

  • การพิมพ์ที่ชัดเจน/โดยปริยาย movs ที่พิมพ์อย่างชัดเจนถูกนำมาใช้เนื่องจากต้องตั้งค่าประเภทของการเปลี่ยนแปลงใหม่/ฟังก์ชัน/อาร์กิวเมนต์ใหม่อย่างชัดเจน เห็นได้ชัดว่าภาพยนตร์ที่มีการพิมพ์โดยนัยถูกส่งไปยังคอมไพเลอร์/ล่าม

    นำมาใช้:
    ยัฟน่า: C++, D, C#
    โดยปริยาย: PHP, Lua, JavaScript

นอกจากนี้ หมายความว่าทุกหมวดหมู่สามารถใช้แทนกันได้ ตัวอย่างเช่น ภาษา C มีการพิมพ์แบบสแตติกอย่างไม่ชัดเจน และภาษา Python มีความเข้มแบบไดนามิกโดยปริยาย

ปกป้องไม่buvaє mov zіtypіzієyuแบบคงที่และไดนามิกในชั่วข้ามคืน ฉันอยากจะพูดก่อนว่าฉันกำลังโกหกอะไรเกี่ยวกับที่นี่ กลิ่นเหม็นนั้นเป็นเรื่องจริง แต่เกี่ยวกับเรื่องอื่น

รุ่นโดยละเอียด

เช่นเดียวกับเวอร์ชันสั้น คุณยังไม่พอ ดี จิไม่ได้เพื่ออะไร ฉันเขียนรายงาน? Golovna ว่าในเวอร์ชันสั้นมันเป็นไปไม่ได้เลยที่จะพอดีกับทั้ง corisnu และ ข้อมูลซิคาวู, และคงเป็นไปได้ที่จะรายงานเมื่อนานมาแล้ว, เพื่อที่คุณจะได้อ่านเนื้อหนังโดยไม่เครียด.

การพิมพ์แบบไม่พิมพ์

ในภาษาที่ไม่ได้พิมพ์ การเขียนโปรแกรม - เวลากลางวันทั้งหมดเป็นเพียงลำดับของจังหวะ วันที่แตกต่างกัน

การพิมพ์แบบไม่พิมพ์จะฟังดูคุ้นเคยกับภาษาระดับต่ำ (ภาษาแอสเซมเบลอร์, ภาษา Forth) และภาษาลึกลับ (Brainfuck, HQ9, Piet) อย่างไรก็ตามในนั้นตามลำดับจาก vadas มีการกระทำของ perevagi

เปเรวากี
  • ให้คุณเขียนในระดับต่ำได้เล็กน้อย นอกจากนี้ คอมไพเลอร์ / ล่ามจะไม่ได้รับผลกระทบจากการตรวจสอบประเภทใดๆ การดำเนินการของVіlnі robiti be-yakіกับข้อมูลประเภท be-yakim
  • รหัสการยกเลิกการเลือกจะมีประสิทธิภาพ
  • ความโปร่งแสงของ vkazivok ด้วยความรู้ด้านภาษาจึงไม่ต้องสงสัยเลยว่าโค้ดต่อไปคืออะไร
เนโดลิกิ
  • พับ. มักจะตำหนิความจำเป็นในการให้ค่าที่ซับซ้อน เช่น รายการ แถว และโครงสร้าง Іz cim สามารถถูกตำหนิได้สำหรับความไม่ถนัด
  • Vіdsutnіstperevіrok Be-yakіbezgluzdіdіїเช่นvіdnіmannyavkazіvnikaบนสัญลักษณ์อาร์เรย์іzจะเป็น vvazhatsya ตามปกติซึ่งอาจนำไปสู่การให้อภัยที่เข้าใจยาก
  • นามธรรมrіvenต่ำ หุ่นยนต์ที่มีข้อมูลแบบพับไม่ได้เหมือนกับหุ่นยนต์ที่มีตัวเลขซึ่งสร้างยากมาก
การพิมพ์แบบไม่มีการพิมพ์นั้นแข็งแกร่งหรือไม่

ใช่ ๆ. ตัวอย่างเช่น ใน mov assembler (สำหรับสถาปัตยกรรม x86 / x86-64 ฉันไม่รู้จักอย่างอื่น) มันเป็นไปไม่ได้ที่จะประกอบโปรแกรม ดังนั้นคุณสามารถลองเก็บข้อมูลใน cx register (16 บิต) จาก rax register (64 บิต)

mov cx,eax; ให้อภัยการชุมนุมชั่วโมง

Tozh go, scho ในแอสเซมเบลอร์іทั้งหมดเดียวกันєtypіzatsija? ฉันสนใจว่ามีการแก้ไขเล็กน้อย และความคิดของคุณzvіsnoนอนน้อยกว่าคุณ

การพิมพ์แบบคงที่และไดนามิก

Golovna ซึ่งถือว่าการพิมพ์แบบคงที่ (คงที่) เป็นแบบไดนามิก (ไดนามิก) ซึ่งการตรวจสอบประเภทซ้ำทั้งหมดจะได้รับการตรวจสอบที่ขั้นตอนการคอมไพล์ ไม่ใช่ในขั้นตอนการสร้างภาพข้อมูล

คนเมืองเดยาคิมสามารถหนีไปได้ เนื่องจากการพิมพ์แบบนิ่งนั้นมีขนาดเล็กเกินไป (อันที่จริง เป็นเช่นนั้น ผู้คนจำนวนมากขอความช่วยเหลือจากวิธีการดังกล่าวมานานแล้ว) Deyakim, scho ภาพยนตร์ที่พิมพ์แบบไดนามิก - tse gra z fire แต่คุณมองเห็นได้อย่างไร คุณไม่เห็นโอกาสด้วยเหตุผล? ทำไมไม่ ทำไม mov ที่พิมพ์แบบสแตติกและไดนามิกมากมาย?

ลองมาดูกัน

ข้อดีของการพิมพ์แบบคงที่
  • การแก้ไขประเภทจะทำเพียงครั้งเดียว - ในขั้นตอนการรวบรวม และหมายความว่าเราจะไม่ต้องกรอไปข้างหน้า หากเราไม่พยายามเพิ่มตัวเลขในแถว (และเห็นการให้อภัย มิฉะนั้น เราจะทำการเปลี่ยนแปลง)
  • Shvidkіst vykonannya จากจุดก่อนหน้านี้ เป็นที่ชัดเจนว่าภาพยนตร์ที่พิมพ์แบบคงที่นั้นเป็นการพิมพ์แบบไดนามิกมากกว่า
  • สำหรับจิตใจของ deyakih dodatkovyh ช่วยให้คุณสามารถแสดงการให้อภัยที่อาจเกิดขึ้นได้ในขั้นตอนของการรวบรวม
ข้อดีของการพิมพ์แบบไดนามิก
  • ความเรียบง่ายของการสร้างคอลเล็กชั่นสากลคือการรวมกันของทุกสิ่งและทุกสิ่ง (ไม่ค่อยตำหนิความต้องการดังกล่าว แต่ถ้าคุณตำหนิการพิมพ์แบบไดนามิก คุณสามารถทำได้)
  • คำอธิบายอัลกอริธึมขั้นสูงที่อธิบายได้ง่าย (เช่น การเรียงลำดับอาร์เรย์ ตัวอย่างเช่น ไม่เพียงแต่ในรายการจำนวนเต็ม แต่ยังรวมถึงในรายการหมายเลขคำพูดและในรายการแถวด้วย)
  • ง่ายต่อการควบคุม - ภาพยนตร์พร้อมเสียงการพิมพ์แบบไดนามิกที่ดียิ่งขึ้นเพื่อเริ่มเขียนโปรแกรม

อัพเดทโปรแกรม

ดี อาร์กิวเมนต์ที่สำคัญที่สุดสำหรับการพิมพ์แบบไดนามิกคือความชัดเจนของคำอธิบายของอัลกอริธึมที่ซับซ้อน มาหาปัญหาของเรากันเถอะ - เราต้องการฟังก์ชันเพื่อค้นหาจำนวนอาร์เรย์ (หรือรายการ) - สำหรับอาร์เรย์ของจำนวนเต็ม สำหรับอาร์เรย์ของคำพูด และอาร์เรย์ของสัญลักษณ์

ทำอย่างไรเราїї virishuvatememo? Virishimo ในสามภาษาที่แตกต่างกัน: หนึ่งที่มีการพิมพ์แบบไดนามิกและสองแบบคงที่

อัลกอริทึมสำหรับเรื่องตลก ฉันจะเอาหนึ่งในวิธีที่ง่ายที่สุด - การแจงนับ ฟังก์ชันคือการตั้งค่าองค์ประกอบที่จะค้นหา อาร์เรย์ตัวเอง (หรือรายการ) และเพื่อหมุนดัชนีขององค์ประกอบ มิฉะนั้น เนื่องจากองค์ประกอบไม่เป็นที่รู้จัก - (-1)

โซลูชันไดนามิก (Python):

Def find(required_element, list): for (index, element) ใน enumerate(list): if element == required_element: return index return (-1)

จามรี bachite ทุกอย่างเป็นเรื่องง่ายและปัญหาในชีวิตประจำวัน scho รายการสามารถแทนที่หมายเลขใด ๆ รายการใด ๆ แม้ว่าจะไม่มีอาร์เรย์อื่น ๆ ค่อนข้างดี ไปต่อ - มาดูภารกิจใน C กัน!

สารละลายคงที่ (Сі):

int find_int ที่ไม่ได้ลงชื่อ (int required_element, int array, ขนาด int ที่ไม่ได้ลงชื่อ) (สำหรับ (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); }

ฟังก์ชั่นสกินค่อนข้างคล้ายกับเวอร์ชัน 3 ของ Python แต่ทำไมถึงมีสามอย่าง? การเขียนโปรแกรมแบบคงที่ล้มเหลวหรือไม่?

І เป็นเช่นนั้น มีวิธีการเขียนโปรแกรมสองสามวิธี ซึ่งหนึ่งในนั้นเราสามารถดูได้ในครั้งเดียว เรียกว่าการเขียนโปรแกรมต่างประเทศซึ่งรองรับภาษา C ++ อย่างเลวทราม มาดูเวอร์ชั่นใหม่กัน:

โซลูชันแบบคงที่ (การเขียนโปรแกรมขั้นสูง C ++):

แม่แบบ ค้นหา int ที่ไม่ได้ลงชื่อ (T required_element, std::vector array) ( for (unsigned int i = 0; i< array.size(); ++i) if (required_element == array[i]) return i; return (-1); }

โดเบร! มันดูไม่สอดคล้องกันเกินไปในเวอร์ชันที่ต่ำกว่าใน Python และในขณะเดียวกันฉันก็ไม่มีโอกาสเขียนมากนัก ก่อนหน้านั้น เราได้นำการนำไปใช้สำหรับอาร์เรย์ทั้งหมดออก ไม่ใช่แค่สำหรับสามเท่านั้น ซึ่งจำเป็นสำหรับการทำงานให้เสร็จ!

รุ่นนี้คล้ายกับรุ่นที่จำเป็น - เราจะใช้ข้อดีและการพิมพ์แบบคงที่และข้อดีของไดนามิกทันที

เป็นเรื่องที่ดีที่สามารถเริ่มต้นได้ แต่เราสามารถทำให้ดีขึ้นได้ การเขียนโปรแกรมขั้นสูงอาจดูชาญฉลาดและสวยงาม (เช่น กับ Haskell ที่มากกว่า) ในอีกทางหนึ่ง นอกเหนือจากการเขียนโปรแกรมที่ซับซ้อนมากขึ้นแล้ว ยังสามารถทำให้เกิดความหลากหลาย zastosuvat (ผลลัพธ์จะสูงขึ้น) ฟังก์ชัน revantaging (ในทำนองเดียวกัน) หรือมาโคร

สถิตยศาสตร์ที่ไดนามิก

นอกจากนี้ คุณต้องเดาว่า mov แบบคงที่จำนวนมากใดที่ให้คุณชนะการพิมพ์แบบไดนามิกได้ เช่น:

  • C # รองรับประเภทหลอกแบบไดนามิก
  • F # รองรับโค้ดวากยสัมพันธ์เหมือนโอเปอเรเตอร์หรือไม่
  • การพิมพ์แบบไดนามิกของ Haskell มีให้โดยโมดูล Data.Dynamic
  • Delphi - สำหรับความช่วยเหลือประเภท Variant พิเศษ

นอกจากนี้ การพิมพ์ภาพยนตร์แบบไดนามิกยังช่วยให้คุณเพิ่มความเร็วได้ด้วยความช่วยเหลือของการพิมพ์แบบคงที่:

  • Common Lisp - การประกาศประเภท
  • Perl – จากเวอร์ชัน 5.6

แข็งแกร่งเป็นประเภทที่อ่อนแอ

ภาพยนตร์ที่มีการจัดประเภทที่ชัดเจนนั้นเป็นไปไม่ได้ที่จะเปลี่ยนลักษณะประจำวันของประเภทต่าง ๆ ใน virazes และชนะการเปลี่ยนแปลงอัตโนมัติทุกวัน พวกเขายังถูกเรียกว่า "Movi จาก Suvoroy Typization" คำศัพท์ภาษาอังกฤษสำหรับสิ่งนี้คือการพิมพ์ที่รัดกุม

ภาพยนตร์ที่พิมพ์ไม่เก่ง, navpaki, spriyako อย่างแรง, สะอื้นไห้โปรแกรมเมอร์ zmishuvav ประเภทต่างๆในนิพจน์เดียว และคอมไพเลอร์จะแปลงทุกอย่างเป็นประเภทเดียว พวกเขาเรียกอีกอย่างว่า "movi ที่มีการจำแนกประเภทที่ไม่ใช่ซูโวรอย" ศัพท์ภาษาอังกฤษสำหรับสิ่งนี้คือการพิมพ์ที่อ่อนแอ

ตัวพิมพ์ที่อ่อนแอมักสับสนกับไดนามิก ซึ่งไม่ใช่กรณีนี้ ภาษาที่พิมพ์แบบไดนามิกสามารถพิมพ์ได้น้อยและหนักแน่น

อย่างไรก็ตาม มีเพียงไม่กี่คนที่ทราบถึงความสำคัญของความเข้มงวดในการพิมพ์ มักจะมีการระบุว่าภาษามีการพิมพ์แบบสแตติก จากนั้นคุณสามารถใช้การอภัยโทษที่อาจเกิดขึ้นได้ไม่จำกัดสำหรับการรวบรวม โกหกคุณ!

Mova มีความผิดในมารดาและการพิมพ์ที่รัดกุม และก็จริง เนื่องจากคอมไพเลอร์จะแทนที่การเตือนความจำเกี่ยวกับการอภัยโทษ มันจะเพิ่มแถวให้กับตัวเลข มิฉะนั้น จะยิ่งสูงขึ้น คุณสามารถดูอาร์เรย์อื่นจากที่หนึ่งได้ อะไรดีสำหรับเรา อะไรทั้งหมด -verifications” ของประเภทจะอยู่ในขั้นตอนการคอมไพล์หรือไม่? ถูกต้อง - การพิมพ์แบบคงที่ที่อ่อนแอนั้นทรงพลังกว่า ด้านล่างคือไดนามิกที่แข็งแกร่ง! (นั่นคือความคิดของฉัน)

เหตุใดประเภทที่อ่อนแอจึงไม่มีข้อดี? มันเป็นไปได้ที่จะมีลักษณะเช่นนั้น โดยไม่เคารพผู้ที่ฉันเหมาะสมกับการพิมพ์ที่รัดกุม ฉันมีความผิดในการรอ ที่คนอ่อนแอมีเปเรวากาเหมือนกัน

คุณต้องการที่จะรู้ว่าอย่างไร

สัญญาณของการพิมพ์ที่แข็งแกร่ง
  • Nadіynіst - คุณเอาความผิดออกไปหรือให้อภัยการรวบรวมพฤติกรรมที่ไม่ถูกต้อง
  • Shvidkіst - zamіst prihovannyh reworking, yakіสามารถทำได้ในสีสดใส, іz typіzієyuที่แข็งแกร่ง มันเป็นสิ่งจำเป็นในการเขียนїхอย่างชัดเจน, โปรแกรมเมอร์ scho zamushuєอย่างน้อยก็รู้ว่ารหัส tsya dіlyankaสามารถpoіlnoyได้
  • ความรู้เกี่ยวกับหุ่นยนต์และโปรแกรม - อีกครั้ง การแทนที่การลดขนาดโดยปริยาย โปรแกรมเมอร์เขียนทุกอย่างด้วยตัวเอง และมันหมายถึงความฉลาดโดยประมาณ การจัดตำแหน่งแถวและจำนวนไม่ได้เกิดขึ้นเองและไม่ได้ในทางที่มีเสน่ห์
  • การนัดหมาย - ถ้าคุณเขียนการเปลี่ยนแปลงด้วยมือ คุณรู้แน่ชัดว่าคุณกำลังแปลงเป็นอะไร ดังนั้นคุณจะตระหนักอยู่เสมอว่าการเปลี่ยนแปลงดังกล่าวสามารถนำไปสู่ความแม่นยำและผลลัพธ์ที่ไม่ถูกต้อง
การพิมพ์ที่อ่อนแอ
  • ความเก่งกาจของชัยชนะของโองการที่หลากหลาย (เช่น หมายเลขคำพูด z tsilih chi)
  • นามธรรมในรูปแบบของการพิมพ์และเน้นงาน
  • บันทึกย่อ

Garazd เราเด้งแล้วปรากฏในประเภทที่อ่อนแอของє perevagi เดียวกัน! และวิธีที่จะถ่ายทอดข้อดีของประเภทที่อ่อนแอไปเป็นแบบที่แข็งแกร่งคืออะไร?

ปรากฏขึ้น єฉันนำทางสอง

การลดประเภทโดยนัยในสถานการณ์ที่ชัดเจนและไม่สูญเสียข้อมูล

เอ่อ ... จบย่อหน้ายาวๆ ให้ฉันให้โยคะสั้น ๆ กับ "การเปลี่ยนแปลงโดยนัยของ obmezhene"

สถานการณ์ไม่ชัดเจน แกนเช่นการบวกตัวเลขสองตัวนั้นเป็นสถานการณ์ที่ชัดเจน และการแปลงตัวเลขเป็นอาร์เรย์นั้นไม่มี (เป็นไปได้ที่จะสร้างอาร์เรย์ขององค์ประกอบหนึ่งก็เป็นไปได้ที่อาร์เรย์จะเติมองค์ประกอบสำหรับการล็อคเป็นเวลานานเช่นนี้และสามารถเปลี่ยนตัวเลขได้ เป็นแถวแล้วใส่อาร์เรย์ของสัญลักษณ์)

การส่งคืนข้อมูลทำได้ง่ายกว่า เราจะแปลงตัวเลขคำพูด 3.5 เป็นตัวเลขได้อย่างไร - เราจะใช้ส่วนหนึ่งของข้อมูล (อันที่จริง การดำเนินการไม่ชัดเจน - การปัดเศษจะทำอย่างไร ด้านที่ใหญ่กว่า ด้านที่เล็กกว่า?

การปฏิรูปในสถานการณ์ที่คลุมเครือ การเปลี่ยนแปลงนั้นด้วยข้อมูลที่สอง ดีขึ้น แย่ลง ไม่มีอะไรพิเศษสำหรับการเขียนโปรแกรม

หากคุณไม่เชื่อฉัน อ่านภาษา PL/I หรือเพียงแค่มองหาข้อกำหนดนี้ อันใหม่มีกฎของการแปลงระหว่างข้อมูลทุกประเภท! Tse แค่นรก!

ฮาราซด์ ลองคิดถึงการแปลงของการแปลงโดยนัยกัน ย้ายอะไร? ตัวอย่างเช่น ใน Pascal คุณสามารถเปลี่ยนจำนวนเต็มเป็นคำพูดได้ แต่ไม่ใช่ในทางที่ผิด กลไกที่คล้ายกันอยู่ใน C#, Groovy และ Common Lisp

Garazd ฉันได้แสดงให้เห็นว่ามีอีกวิธีหนึ่งในการนำข้อดีสองสามข้อจากประเภทที่อ่อนแอจากภาษาที่รุนแรง ดังนั้น ไวน์จึงถูกเรียกว่า polymorphism ของคอนสตรัคเตอร์

ฉันจะอธิบายโยคะในแอปพลิเคชั่นภาพยนตร์มหัศจรรย์ของ Haskell

คอนสตรัคเตอร์แบบ Polymorphic ปรากฏขึ้นเนื่องจากการเตือนว่าจำเป็นต้องมีการแปลงโดยนัยที่ปลอดภัยที่สุดเมื่อเปลี่ยนตัวอักษรตัวเลข

ตัวอย่างเช่น หากคุณมี pi + 1 คุณไม่ต้องการเขียน pi + 1.0 แทน pi + float(1) ฉันต้องการเขียนแค่ pi + 1!

มันเสียใน Haskell เพราะตัวอักษร 1 ไม่มีประเภทเฉพาะ ราคาไม่มีคำพูดหรือคำพูดที่ซับซ้อน เป็นแค่ตัวเลข!

เป็นผลให้เมื่อเขียนฟังก์ชันง่าย ๆ ผลรวม x y ซึ่งคูณตัวเลขทั้งหมดใน x ถึง y (โดยเพิ่มขึ้นทีละ 1) เราคำนึงถึงจำนวนเวอร์ชัน - ผลรวมสำหรับจำนวนเต็ม, ผลรวมสำหรับคำพูด, ผลรวมสำหรับเหตุผล, ผลรวม สำหรับจำนวนเชิงซ้อนและผลรวมของประเภทตัวเลขทั้งหมดที่คุณกำหนดเอง

Zvichayno ryatuє tsey priyom เฉพาะเมื่อ vikoristanny zmіshanih vrazіv іzตัวอักษรตัวเลข แต่เพียงส่วนปลายของภูเขาน้ำแข็ง

ด้วยวิธีนี้ เราสามารถพูดได้ว่าวิธีที่ดีที่สุดคือการสร้างสมดุลระหว่างตัวพิมพ์ที่รัดกุมและอ่อนแอ ตราบใดที่ฉันไม่มีความสมดุลที่สมบูรณ์แบบของภาษาใด ๆ ฉันก็มีแนวโน้มที่จะพิมพ์มากขึ้น (เช่น Haskell, Java, C#, Python) มากกว่าที่พิมพ์ไม่เก่ง (เช่น C, JavaScript, Lua, PHP ).

การพิมพ์ที่ชัดเจนและโดยปริยาย

Mova พร้อมการพิมพ์ที่ชัดเจนบ่งบอกว่าโปรแกรมเมอร์มีความผิดในการระบุประเภทของการเปลี่ยนแปลงและการทำงานทั้งหมด ราวกับว่าทำให้หูหนวก คำศัพท์ภาษาอังกฤษสำหรับสิ่งนี้คือการพิมพ์ที่ชัดเจน

Mova พร้อมการพิมพ์โดยนัย, navpaki, proponuєลืมเกี่ยวกับประเภทและโอนคำจำกัดความประเภทไปยังคอมไพเลอร์หรือล่าม คำศัพท์ภาษาอังกฤษสำหรับการพิมพ์โดยปริยาย

ที่ด้านหลังมือ คุณสามารถพูดได้ว่าการพิมพ์โดยนัยมีค่าเท่ากับไดนามิก และแบบที่ชัดเจนนั้นเป็นแบบคงที่ แต่ยิ่งไปกว่านั้น สิ่งที่ไม่เป็นเช่นนั้น

Chi є pluses ของรูปลักษณ์ของผิวและอีกครั้ง chi єїхชุดค่าผสมі chi є movi z รองรับทั้งสองวิธีหรือไม่

ข้อดีของการพิมพ์แบบชัดแจ้ง
  • การมีอยู่ของฟังก์ชันสกินของลายเซ็น (เช่น int add(int, int)) ช่วยให้คุณสามารถกำหนดฟังก์ชันที่จะทำงานได้อย่างง่ายดาย
  • โปรแกรมเมอร์จะจดทันทีว่าค่าประเภทใดที่สามารถนำมาจากการเปลี่ยนแปลงนั้นได้ ซึ่งทำให้จำเป็นต้องจำไว้
คุณสมบัติการพิมพ์โดยนัย
  • บันทึกย่อ - def add(x, y) สั้นกว่า int add(int x, int y) อย่างชัดเจน
  • ทนต่อการเปลี่ยนแปลง ตัวอย่างเช่น หากฟังก์ชันเปลี่ยนเวลามีประเภทเดียวกับอาร์กิวเมนต์อินพุต ดังนั้นในการย้ายที่พิมพ์อย่างชัดเจน เมื่อเปลี่ยนประเภทของอาร์กิวเมนต์อินพุต จำเป็นต้องเปลี่ยนประเภทการเปลี่ยนแปลงเวลา

ดี เป็นที่ชัดเจนว่าการดูหมิ่นเกิดขึ้นเหมือนข้อดี ดังนั้น minuses (และใครจะตรวจสอบอะไรอีก) จากนั้นมาขอวิธีที่จะรวมสองวิธีนี้เข้าด้วยกัน!

การพิมพ์ผิดอย่างชัดเจนบน vibir

ย้ายด้วยการพิมพ์โดยนัยสำหรับการจับภาพและความสามารถในการระบุค่าประเภทสำหรับการบริโภค Tsey พิมพ์ virazu นักแปล vivede โดยอัตโนมัติ หนึ่งในการเคลื่อนไหวเหล่านี้คือ Haskell ให้ฉันยกตัวอย่างง่ายๆเพื่อความชัดเจน:

ไม่มีการประกาศประเภทที่ชัดเจน add (x, y) = x + y - การประกาศประเภทที่ชัดเจน add:: (Integer, Integer) -> Integer add (x, y) = x + y

หมายเหตุ: ฉันสามารถตั้งชื่อฟังก์ชันที่ไม่ถือครองได้ และยังสามารถเขียนลายเซ็นส่วนตัวแทนการเพิ่มลายเซ็นขนาดใหญ่ขึ้นได้:: (Num a) -> a -> a -> a เพราะ ฉันต้องการแสดงแนวคิดโดยไม่ต้องอธิบายไวยากรณ์ของ Haskell

หืม จามรี bachimo ก็สวยสั้นเหมือนกันนะ รายการฟังก์ชันใช้เวลาเพียง 18 อักขระต่อแถว รวมช่องว่าง!

อย่างไรก็ตาม การไขลานอัตโนมัติของประเภทสามารถพับเก็บได้ และใช้งานไม่ได้กับ Haskell ภาษาเจ๋งๆ เช่นนี้ (ตัวอย่างเช่น คุณสามารถนำการเปลี่ยนแปลงไปใช้ monomorphism)

Chi є movi พร้อมการพิมพ์ที่ชัดเจนสำหรับการล็อคและความต้องการโดยปริยาย? คอน
แน่นอน

การพิมพ์โดยปริยายในตัวเลือก

มาตรฐานภาษา C++ ใหม่ที่เรียกว่า C++11 (ก่อนหน้านี้เรียกว่า C++0x) ได้แนะนำคำสำคัญอัตโนมัติ ดังนั้นคุณสามารถบอกให้คอมไพเลอร์ป้อนประเภทโดยไม่ใช้บริบท:

อาจเป็นไปได้: // การแทรกด้วยตนเองเพื่อพิมพ์ unsigned int a = 5; int ที่ไม่ได้ลงนาม b = a + 3; // ชนิดห่ออัตโนมัติ unsigned int a = 5; อัตโนมัติ b = a+3;

ไม่เลว. เอล บันทึกไม่ได้หดตัวมาก มาประหลาดใจที่ก้นด้วยการวนซ้ำ (ถ้าคุณไม่เข้าใจอย่าต่อสู้อย่าลืมเคารพว่าการบันทึก zavodka ไปยัง vysnovka อัตโนมัตินั้นเร็วอยู่แล้ว):

// กำหนดด้วยตนเองให้กับ std::vector type vec = randomVector(30); สำหรับ (std::vector::const_iterator it = vec.cbegin(); ...) ( ... ) // Auto vec type auto vec = randomVector (สามสิบ); สำหรับ (อัตโนมัติ = vec.cbegin(); ...) ( ... )

ว้าว! แกนจะสั้น Garazd แต่คุณจะทำงานกับวิญญาณของ Haskell ได้อย่างไร คุณค่าประเภทใด จะเปลี่ยนไปอย่างไร จะอยู่ในประเภทของการโต้แย้ง

ฉันจะทำซ้ำอย่างนั้น zavdyaki คำสำคัญ decltype ร่วมกับ auto:

// พิมพ์ int หารด้วยตนเอง (int x, int y) (...) // ประเภทอัตโนมัติแบ่งอัตโนมัติ (int x, int y) -> decltype(x / y) (...)

คุณอาจพบว่ารูปแบบของสัญกรณ์ไม่ค่อยดีนัก แต่เมื่อใช้ร่วมกับการเขียนโปรแกรมขั้นสูง (เทมเพลต/ทั่วไป) การพิมพ์โดยนัยหรือการสืบทอดประเภทอัตโนมัติจะสร้าง div

การเขียนโปรแกรม Deyaki movi สำหรับการจัดหมวดหมู่นี้

ฉันจะทำรายการ mov ยอดนิยมเล็กน้อยและเขียนว่ากลิ่นเหม็นนั้นเหมาะกับหมวดหมู่สกิน "ประเภท" อย่างไร

JavaScript - Dynamic / Weak / Implicit Ruby - Dynamic / Strong / Implicit Python - Dynamic / Strong / Implicit Java - Static / Strong / Explicit PHP - Dynamic / Weak / Implicit C - Static / Weak / Explicit C++ - Static / Strong / Explicit - ไดนามิก / อ่อนแอ / วัตถุประสงค์โดยนัย -C - คงที่ / อ่อนแอ / ชัดเจน C# - คงที่ / แข็งแกร่ง / ชัดเจน Haskell - คงที่ / แข็งแกร่ง / โดยนัย Common Lisp - ไดนามิก / แข็งแกร่ง / โดยนัย

บางทีฉันมีความเมตตาที่นี่ โดยเฉพาะอย่างยิ่งกับ CL, PHP และ Obj-C ราวกับว่าคุณมีความคิดอื่น - เขียนความคิดเห็น



บทความนี้เกี่ยวกับความแตกต่างระหว่างภาษาที่พิมพ์แบบสถิตและการพิมพ์แบบไดนามิก การตรวจสอบความเข้าใจในการพิมพ์ที่ "แข็งแกร่ง" และ "อ่อนแอ" และความคล้ายคลึงของระบบการพิมพ์ในภาษาต่างๆ ในช่วงเวลาที่เหลือของชั่วโมง จะมีขั้นตอนที่ชัดเจนของระบบการพิมพ์ที่ดีที่สุดและทันสมัยที่สุดในการเขียนโปรแกรม ดังนั้นสิ่งสำคัญคือต้องคิดว่าจะทำอย่างไร หากคุณกำลังพูดถึงเคล็ดลับและการพิมพ์



Type - ค่าที่เป็นไปได้ทั้งหมด จำนวนเต็มอาจเป็นค่าแม่ 0, 1, 2, 3 เป็นต้น Bulova อาจเป็นจริงหรือเท็จก็ได้ คุณสามารถเดาประเภทของคุณ เช่น ประเภท "DayFive" ซึ่งในกรณีนี้หมายถึง "ให้" และ "5" และไม่มีอะไรมากไปกว่านี้ ไม่ใช่แถวและจำนวน ราคา แบบ okremium


การพิมพ์แบบคงที่ของ mov อยู่ระหว่างประเภทของการเปลี่ยนแปลง: การเขียนโปรแกรม mov สามารถรู้ได้ ตัวอย่างเช่น x เป็นจำนวนเต็ม โปรแกรมเมอร์แบบไหนที่กลัว robit x = true ถ้าโค้ดไม่ตรง คอมไพเลอร์จำเป็นต้องคอมไพล์ ดังนั้นเราจึงไม่สามารถเรียกใช้โค้ดดังกล่าวได้ นอกจากนี้ ภาษาสามารถพิมพ์แบบสแตติกได้ในลักษณะที่แตกต่างกัน และไม่สามารถใช้ประเภท DayFive ของเราจากระบบการพิมพ์ยอดนิยมได้ (แม้ว่าจะมีคนจำนวนมากสามารถใช้แนวคิดอื่นที่ซับซ้อนกว่า)


mov ที่พิมพ์แบบไดนามิกกำหนดค่าตามประเภท: mov รู้ว่าอะไรเป็นจำนวนเต็ม 2 เป็นจำนวนเต็ม แต่คุณสามารถรู้ว่า x ถูกเปลี่ยนอะไรเพื่อแทนที่จำนวนเต็ม


ตรงกลางของ vikonannya movi pereviryaєtsіสัญญาณในช่วงเวลาและชั่วโมงที่ต่างกัน หากเราพยายามรวมค่าสองค่าเข้าด้วยกัน คุณสามารถพลิกค่าได้ มันคือตัวเลข แถว และอาร์เรย์ หมดสต๊อกแล้วค่า ติดกาวกันดู ให้อภัยคนประเภทหลงทาง

ภาพยนตร์แบบคงที่

ภาพยนตร์คงที่จะได้รับการยืนยันอีกครั้งโดยโปรแกรมเป็นเวลาหนึ่งชั่วโมงก่อนที่จะเปิดตัวโปรแกรม ไม่ว่าจะเป็นโปรแกรม de tipi แหกกฎของหนัง เคารพมันอย่างไม่ถูกต้อง ตัวอย่างเช่น mov คงที่มากขึ้นvіdhilyає viraz "a" + 1 (การเคลื่อนไหวСі - tse โทษจากกฎนี้) คอมไพเลอร์รู้ว่า "a" เป็นจำนวนเต็ม และ 1 เป็นจำนวนเต็ม และจะใช้ได้ก็ต่อเมื่อส่วนซ้ายและขวาสามารถมีได้เป็นประเภทเดียว ดังนั้นคุณไม่จำเป็นต้องรันโปรแกรมเพื่อค้นหาว่าปัญหาคืออะไร สกินของภาพยนตร์ที่พิมพ์แบบคงที่สามารถแปลงเป็นประเภทเดียว ซึ่งสามารถกำหนดได้โดยไม่ต้องรันโค้ด


มีการพิมพ์แบบคงที่จำนวนมากเพื่อกำหนดประเภท ฟังก์ชัน Java สาธารณะ int add (int x, int y) รับจำนวนเต็มสองตัวและหมุนตัวเลขที่สาม ภาพยนตร์ที่พิมพ์แบบคงที่อื่น ๆ สามารถกำหนดประเภทได้โดยอัตโนมัติ ฟังก์ชั่นการพับนั้นใน Haskell มีลักษณะดังนี้: add x y = x + y เราไม่ได้พูดถึงประเภท mov แต่คุณสามารถกำหนดได้เอง เนื่องจากคุณรู้ว่า + ใช้ได้กับตัวเลขเท่านั้น ดังนั้น x และ y ต้องเป็นตัวเลข ดังนั้นฟังก์ชัน add จึงใช้ตัวเลขสองตัวเป็นอาร์กิวเมนต์


อย่าเปลี่ยนระบบประเภท "คงที่" ระบบประเภทใน Haskell มีความคงที่ เข้มงวด และรัดกุมเป็นของตัวเอง และโดยทั่วไป Haskell นั้นเหนือกว่า Java

ภาพยนตร์ที่พิมพ์แบบไดนามิก

ภาพยนตร์ที่พิมพ์แบบไดนามิกจะไม่เปลี่ยนประเภท แต่อย่าเปลี่ยนเอง Tipi zminnyh nevidomіจนถึงช่วงเวลาที่เหม็น mayut ความหมายเฉพาะเมื่อเริ่มต้น ตัวอย่างเช่น ฟังก์ชันใน Python


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

คุณสามารถเพิ่มจำนวนเต็มสองตัว ติดกาวแถว รายการ และอื่นๆ และเราไม่สามารถเข้าใจสิ่งที่เราคิด ด็อคจะไม่เรียกใช้โปรแกรม เป็นไปได้ ในบางจุด ฟังก์ชัน f สามารถเรียกเป็นสองแถว และเรียกเป็นตัวเลขสองตัวในช่วงเวลาถัดไป ในช่วงเวลาดังกล่าว x และ y จะมีค่าที่แตกต่างกันในแต่ละชั่วโมง ดูเหมือนว่าความหมายในภาษาไดนามิกจะกำหนดประเภท แต่การเปลี่ยนแปลงฟังก์ชันนั้นไม่ใช่การเปลี่ยนแปลง ค่า 1 จะเป็นจำนวนเต็มเสมอ แต่ x กับ y เป็นอะไรก็ได้

โปริฟเนียเนีย

ไดนามิกส่วนใหญ่เคลื่อนไหวเพื่อให้อภัยราวกับว่าพวกเขาเขียนไม่ถูกต้อง (JavaScript - การตำหนิ; มันช่วยเปลี่ยนค่าสำหรับการแสดงออกประเภทใด ๆ เพื่อนำมันออกมาหากไม่มีเหตุผล) เมื่อvikoristannіแบบไดนามิกtypіzovanіh mov นำทางให้อภัยง่าย ๆ ในรูปแบบ "a" + 1 สามารถพิสูจน์ได้จากการลับการต่อสู้ ภาพยนตร์คงที่กลัวการให้อภัยดังกล่าว แต่เห็นได้ชัดว่าขั้นตอนของการกลัวที่จะอยู่ในความรัดกุมของระบบประเภท


การเคลื่อนไหวแบบคงที่และไดนามิกซึ่งได้รับแรงบันดาลใจจากแนวคิดที่แตกต่างกันโดยพื้นฐานเกี่ยวกับความถูกต้องของโปรแกรม การย้ายแบบไดนามิก "a" + 1 มีโปรแกรมที่ถูกต้อง: รหัสจะเปิดตัวและการให้อภัยจะปรากฏขึ้นตรงกลาง vikonnannya Prote mov viraz "a" ที่พิมพ์แบบคงที่มากที่สุด + 1 - tse ไม่ใช่โปรแกรม: จะไม่ถูกคอมไพล์และจะไม่ถูกเรียกใช้ นี่ไม่ใช่โค้ดที่ถูกต้อง เช่นเดียวกับการพิมพ์อักขระที่ไม่ถูกต้อง!&%^@*&%^@* - โค้ดนี้ไม่ใช่โค้ดที่ถูกต้อง Tse ความเข้าใจเพิ่มเติมเกี่ยวกับความถูกต้องและความไม่ถูกต้องไม่สามารถเทียบเท่าในภาษาไดนามิก

แข็งแกร่งเป็นประเภทที่อ่อนแอ

แนวคิดของ "เข้มแข็ง" และ "อ่อนแอ" นั้นคลุมเครือมากกว่า Axis deyaki ใช้їх vikoristannya:

    บางครั้ง "แรง" หมายถึง "คงที่"
    ทุกอย่างเรียบง่ายที่นี่ แต่ควรใช้คำว่า "คงที่" เพื่อให้ได้รับชัยชนะและเข้าใจโยคะมากขึ้น

    บางครั้ง "แข็งแกร่ง" หมายถึง "อย่าขโมยการเปลี่ยนแปลงประเภทโดยนัย"
    ตัวอย่างเช่น JavaScript ให้คุณเขียน "a" + 1 ซึ่งสามารถเรียกว่า "การพิมพ์ที่อ่อนแอ" เบียร์อาจเป็น movi ทั้งหมดให้ chie іnshiyrіvenของการแปลงโดยปริยาย เพราะมันช่วยให้คุณเปลี่ยนจากตัวเลขจำนวนเต็มเป็นตัวเลข z ที่ลอยอยู่ clod บน srazok 1 + 1.1 ได้โดยอัตโนมัติ ในความเป็นจริง คนส่วนใหญ่ชนะคำว่า "แข็งแกร่ง" เพื่อกำหนดระหว่างการเปลี่ยนแปลงที่ยอมรับได้และการเปลี่ยนแปลงที่ยอมรับไม่ได้ ไม่มีสิ่งที่เรียกว่าวงล้อมกลิ่นเหม็นทั้งหมดนั้นไม่ถูกต้องและอยู่ในใจของบุคคลใดบุคคลหนึ่ง

    บางครั้ง "แข็งแกร่ง" หมายความว่าเป็นไปไม่ได้ที่จะฝ่าฝืนกฎการพิมพ์ที่เข้มงวดในภาษา

  • บางครั้ง "strong" หมายถึงหน่วยความจำที่ปลอดภัย (memory-safe)
    Cі - ไม่ใช่ก้นที่ปลอดภัยสำหรับความทรงจำของภาพยนตร์ หาก xs เป็นอาร์เรย์ของตัวเลขหลายตัว Сі z ยินดีที่จะหารหัส xs หรือ xs ให้เปลี่ยนค่าเป็นค่าในหน่วยความจำ เพื่อให้อยู่ด้านหลัง xs

มาลุ้นกัน ฝ่ายอักษะเช่นdeyakі mov vіdpovіdat tsim เจ้าหน้าที่ เท่าที่ฉันสามารถบอกได้ Haskell นั้น "แข็งแกร่งที่สุด" ในทุกประการ คำเพิ่มเติมไม่ชัดเจนดังนั้น



("ถ้าจามรี" ที่คอลัมน์ "การแปลงโดยนัย" หมายความว่าเป็นไปได้ที่ผู้ที่แข็งแกร่งและอ่อนแอจะโกหกนอกจากนี้ เนื่องจากการเปลี่ยนแปลงเป็นที่ยอมรับด้วยความเคารพ)


ในกรณีส่วนใหญ่ คำว่า "แรง" และ "อ่อนแอ" สามารถมองได้ว่าเป็นการรวมฟังก์ชันอื่นๆ ที่ไม่ได้กำหนดไว้ มากกว่าฟังก์ชันอื่นๆ ซึ่งไม่ได้ระบุไว้ที่นี่ ปัญหาทั้งหมดในการขโมยคำว่า "แข็งแกร่ง" และ "อ่อนแอ" นั้นช่างโง่เขลา หากคุณต้องการใช้คำว่า vikoristovuvat ให้อธิบายสั้น ๆ ว่ามีอะไรอยู่ใน uvazi ตัวอย่างเช่น คุณสามารถพูดได้ว่า "JavaScript จะหมุนค่าหากมีการเพิ่มแถวของตัวเลข แต่ Python จะหมุนการให้อภัย" ในช่วงเวลาดังกล่าว ดูเหมือนเราจะไม่มีกำลังของตัวเองที่จะลองเรียนรู้เกี่ยวกับความหมายที่ไม่มีตัวตนของคำว่า "เข้มแข็ง" Abo ยิ่งแย่ลง: มาถึงความไม่เข้าใจที่เข้าใจยากผ่านคำศัพท์


คำศัพท์ vipadkiv ส่วนใหญ่ "แข็งแกร่ง" และ "อ่อนแอ" ในอินเทอร์เน็ตนั้นเป็นความคิดที่ไม่ชัดเจนและไม่เหมาะสม เฉพาะบุคคล. กลิ่นเหม็น vikoristovuyutsya, schob เรียกภาษาว่า "น่ารังเกียจ" หรือ "ดี" และความคิดนี้กลายเป็นศัพท์แสงทางเทคนิค



Strong typization : ระบบของประเภทชอบและชอบฉันอย่างแน่นอน

การพิมพ์ที่อ่อนแอ: ระบบของประเภทมีความปั่นป่วนน้อยลงหรือไม่สะดวกสำหรับฉัน

การพิมพ์แบบโปรเกรสซีฟ (การพิมพ์แบบค่อยเป็นค่อยไป)

คุณสามารถเพิ่มเคล็ดลับคงที่ให้กับการเคลื่อนไหวแบบไดนามิกได้หรือไม่? ในบางวิปัสกา - ดังนั้น. อย่างอื่นเป็นเรื่องยากและเป็นไปไม่ได้ ปัญหาที่ชัดเจนที่สุดคือต้นทุนของ eval และความเป็นไปได้อื่นๆ ที่คล้ายคลึงกันของภาษาไดนามิก Vikonannya 1 + eval("2") ใน Python คือ 3 แต่แล้ว 1 + eval(read_from_the_network()) ล่ะ? มันคุ้มค่าที่จะวางในรูปแบบของสิ่งที่อยู่ในสนามในเวลาที่มีการประชุม หากตัวเลขถูกลบไปแสดงว่าถูกต้อง เหมือนอยู่แถวนั้นเลยไม่ใช่ ไม่สามารถระบุได้ก่อนการเปิดตัว ดังนั้นจึงไม่สามารถวิเคราะห์ประเภทแบบคงที่ได้


แนวทางแก้ไขที่ไม่น่าพอใจในทางปฏิบัติคือตั้งค่าประเภท eval() เป็น Any ซึ่งคาดเดา Object ในภาษาการเขียนโปรแกรมเชิงวัตถุหรืออินเทอร์เฟซ () ใน Go: ประเภทนี้ ซึ่งจะทำให้พอใจ


ค่าของประเภทใด ๆ จะไม่ถูกคั่นด้วยสิ่งใด ๆ ซึ่งหมายความว่าระบบประเภทสามารถช่วยเราได้ด้วยรหัส eval ภาพยนตร์ในระบบ є eval іประเภทใด ๆ มีความผิดประเภทที่ปลอดภัยในกรณีของ varicose eval ที่ผิวหนัง


การเคลื่อนไหวบางอย่างมีตัวเลือกหรือการพิมพ์ทีละขั้นตอน (การพิมพ์ทีละน้อย): กลิ่นเหม็นเป็นไดนามิกสำหรับ zamovchuvannyam แต่อนุญาตให้เพิ่มคำอธิบายประกอบแบบคงที่ Python ได้เพิ่มประเภทตัวเลือกเมื่อเร็ว ๆ นี้; TypeScript - ตัวยกเหนือ JavaScript สำหรับตัวเลือกบางประเภท; Flow คือการวิเคราะห์แบบคงที่ของโค้ด JavaScript แบบเก่าที่ดี


Tsі movi ให้deakі perevagi typіzatsіїคงที่ แต่พวกเขาจะไม่ให้การรับประกันที่แน่นอนเหมือนในภาพยนตร์สแตติกที่ถูกต้อง ฟังก์ชันที่ใช้งานอยู่จะถูกพิมพ์แบบคงที่ และฟังก์ชันที่ใช้งานอยู่จะถูกพิมพ์แบบไดนามิก โปรแกรมเมอร์จำเป็นต้องรู้และกลัวการค้าปลีก

การรวบรวมรหัสที่พิมพ์แบบคงที่

เมื่อรวบรวมโค้ดที่พิมพ์แบบสแตติก ไวยากรณ์มักจะได้รับการแก้ไข เช่นเดียวกับคอมไพเลอร์อื่นๆ Tipis ถูกพลิกโดยปี Tse หมายความว่า ภาษาคงที่สามารถได้รับการอภัยโทษด้วยวากยสัมพันธ์หนึ่งครั้ง และหลังจากนั้นจะแก้ไขสำหรับการอภัยโทษในการพิมพ์ 100 ครั้ง การแก้ไขคำขอโทษแบบวากยสัมพันธ์ไม่ได้สร้างการให้อภัยแบบพิมพ์ 100 ครั้ง คอมไพเลอร์ไม่สามารถแสดงการอภัยโทษประเภทต่าง ๆ ได้ ไวยากรณ์ไม่ได้รับการแก้ไขโดยเอกสาร


คอมไพเลอร์ mov แบบคงที่สามารถสร้างสมาร์ทโค้ดได้ แต่คอมไพเลอร์แบบไดนามิกไม่สามารถทำได้ ตัวอย่างเช่น เนื่องจากคอมไพเลอร์รู้ว่าฟังก์ชัน add ยอมรับจำนวนเต็ม จึงสามารถเอาชนะคำสั่ง ADD ดั้งเดิมของ CPU ได้ ภาษาแบบไดนามิกแบบย้อนกลับได้เมื่อ viconann การเลือกหนึ่งในฟังก์ชันที่ไม่มีตัวตนเพิ่มประเภทที่ไม่แน่นอน (การเพิ่มจำนวนเต็มหรือลอยหรือติดกาวแถวหรือบางทีรายการ?) หรือคุณจำเป็นต้อง virishiti การให้อภัยไวนิลและ tipi ไม่ตรงกัน การตรวจสอบซ้ำของ Usі ts_ ใช้เวลาหนึ่งชั่วโมง การเคลื่อนไหวแบบไดนามิกมีเทคนิคต่างๆ สำหรับการเพิ่มประสิทธิภาพ ตัวอย่างเช่น การรวบรวม JIT (แบบทันเวลา) การถอดรหัสจะถูกคอมไพล์ใหม่เมื่อโค้ดถูกลบหลังจากลบข้อมูลที่จำเป็นทั้งหมดเกี่ยวกับประเภท อย่างไรก็ตาม ภาษาไดนามิกใด ๆ ไม่สามารถเปรียบเทียบกับ swidkista ด้วยรหัสคงที่ที่เขียนอย่างเรียบร้อยของ Rust ของฉัน

ข้อโต้แย้งเกี่ยวกับความเศร้าโศกของประเภทคงที่และไดนามิก

สิ่งที่แนบมากับระบบแบบคงที่ระบุว่าไม่มีระบบประเภท แค่ให้อภัยทำให้เกิดปัญหาในการผลิตได้ เห็นได้ชัดว่าจริง เป็นคนที่ชนะภาษาไดนามิกลองด้วยตัวเอง


Adherent ของ movs แบบไดนามิกชี้ไปที่สิ่งที่ mov ดังกล่าวเขียนโค้ดได้ง่ายกว่า สิ่งนี้เป็นจริงอย่างแน่นอนสำหรับโค้ดทุกประเภท ซึ่งเราเขียนต่างกัน เช่น โค้ดนั้นคือ eval นี่เป็นวิธีแก้ปัญหาที่แตกต่างออกไปสำหรับงานปกติ และที่นี่ก็สมเหตุสมผลที่จะเดาคำว่า "ง่าย" Rich Hiki พูดอย่างน่าอัศจรรย์เกี่ยวกับคำว่า "ง่าย" และ yogo zv'yazok zіคำว่า "เรียบง่าย" เมื่อมองย้อนกลับไป ณ จุดนี้ คุณจะเข้าใจว่าการสะกดคำว่า "ง่าย" ให้ถูกต้องไม่ใช่เรื่องง่าย ระวัง "ง่าย"


ข้อดีและข้อเสียของไฟฟ้าสถิต ระบบไดนามิกการพิมพ์ยังคงเน่าเสีย แต่กลิ่นเหม็นอยู่อย่างบ้าคลั่งเมื่อพิจารณาถึงงานเฉพาะที่ละเมิด


JavaScript ช่วยให้โรบ็อตทำงานต่อ แต่ไม่ได้หมายถึงการแปลงแบบโง่ๆ (เช่น "a" + 1 ซึ่งให้ "a1") Python มีแนวโน้มที่จะอนุรักษ์นิยมและมีการให้อภัยบ่อยครั้ง เช่นในกรณีของ "a" + 1


ใช้วิธีการที่แตกต่างกันโดยมีระดับความปลอดภัยต่างกัน แต่ Python และ JavaScript เป็นภาษาที่พิมพ์แบบไดนามิก



Haskell ไม่อนุญาตให้พับจำนวนเต็มและจำนวนลอยโดยไม่ต้องแปลงอย่างชัดเจนก่อน cym Сіі Haskell รู้สึกขุ่นเคืองโดยการพิมพ์แบบคงที่ไม่แปลกใจกับความหลากหลายที่ยิ่งใหญ่เช่นนี้


Є รูปแบบที่ไม่มีตัวตนของภาษาแบบไดนามิกและแบบคงที่ ไม่ว่าจะเป็นการเกาะติดจิตใจอย่างไม่ระวัง "การเคลื่อนที่แบบนิ่งสวยงามกว่า ไดนามิกต่ำกว่า ถ้า X ยืนอยู่ทางขวา" ce อาจรับประกันได้ว่าบ้า คุณอาจพูดจริงในบางภาษาก็ได้ หรือแค่พูดว่า "Haskell ดีกว่า ให้ Python ต่ำกว่า ถ้า X อยู่ทางขวา"

ความหลากหลายของระบบการพิมพ์แบบคงที่

มาดูสองตัวอย่างที่มีชื่อเสียงของ mov ที่พิมพ์แบบคงที่: Go และ Haskell ไม่มีประเภทเฉพาะในระบบการพิมพ์ Go ประเภทจาก "พารามิเตอร์" จากประเภทอื่น ตัวอย่างเช่น คุณสามารถสร้างประเภทของคุณเองสำหรับรายการ MyList ซึ่งสามารถบันทึกข้อมูลใดก็ได้ที่เราต้องการ เราต้องการสร้างจำนวนเต็มของ MyList, แถวใน MyList และอื่นๆ โดยไม่ต้องเปลี่ยนรหัสทางออกของ MyList คอมไพเลอร์มีหน้าที่รับผิดชอบในการพิมพ์: เพราะถ้า MyList เป็นจำนวนเต็ม และเราจงใจเพิ่มแถว คอมไพเลอร์ก็จะตำหนิสำหรับโปรแกรมพิมพ์


ไปเฉพาะสำหรับการออกแบบในลักษณะที่เป็นไปไม่ได้ที่จะกำหนดประเภทให้กับประเภท MyList สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือทำให้ MyList เป็น "อินเทอร์เฟซว่าง": MyList สามารถสร้างวัตถุได้ แต่คอมไพเลอร์ไม่รู้ประเภท หากเราต้องการอ็อบเจ็กต์จาก MyList เราจำเป็นต้องตรวจสอบประเภทคอมไพเลอร์ อย่างที่เราพูดว่า "ฉันเอื้อมมือออกไป" แต่ถ้าเป็นเรื่องจริงมันเป็นตัวเลขก็จะมีการอภัยเช่นวิปัสกาที่มีสุนทรพจน์แบบไดนามิก


Go ยังมีความเป็นไปได้อื่นๆ ที่ไม่มีตัวตนอยู่มากมาย ซึ่งมีอยู่ในการเคลื่อนไหวแบบคงที่ในปัจจุบัน (หรือในระบบอื่นๆ ของปี 1970) ผู้สร้าง Go มีเหตุผลของตัวเองในการตัดสินใจ แต่บางครั้งความคิดของผู้คนจากแรงผลักดันนี้อาจฟังดูรุนแรง


ทีนี้มาดูที่ Haskell ซึ่งสามารถดันระบบประเภทให้หนักขึ้นเล็กน้อย หากคุณระบุประเภท MyList ประเภทของรายการตัวเลขก็คือ MyList Integer Haskell จะไม่ให้เราเพิ่มแถวลงในรายการด้วยวิธี vipadical และเปลี่ยนแปลงเพื่อไม่ให้เราใส่องค์ประกอบจากรายการลงในการเปลี่ยนแปลงแถว


Haskell สามารถแสดงความคิดที่ยุบได้อย่างสมบูรณ์โดยไม่มีประเภทกลาง ตัวอย่างเช่น Num a => MyList a หมายถึง "MyList เป็นค่าที่แสดงตัวเลขประเภทหนึ่ง" คุณสามารถมีรายการของจำนวนเต็ม "ів, float"ів or หลักสิบด้วยความแม่นยำคงที่ แต่ไม่มีข้อยกเว้น จะไม่มีรายการแถวที่เปลี่ยนแปลงระหว่างการคอมไพล์


คุณสามารถเขียนฟังก์ชันเพิ่มที่ใช้ได้กับตัวเลขทุกประเภท ฟังก์ชั่นนี้คือ matime ประเภท Num a => (a -> a -> a) เช แปลว่า

  • a สามารถเป็นประเภทตัวเลขได้ (Num a =>)
  • ฟังก์ชันรับอาร์กิวเมนต์ประเภท a สองตัวและแปลงประเภท a (a -> a -> a)

ตัวอย่างที่เหลือ. หากประเภทฟังก์ชันคือ String -> String จะใช้แถวและหมุนแถว อีกทางหนึ่งถ้า String -> IO String แสดงว่ามีการแนะนำ/มุมมองด้วย คุณยังสามารถดาวน์โหลดลงดิสก์ วัดค่า อ่านจากเทอร์มินัล และอื่นๆ


เหมือนฟังก์ชั่นมีประเภท ไม่ IO เรารู้ว่าจะไม่ดำเนินการใดๆ ของ I/O ตามปกติ ตัวอย่างเช่น ด้วยโฮสต์เว็บ คุณสามารถทราบได้ว่าฟังก์ชันใดกำลังเปลี่ยนฐานข้อมูลเพียงแค่ดูจากประเภท Nіyakіdynamіchnіและ mayzhe nіyakіstaticіchnі mоvi ไม่ควรรับ ลักษณะเฉพาะของ mov จากระบบการพิมพ์ขั้นสูงสุดคืออะไร


ที่ mov มากที่สุด เรามีโอกาสจัดเรียงฟังก์ชันและฟังก์ชันทั้งหมด เช่น เสียงที่ถูกเรียก และอื่นๆ พยายามรู้ว่าอะไรกำลังเปลี่ยนแปลงฐานข้อมูล กระบวนการที่มีราคาแพงซึ่งง่ายต่อการให้อภัย และระบบประเภท Haskell สามารถใช้กับห่วงโซ่อาหารได้ รับรองได้


ปรับความตึงเครียดนี้ด้วย Go ซึ่งไม่สร้างสรรค์สำหรับแนวคิดง่ายๆ ของ ​​MyList โดยที่ดูเหมือนไม่เกี่ยวกับ "ฟังก์ชันที่รับสองข้อโต้แย้งและกลิ่นเหม็นของตัวเลขดูถูกประเภทเดียวกันและวิธีปล้นบทนำ / บทนำ ."


โปรแกรม Go เป็นเรื่องเกี่ยวกับเครื่องมือสำหรับเขียนโปรแกรมใน Go (การใช้งานคอมไพเลอร์สามารถทำได้ง่าย) ถึงเวลานั้น จำเป็นต้องเรียนรู้แนวคิดให้น้อยลง เช่นเดียวกับ Qi perevagi สามารถปรับสมดุลด้วยการแลกเปลี่ยนที่สำคัญ - อาหารอัตนัย อย่างไรก็ตาม คุณไม่สามารถเปรียบเทียบได้ว่า Haskell นั้นฉลาดกว่า Go ระบบประเภท Haskell นั้นเข้มงวดกว่ามาก และ Haskell สามารถใช้ประโยชน์จากประเภทจุดบกพร่องอีกมากมายเมื่อทำการคอมไพล์


Go และ Haskell movs ที่แตกต่างกันซึ่งถูกจัดกลุ่มเป็น "static mov" ระดับหนึ่งสามารถนำเข้าสู่โอมานได้โดยไม่ต้องแปลกใจว่าคำนั้นถูกต้อง เพื่อที่จะแยกย่อยข้อดีในทางปฏิบัติของการรักษาความปลอดภัย Go นั้นใกล้เคียงกับการเคลื่อนไหวแบบไดนามิก ลงไปที่ Haskell


จากอีกด้านหนึ่ง deyakіdynamіchnі movi єbezpechnіshimi, nіzh deyaki static movi (Python โดยทั่วไปถือว่าปลอดภัยกว่า C ต่ำกว่า) หากคุณต้องการศึกษาเกี่ยวกับ mov แบบสแตติกหรือไดนามิกแบบกลุ่ม อย่าลืมความยิ่งใหญ่ของจำนวนผู้มีอำนาจระหว่าง mov

การประยุกต์ใช้ความสามารถของระบบการพิมพ์ที่เป็นรูปธรรม

ในระบบการพิมพ์ที่เข้มงวดมากขึ้น เป็นไปได้ที่จะระบุการแลกเปลี่ยนความเท่าเทียมกันที่แห้งกว่า แกนของkіlkaถูกนำไปใช้ แต่อย่าวนเป็นวัฏจักรเนื่องจากไวยากรณ์ของความไม่รู้


ด้วย Go คุณสามารถพูดว่า "ฟังก์ชันเพิ่มใช้จำนวนเต็มสองจำนวน" และหมุนจำนวนเต็มได้:


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

ใน Haskell คุณสามารถพูดว่า "function accept เป็นเหมือนประเภทตัวเลขที่แปลงตัวเลขประเภทเดียวกัน":


f:: Num a => a -> a -> a เพิ่ม x y = x + y

ใน Idris คุณสามารถพูดว่า "ฟังก์ชันยอมรับจำนวนเต็มสองจำนวน" และหมุนจำนวนเต็ม มิฉะนั้นอาร์กิวเมนต์แรกคือการตำหนิหรืออาร์กิวเมนต์ที่เล็กกว่าสำหรับอาร์กิวเมนต์อื่น ๆ ":


เพิ่ม: (x: Nat) -> (y: Nat) -> (อัตโนมัติที่เล็กกว่า: LT x y) -> Nat เพิ่ม x y = x + y

หากคุณลองใช้ฟังก์ชัน viklikati เพิ่ม 2 1 อาร์กิวเมนต์แรกจะมากกว่าอาร์กิวเมนต์อื่น คอมไพเลอร์จะสนับสนุนโปรแกรม ภายในชั่วโมงของการรวบรวม. เป็นไปไม่ได้ที่จะเขียนโปรแกรมที่ทำให้อาร์กิวเมนต์แรกมีค่ามากกว่าอาร์กิวเมนต์อื่น Rіdkіsna mova mаієความเป็นไปได้ดังกล่าว mov ส่วนใหญ่มี reverb แบบนี้เมื่อ vikonann: เราเขียนแค่ตัวอย่าง if x >= y: Raise SomeError()


Haskell ไม่มีอะไรเทียบเท่ากับประเภทนี้ เช่นเดียวกับแอปพลิเคชัน Idris ที่มีมากกว่า และ Go ก็ไม่เทียบเท่ากับแอปพลิเคชัน Haskell หรือแอปพลิเคชัน Idris เป็นผลให้ Idris สามารถเอาชนะแมลงที่ไม่ระบุตัวตนได้ ดังนั้นมันจึงไม่สามารถเอาชนะ Haskell และ Haskell สามารถเอาชนะแมลงใบ้ได้ ดังนั้นจึงไม่สามารถเอาชนะ Go ได้ ในทั้งสองทิศทางที่คุณต้องการ ความสามารถเสริมระบบการพิมพ์ราวกับว่าจะสลายการพับภาษา

ระบบการพิมพ์สำหรับการเคลื่อนที่แบบคงที่บางตัว

แกนคือการแปลคร่าวๆ ของระบบการพิมพ์ deyaky mov ตามลำดับความรัดกุมที่เพิ่มขึ้น ฉันจะให้รายการคุณ การเผยแพร่เกี่ยวกับความรัดกุมของระบบ ไม่จำเป็นต้องยกขึ้นสู่ระดับใหม่ของความจริงอย่างแท้จริง ที่เลือกในกลุ่ม mov สามารถแบ่งได้หนึ่งประเภท ระบบการพิมพ์สกินมีปัญหาในตัวเอง และปัญหาอื่นๆ ที่มีความซับซ้อนมากขึ้น

  • ซี (1972), โก (2009): ไม่จำเป็นต้องกดหมายเลขของระบบโดยไม่ระบุประเภทที่ระบุ ไม่สามารถระบุประเภท MyList ได้ ซึ่งหมายถึง "รายการตัวเลขทั้งหมด" "รายการแถว" เป็นต้น Natom_st เกิดขึ้นกับการทำงาน "รายการค่าที่ไม่สำคัญ" โปรแกรมเมอร์มีหน้าที่ตรวจสอบ "รายการแถว" ด้วยตนเองเป็นระยะ ๆ หากแถวนั้นอยู่ในรายการและเป็นไปได้ที่จะให้อภัยในชั่วโมงถัดไป
  • จาวา (1995), C # (2000): movi pіdrimuyut zagalnenі tipi ที่น่ารังเกียจดังนั้นคุณจะพูดอะไรได้ เธอมีรายชื่อแถว เกี่ยวกับคอมไพเลอร์ที่เธอรู้จักและสามารถปฏิบัติตามกฎประเภทต่างๆ เพิ่มเติมได้ องค์ประกอบจากรายการจะเป็นประเภทแม่ของสตริง คอมไพเลอร์บังคับกฎเมื่อทำการคอมไพล์ ดังที่เห็นได้ชัด ดังนั้นการให้อภัยจึงมีความสำคัญน้อยกว่าเมื่อทำการคอมไพล์
  • ฮาสเคลล์ (1990), สนิม (2010), สวิฟท์ (2014): ความเป็นไปได้ที่เป็นไปได้ทั้งหมด movi volodiyut dekіlkom ได้แก่ ประเภท zagalnennymi ประเภทข้อมูลเกี่ยวกับพีชคณิต (ADT) และคลาสของประเภทหรือคล้ายกัน (ประเภทของคลาส สัญญาณ (ลักษณะ) และโปรโตคอล) Rust และ Swift เป็นที่นิยม มี Haskell น้อยกว่า และเป็นองค์กรที่ได้รับความนิยมมากกว่า (แน่นอนว่า Mozilla และ Apple)
  • แอกด้า (2007), ไอดริส (2011): Tsі movi pіdrimuyut stale tipi ช่วยให้คุณสร้าง tipi บน kshtalt "ฟังก์ชัน จามรีรับสองจำนวนเต็ม x і y มากกว่า x ล่าง" Navit obezhennya "y ต่ำกว่า x" ถูกบังคับเมื่อทำการคอมไพล์ เมื่อ vikonanna y จะมีไม่น้อย แต่มีเพียงหนึ่ง x ไม่ว่าจะเกิดอะไรขึ้น แม้แต่ระบบพลังงานที่บางกว่า แต่ที่สำคัญกว่าก็สามารถบิดเบือนทางสถิตในภาษาของพวกเขาได้ มีโปรแกรมเมอร์อยู่ไม่กี่คน แต่พวกเขายังเรียกความกระตือรือร้นอันยิ่งใหญ่จากพวกเขา

มีการแตกอย่างชัดเจนในระบบการพิมพ์ในอนาคต โดยเฉพาะอย่างยิ่งเมื่อพิจารณาจากความนิยมของ mov และไม่ใช่จากข้อเท็จจริงง่ายๆ ของพื้นฐานของ mov Vіdomy vynyatok - tse Go ซึ่งอธิบายว่าทำไมมีผู้ติดยาจำนวนมากใน mov คงที่ vvazhayut yogo croc back


กลุ่มที่สอง (Java และ C#) เป็นภาพยนตร์หลัก ประเภทนี้มีการเล่นกันอย่างแพร่หลาย


กลุ่มที่ 3 กำลังเข้าสู่กระแสหลักด้วยการสนับสนุนที่ดีของ Mozilla (Rust) และ Apple (Swift)


กลุ่มโชติรี (ไอดริสและอักดา) อยู่ไกลจากกระแสหลัก แต่สามารถเปลี่ยนแปลงได้ตามชั่วโมง ย้ายกลุ่มลูกเปตองสามลูกไปสู่กระแสหลักเมื่อสิบปีก่อน

ประเภทซูโวร่า- หนึ่งในตัวเลือกสำหรับนโยบายการทำงานกับประเภทของข้อมูลที่ชนะในการเขียนโปรแกรมภาษา

Suvora typіzatsіyaโอนจิตใจ obov'yazykovyh ที่น่ารังเกียจ:

  1. ไม่ว่าจะมีวัตถุของข้อมูล (เปลี่ยนแปลง, คงที่, viraz) ในภาพยนตร์ อาจมีประเภทการร้องเพลงซึ่งได้รับการแก้ไขในขณะที่รวบรวมโปรแกรม (การพิมพ์แบบคงที่) หรือกำหนดทุก ๆ ชั่วโมงของการล่วงเลย ( การพิมพ์แบบไดนามิก)
  2. อนุญาตให้เปลี่ยนเฉพาะค่าซึ่งสามารถเป็นข้อมูลประเภทเดียวกันอย่างเคร่งครัดซึ่งมีการเปลี่ยนแปลงการแลกเปลี่ยนเดียวกันสามารถทำได้วิธีการถ่ายโอนพารามิเตอร์และหมุนผลลัพธ์ของฟังก์ชัน
  3. การผ่าตัดผิวหนังจะต้องใช้พารามิเตอร์ประเภทเดียวกัน
  4. ไม่อนุญาตให้แปลงประเภทโดยนัย (ดังนั้นนักแปลจึงยอมรับว่าเป็นการพยายามจับคู่ค่าที่ไม่ใช่ประเภท เช่น คำอธิบายสำหรับการเปลี่ยนแปลง พารามิเตอร์ ฟังก์ชัน หรือการดำเนินการ เช่น การให้อภัยด้วยวากยสัมพันธ์)

ด้วยdotrimannіที่แน่นอนสามารถ suvoro їtypіzatsіїnavіtvіnіvіdnіvіdnіvіdnі v znachenіในการดำเนินการที่ยอมรับได้ในการพิมพ์іnієวิกลจริต เช่นเดียวกับในโปรแกรมจำเป็นต้องกำหนดค่าของข้อมูลประเภทหนึ่งเป็นประเภทอื่นซึ่งสามารถทำได้ แต่เฉพาะในลักษณะการตั้งค่าการดำเนินการพิเศษในการแปลงประเภทอย่างชัดเจนเท่านั้นเช่นในสถานการณ์เช่นนี้ เป็นส่วนหนึ่งของการเขียนโปรแกรมของฉัน (แม้ว่าคุณจะไม่ใช่ไลบรารีมาตรฐานอย่างเป็นทางการ แต่คุณสามารถใช้งานได้)

ตัวแปรเดียวที่ใช้งานได้จริงของการเขียนโปรแกรมภาษาที่มีการพิมพ์อย่างเข้มงวด - tse Ada มีโปรแกรมภาษากว้างๆ ให้กรอกจำนวนมากและพิมพ์สแตติกแบบไม่เข้มงวด mov ดังกล่าวสามารถเห็นได้เช่น Pascal, Modula-2, Java หากมีคำอธิบายเฉพาะภาษาของประเภทการเปลี่ยนแปลง พารามิเตอร์และฟังก์ชัน และหากอนุญาตให้ใช้ประเภทการส่งโดยนัย - ในบางกรณี หากกำหนดค่าประเภทหนึ่งให้กับการเปลี่ยนแปลงอื่น คอมไพเลอร์จะสร้างรหัสการแปลงสำหรับ มูลค่าของประเภทที่ต้องการเพื่อไม่ให้ทำการแปลงเท่านั้น ตัวอย่างเช่น จำนวนเต็มสามารถกำหนดการเปลี่ยนแปลงได้ เปล่งเสียงเหมือนตัวเลขที่มีจุดลอยตัว และส่งคืนโดยไม่มีการลดประเภทลงอย่างชัดเจน ถูกล้อมรั้ว เศษที่มีการเลียนแบบสูงได้รับการอภัยโทษ . การกระทำของภาษาซึ่งตามประเภทของข้อมูลสามารถเข้าใจได้อย่างเป็นทางการ แท้จริงแล้วถือเป็นการไม่ระบุประเภท ก่อน mov ดังกล่าวจะมีการแนะนำ C แบบคลาสสิกซึ่งในกรณีนี้แม้ว่าประเภทจะถูกเปล่งออกมาและมีความจำเป็นที่จริงแล้วข้อมูลทุกประเภทจะถูกรวมสำหรับการมอบหมาย (คอมไพเลอร์ปัจจุบันของ C อยู่ระหว่างอิสระนี้และดูความก้าวหน้าน้อยที่สุด ในกรณีการแปลงประเภทที่ไม่ปลอดภัย)

ในทฤษฎีการเขียนโปรแกรม การพิมพ์แบบ Suvor เป็นองค์ประกอบที่ขาดไม่ได้ของการรักษาความปลอดภัยของอำนาจสูงสุดที่กำลังพัฒนา ผลงานโปรแกรม. ด้วย zastosuvanni ที่ถูกต้อง (สิ่งที่ถูกส่งสิ่งที่อยู่ในโปรแกรมถูกเปล่งออกมาและได้รับชัยชนะเกี่ยวกับประเภทของข้อมูลสำหรับค่าที่บ้าอย่างมีเหตุผล) มันจะปกป้องโปรแกรมเมอร์จากความเรียบง่าย แต่ให้อภัย ชัยชนะที่หลับใหลความหมายบ้าๆ บอๆ ที่ตำหนิผู้อื่นเพียงเพราะการพิมพ์ผิดเบื้องต้น การให้อภัยที่คล้ายกันปรากฏขึ้นมากขึ้นในขั้นตอนการรวบรวมโปรแกรม อย่างไรก็ตาม เนื่องจากมีความเป็นไปได้ที่จะลดประเภทใด ๆ โดยปริยาย (เช่น ตัวอย่างเช่น ใน mov คลาสสิก) การให้อภัยจะปรากฏขึ้นสำหรับการทดสอบเท่านั้น นอกจากนี้ รวม obsya และvіdrazu ในทางกลับกัน โปรแกรมเมอร์มืออาชีพจำนวนมากไม่ชอบการพิมพ์ที่เข้มงวดผ่านความไม่สะดวก - จะมีโปรแกรมมากขึ้นและชั่วโมงในการเขียนมากขึ้น ซึ่งหมายถึงการใช้งานโค้ดในโลกแห่งความเป็นจริงมากขึ้น ซึ่งดีกว่าสำหรับ zayvim

  • การพิมพ์แบบไดนามิกเป็นเทคนิคที่ใช้กันอย่างแพร่หลายในการเขียนโปรแกรมภาษาและข้อกำหนดภาษาเมื่อมีการเปลี่ยนแปลงจะเรียกว่าประเภทในขณะที่ตั้งค่าไม่ใช่ในขณะที่การเปลี่ยนแปลงจะถูกเปล่งออกมา ในอันดับนี้ ในตัวแทนจำหน่ายต่างๆ โปรแกรมเพียงอย่างเดียวสามารถเปลี่ยนค่าประเภทต่างๆ ได้ การพิมพ์แบบไดนามิกประยุกต์ - Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Lisp, xBase, Erlang, Visual Basic

    การรับ Protilezhny - การพิมพ์แบบคงที่

    บางการเคลื่อนไหวที่มีการพิมพ์แบบไดนามิกที่อ่อนแอมีปัญหาในการปรับค่าให้เท่ากัน ตัวอย่างเช่น PHP อาจมีการดำเนินการอีควอไลเซอร์ “==”, “!=” และ “===”, “!==” อีกคู่ของ การดำเนินการปรับค่าของงูชนิดนั้น การดำเนินการ "===" ให้เป็นจริงเฉพาะในกรณีที่การทำงานเต็ม ในมุมมอง "==" แล้วแต่ว่าจะใช้ประเภทใด: (1=="1") ควรสังเกตว่านี่เป็นปัญหาของการพิมพ์แบบไดนามิกโดยหัวหน้าและการเขียนโปรแกรม mov เฉพาะ

Po'yazanіเข้าใจ

การเขียนโปรแกรม Mova - ภาษาทางการ เป็นที่รู้จักสำหรับบันทึก โปรแกรมคอมพิวเตอร์. โปรแกรมภาษากำหนดชุดของกฎศัพท์ วากยสัมพันธ์ และความหมายที่กำหนด ดูเก่าโปรแกรมและpodії, yakіvikonaє vykonavets (เสียง - EOM) ภายใต้kerіvnitstvom

น้ำตาลวากยสัมพันธ์ (อังกฤษ น้ำตาลวากยสัมพันธ์) ในการเขียนโปรแกรม movi - ความเป็นไปได้ทางวากยสัมพันธ์ zastosuvannya เช่นพฤติกรรมการฝังของโปรแกรม แต่จะปล้น vikoristannya movi zruchnіshimสำหรับผู้คน

พลัง - วิธีเข้าถึงสถานะภายในของวัตถุซึ่งเลียนแบบการเปลี่ยนแปลงของประเภทการร้องเพลง การเพิ่มคุณภาพของออบเจกต์จะดูเหมือนเดิม เหมือนกับการเปลี่ยนไปใช้ฟิลด์โครงสร้าง (ในการเขียนโปรแกรมเชิงโครงสร้าง) แต่ที่จริงแล้ว มันถูกใช้งานผ่านฟังก์ชันคลิกด่วน เมื่อลองใส่ค่า ได้รับอำนาจวิธีหนึ่งถูกเรียกใช้และเมื่อพยายามค้นหาความหมายของพลังนี้ - อีกวิธีหนึ่ง

แบบฟอร์ม Backus แบบขยาย - Naur (แบบฟอร์ม Backus แบบขยาย - รูปแบบ Naur (RBNF)) - ระบบอย่างเป็นทางการของการกำหนดรูปแบบไวยากรณ์ ซึ่งหมวดหมู่วากยสัมพันธ์หนึ่งประเภทถูกกำหนดตามลำดับผ่านผู้อื่น ชัยชนะสำหรับคำอธิบายไวยากรณ์ที่เป็นทางการเฉพาะบริบท เผยแพร่โดย Niklaus Wirth ด้วยการปรับปรุงรูปแบบ Bekus-Naur พวกเขาจึงได้ถูกนำมาใช้ใน BNF ด้วยโครงสร้างแบบ "กึ่ง" ที่ใหญ่ขึ้น ซึ่งช่วยให้สามารถสอบถามกับสิ่งปลูกสร้างต่างๆ...

การเขียนโปรแกรมประยุกต์เป็นหนึ่งในประเภทของการเขียนโปรแกรมเชิงประกาศ ซึ่งโปรแกรมต่างๆ ถูกเขียนในลักษณะที่เปลี่ยนแปลงวัตถุหนึ่งไปยังอีกวัตถุหนึ่งอย่างเป็นระบบ ผลของความซบเซาดังกล่าวเป็นวัตถุใหม่ ซึ่งสามารถมีส่วนร่วมใน zastosuvannia เป็นบทบาทของฟังก์ชัน เช่นเดียวกับการโต้แย้ง และอื่นๆ เป้าหมายคือการเขียนโปรแกรมให้ชัดเจนทางคณิตศาสตร์ ความจริงที่ว่าฟังก์ชันถูกระบุโดย virase เป็นหลักฐานของความเป็นไปได้ของความหมายที่แตกต่างกันของฟังก์ชัน - ฟังก์ชัน ...

การเขียนโปรแกรมภาษาแบบเรียงต่อกันคือการเขียนโปรแกรมภาษาหลักโดยยึดตามข้อเท็จจริงที่ว่าการต่อกันของสองส่วนย่อยในโค้ดจะเปลี่ยนองค์ประกอบของมัน ภาพยนตร์มีฟังก์ชันการแทรกอาร์กิวเมนต์โดยนัยให้เลือกมากมาย (การเขียนโปรแกรมแบบไร้จุดหมาย div) ฟังก์ชันใหม่ถูกกำหนดให้เป็นองค์ประกอบของฟังก์ชัน และการแทนที่แอปพลิเคชันจะถูกต่อกัน แนวทางนี้ตรงข้ามกับการเขียนโปรแกรมเชิงประยุกต์

เปลี่ยน - คุณลักษณะของระบบทางกายภาพหรือนามธรรมซึ่งสามารถเปลี่ยนค่าตัวเลขได้เองตามกฎ แนวคิดของการเปลี่ยนแปลงมีการใช้กันอย่างแพร่หลายในแวดวงต่างๆ เช่น คณิตศาสตร์ วิทยาศาสตร์ธรรมชาติ เทคโนโลยี และการเขียนโปรแกรม ก้นที่เปลี่ยนแปลงได้สามารถ: ตรวจวัดอุณหภูมิ พารามิเตอร์ฟังก์ชัน และอื่นๆ

การวิเคราะห์วากยสัมพันธ์ (abo parsing, jarg. parsing ← English parsing) ในlіngvіstіtsіและ іnformatіcі - กระบวนการของการตั้งค่าlіnіynoї poslіnovnostі lexemes (slіv, tokenіv) ภาษาธรรมชาติหรือเป็นทางการด้วยไวยากรณ์ที่เป็นทางการ ผลที่ได้คือต้นไม้แยกวิเคราะห์ (ต้นไม้วากยสัมพันธ์) เสียงzastosovuєtsyaในครั้งเดียวด้วยการวิเคราะห์คำศัพท์

ชนิดข้อมูลเชิงพีชคณิตทั่วไป (GADT) เป็นหนึ่งในประเภทข้อมูลพีชคณิต ซึ่งมีลักษณะเฉพาะโดยข้อเท็จจริงที่ว่าตัวสร้างสามารถแปลงค่าที่ไม่ใช่ประเภทที่เกี่ยวข้องกับข้อมูลนั้น ออกแบบโดยเน้นการทำงานเกี่ยวกับตระกูลอุปนัยของประเภทรกร้างยุคกลางยุคก่อนประวัติศาสตร์

ความหมายในการเขียนโปรแกรมเป็นวินัยที่พัฒนาการกำหนดความหมายของการออกแบบโปรแกรม mov ให้เป็นแบบแผนเพื่อรองรับโมเดลทางคณิตศาสตร์ที่เป็นทางการ สามารถใช้ตัวอย่างต่างๆ ได้ เช่น ตรรกะทางคณิตศาสตร์ แคล-แคลคูลัส ทฤษฎีพหุคูณ ทฤษฎีหมวดหมู่ ทฤษฎีแบบจำลอง พีชคณิตสากล การทำให้เป็นทางการของความหมายของโปรแกรมภาพยนตร์สามารถใช้เป็นวิธีการอธิบายภาพยนตร์ เพื่อแสดงพลังของภาพยนตร์

Object-Oriented Programming (OOP) เป็นวิธีการเขียนโปรแกรมตามโปรแกรมที่นำเสนอซึ่งพิจารณาถึงจำนวนรวมของอ็อบเจ็กต์ สกินที่มีอินสแตนซ์ใดๆ ของเฟิร์สคลาส และคลาสนั้นสอดคล้องกับลำดับชั้นของการสลายตัว

การเปลี่ยนแปลงแบบไดนามิก - เปลี่ยนในโปรแกรม, วางใน หน่วยความจำในการทำงาน pіd yaku vіdіlyaєtsyapіdhіkonannya progry ตามความเป็นจริงไม่มีหน่วยความจำระบบของโปรแกรมสำหรับวัตถุประสงค์เฉพาะภายใต้ชั่วโมงของโปรแกรมหุ่นยนต์ Tsim vіdіznâєєtsya vіd globalї staticії zmіnnoї — หน่วยความจำ dilyanki เห็นโดยระบบโปรแกรมเพื่อวัตถุประสงค์เฉพาะก่อน cob ของโปรแกรมหุ่นยนต์ การเปลี่ยนแปลงแบบไดนามิก - หนึ่งในคลาสของหน่วยความจำการเปลี่ยนแปลง

เพื่อล้างแค้นขั้นต่ำที่จำเป็นของการกล่าวสุนทรพจน์อย่างเงียบ ๆ เนื่องจากจำเป็นต้องรู้เกี่ยวกับการพิมพ์เพื่อไม่ให้เรียกการพิมพ์แบบไดนามิกที่ชั่วร้าย Lisp - untyped my และ C - การพิมพ์ที่เข้มงวดของฉัน

ในเวอร์ชันล่าสุดมีคำอธิบายรายงานทุกประเภท เครื่องเทศที่มีรหัส ข้อความเกี่ยวกับภาพยนตร์ยอดนิยมและการเขียนโปรแกรมและรูปภาพที่แสดง

ฉันแนะนำให้คุณอ่านบทความสั้นแบบย้อนกลับ จากนั้นอ่านเนื้อหาด้านล่าง

เวอร์ชั่นสั้น

การเขียนโปรแกรมภาพยนตร์โดยการพิมพ์ได้รับการยอมรับให้แบ่งออกเป็นสองค่ายที่ยอดเยี่ยม - การพิมพ์และไม่พิมพ์ (ไม่พิมพ์) ตัวอย่างแรกคือ C, Python, Scala, PHP และ Lua และตัวอย่างที่สองคือภาษาแอสเซมเบลอร์ Forth และ Brainfuck

ดังนั้นในฐานะที่เป็น "สัตว์ป่า" เพราะมันเรียบง่ายเหมือนจุกไม้ก๊อก และแกนของการพิมพ์ภาพยนตร์ก็ถูกแบ่งออกเป็นหมวดหมู่เพิ่มเติมซึ่งมีการเปลี่ยนแปลง:

  • การพิมพ์แบบคงที่/ไดนามิก ถูกกำหนดโดยสถิตจากข้อเท็จจริงที่ว่าประเภทสุดท้ายของการเปลี่ยนแปลงและฟังก์ชันได้รับการติดตั้งที่ขั้นตอนการคอมไพล์ ทูบโต คอมไพเลอร์นั้นถูกต้องแล้ว 100% ซึ่งเป็นที่รู้จัก ในการพิมพ์แบบไดนามิก ทุกประเภทเป็น z'yasovyatsya แล้วเมื่อสิ้นสุดโปรแกรม

    นำมาใช้:
    คงที่: C, Java, C #;
    ไดนามิก: Python, JavaScript, Ruby

  • การพิมพ์ที่รัดกุม/อ่อนแอ (เรียกอีกอย่างว่าเข้มงวด/ไม่เข้มงวด) การพิมพ์ที่รัดกุมจะเห็นว่าภาษาไม่อนุญาตให้ผสมในประเภทต่างๆ และไม่ชนะการแปลงโดยนัยโดยอัตโนมัติ ตัวอย่างเช่น เป็นไปไม่ได้ที่จะเห็นสิ่งที่ไม่มีตัวตน ภาพยนตร์ที่มีการพิมพ์ไม่ชัดสามารถเปลี่ยนแปลงได้โดยอัตโนมัติโดยไม่มีการเปลี่ยนแปลงใดๆ โดยนัย ดังนั้นอาจทำให้สูญเสียความแม่นยำ หรือการเปลี่ยนแปลงไม่ชัดเจน

    นำมาใช้:
    แข็งแกร่ง: Java, Python, Haskell, Lisp;
    จุดอ่อน: C, JavaScript, Visual Basic, PHP

  • การพิมพ์ที่ชัดเจน/โดยปริยาย movs ที่พิมพ์อย่างชัดเจนถูกนำมาใช้เนื่องจากต้องตั้งค่าประเภทของการเปลี่ยนแปลงใหม่/ฟังก์ชัน/อาร์กิวเมนต์ใหม่อย่างชัดเจน เห็นได้ชัดว่าภาพยนตร์ที่มีการพิมพ์โดยนัยถูกส่งไปยังคอมไพเลอร์/ล่าม

    นำมาใช้:
    ยัฟน่า: C++, D, C#
    โดยปริยาย: PHP, Lua, JavaScript

นอกจากนี้ หมายความว่าทุกหมวดหมู่สามารถใช้แทนกันได้ ตัวอย่างเช่น ภาษา C มีการพิมพ์แบบสแตติกอย่างไม่ชัดเจน และภาษา Python มีความเข้มแบบไดนามิกโดยปริยาย

ปกป้องไม่buvaє mov zіtypіzієyuแบบคงที่และไดนามิกในชั่วข้ามคืน ฉันอยากจะพูดก่อนว่าฉันกำลังโกหกอะไรเกี่ยวกับที่นี่ กลิ่นเหม็นนั้นเป็นเรื่องจริง แต่เกี่ยวกับเรื่องอื่น

รุ่นโดยละเอียด

เช่นเดียวกับเวอร์ชันสั้น คุณยังไม่พอ ดี จิไม่ได้เพื่ออะไร ฉันเขียนรายงาน? Golovne ว่าในเวอร์ชันสั้นนั้นเป็นไปไม่ได้เลยที่จะมีข้อมูลที่ซ้ำซากและวงเวียนทั้งหมด แต่อาจเป็นไปได้ที่จะรายงานเป็นเวลานานเพื่อให้คุณสามารถอ่านได้โดยไม่ต้องเครียด

การพิมพ์แบบไม่พิมพ์

ในภาษาที่ไม่ได้พิมพ์ การเขียนโปรแกรม - เวลากลางวันทั้งหมดเป็นเพียงลำดับของจังหวะ วันที่แตกต่างกัน

การพิมพ์แบบไม่พิมพ์จะฟังดูคุ้นเคยกับภาษาระดับต่ำ (ภาษาแอสเซมเบลอร์, ภาษา Forth) และภาษาลึกลับ (Brainfuck, HQ9, Piet) อย่างไรก็ตามในนั้นตามลำดับจาก vadas มีการกระทำของ perevagi

เปเรวากี
  • ให้คุณเขียนในระดับต่ำได้เล็กน้อย นอกจากนี้ คอมไพเลอร์ / ล่ามจะไม่ได้รับผลกระทบจากการตรวจสอบประเภทใดๆ การดำเนินการของVіlnі robiti be-yakіกับข้อมูลประเภท be-yakim
  • รหัสการยกเลิกการเลือกจะมีประสิทธิภาพ
  • ความโปร่งแสงของ vkazivok ด้วยความรู้ด้านภาษาจึงไม่ต้องสงสัยเลยว่าโค้ดต่อไปคืออะไร
เนโดลิกิ
  • พับ. มักจะตำหนิความจำเป็นในการให้ค่าที่ซับซ้อน เช่น รายการ แถว และโครงสร้าง Іz cim สามารถถูกตำหนิได้สำหรับความไม่ถนัด
  • Vіdsutnіstperevіrok Be-yakіbezgluzdіdіїเช่นvіdnіmannyavkazіvnikaบนสัญลักษณ์อาร์เรย์іzจะเป็น vvazhatsya ตามปกติซึ่งอาจนำไปสู่การให้อภัยที่เข้าใจยาก
  • นามธรรมrіvenต่ำ หุ่นยนต์ที่มีข้อมูลแบบพับไม่ได้เหมือนกับหุ่นยนต์ที่มีตัวเลขซึ่งสร้างยากมาก
การพิมพ์แบบไม่มีการพิมพ์นั้นแข็งแกร่งหรือไม่

ใช่ ๆ. ตัวอย่างเช่น ใน mov assembler (สำหรับสถาปัตยกรรม x86 / x86-64 ฉันไม่รู้จักอย่างอื่น) มันเป็นไปไม่ได้ที่จะประกอบโปรแกรม ดังนั้นคุณสามารถลองเก็บข้อมูลใน cx register (16 บิต) จาก rax register (64 บิต)

mov cx,eax; ให้อภัยการชุมนุมชั่วโมง

Tozh go, scho ในแอสเซมเบลอร์іทั้งหมดเดียวกันєtypіzatsija? ฉันสนใจว่ามีการแก้ไขเล็กน้อย และความคิดของคุณzvіsnoนอนน้อยกว่าคุณ

การพิมพ์แบบคงที่และไดนามิก

Golovna ซึ่งถือว่าการพิมพ์แบบคงที่ (คงที่) เป็นแบบไดนามิก (ไดนามิก) ซึ่งการตรวจสอบประเภทซ้ำทั้งหมดจะได้รับการตรวจสอบที่ขั้นตอนการคอมไพล์ ไม่ใช่ในขั้นตอนการสร้างภาพข้อมูล

คนเมืองเดยาคิมสามารถหนีไปได้ เนื่องจากการพิมพ์แบบนิ่งนั้นมีขนาดเล็กเกินไป (อันที่จริง เป็นเช่นนั้น ผู้คนจำนวนมากขอความช่วยเหลือจากวิธีการดังกล่าวมานานแล้ว) Deyakim, scho ภาพยนตร์ที่พิมพ์แบบไดนามิก - tse gra z fire แต่คุณมองเห็นได้อย่างไร คุณไม่เห็นโอกาสด้วยเหตุผล? ทำไมไม่ ทำไม mov ที่พิมพ์แบบสแตติกและไดนามิกมากมาย?

ลองมาดูกัน

ข้อดีของการพิมพ์แบบคงที่
  • การแก้ไขประเภทจะทำเพียงครั้งเดียว - ในขั้นตอนการรวบรวม และหมายความว่าเราจะไม่ต้องกรอไปข้างหน้า หากเราไม่พยายามเพิ่มตัวเลขในแถว (และเห็นการให้อภัย มิฉะนั้น เราจะทำการเปลี่ยนแปลง)
  • Shvidkіst vykonannya จากจุดก่อนหน้านี้ เป็นที่ชัดเจนว่าภาพยนตร์ที่พิมพ์แบบคงที่นั้นเป็นการพิมพ์แบบไดนามิกมากกว่า
  • สำหรับจิตใจของ deyakih dodatkovyh ช่วยให้คุณสามารถแสดงการให้อภัยที่อาจเกิดขึ้นได้ในขั้นตอนของการรวบรวม
ข้อดีของการพิมพ์แบบไดนามิก
  • ความเรียบง่ายของการสร้างคอลเล็กชั่นสากลคือการรวมกันของทุกสิ่งและทุกสิ่ง (ไม่ค่อยตำหนิความต้องการดังกล่าว แต่ถ้าคุณตำหนิการพิมพ์แบบไดนามิก คุณสามารถทำได้)
  • คำอธิบายอัลกอริธึมขั้นสูงที่อธิบายได้ง่าย (เช่น การเรียงลำดับอาร์เรย์ ตัวอย่างเช่น ไม่เพียงแต่ในรายการจำนวนเต็ม แต่ยังรวมถึงในรายการหมายเลขคำพูดและในรายการแถวด้วย)
  • ง่ายต่อการควบคุม - ภาพยนตร์พร้อมเสียงการพิมพ์แบบไดนามิกที่ดียิ่งขึ้นเพื่อเริ่มเขียนโปรแกรม

อัพเดทโปรแกรม

ดี อาร์กิวเมนต์ที่สำคัญที่สุดสำหรับการพิมพ์แบบไดนามิกคือความชัดเจนของคำอธิบายของอัลกอริธึมที่ซับซ้อน มาหาปัญหาของเรากันเถอะ - เราต้องการฟังก์ชันเพื่อค้นหาจำนวนอาร์เรย์ (หรือรายการ) - สำหรับอาร์เรย์ของจำนวนเต็ม สำหรับอาร์เรย์ของคำพูด และอาร์เรย์ของสัญลักษณ์

ทำอย่างไรเราїї virishuvatememo? Virishimo ในสามภาษาที่แตกต่างกัน: หนึ่งที่มีการพิมพ์แบบไดนามิกและสองแบบคงที่

อัลกอริทึมสำหรับเรื่องตลก ฉันจะเอาหนึ่งในวิธีที่ง่ายที่สุด - การแจงนับ ฟังก์ชันคือการตั้งค่าองค์ประกอบที่จะค้นหา อาร์เรย์ตัวเอง (หรือรายการ) และเพื่อหมุนดัชนีขององค์ประกอบ มิฉะนั้น เนื่องจากองค์ประกอบไม่เป็นที่รู้จัก - (-1)

โซลูชันไดนามิก (Python):

Def find(required_element, list): for (index, element) ใน enumerate(list): if element == required_element: return index return (-1)

จามรี bachite ทุกอย่างเป็นเรื่องง่ายและปัญหาในชีวิตประจำวัน scho รายการสามารถแทนที่หมายเลขใด ๆ รายการใด ๆ แม้ว่าจะไม่มีอาร์เรย์อื่น ๆ ค่อนข้างดี ไปต่อ - มาดูภารกิจใน C กัน!

สารละลายคงที่ (Сі):

int find_int ที่ไม่ได้ลงชื่อ (int required_element, int array, ขนาด int ที่ไม่ได้ลงชื่อ) (สำหรับ (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); }

ฟังก์ชั่นสกินค่อนข้างคล้ายกับเวอร์ชัน 3 ของ Python แต่ทำไมถึงมีสามอย่าง? การเขียนโปรแกรมแบบคงที่ล้มเหลวหรือไม่?

І เป็นเช่นนั้น มีวิธีการเขียนโปรแกรมสองสามวิธี ซึ่งหนึ่งในนั้นเราสามารถดูได้ในครั้งเดียว เรียกว่าการเขียนโปรแกรมต่างประเทศซึ่งรองรับภาษา C ++ อย่างเลวทราม มาดูเวอร์ชั่นใหม่กัน:

โซลูชันแบบคงที่ (การเขียนโปรแกรมขั้นสูง C ++):

แม่แบบ ค้นหา int ที่ไม่ได้ลงชื่อ (T required_element, std::vector array) ( for (unsigned int i = 0; i< array.size(); ++i) if (required_element == array[i]) return i; return (-1); }

โดเบร! มันดูไม่สอดคล้องกันเกินไปในเวอร์ชันที่ต่ำกว่าใน Python และในขณะเดียวกันฉันก็ไม่มีโอกาสเขียนมากนัก ก่อนหน้านั้น เราได้นำการนำไปใช้สำหรับอาร์เรย์ทั้งหมดออก ไม่ใช่แค่สำหรับสามเท่านั้น ซึ่งจำเป็นสำหรับการทำงานให้เสร็จ!

รุ่นนี้คล้ายกับรุ่นที่จำเป็น - เราจะใช้ข้อดีและการพิมพ์แบบคงที่และข้อดีของไดนามิกทันที

เป็นเรื่องที่ดีที่สามารถเริ่มต้นได้ แต่เราสามารถทำให้ดีขึ้นได้ การเขียนโปรแกรมขั้นสูงอาจดูชาญฉลาดและสวยงาม (เช่น กับ Haskell ที่มากกว่า) ในอีกทางหนึ่ง นอกเหนือจากการเขียนโปรแกรมที่ซับซ้อนมากขึ้นแล้ว ยังสามารถทำให้เกิดความหลากหลาย zastosuvat (ผลลัพธ์จะสูงขึ้น) ฟังก์ชัน revantaging (ในทำนองเดียวกัน) หรือมาโคร

สถิตยศาสตร์ที่ไดนามิก

นอกจากนี้ คุณต้องเดาว่า mov แบบคงที่จำนวนมากใดที่ให้คุณชนะการพิมพ์แบบไดนามิกได้ เช่น:

  • C # รองรับประเภทหลอกแบบไดนามิก
  • F # รองรับโค้ดวากยสัมพันธ์เหมือนโอเปอเรเตอร์หรือไม่
  • การพิมพ์แบบไดนามิกของ Haskell มีให้โดยโมดูล Data.Dynamic
  • Delphi - สำหรับความช่วยเหลือประเภท Variant พิเศษ

นอกจากนี้ การพิมพ์ภาพยนตร์แบบไดนามิกยังช่วยให้คุณเพิ่มความเร็วได้ด้วยความช่วยเหลือของการพิมพ์แบบคงที่:

  • Common Lisp - การประกาศประเภท
  • Perl – จากเวอร์ชัน 5.6

แข็งแกร่งเป็นประเภทที่อ่อนแอ

ภาพยนตร์ที่มีการจัดประเภทที่ชัดเจนนั้นเป็นไปไม่ได้ที่จะเปลี่ยนลักษณะประจำวันของประเภทต่าง ๆ ใน virazes และชนะการเปลี่ยนแปลงอัตโนมัติทุกวัน พวกเขายังถูกเรียกว่า "Movi จาก Suvoroy Typization" คำศัพท์ภาษาอังกฤษสำหรับสิ่งนี้คือการพิมพ์ที่รัดกุม

mov, navpak, spriyat ที่พิมพ์ไม่เก่งทุกอย่างเพื่อให้โปรแกรมเมอร์เปลี่ยนประเภทต่าง ๆ ในทางเดียวและคอมไพเลอร์เองก็นำทุกอย่างมาสู่ประเภทเดียว พวกเขาเรียกอีกอย่างว่า "movi ที่มีการจำแนกประเภทที่ไม่ใช่ซูโวรอย" ศัพท์ภาษาอังกฤษสำหรับสิ่งนี้คือการพิมพ์ที่อ่อนแอ

ตัวพิมพ์ที่อ่อนแอมักสับสนกับไดนามิก ซึ่งไม่ใช่กรณีนี้ ภาษาที่พิมพ์แบบไดนามิกสามารถพิมพ์ได้น้อยและหนักแน่น

อย่างไรก็ตาม มีเพียงไม่กี่คนที่ทราบถึงความสำคัญของความเข้มงวดในการพิมพ์ มักจะมีการระบุว่าภาษามีการพิมพ์แบบสแตติก จากนั้นคุณสามารถใช้การอภัยโทษที่อาจเกิดขึ้นได้ไม่จำกัดสำหรับการรวบรวม โกหกคุณ!

Mova มีความผิดในมารดาและการพิมพ์ที่รัดกุม และก็จริง เนื่องจากคอมไพเลอร์จะแทนที่การเตือนความจำเกี่ยวกับการอภัยโทษ มันจะเพิ่มแถวให้กับตัวเลข มิฉะนั้น จะยิ่งสูงขึ้น คุณสามารถดูอาร์เรย์อื่นจากที่หนึ่งได้ อะไรดีสำหรับเรา อะไรทั้งหมด -verifications” ของประเภทจะอยู่ในขั้นตอนการคอมไพล์หรือไม่? ถูกต้อง - การพิมพ์แบบคงที่ที่อ่อนแอนั้นทรงพลังกว่า ด้านล่างคือไดนามิกที่แข็งแกร่ง! (นั่นคือความคิดของฉัน)

เหตุใดประเภทที่อ่อนแอจึงไม่มีข้อดี? มันเป็นไปได้ที่จะมีลักษณะเช่นนั้น โดยไม่เคารพผู้ที่ฉันเหมาะสมกับการพิมพ์ที่รัดกุม ฉันมีความผิดในการรอ ที่คนอ่อนแอมีเปเรวากาเหมือนกัน

คุณต้องการที่จะรู้ว่าอย่างไร

สัญญาณของการพิมพ์ที่แข็งแกร่ง
  • Nadіynіst - คุณเอาความผิดออกไปหรือให้อภัยการรวบรวมพฤติกรรมที่ไม่ถูกต้อง
  • Shvidkіst - zamіst prihovannyh reworking, yakіสามารถทำได้ในสีสดใส, іz typіzієyuที่แข็งแกร่ง มันเป็นสิ่งจำเป็นในการเขียนїхอย่างชัดเจน, โปรแกรมเมอร์ scho zamushuєอย่างน้อยก็รู้ว่ารหัส tsya dіlyankaสามารถpoіlnoyได้
  • ความรู้เกี่ยวกับหุ่นยนต์และโปรแกรม - อีกครั้ง การแทนที่การลดขนาดโดยปริยาย โปรแกรมเมอร์เขียนทุกอย่างด้วยตัวเอง และมันหมายถึงความฉลาดโดยประมาณ การจัดตำแหน่งแถวและจำนวนไม่ได้เกิดขึ้นเองและไม่ได้ในทางที่มีเสน่ห์
  • การนัดหมาย - ถ้าคุณเขียนการเปลี่ยนแปลงด้วยมือ คุณรู้แน่ชัดว่าคุณกำลังแปลงเป็นอะไร ดังนั้นคุณจะตระหนักอยู่เสมอว่าการเปลี่ยนแปลงดังกล่าวสามารถนำไปสู่ความแม่นยำและผลลัพธ์ที่ไม่ถูกต้อง
การพิมพ์ที่อ่อนแอ
  • ความเก่งกาจของชัยชนะของโองการที่หลากหลาย (เช่น หมายเลขคำพูด z tsilih chi)
  • นามธรรมในรูปแบบของการพิมพ์และเน้นงาน
  • บันทึกย่อ

Garazd เราเด้งแล้วปรากฏในประเภทที่อ่อนแอของє perevagi เดียวกัน! และวิธีที่จะถ่ายทอดข้อดีของประเภทที่อ่อนแอไปเป็นแบบที่แข็งแกร่งคืออะไร?

ปรากฏขึ้น єฉันนำทางสอง

การลดประเภทโดยนัยในสถานการณ์ที่ชัดเจนและไม่สูญเสียข้อมูล

เอ่อ ... จบย่อหน้ายาวๆ ให้ฉันให้โยคะสั้น ๆ กับ "การเปลี่ยนแปลงโดยนัยของ obmezhene"

สถานการณ์ไม่ชัดเจน แกนเช่นการบวกตัวเลขสองตัวนั้นเป็นสถานการณ์ที่ชัดเจน และการแปลงตัวเลขเป็นอาร์เรย์นั้นไม่มี (เป็นไปได้ที่จะสร้างอาร์เรย์ขององค์ประกอบหนึ่งก็เป็นไปได้ที่อาร์เรย์จะเติมองค์ประกอบสำหรับการล็อคเป็นเวลานานเช่นนี้และสามารถเปลี่ยนตัวเลขได้ เป็นแถวแล้วใส่อาร์เรย์ของสัญลักษณ์)

การส่งคืนข้อมูลทำได้ง่ายกว่า เราจะแปลงตัวเลขคำพูด 3.5 เป็นตัวเลขได้อย่างไร - เราจะใช้ส่วนหนึ่งของข้อมูล (อันที่จริง การดำเนินการไม่ชัดเจน - การปัดเศษจะทำอย่างไร ด้านที่ใหญ่กว่า ด้านที่เล็กกว่า?

การปฏิรูปในสถานการณ์ที่คลุมเครือ การเปลี่ยนแปลงนั้นด้วยข้อมูลที่สอง ดีขึ้น แย่ลง ไม่มีอะไรพิเศษสำหรับการเขียนโปรแกรม

หากคุณไม่เชื่อฉัน อ่านภาษา PL/I หรือเพียงแค่มองหาข้อกำหนดนี้ อันใหม่มีกฎของการแปลงระหว่างข้อมูลทุกประเภท! Tse แค่นรก!

ฮาราซด์ ลองคิดถึงการแปลงของการแปลงโดยนัยกัน ย้ายอะไร? ตัวอย่างเช่น ใน Pascal คุณสามารถเปลี่ยนจำนวนเต็มเป็นคำพูดได้ แต่ไม่ใช่ในทางที่ผิด กลไกที่คล้ายกันอยู่ใน C#, Groovy และ Common Lisp

Garazd ฉันได้แสดงให้เห็นว่ามีอีกวิธีหนึ่งในการนำข้อดีสองสามข้อจากประเภทที่อ่อนแอจากภาษาที่รุนแรง ดังนั้น ไวน์จึงถูกเรียกว่า polymorphism ของคอนสตรัคเตอร์

ฉันจะอธิบายโยคะในแอปพลิเคชั่นภาพยนตร์มหัศจรรย์ของ Haskell

คอนสตรัคเตอร์แบบ Polymorphic ปรากฏขึ้นเนื่องจากการเตือนว่าจำเป็นต้องมีการแปลงโดยนัยที่ปลอดภัยที่สุดเมื่อเปลี่ยนตัวอักษรตัวเลข

ตัวอย่างเช่น หากคุณมี pi + 1 คุณไม่ต้องการเขียน pi + 1.0 แทน pi + float(1) ฉันต้องการเขียนแค่ pi + 1!

มันเสียใน Haskell เพราะตัวอักษร 1 ไม่มีประเภทเฉพาะ ราคาไม่มีคำพูดหรือคำพูดที่ซับซ้อน เป็นแค่ตัวเลข!

เป็นผลให้เมื่อเขียนฟังก์ชันง่าย ๆ ผลรวม x y ซึ่งคูณตัวเลขทั้งหมดใน x ถึง y (โดยเพิ่มขึ้นทีละ 1) เราคำนึงถึงจำนวนเวอร์ชัน - ผลรวมสำหรับจำนวนเต็ม, ผลรวมสำหรับคำพูด, ผลรวมสำหรับเหตุผล, ผลรวม สำหรับจำนวนเชิงซ้อนและผลรวมของประเภทตัวเลขทั้งหมดที่คุณกำหนดเอง

Zvichayno ryatuє tsey priyom เฉพาะเมื่อ vikoristanny zmіshanih vrazіv іzตัวอักษรตัวเลข แต่เพียงส่วนปลายของภูเขาน้ำแข็ง

ด้วยวิธีนี้ เราสามารถพูดได้ว่าวิธีที่ดีที่สุดคือการสร้างสมดุลระหว่างตัวพิมพ์ที่รัดกุมและอ่อนแอ ตราบใดที่ฉันไม่มีความสมดุลที่สมบูรณ์แบบของภาษาใด ๆ ฉันก็มีแนวโน้มที่จะพิมพ์มากขึ้น (เช่น Haskell, Java, C#, Python) มากกว่าที่พิมพ์ไม่เก่ง (เช่น C, JavaScript, Lua, PHP ).

การพิมพ์ที่ชัดเจนและโดยปริยาย

Mova พร้อมการพิมพ์ที่ชัดเจนบ่งบอกว่าโปรแกรมเมอร์มีความผิดในการระบุประเภทของการเปลี่ยนแปลงและการทำงานทั้งหมด ราวกับว่าทำให้หูหนวก คำศัพท์ภาษาอังกฤษสำหรับสิ่งนี้คือการพิมพ์ที่ชัดเจน

Mova พร้อมการพิมพ์โดยนัย, navpaki, proponuєลืมเกี่ยวกับประเภทและโอนคำจำกัดความประเภทไปยังคอมไพเลอร์หรือล่าม คำศัพท์ภาษาอังกฤษสำหรับการพิมพ์โดยปริยาย

ที่ด้านหลังมือ คุณสามารถพูดได้ว่าการพิมพ์โดยนัยมีค่าเท่ากับไดนามิก และแบบที่ชัดเจนนั้นเป็นแบบคงที่ แต่ยิ่งไปกว่านั้น สิ่งที่ไม่เป็นเช่นนั้น

Chi є pluses ของรูปลักษณ์ของผิวและอีกครั้ง chi єїхชุดค่าผสมі chi є movi z รองรับทั้งสองวิธีหรือไม่

ข้อดีของการพิมพ์แบบชัดแจ้ง
  • การมีอยู่ของฟังก์ชันสกินของลายเซ็น (เช่น int add(int, int)) ช่วยให้คุณสามารถกำหนดฟังก์ชันที่จะทำงานได้อย่างง่ายดาย
  • โปรแกรมเมอร์จะจดทันทีว่าค่าประเภทใดที่สามารถนำมาจากการเปลี่ยนแปลงนั้นได้ ซึ่งทำให้จำเป็นต้องจำไว้
คุณสมบัติการพิมพ์โดยนัย
  • บันทึกย่อ - def add(x, y) สั้นกว่า int add(int x, int y) อย่างชัดเจน
  • ทนต่อการเปลี่ยนแปลง ตัวอย่างเช่น หากฟังก์ชันเปลี่ยนเวลามีประเภทเดียวกับอาร์กิวเมนต์อินพุต ดังนั้นในการย้ายที่พิมพ์อย่างชัดเจน เมื่อเปลี่ยนประเภทของอาร์กิวเมนต์อินพุต จำเป็นต้องเปลี่ยนประเภทการเปลี่ยนแปลงเวลา

ดี เป็นที่ชัดเจนว่าการดูหมิ่นเกิดขึ้นเหมือนข้อดี ดังนั้น minuses (และใครจะตรวจสอบอะไรอีก) จากนั้นมาขอวิธีที่จะรวมสองวิธีนี้เข้าด้วยกัน!

การพิมพ์ผิดอย่างชัดเจนบน vibir

ย้ายด้วยการพิมพ์โดยนัยสำหรับการจับภาพและความสามารถในการระบุค่าประเภทสำหรับการบริโภค Tsey พิมพ์ virazu นักแปล vivede โดยอัตโนมัติ หนึ่งในการเคลื่อนไหวเหล่านี้คือ Haskell ให้ฉันยกตัวอย่างง่ายๆเพื่อความชัดเจน:

ไม่มีการประกาศประเภทที่ชัดเจน add (x, y) = x + y - การประกาศประเภทที่ชัดเจน add:: (Integer, Integer) -> Integer add (x, y) = x + y

หมายเหตุ: ฉันสามารถตั้งชื่อฟังก์ชันที่ไม่ถือครองได้ และยังสามารถเขียนลายเซ็นส่วนตัวแทนการเพิ่มลายเซ็นขนาดใหญ่ขึ้นได้:: (Num a) -> a -> a -> a เพราะ ฉันต้องการแสดงแนวคิดโดยไม่ต้องอธิบายไวยากรณ์ของ Haskell

หืม จามรี bachimo ก็สวยสั้นเหมือนกันนะ รายการฟังก์ชันใช้เวลาเพียง 18 อักขระต่อแถว รวมช่องว่าง!

อย่างไรก็ตาม การไขลานอัตโนมัติของประเภทสามารถพับเก็บได้ และใช้งานไม่ได้กับ Haskell ภาษาเจ๋งๆ เช่นนี้ (ตัวอย่างเช่น คุณสามารถนำการเปลี่ยนแปลงไปใช้ monomorphism)

Chi є movi พร้อมการพิมพ์ที่ชัดเจนสำหรับการล็อคและความต้องการโดยปริยาย? คอน
แน่นอน

การพิมพ์โดยปริยายในตัวเลือก

มาตรฐานภาษา C++ ใหม่ที่เรียกว่า C++11 (ก่อนหน้านี้เรียกว่า C++0x) ได้แนะนำคำสำคัญอัตโนมัติ ดังนั้นคุณสามารถบอกให้คอมไพเลอร์ป้อนประเภทโดยไม่ใช้บริบท:

อาจเป็นไปได้: // การแทรกด้วยตนเองเพื่อพิมพ์ unsigned int a = 5; int ที่ไม่ได้ลงนาม b = a + 3; // ชนิดห่ออัตโนมัติ unsigned int a = 5; อัตโนมัติ b = a+3;

ไม่เลว. เอล บันทึกไม่ได้หดตัวมาก มาประหลาดใจที่ก้นด้วยการวนซ้ำ (ถ้าคุณไม่เข้าใจอย่าต่อสู้อย่าลืมเคารพว่าการบันทึก zavodka ไปยัง vysnovka อัตโนมัตินั้นเร็วอยู่แล้ว):

// กำหนดด้วยตนเองให้กับ std::vector type vec = randomVector(30); สำหรับ (std::vector::const_iterator it = vec.cbegin(); ...) ( ... ) // Auto vec type auto vec = randomVector (สามสิบ); สำหรับ (อัตโนมัติ = vec.cbegin(); ...) ( ... )

ว้าว! แกนจะสั้น Garazd แต่คุณจะทำงานกับวิญญาณของ Haskell ได้อย่างไร คุณค่าประเภทใด จะเปลี่ยนไปอย่างไร จะอยู่ในประเภทของการโต้แย้ง

ฉันทำซ้ำวิธีนี้โดยใช้คีย์เวิร์ด decltype ร่วมกับ auto:

// พิมพ์ int หารด้วยตนเอง (int x, int y) (...) // ประเภทอัตโนมัติแบ่งอัตโนมัติ (int x, int y) -> decltype(x / y) (...)

คุณอาจพบว่ารูปแบบของสัญกรณ์ไม่ค่อยดีนัก แต่เมื่อใช้ร่วมกับการเขียนโปรแกรมขั้นสูง (เทมเพลต/ทั่วไป) การพิมพ์โดยนัยหรือการสืบทอดประเภทอัตโนมัติจะสร้าง div

การเขียนโปรแกรม Deyaki movi สำหรับการจัดหมวดหมู่นี้

ฉันจะทำรายการ mov ยอดนิยมเล็กน้อยและเขียนว่ากลิ่นเหม็นนั้นเหมาะกับหมวดหมู่สกิน "ประเภท" อย่างไร

JavaScript - Dynamic / Weak / Implicit Ruby - Dynamic / Strong / Implicit Python - Dynamic / Strong / Implicit Java - Static / Strong / Explicit PHP - Dynamic / Weak / Implicit C - Static / Weak / Explicit C++ - Static / Strong / Explicit - ไดนามิก / อ่อนแอ / วัตถุประสงค์โดยนัย -C - คงที่ / อ่อนแอ / ชัดเจน C# - คงที่ / แข็งแกร่ง / ชัดเจน Haskell - คงที่ / แข็งแกร่ง / โดยนัย Common Lisp - ไดนามิก / แข็งแกร่ง / โดยนัย

บางทีฉันมีความเมตตาที่นี่ โดยเฉพาะอย่างยิ่งกับ CL, PHP และ Obj-C ราวกับว่าคุณมีความคิดอื่น - เขียนความคิดเห็น

วิสโนวอค

ตกลง. เนซาบาร์จะชัดเจนและฉันรู้ว่าไม่มีอะไรจะพูดเกี่ยวกับการพิมพ์อีกต่อไป โอ้ จามรี? หัวข้อไร้สาระ? Duzhe ร่ำรวยหายไปไม่เสร็จ? ฉันขอความคิดเห็นแบ่งปันข้อมูลพื้นฐาน

© 2022 androidas.ru - ทั้งหมดเกี่ยวกับ Android