การจัดประเภทของระบบพิมพ์ (แข็งแรง / อ่อน, ไดนามิก / คงที่)


23

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

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

  • ไม่มีการพิมพ์: ภาษาไม่มีความคิดประเภทหรือจากมุมมองที่พิมพ์: มีประเภทเดียวในภาษา ภาษาแอสเซมบลีมีชนิด 'รูปแบบบิต' เท่านั้น Rexx และ Tk มีเฉพาะชนิด 'ข้อความ' แกน MatLab มีเฉพาะ 'เมทริกซ์ที่ซับซ้อนที่มีมูลค่า' ประเภท
  • การพิมพ์ที่อ่อนแอ: มีประเภทที่แตกต่างเพียงไม่กี่ประเภทและอาจเป็นคำพ้องความหมายสำหรับหลายประเภท เช่น C ใช้ตัวเลขจำนวนเต็มสำหรับ booleans, จำนวนเต็ม, ตัวอักษร, ชุดบิตและการแจกแจง
  • การพิมพ์ที่แข็งแกร่ง: ชุดเม็ดเล็กแบบละเอียดเช่นในภาษา Ada, ภาษา Wirthian (Pascal, Modula-2), Eiffel

ทั้งหมดนี้ขัดกับการรับรู้ส่วนบุคคลของฉันซึ่งเป็นไปตาม:

  • การพิมพ์ที่อ่อนแอ: ออบเจ็กต์มีประเภท แต่จะถูกแปลงเป็นประเภทอื่นโดยปริยายเมื่อบริบทต้องการ ยกตัวอย่างเช่น Perl, PHP และ JavaScript เป็นภาษาทั้งหมดที่"1"สามารถใช้ในมากหรือน้อยบริบทใด ๆ ที่1สามารถ
  • การพิมพ์ที่รัดกุม: วัตถุมีชนิดและไม่มีการแปลงโดยนัย (แม้ว่าอาจใช้การจำลองมากเกินไป) ดังนั้นการใช้วัตถุในบริบทที่ไม่ถูกต้องเป็นข้อผิดพลาด ใน Python การทำดัชนีอาร์เรย์ด้วยสตริงหรือ float จะส่งข้อยกเว้น TypeError ใน Haskell มันจะล้มเหลวในเวลารวบรวม

ฉันถามความคิดเห็นเกี่ยวกับเรื่องนี้จากคนอื่น ๆ ที่มีประสบการณ์ในสาขามากกว่าฉันและคนหนึ่งให้คุณลักษณะนี้:

  • การพิมพ์ที่อ่อนแอ: การดำเนินการที่ไม่ถูกต้องกับข้อมูลจะไม่ได้รับการควบคุมหรือปฏิเสธ แต่จะสร้างผลลัพธ์ที่ไม่ถูกต้อง / ไม่เจาะจง
  • การพิมพ์ที่รัดกุม: การดำเนินการกับข้อมูลจะได้รับอนุญาตเฉพาะในกรณีที่ข้อมูลนั้นเข้ากันได้กับการดำเนินการ

เมื่อฉันเข้าใจแล้วตัวอักษรตัวแรกและตัวสุดท้ายจะเรียกว่า C ที่พิมพ์อย่างอ่อนตัวที่สองจะเรียกมันว่าเป็นตัวพิมพ์ที่รุนแรง ตัวแรกและตัวที่สองจะเรียก Perl และ PHP ที่พิมพ์แบบอ่อน ๆ ส่วนที่สามจะเรียกพวกมันว่าอย่างมาก ทั้งสามคนจะอธิบาย Python ว่าพิมพ์อย่างรุนแรง

ฉันคิดว่าคนส่วนใหญ่จะบอกฉันว่า "ก็ดีไม่มีความเห็นเป็นเอกฉันท์ไม่มีความหมายที่ยอมรับได้ของคำศัพท์" หากคนเหล่านั้นผิดฉันยินดีที่จะได้ยินเกี่ยวกับเรื่องนี้ แต่ถ้าพวกเขาพูดถูกนักวิจัย CS จะอธิบายและเปรียบเทียบระบบการพิมพ์อย่างไร ฉันสามารถใช้คำศัพท์อะไรที่มีปัญหาน้อยกว่าได้บ้าง

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


6
ฉันคิดว่าคุณมีคำตอบแล้ว: ไม่มีคำจำกัดความที่ยอมรับได้สำหรับการพิมพ์ที่อ่อนแอและแข็งแรง
svick

ฉันจะไม่พบว่ายากที่จะเชื่อ แต่ฉันถามคำถามด้วยความหวังว่ามีสิ่งหนึ่งที่ฉันไม่เคยได้ยินเกี่ยวกับ :) หรืออย่างน้อยคำจำกัดความที่มีอำนาจมากกว่าสิ่งที่ผู้ชายบางคนที่แก้ไขการคำนวณ wiki เป็นกรณี .
Ben Millwood

3
สำหรับบางคนการอภิปรายเกี่ยวกับเรื่องนี้ดูคำถามที่เกี่ยวข้องเกี่ยวกับเรื่องนี้ดังนั้น
svick

1
เพื่อเสริมสร้างจุด svick มันเป็นไปไม่ได้ที่จะหาการอ้างอิงผู้มีอำนาจในสิ่งที่ไม่ได้รับการยอมรับ สิ่งใดก็ตามที่อ้างว่าเป็นผู้มีอำนาจจะผิดอย่างแน่นอน (เนื่องจากมีตัวอย่างเคาน์เตอร์จำนวนเท่าใด)
edA-qa mort-ora-y

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

คำตอบ:


18

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

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

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

  • ใน Pascal มีการเพิ่ม "ชุดระเบียนแตกต่าง" ซึ่งเกือบจะเหมือนกับข้อความประกาศความเท่าเทียมแบบเก่า

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

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

โปรดทราบว่าภาษาที่พิมพ์แบบไดนามิกเช่น Lisp ซึ่งดำเนินการตรวจสอบชนิดของเวลาทำงานเสร็จสมบูรณ์จะถูก "พิมพ์อย่างยิ่ง" ในแง่ของการปกป้องการเป็นตัวแทน ในขณะเดียวกันภาษาที่พิมพ์แบบคงที่จะสูญเสียความเป็นอิสระในการเป็นตัวแทนเว้นแต่พวกเขาจะทำการตรวจสอบขอบเขตของอาเรย์ ดังนั้นพวกเขาจะไม่ "พิมพ์อย่างยิ่ง" ในแง่ที่เข้มงวดของคำ เนื่องจากผลกระทบที่ผิดปกติเหล่านี้คำว่า "พิมพ์อย่างยิ่ง" จึงถูกเลิกใช้หลังจากยุค 70 เมื่อกระทรวงกลาโหมสหรัฐพัฒนาข้อกำหนดที่เข้มงวดสำหรับการออกแบบของ Ada พวกเขารวมข้อกำหนดที่ว่าภาษาควรจะ "พิมพ์อย่างยิ่ง" (ดูเหมือนว่าจะมีความเชื่อในเวลานั้นว่าความคิดของ "พิมพ์อย่างยิ่ง" มีความชัดเจนในตัวเองไม่มีการเสนอคำนิยาม ) ข้อเสนอภาษาทั้งหมดที่ส่งมาในการตอบกลับอ้างว่าเป็น "พิมพ์อย่างยิ่ง" เมื่อ Dijkstra วิเคราะห์ข้อเสนอทางภาษาทั้งหมดเขาพบว่าไม่มีการพิมพ์ข้อเสนอแนะใด ๆ และในความเป็นจริงมันไม่ได้ชัดเจนว่าคำนั้นหมายถึงอะไร ดูรายงานEWD663 อย่างไรก็ตามฉันเห็นว่าคำศัพท์นี้กลับมาใช้อีกครั้งผ่านนักวิจัยรุ่นใหม่ที่ไม่รู้ประวัติของตาหมากรุก

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

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

เพิ่มหมายเหตุ : ประเด็นพื้นฐานคือคำว่า "การพิมพ์ที่แข็งแกร่ง" ไม่ได้ถูกนำมาใช้เป็นคำศัพท์ทางเทคนิคที่มีคำจำกัดความที่เข้มงวด มันเหมือนที่นักออกแบบภาษาบางคนรู้สึกว่า: "ระบบพิมพ์ของเราแข็งแกร่ง; มันจับข้อผิดพลาดทุกประเภท; มันไม่มีช่องโหว่" และดังนั้นเมื่อพวกเขาตีพิมพ์การออกแบบภาษาของพวกเขาพวกเขาอ้างว่ามันเป็น . มันเป็นคำที่มีเสียงพึมพำที่ฟังดูดีและผู้คนเริ่มใช้มัน กระดาษ Cardelli-Wegner เป็นกระดาษแผ่นแรกที่ฉันได้เห็นว่ามีการวิเคราะห์อะไรบ้างในความหมาย โพสต์ของฉันที่นี่ควรพิจารณาว่าเป็นการอธิบายถึงตำแหน่งอย่างละเอียด


คุณสามารถให้การอ้างอิงบางส่วนสำหรับการพัฒนาประวัติศาสตร์ได้หรือไม่? "ไม่มีข้อผิดพลาดชนิดรันไทม์ไม่มีความหมายอะไร" - คุณหมายถึงการคอมไพล์เวลาที่นี่หรือไม่?
Raphael

นี่คือบทความเกี่ยวกับEuclidที่ปรากฏใน Google Scholar ฉันจำได้ว่าเห็นเอกสารหลายฉบับในยุค 70 ซึ่งภาษาต่าง ๆ ถูกอ้างว่าพิมพ์ออกมาอย่างแรง โดยทั่วไปคิดว่าเป็นสนามขาย
Uday Reddy

1
@Raphael ฉันหมายถึง "ข้อผิดพลาดประเภทเวลาทำงาน" ในการไปถึงเวลาทำงานโปรแกรมจะต้องผ่านตัวตรวจสอบชนิดคงที่ตั้งแต่แรก ประเด็นก็คือภาษาที่พิมพ์อย่างรุนแรงเช่น Java จะให้ข้อผิดพลาดประเภทที่เวลาทำงานเมื่อไม่สามารถตรวจสอบพวกเขาในเวลารวบรวม ภาษาของประเภท Hole เช่น C จะทำให้เวลารันสร้างขยะแทนที่จะให้ข้อผิดพลาด
Uday Reddy

1
@benmachine ดูหัวข้อ "การตรวจสอบประเภท" ในกระดาษ Euclid ที่ฉันอ้างถึง ฉันคิดว่าประเด็นหลักคือ "พิมพ์อย่างยิ่ง" เป็นคำที่มีเสียงดัง ไม่ใช่ความคิดทางเทคนิค ที่ดีที่สุดเนื้อหาทางเทคนิคของมันคือการหมายความว่าไม่มีหลุมประเภท
Uday Reddy

1
ในการนำไปใช้งานที่ทันสมัยโดยทั่วไปที่ประเภทจำนวนเต็มสองชนิดที่แตกต่างกันมีการแสดงที่เหมือนกัน (เช่นทั้งสองintและlongเป็น 32 บิตหรือทั้งสองlongและlong longเป็น 64) โปรแกรมที่ใช้ตัวชี้ชนิดหนึ่งเพื่อเขียนที่เก็บข้อมูลบางส่วนและใช้ตัวชี้ประเภทอื่น ๆ การอ่านโดยทั่วไปจะไม่ทำให้เกิดข้อผิดพลาดขณะตรวจจับได้ แต่อาจทำงานผิดพลาดโดยพลการในรูปแบบอื่นโดยพลการโมเดิร์นซีจึงสูญเสียความปลอดภัยประเภทปัจจุบันของภาษาอื่นโดยไม่ได้รับความหมายใด ๆ เสนอเดิมในการแลกเปลี่ยน
supercat

7

กระดาษ Uday Reddy พบในคำตอบของเขาในประเภทการทำความเข้าใจ, Data Abstraction และ Polymorphism (1985) ให้คำตอบต่อไปนี้:

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


โพสต์เป็นชุมชน wiki เนื่องจากฉันไม่ได้รับเครดิตสำหรับการค้นหาสิ่งนี้
Ben Millwood

ปัญหาที่ฉันมีที่นี่เกี่ยวข้องกับความคิดเห็นแรกของ svick ในขณะที่มันอาจจะดีที่คุณได้พบคำจำกัดความของการพิมพ์ที่แข็งแกร่งนี้ไม่แน่นอนคำจำกัดความที่ยอมรับกันทั่วไป
edA-qa mort-ora-y

@ edA-qamort-ora-y: บนพื้นฐานที่คุณพูดเช่นนั้น? คุณมีสิ่งที่ดีกว่าหลักฐานพอสมควรสำหรับสิ่งที่เป็นและไม่ได้รับการยอมรับกันโดยทั่วไป? การอ้างอิงใด ๆ (ฉันเข้าใจว่าคุณอาจมีจุดที่ถูกต้องแม้ว่าจะไม่ใช่ แต่ฉันยังคงคิดว่าคำถามข้างต้นตอบคำถามของฉันแม้ว่าจะไม่มีฉันทามติก็เป็นเรื่องดีที่จะรู้คำตอบเชิงวิชาการอย่างน้อยหนึ่งข้อ)
Ben Millwood

1
ฉันไม่สามารถพิสูจน์ได้ว่าไม่มีคำนิยามที่ตกลงกันไว้ฉันจะทำอย่างไร มันเป็นไปไม่ได้ในเชิงตรรกะ อย่างไรก็ตามบทความวิกิพีเดียเกี่ยวกับการพิมพ์ที่แข็งแกร่งจะให้หลักฐานจำนวนมากและการอ้างอิงสำหรับความขัดแย้งและความขัดแย้ง en.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y

@ edA-qamort-ora-y: การอ้างอิงจาก Wikipedia นั้นมีประโยชน์จริง ๆ : บางคนไม่ได้เป็นนักวิชาการ, บางคนอ้างถึงเหตุผลอื่นนอกเหนือจากการกำหนดเงื่อนไข บทความการเขียนโปรแกรม Typeful ดูเหมือนจะมีแนวโน้ม แต่หมายถึงคำจำกัดความที่สั้นมากในการส่งผ่าน; บางทีมันก็คุ้มค่าที่จะแก้ไขคำตอบของฉัน เมื่อพิจารณาถึงการไม่มีตัวตนฉันคิดว่าหลักฐานของการโต้เถียง / ความขัดแย้งในหมู่คนที่รู้ว่าสิ่งที่พวกเขากำลังพูดถึงจะเพียงพอสำหรับฉัน (ซึ่งแน่นอนแล้วบทความ Typeful Programming อาจให้ฉัน)
Ben Millwood

6

คำตอบมีสิทธิ์สามารถพบได้ใน Cardelli และ Wegner บทความการสำรวจ: ประเภทเข้าใจนามธรรมข้อมูลและความแตกต่าง

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



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

@benmachine บทความฉบับเต็มมีความคุ้มค่าในการอ่าน แต่ประเด็นทางความคิดระดับสูงนั้นครอบคลุมอยู่ในสองส่วนแรกเท่านั้น
Uday Reddy

4
ฉันยังคิดว่าควรสรุปไว้ในหน้านี้ ลิงก์อาจหมดอายุในภายหลัง
Ben Millwood

@benmachine คุณสามารถโพสต์สรุปเป็นคำตอบสำหรับคำถามของคุณเอง
Uday Reddy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.