4 คะแนน โดย GN⁺ 13 일 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Ada ถือกำเนิดขึ้นท่ามกลางความโกลาหลด้านซอฟต์แวร์ของกระทรวงกลาโหมสหรัฐในทศวรรษ 1970 โดยเป็นภาษาที่มี ระบบชนิดแบบสถิตที่เข้มงวดและการแยกสเปกออกจากการอิมพลีเมนต์ เป็นหัวใจสำคัญ
  • ด้วย โครงสร้างแพ็กเกจและการซ่อนรายละเอียดเชิงตัวแทน ทำให้เกิดการห่อหุ้มอย่างสมบูรณ์ และต่อมามีอิทธิพลต่อระบบโมดูลของภาษาแบบใหม่อย่าง Java, C#, Go เป็นต้น
  • ชนิดที่มีข้อจำกัดเชิงความหมาย, generic, concurrency (task), การออกแบบบนฐานสัญญา ล้วนเป็นแนวคิดที่ Ada นำเสนอไว้ล่วงหน้าหลายสิบปี และถูกสืบทอดต่อโดย Haskell, Rust, Swift เป็นต้น
  • SPARK Ada ใช้การพิสูจน์เชิงรูปนัยเพื่อตัดทั้ง data race และข้อผิดพลาดเชิงตรรกะออกไป จึงถูกใช้งานในสาขาที่ต้องการความเชื่อถือสูงอย่าง การบิน รถไฟ และระบบป้องกันประเทศ
  • แม้ Ada จะไม่ใช่ภาษายอดนิยมในวงกว้าง แต่ในฐานะ “ภาษาที่ทำงานได้ถูกต้องอย่างเงียบ ๆ” มันคือรากฐานที่เสนอหลักการพื้นฐานของการออกแบบภาษาโปรแกรมสมัยใหม่

ภูมิหลังการกำเนิดและปรัชญาการออกแบบของ Ada

  • ช่วงต้นทศวรรษ 1970 กระทรวงกลาโหมสหรัฐ (DoD) สำรวจพบว่าสถานการณ์ในระบบอาวุธ โลจิสติกส์ และการสื่อสาร มีภาษากับภาษาถิ่นปะปนกันมากกว่า 450 แบบ
    • แต่ละระบบมีปัญหาใช้งานร่วมกันไม่ได้ บำรุงรักษาไม่ได้ และผู้เขียนดั้งเดิมไม่อยู่แล้ว
    • ส่งผลให้เกิด วิกฤตการจัดหาซอฟต์แวร์
  • DoD ไม่เลือกใช้ภาษาที่มีอยู่เดิมอย่าง COBOL, Fortran, PL/1 แต่ใช้เวลานาน 5 ปีในการกำหนดความต้องการ
    • เอกสารพัฒนาจาก Strawman → Woodenman → Tinman → Ironman → Steelman
    • Steelman (1978) กำหนดให้ต้องมีการแยกอินเทอร์เฟซอย่างชัดเจน ระบบชนิดแบบสถิตที่เข้มงวด concurrency ในตัว การจัดการข้อยกเว้นที่สอดคล้องกัน ความเป็นอิสระจากเครื่อง ความอ่านง่าย และความสามารถในการตรวจพิสูจน์
  • ในการแข่งขันระหว่าง 4 ทีม (Green, Red, Blue, Yellow) เมื่อปี 1979 ทีม Green ที่นำโดย Jean Ichbiah ได้รับเลือก และภาษาถูกตั้งชื่อว่า Ada
    • ชื่อนี้ตั้งขึ้นเพื่อยกย่อง Ada Lovelace และสื่อถึงเจตนารมณ์ของภาษา

โครงสร้างแพ็กเกจและการห่อหุ้ม

  • โครงสร้างศูนย์กลางของ Ada คือ แพ็กเกจ (package) โดยแยก specification และ body ออกจากกันในเชิงกายภาพ
    • specification คือสัญญาที่เปิดเผยต่อภายนอก ส่วน body คือการอิมพลีเมนต์ และคอมไพเลอร์จะบังคับความสัมพันธ์ระหว่างทั้งสอง
    • โค้ดฝั่งไคลเอนต์ไม่สามารถเข้าถึงองค์ประกอบที่ไม่ได้อยู่ใน specification ได้
  • โครงสร้างนี้เป็น ต้นแบบของระบบโมดูล ซึ่งภาษาต่อมาหลายภาษาได้เลียนแบบเพียงบางส่วน
    • Java, Python, JavaScript, C, Go, Rust ล้วนยังไม่สามารถทำการแยกเชิงโครงสร้างได้สมบูรณ์แบบเท่า Ada
  • private type เปิดเผยเพียงชื่อ แต่ซ่อนรูปแบบการแทนค่าภายในไว้อย่างสมบูรณ์
    • ไคลเอนต์ไม่อาจรู้โครงสร้างภายในของชนิดนั้น และใช้ได้เฉพาะปฏิบัติการที่อนุญาตเท่านั้น
    • สิ่งนี้เป็น การซ่อนรายละเอียดเชิงตัวแทน (representational invisibility) ที่แข็งแกร่งกว่า access control แบบ private ของ Java
  • Java และ C# ค่อย ๆ พัฒนาไปสู่ระดับการห่อหุ้มแบบ Ada ตลอดหลายสิบปี

ระบบชนิดและข้อจำกัดเชิงความหมาย

  • Ada นิยาม ความแตกต่างระหว่าง type และ subtype ในความหมายเชิงคณิตศาสตร์
    • ตัวอย่าง: type Age is range 0 .. 150 คือการสร้างชนิดแยกต่างหากที่มีข้อจำกัดด้านช่วงค่า
    • การส่งค่าระหว่างชนิดที่ไม่ถูกต้องจะถูกตรวจพบเป็น ข้อผิดพลาดตอนคอมไพล์
  • สำหรับปี 1983 ระบบชนิดของ Ada มีพลังในการแสดงความหมายสูงกว่า C, Fortran, Pascal มาก
    • โดยใช้ ชนิดที่มีข้อจำกัดเชิงความหมาย เพื่อป้องกันข้อผิดพลาดระดับโดเมน
  • discriminated record คือโครงสร้างที่มีฟิลด์ต่างกันตามค่าที่กำหนด
    • สิ่งนี้เทียบเท่ากับ sum type หรือ algebraic data type (ADT) ในภาษาสมัยใหม่
    • Haskell, Rust, Swift, Kotlin, TypeScript และภาษาอื่น ๆ นำแนวคิดเดียวกันนี้มาใช้ในอีกหลายสิบปีต่อมา

Generic และความเป็นพหุรูป

  • generic ของ Ada เป็นหน่วยที่รับชนิด ค่า ซับโปรแกรม และแพ็กเกจเป็นพารามิเตอร์
    • เป็นการทำ พหุรูปแบบสถิต (parametric polymorphism) ที่ตรวจสอบชนิดในเวลาคอมไพล์
  • C++ (1990), Java (2004), C# (2005), Go (2022) ต่างค่อย ๆ เพิ่มความสามารถคล้ายกันหลัง Ada อีกหลายสิบปี
    • Java ใช้ type erasure ทำให้ข้อมูลชนิดสูญหายไปในรันไทม์
    • Ada รองรับทั้งการคงข้อมูลชนิดในรันไทม์และ การทำแพ็กเกจให้เป็นพารามิเตอร์
  • generic ของ Ada ให้พลังการแสดงออกในระดับ higher-kinded polymorphism
    • มีแนวคิดใกล้เคียงกับ type class ของ Haskell, trait ของ Rust และ concepts ของ C++20

โมเดล concurrency และความปลอดภัย

  • Ada มี concurrency ระดับภาษา (task) ติดมาในตัวตั้งแต่ปี 1983
    • ผ่านการประกาศ task และโมเดลการสื่อสารแบบ rendezvous ทำให้เกิด การส่งข้อความโดยไม่มีสถานะที่ใช้ร่วมกัน
    • channel ของ Go ก็อยู่ในสายแนวคิดเดียวกันของ CSP (Communicating Sequential Processes)
  • Ada 95 เพิ่ม protected object เข้ามา
    • ใช้ปกป้องการเข้าถึงข้อมูล และแยกเป็น procedure, function, entry
    • ให้ทั้ง เงื่อนไข barrier อัตโนมัติ และ การซิงโครไนซ์แบบไม่ใช้ lock
  • SPARK Ada ใช้การพิสูจน์เชิงรูปนัยเพื่อพิสูจน์ทางคณิตศาสตร์ว่าไม่มี data race, exception, range error และการละเมิด precondition/postcondition
    • ขณะที่ borrow checker ของ Rust รับประกันเพียงความปลอดภัยด้านหน่วยความจำ SPARK สามารถ พิสูจน์ความสอดคล้องเชิงตรรกะได้ด้วย

การออกแบบบนฐานสัญญาและความปลอดภัยจาก null

  • Ada 2012 รวม สัญญา (contracts) เข้ามาไว้ในภาษา
    • สามารถระบุ precondition, postcondition และ type invariant ได้
    • ชุดเครื่องมือของ SPARK นำสิ่งเหล่านี้ไปใช้ในการพิสูจน์แบบสถิต
  • เป็นการทำให้แนวคิด Design by Contract ของ Eiffel (1986) เป็นรูปธรรมในระดับภาษา
    • ขณะที่ C++, Java, Python, Rust ยังอยู่เพียงในระดับบางส่วนหรือผ่านไลบรารี
  • Ada 2005 เพิ่มชนิด not null เพื่อรองรับ การตัด null ออกตั้งแต่ตอนคอมไพล์
    • โดยค่าปริยายจะรับประกันการล้มเหลวอย่างปลอดภัยผ่าน runtime exception (Constraint_Error)
    • เป็นแนวทางที่คล้ายกับ nullable reference ใน C# 8.0

โครงสร้างการจัดการข้อยกเว้น

  • Ada 83 เป็นภาษาแรกที่นำ structured exception handling มาใช้
    • exception ต้องประกาศก่อนใช้งาน ถูกจัดการตามขอบเขต และมีกฎการแพร่กระจายที่ชัดเจน
  • checked exception ของ Java เป็นรูปแบบที่ต่อยอดจาก Ada โดยผู้เรียกต้องระบุข้อยกเว้นให้ชัดเจน
    • ส่วน Ada อนุญาตให้มีการแพร่กระจาย exception ได้อย่างอิสระ
  • Rust ตัด exception ออกไปและใช้ การจัดการข้อผิดพลาดบนฐาน Result type
    • สิ่งที่ Ada มีส่วนสำคัญคือการทำให้การแพร่กระจาย exception มีโครงสร้างและคาดการณ์ได้

Annex และโครงสร้างการทำให้เป็นมาตรฐาน

  • มาตรฐานของ Ada มีโครงสร้างส่วนขยายแบบเลือกใช้ที่เรียกว่า Annex
    • Annex C~H นิยามความสามารถสำหรับงานระบบ งานเรียลไทม์ งานกระจาย งานเชิงตัวเลข และงานความเชื่อถือสูง
    • คอมไพเลอร์ต้องได้รับ การรับรองแยกตาม Annex
  • มีการตรวจสอบความสอดคล้องตามมาตรฐานผ่าน ACATS test ของ ACAA
    • โครงสร้างมาตรฐานของ Ada สามารถนำไปใช้กับ การรับรองซอฟต์แวร์การบิน DO-178C ได้โดยตรง
    • แม้ C/C++ ก็สามารถรับรองแบบเดียวกันได้ แต่ Ada เหมาะสมกว่าในเชิงโครงสร้าง

อิทธิพลของ Ada และความไม่สมดุลในการรับรู้

  • Ada เป็น ภาษาที่ขับเคลื่อนโดยภาครัฐ จึงไม่ค่อยได้รับความสนใจในวัฒนธรรมสายซิลิคอนแวลลีย์
    • ซึ่งนิยมไวยากรณ์กระชับแบบตระกูล C มากกว่า
  • กรณีความสำเร็จของ Ada (ระบบการบิน รถไฟ ระบบป้องกันประเทศ) มี การมองเห็นต่ำเพราะไม่มีความล้มเหลว
    • ระบบที่เชื่อถือได้สูงมักไม่ก่อให้เกิดประเด็นถกเถียงหรือเหตุการณ์
  • ทิศทางการพัฒนาของภาษาสมัยใหม่กำลังค่อย ๆ มาบรรจบกับหลักการที่ Ada เสนอไว้แล้ว
    • เช่น การแยกสเปกกับการอิมพลีเมนต์, การตรวจสอบชนิดแบบสถิต, concurrency ระดับภาษา, ความปลอดภัยบนฐานสัญญา
  • ปัจจุบัน Ada ยังคงใช้งานอยู่ในระบบที่ต้องการความเชื่อถือสูง เช่น เครื่องบิน รถไฟ และยานอวกาศ และยังคงเป็น “ภาษาที่ทำงานได้ถูกต้องอย่างเงียบ ๆ”

1 ความคิดเห็น

 
GN⁺ 13 일 전
ความเห็นจาก Hacker News
  • ฉันชอบ Ada มาก แต่พอพูดถึงระบบจัดการชนิดข้อมูลแล้วกลับไม่พูดถึง ภาษาในตระกูล ML (ML, SML, CML, Caml, OCaml ฯลฯ) เลยก็น่าแปลก
    ภาษาเหล่านี้รองรับ structural typing ในระดับคอมไพเลอร์ตั้งแต่แรก ปัญหาของ Ada คือภาษาตัวมันเองใหญ่เกินไปและไวยากรณ์ซับซ้อน เหมือน PL/I, PHP, Perl ในบทความมองว่านี่เป็นข้อดี แต่ส่วนตัวคิดว่าส่วนขยายมาตรฐานที่แยกเป็น Annex นั้นยอดเยี่ยมกว่า ถ้าทำให้แกนหลักของภาษามีขนาดเล็กลงแล้วเน้น Annex เป็นศูนย์กลาง ก็น่าจะถูกใช้อย่างแพร่หลายกว่านี้

    • ในภาษา ML ผู้ใช้ไม่สามารถนิยาม ชนิด Integer/Floating point แบบ bounded ได้เอง หนึ่งในความสามารถแกนหลักของ Ada ก็คือระบบชนิดข้อมูลแบบนี้ พอได้ลองใช้ระบบชนิดของ Ada แล้วจะประหลาดใจว่ามันช่วยยกระดับคุณภาพและความน่าเชื่อถือของโค้ดได้มากแค่ไหน
  • หนึ่งในเหตุผลที่ Ada ไม่ได้รับความนิยมคือ ราคาคอมไพเลอร์ สูงถึงหลายหมื่นดอลลาร์ ในยุคที่ยังไม่มีคอมไพเลอร์ฟรีหรือโอเพนซอร์ส ภาษาอื่น ๆ ใช้ได้ฟรี นั่นเป็นปัจจัยชี้ขาด

    • ที่ Ada ไม่สามารถหลุดพ้นจากความเป็นนิชมาจากหลายปัจจัยซ้อนกัน ทั้งความซับซ้อนของภาษา และเทคโนโลยีคอมไพเลอร์ในยุคนั้นก็ยังทำให้มันรันบนไมโครคอมพิวเตอร์ยุค 1980 ได้ไม่ดี Intel เคยสร้าง i432 ที่เอาแนวคิดของ Ada ไปฝังไว้ในฮาร์ดแวร์ แต่ประสิทธิภาพแย่มาก หลังจากนั้นไมโครคอมพิวเตอร์ก็ครองโลก และมรดกของ C กับแอสเซมบลีก็ลากยาวต่อไปอีกกว่า 20 ปี
    • ฉันใช้ Ada อยู่หลายปี แต่การที่เพื่อนร่วมงานไปใช้ภาษาอื่นเป็นงานอดิเรกก็ไม่ได้ช่วยให้ Ada แพร่หลายขึ้น การจัดการสตริงก็อ่อนแอ ความเร็วก็ช้า โดยเฉพาะ การจัดการความพร้อมกัน ที่ไม่ใช้ OS thread ทำให้ใช้งานลำบาก สุดท้ายเลยต้องใช้ส่วนขยาย real-time ของ HPUX แล้วรันเป็นหลายโปรเซส
    • ตั้งแต่กลางยุค 90 ก็มี GNAT แล้ว และในยุคนั้นคอมไพเลอร์เชิงพาณิชย์ก็พบได้ทั่วไป สาเหตุที่ Ada ไปต่อไม่ได้คือภาพจำเรื่อง ‘overhead ที่ไม่จำเป็น’ หรือก็คือมีชื่อเสียงว่าไม่มีเหตุผลให้ใช้ นอกจากงานทหารหรือระบบความปลอดภัยสูง
    • GNU Ada Compiler(GNAT) เปิดตัวครั้งแรกในปี 1995
    • จริง ๆ แล้วในยุค 80 คอมไพเลอร์ของภาษาไหนก็คุณภาพไม่ดีนัก GCC เองก็เพิ่งใช้การได้จริงในช่วงปลายยุค ถ้าใช้ภาษาใหม่ก็เป็นเรื่องปกติที่คอมไพเลอร์จะยังไม่สุกงอม C++ ในตอนนั้นก็ยังตามหลัง Ada อยู่มาก และ ‘ฟีเจอร์สังหาร’ ของ C++ แทบจะเป็นแค่ มันใช้แบบ C ได้ เท่านั้นเอง ถ้า Ada มีโหมด Pascal-compatible ประวัติศาสตร์อาจเปลี่ยนไปก็ได้
  • ตอนอ่านบทความ ฉันรู้สึกว่าทั้ง Ada และตัวบทความเองน่าสนใจมาก แต่ก็เห็น ข้อผิดพลาดด้านข้อเท็จจริง บางจุด เช่น บทความบอกว่ามีแค่ Ada ที่แยก implementation กับ specification ได้อย่างสมบูรณ์ ทั้งที่ JavaScript ก็สามารถนิยามองค์ประกอบ private ใน ES6 module ได้ คำอธิบายเรื่อง visibility ของ private ใน Java ก็ผิดเช่นกัน ความผิดพลาดพวกนี้ทำให้ความน่าเชื่อถือของบทความลดลง

    • ใน Ada ถ้านิยามชนิด private ไว้ ภายนอกจะไม่สามารถเข้าถึงฟิลด์ภายในได้ แต่ใน JavaScript วัตถุใด ๆ ก็ยังเพิ่มหรือลบพร็อพเพอร์ตีได้อย่างอิสระ ดังนั้นระดับ การป้องกันตอนคอมไพล์ ของ Ada จึงเทียบกับ JS ไม่ได้เลย
    • ใน Java สามารถเข้าถึงสมาชิก private ได้ผ่าน reflection และใช้ setAccessible(true) เพื่อแก้ไขภายในของ String ได้ด้วย
    • ฉันชอบประโยคที่บอกว่าเวลา LLM เขียนให้มนุษย์อ่าน มันทำงานคล้าย Gell-Mann amnesia
  • โดยรวมบทความดี แต่ประโยคแนว “ภาษา X เพิ่งมีฟีเจอร์นี้ช้ากว่า Ada” ที่วนซ้ำไปมาเริ่มน่าเบื่อ ถ้ามี ตัวอย่างโค้ด น่าจะโน้มน้าวได้ดีกว่านี้มาก

    • จริง ๆ แล้วหลายฟีเจอร์ของ Ada ก็ ยืม มาจากภาษาเดิม ๆ (PASCAL, CLU, MODULA, CSP ฯลฯ) ไม่ใช่แนวคิดใหม่ทั้งหมด แต่เป็นการรวมไอเดียที่ผ่านการพิสูจน์มาแล้ว
    • บางแนวคิดที่อ้างว่า Ada นำมาก่อน แท้จริงแล้วในภาษาอื่นอาจถูกทำออกมาต่างกันมาก จึงยิ่งจำเป็นต้องมีตัวอย่างเปรียบเทียบ
    • บทความนี้ไม่ได้จะบอกว่า “Ada ดีที่สุด” แต่กำลังแสดงให้เห็นว่า Ada ออกแบบอย่างไรเพื่อความปลอดภัยและความน่าเชื่อถือ การเทียบปีจึงมีความหมายในบริบทนั้น
    • ฉันลองให้ Claude เขียนเดโมโค้ด Ada ให้ดูแล้ว มันออกมาค่อนข้างดี ฉันรู้จัก Ada มานานแต่พอลองเขียนเองกลับรู้สึก FOMO ขึ้นมา
    • ถ้ามองจากมุมของนักพัฒนา Ada รูปแบบการเปรียบเทียบแบบนี้อาจชวนให้เหนื่อยล้า เพราะถูกทำซ้ำมานานหลายสิบปีแล้ว
  • บัญชี Twitter นี้ ถูกสร้างในเดือนเมษายน 2026 และไม่ได้ระบุผู้เขียนไว้ มันสร้างผลงานได้มหาศาลในช่วงเวลาสั้น ๆ เลยทำให้การไม่เปิดเผยชื่อยิ่งน่าสนใจ

    • ก็มีความเห็นว่าเหตุผลที่ไม่มีชื่อผู้เขียนเพราะมันเป็น บอต
  • คำกล่าวที่ว่า “ทุกภาษาเพิ่งเพิ่ม sum type เข้ามาในช่วง 20 ปีที่ผ่านมา แต่ Ada มีมาตั้งแต่แรก” นั้นจริง แต่ต้นกำเนิดไม่ได้มาจาก Ada เพราะ ภาษา Hope หรือ NPL มีมาก่อน

    • จริง ๆ แล้ว ต้นกำเนิดของ sum type อยู่ในงานเขียนปี 1964 ของ John McCarthy เรื่อง “Definition of new data types in ALGOL X” เขาเสนอคีย์เวิร์ด UNION และต่อมาแนวคิดนี้ก็พัฒนาต่อใน ALGOL 68, Hope, Miranda ฯลฯ ส่วน union ของ C ไม่ใช่แนวคิดเดียวกัน
  • ฉันชอบบทความนี้มากจนหวังว่ามันจะไม่ได้เขียนโดย AI แต่ความเร็วในการโพสต์บน Twitter มันเร็วผิดปกติจนอดสงสัยไม่ได้

    • ตัวบทความมีความ เยิ่นเย้อและซ้ำไปซ้ำมา อยู่บ้าง เลยให้ความรู้สึกเหมือน AI
    • เดี๋ยวนี้มีเครื่องมือ AI เยอะมากที่เอาบทความบล็อกมา เขียนใหม่ อัตโนมัติ เลยยิ่งทำให้น่าสงสัย
    • ฉันก็อ่านอย่างเพลิดเพลินนะ แต่พอเห็น em dash 110 ตัวถึงได้เริ่มคิดว่า “หรือจะเป็น AI?” มันน่าเศร้าที่ทุกวันนี้แม้แต่บทความบล็อกเรายังต้องอ่านด้วย media literacy
    • ฉันเองเขียนบทความมา 50 ชิ้นในช่วง 3 ปี แต่ส่วนใหญ่ก็ยังไม่ได้เผยแพร่ บางทีผู้เขียนคนนี้อาจอยู่ในสถานการณ์คล้ายกันและเพิ่งรวบรวมความกล้าได้เมื่อไม่นานมานี้ก็ได้ ฉันเข้าใจดีว่าการถูกเข้าใจผิดว่าเป็น AI มัน น่าท้อแท้ แค่ไหน
    • ถ้า AI สามารถเขียนบทความได้ถึงระดับนี้จริง ก็ มีคุณค่ามากพอที่จะยอมเสียเวลาอ่าน
  • เดิมที USAF ตั้งใจจะใช้ Ada แต่เพราะการพัฒนาล่าช้าจึงไปใช้ JOVIAL แทน ฉันทำโปรเจกต์แรกด้วย JOVIAL ในปี 1981 และตอนนั้น Ada ยังอยู่ในขั้นข้อกำหนดเท่านั้น

    • JOVIAL เป็นภาษาที่แตกแขนงมาจาก IAL ซึ่งเป็นบรรพบุรุษของ ALGOL 60 และมีอิทธิพลต่อข้อกำหนดช่วงแรกของ Ada (STRAWMAN~STEELMAN) ต่อมา Ada ก็พัฒนาฟีเจอร์ของ JOVIAL ให้ดีขึ้น และนำเสนอแนวคิดใหม่อย่าง การระบุพารามิเตอร์ in/out ทำให้ไม่จำเป็นต้องมี copy constructor หรือ move semantics ที่ซับซ้อนแบบ C++
  • ที่หน้าแรกของเว็บมีข้อความว่า “นี่ไม่ใช่จุดยืน แต่เป็นข้อเสนอ” แล้วมีคนเอาไปใช้เป็นหลักฐานว่าเป็น เว็บไซต์ที่ AI เขียน

    • แต่ประโยคนั้นไม่ได้เป็นหลักฐานว่า AI เป็นคนเขียน
  • ในบทความบอกว่า “ระบบโมดูลของ JavaScript ซ่อนการแทนค่าภายในของชนิดข้อมูลแบบ Ada ไม่ได้” แต่จริง ๆ แล้วใน JS ถ้าไม่ export ก็ซ่อนได้เพียงพอ เลยทำให้สงสัยว่า Ada มีอะไรดีกว่าเป็นพิเศษหรือไม่

    • ถ้ามองตาม TypeScript วัตถุ JS ก็ยังถูกเพิ่มหรือแก้ไขพร็อพเพอร์ตีจากภายนอกได้อยู่ดี แต่ใน Ada นั้น อินสแตนซ์ของ private type จะถูกจัดการได้นอกเหนือจาก API ที่นิยามไว้ไม่ได้
    • ดูตัวอย่างแบบเจาะจงได้ในคอมเมนต์นี้