การเดินทางของคอมไพเลอร์ ASN.1: การค้นหาตลอดหนึ่งปีของนักพัฒนาผ่านโปรโตคอลที่มีชื่อเสียงในด้านความซับซ้อน

ทีมชุมชน BigGo
การเดินทางของคอมไพเลอร์ ASN.1: การค้นหาตลอดหนึ่งปีของนักพัฒนาผ่านโปรโตคอลที่มีชื่อเสียงในด้านความซับซ้อน

ในโลกของภาษาโปรแกรมมิ่งและโปรโตคอลข้อมูล การเดินทางบางครั้งก็เต็มไปด้วยอุปสรรคมากกว่าการเดินทางอื่นๆ เมื่อมีนักพัฒนารายหนึ่งประกาศว่าเขาใช้เวลาถึงหนึ่งปีในการสร้างคอมไพเลอร์ ASN.1 โดยใช้ภาษาโปรแกรมมิ่ง D เขาก็ได้เรียกเสียงร้อง同情จากวิศวกรคนอื่นๆ ที่เคยพบเจอโปรโตคอลภาษาสเปคที่มีความซับซ้อน notorious นี้ การอภิปรายที่ตามมาเผยให้เห็นจุดตัดที่น่าสนใจระหว่างการสนับสนุนภาษาโปรแกรมมิ่ง ปรัชญาการออกแบบโปรโตคอล และความทรงจำร่วมเกี่ยวกับการทำงานกับหนึ่งในสเปคที่ท้าทายที่สุดในโลกคอมพิวเตอร์

ประสบการณ์ ASN.1: ความเจ็บปวดที่เป็นสากล ความสุขที่เป็นศูนย์

ปฏิกิริยาต่อโปรเจกต์คอมไพเลอร์ ASN.1 เกิดขึ้นทันทีและเป็นเอกฉันท์ - ไม่มีใครมีความทรงจำที่ดีในการทำงานกับสเปคนี้ ASN.1 (Abstract Syntax Notation One) เป็นภาษาบรรยายอินเทอร์เฟซมาตรฐานที่ใช้กำหนดโครงสร้างข้อมูลซึ่งสามารถทำ serialization และ deserialization ข้ามระบบต่างๆ ได้ ซึ่งเป็นที่รู้จักมากที่สุดในใบรับรอง X.509 ที่เป็นรากฐานของความปลอดภัย HTTPS สิ่งที่ทำให้ความพยายามตลอดหนึ่งปีของนักพัฒนาคนนี้มีความน่าสนใจเป็นพิเศษคือการยอมรับถึงความซับซ้อนของ ASN.1 อย่างเป็นสากลในหมู่ผู้ที่เคยพบเจอมันในเชิงวิชาชีพ

โดยปกติแล้ว คุณอาจพูดได้ว่าเมื่อนำมาตรฐานบางอย่างไปใช้งาน คุณจะได้ฟังก์ชันการทำงาน 80% ด้วยเวลา 20% ของที่วางแผนไว้ แต่กับ ASN.1 แล้ว 20% ที่เหลืออาจใช้เวลาที่เหลือของชีวิตคุณ

ความรู้สึกนี้สะท้อนไปทั่วทั้งชุมชน โดยมีนักพัฒนาหลายคนแบ่งปันเรื่องราวอันน่าสะพรึงกลัวของพวกเขาเกี่ยวกับ ASN.1 ผู้แสดงความคิดเห็น的一位ที่เคยทำงานกับโปรโตคอลนี้ในยุค 1990 แสดงความเห็นอกเห็นใจต่อผู้เขียนคอมไพเลอร์ โดยระบุว่ามีน้อยสิ่งในโลกคอมพิวเตอร์ที่ฉันไม่ชอบมากไปกว่า ASN.1/BER ดูเหมือนว่าโปรโตคอลนี้จะสร้างความ anguish แบบพิเศษให้กับนักพัฒนา ซึ่งข้ามผ่านรุ่นและกระบวนทัศน์การโปรแกรม

สงครามโปรโตคอลและประวัติศาสตร์อินเทอร์เน็ต

การอภิปรายได้พัฒนาอย่างเป็นธรรมชาติไปสู่บริบททางประวัติศาสตร์ว่าทำไม ASN.1 จึงกลายเป็นที่แพร่หลายแม้จะมีควาซับซ้อน ผู้แสดงความคิดเห็นอ้างอิงถึงสงครามโปรโตคอล (Protocol Wars) ในยุคเริ่มต้นของอินเทอร์เน็ต ซึ่งมาตรฐานจากบริษัทต่างๆ เช่น จาก ITU (International Telecommunication Union) แข่งขันกับแนวทางจากแวดวงวิชาการและ IETF (Internet Engineering Task Force) ASN.1 เกิดขึ้นจากวัฒนธรรมมาตรฐานของบรรษัทนี้ ซึ่งให้ความสำคัญกับสเปคที่ครอบคลุมมากกว่าความกังวลในทางปฏิบัติเกี่ยวกับการนำไปใช้งาน

ผู้แสดงความคิดเห็น的一位วาดภาพที่สดใสเกี่ยวกับสิ่งที่อาจจะเกิดขึ้น: ระหว่างการประชุมผู้ปกครองในตอนต้น ลูกเขยในอนาคตบรรยายตัวเองว่าเป็นที่ปรึกษาด้านการสื่อสาร ทำงานเกี่ยวกับการติดตั้งเครือข่าย X.25 ฉันต้องหยุดหนังและอธิบายให้คู่ของฉันฟังว่าโลกเราเกือบจะพลาดอะไรไป 'อินเทอร์เน็ต' อินเทอร์เน็ตทางเลือกนี้จะมีที่อยู่แบบเช่น CN=wikipedia, OU=org, C=US และน่าจะมีโมเดลการคิดเงินตามจำนวนไบต์ การอยู่รอดของสแต็ก TCP/IP ที่เปิดกว้างมากกว่า เมื่อเทียบกับโปรโตคอล OSI เช่น พวกที่ใช้ ASN.1 เป็นช่วงเวลาสำคัญในประวัติศาสตร์อินเทอร์เน็ต

ภาษาโปรแกรมมิ่ง D: แชมเปี้ยนขมปนหวาน

การเลือกใช้ภาษา D สำหรับโปรเจกต์คอมไพเลอร์นี้ได้จุดประกายการอภิปรายย่อยเกี่ยวกับระบบนิเวศของภาษาโปรแกรมมิ่ง D ครองพื้นที่พิเศษในโลกการโปรแกรมมิ่ง - เป็นภาษาที่หลายคนชื่นชมในด้านเทคนิค แต่พลาดหน้าต่างสำหรับการยอมรับในวงกว้าง ดังที่ผู้แสดงความคิดเห็น的一位ระบุว่า จากมุมมองทางปรัชญาและการออกแบบภาษา มันตอบโจทย์มากมาย มันมีศักยภาพที่จะได้รับความนิยมอย่างกว้างขวาง หากบางสิ่งบางอย่างเป็นไปแตกต่างออกไป

นักพัฒนาได้ชื่นชมคุณสมบัติของภาษา D เช่น unit tests ที่สามารถเขียนได้ทันทีหลังฟังก์ชัน การสนับสนุน enum และ union ที่ทรงพลัง การเขียนโปรแกรมแบบมีสัญญา (contract programming) และความสามารถในการแยกโค้ดทดสอบโดยใช้บล็อก version(unittest) ภาษานี้ดูเหมือนจะสร้างสมดุลระหว่างการทำงานระดับสูงที่มีประสิทธิภาพและการควบคุมระดับต่ำที่ดึงดูดนักโปรแกรมระบบ อย่างไรก็ตาม ดังที่ผู้แสดงความคิดเห็นอีกท่านหนึ่งสังเกต D สูญเสียโอกาสไปเมื่อตอนที่ Remedy Games และ Facebook กำลังวางเดิมพันกับมัน โดยคุณสมบัติที่ครั้งหนึ่งเคยเป็นเอกลักษณ์ของ D ตอนนี้ถูกนำไปใช้โดยภาษากระแสหลักอื่นๆ เช่น C#, Java และ C++

คุณสมบัติสำคัญของภาษาโปรแกรม D ที่ถูกกล่าวถึง

  • สามารถเขียน unit tests ได้ติดกับฟังก์ชัน
  • บลอก version(unittest) สำหรับการจัดการโค้ดทดสอบ
  • รองรับ enum, union และ contract programming ขั้นสูง
  • คอมไพล์ผ่าน DMD (reference compiler), LDC (ใช้ LLVM) และ GDC (ใช้ GCC)

ความซับซ้อนทางเทคนิคของการนำ ASN.1 ไปใช้งาน

ความท้าทายในการนำ ASN.1 ไปใช้งานจริงเผยให้เห็นว่าทำไมมันจึงสร้างปฏิกิริยารุนแรงเช่นนี้ สเปคนี้ไม่ใช่รูปแบบการเข้ารหัสเดียว แต่เป็นภาษาสคีมาที่มีกฎการเข้ารหัสไบนารีหลายแบบ รวมถึง BER (Basic Encoding Rules), DER (Distinguished Encoding Rules) และ PER (Packed Encoding Rules) DER ให้การเข้ารหัสที่เป็นมาตรฐาน (canonical encoding) ซึ่งสำคัญสำหรับแอปพลิเคชันการเข้ารหัสลับเช่นใบรับรอง แต่ตามที่ผู้แสดงความคิดเห็นระบุ การใช้งานจริงมักผสมผสาน DER และ BER เนื่องจาก historically การแยกวิเคราะห์แบบผ่อนปรนของ OpenSSL

ความท้าทายทางเทคนิคอย่างหนึ่งที่ถูกเน้นคือ IMPLICIT tagging ซึ่งข้อมูลประเภทไม่ได้อธิบายตัวเองในข้อมูลที่ถูกเข้ารหัส จึงต้องใช้สคีมาเพื่อการตีความที่ถูกต้อง สิ่งนี้แตกต่างจากรูปแบบที่ทันสมัยกว่าอย่าง Protocol Buffers หรือ JSON ที่โครงสร้างจะปรากฏชัดเจนกว่าในทันที การอภิปรายเผยให้เห็นว่าในขณะที่การเข้ารหัส DER นั้น technically อธิบายตัวเองได้สำหรับองค์ประกอบที่ติดแท็ก universally ความเป็นจริงในทางปฏิบัติของการทำงานกับสเปค ASN.1 ที่มีอยู่ มักต้องอาศัยความรู้เกี่ยวกับสคีมาอย่างลึกซึ้ง

รูปแบบการเข้ารหัส ASN.1

  • BER (Basic Encoding Rules): การเข้ารหัสแบบดั้งเดิมที่มีความยืดหยุ่น
  • DER (Distinguished Encoding Rules): รูปแบบมาตรฐานที่จำเป็นสำหรับการเข้ารหัสลับ
  • PER (Packed Encoding Rules): การเข้ารหัสที่ปรับให้ประหยัดพื้นที่ โดยต้องใช้ schema ในการแยกวิเคราะห์

ทางเลือกสมัยใหม่และภาระจากระบบเดิม

การสนทนาหันไปสู่สิ่งที่อาจจะแทนที่ ASN.1 หากออกแบบในปัจจุบัน โดยบางคนแนะนำรูปแบบ based on JSON อย่าง JWT (JSON Web Tokens) ขณะที่บางคนชี้ให้เห็นข้อจำกัดเกี่ยวกับการจัดการข้อมูลไบนารีและความจำเป็นในการเข้ารหัสที่เป็นมาตรฐานในบริบทการเข้ารหัสลับ Protocol Buffers ปรากฏเป็นทางเลือกที่ถูกกล่าวถึงบ่อยครั้ง โดยถูกอธิบายโดยผู้แสดงความคิดเห็น的一位ว่าเป็น ASN.1 ที่มีเครื่องมือที่ดีกว่า

อย่างไรก็ตาม ความจริงคือ ASN.1 ถูกฝังลึกอยู่ในโครงสร้างพื้นฐานที่สำคัญ โดยเฉพาะใน PKI (Public Key Infrastructure) และโปรโตคอลโทรคมนาคม ดังที่นักพัฒนาที่ทำงานเกี่ยวกับลายเซ็น PDF คนหนึ่งระบุ ความจำเป็นในการจัดการส่วนขยายที่ไม่รู้จักโดย consumer รุ่นเก่า ต้องการการรักษาความเข้ากันได้กับ ASN.1 ไปในอนาคตอันใกล้ ต้นทุนในการแทนที่รากฐานนี้สูงเกินไป ทำให้นักพัฒนาต้องต่อสู้กับความซับซ้อนของมันต่อไป

การเดินทางของการสร้างคอมไพเลอร์ ASN.1 ใน D แสดงถึงมากกว่าความสำเร็จทางเทคนิค - มันเป็นข้อพิสูจน์ถึงธรรมชาติที่ยั่งยืนของการตัดสินใจเกี่ยวกับโปรโตคอลที่ทำไว้เมื่อหลายทศวรรษก่อน และนักพัฒนาที่บำรุงรักษาโครงสร้างพื้นฐานดิจิทัลของเราแม้จะมีความเจ็บปวดที่เกี่ยวข้องก็ตาม ปฏิกิริยาสากลของความเห็นอกเห็นใจและความทรงจำร่วมเกี่ยวกับการทำงานกับเทคโนโลยีนี้จากชุมชนโปรแกรมเมอร์ เน้นย้ำว่าบางเทคโนโลยีกลายเป็นตำนานในด้านความซับซ้อนอย่างไร สร้างความผูกพันระหว่างนักพัฒนาข้ามรุ่นที่เคยเผชิญความท้าทายเดียวกัน

อ้างอิง: I spend a year of my life making an ABL1 compiler in D