ความแตกต่างระหว่าง API และภาษาเฉพาะโดเมนแบบฝัง (DSL) คืออะไร
มันเป็นเพียงไวยากรณ์
พิจารณา API เช่น OpenGL มันแตกต่างจาก DSL กราฟิกอย่างไร
กล่าวอีกนัยหนึ่งถ้า API มีความซับซ้อนเพียงพอจะถือว่าเป็น DSL แบบฝังได้หรือไม่
ความแตกต่างระหว่าง API และภาษาเฉพาะโดเมนแบบฝัง (DSL) คืออะไร
มันเป็นเพียงไวยากรณ์
พิจารณา API เช่น OpenGL มันแตกต่างจาก DSL กราฟิกอย่างไร
กล่าวอีกนัยหนึ่งถ้า API มีความซับซ้อนเพียงพอจะถือว่าเป็น DSL แบบฝังได้หรือไม่
คำตอบ:
ความแตกต่างนั้นยากที่จะทำและขึ้นอยู่กับภาษาที่ใช้ มันเป็นเรื่องส่วนตัวเช่นกัน
ใน Clojure คุณสามารถกำหนด API ที่ดูเหมือน DSL สำหรับตัวอย่าง hiccup ให้คุณสร้าง html:
(html [:span {:class "foo"} "bar"])
สิ่งนี้ถือได้ว่าเป็น DSL ที่มีไวยากรณ์เสียงกระเพื่อม ความจริงที่ว่าhtml
อาจเป็นมาโครให้พลังงานเท่ากันเสมือนกับว่าคุณกำลังเขียน lib hpl templating lib ด้วย s-expressions (ดูsxml )
ใน python API เดียวกันอาจมีลักษณะดังนี้:
html(["span", {"class" : "foo"}, "bar"])
html เป็นฟังก์ชั่น อาร์กิวเมนต์จะถูกประเมินก่อนจากนั้นจะเรียกใช้ฟังก์ชัน ความจริงที่ว่าไวยากรณ์ของงูหลามนั้นมีความเฉพาะเจาะจงมากขึ้นและความหมายของงูหลามนั้นเข้มงวดกว่าหมายความว่านิพจน์นี้ยากต่อการตีความว่าเป็น DSL ที่ไม่ขึ้นกับภาษา
การแสดงภาษาคลาสสิกเป็นต้นไม้เช่นโครงสร้างข้อมูลและฟังก์ชั่น eval ที่เรียกซ้ำในโหนด ภาษา LISP ทำให้โครงสร้างต้นไม้นี้ชัดเจนมากดังนั้นการเรียกใช้ฟังก์ชันที่ซ้อนกันใด ๆ จึงแยกไม่ออกจากคุณลักษณะภาษาในตัว นั่นคือเหตุผลที่ชุมชน LISP พูดถึง DSL เกือบทุกอย่าง
ฉันเชื่อว่าการเขียนโปรแกรมเป็นเรื่องเกี่ยวกับการให้ abstractions ที่มีประโยชน์ ฉันพบว่าการดูทุกสิ่งที่คุณสร้าง (lib หรือแม้กระทั่ง UI ของแอปพลิเคชันของคุณ) เนื่องจากองค์ประกอบด้านภาษาช่วยให้ผู้คนในการแก้ปัญหาที่ซับซ้อนเป็นวิธีที่มีประสิทธิภาพในการออกแบบสิ่งต่างๆ ด้วยมุมมองนี้ฉันขอยืนยันว่าห้องสมุดทุกแห่งเป็น DSL แต่บางคนก็ออกแบบมาไม่ดี :-)
API และ DSL เป็นแนวคิดที่แตกต่างกันมากและมีเพียงบางพื้นที่ที่อาจกล่าวได้ว่าทับซ้อนกัน
DSLs ทั้งหมดอยู่ในคอมพิวเตอร์ภาษา พวกเขาอาจจะถูกตีความรวบรวมเครื่องหมายขึ้นภาษาสอบถาม (เช่น SQL) หรือ (เช่น JSON หรือใช้บางส่วนของ XML) ภาษาข้อมูลซึ่งอาจนำมาใช้ในการส่งข้อความผ่านทาง API แต่พวกเขาจะต้องเป็นภาษา คำนี้อธิบายถึงธรรมชาติไม่ใช่วัตถุประสงค์
API เป็นอินเทอร์เฟซที่อนุญาตให้ส่วนประกอบซอฟต์แวร์หนึ่งชิ้นสามารถใช้โดยส่วนประกอบอื่น ๆ คำนี้อธิบายถึงวัตถุประสงค์ไม่ใช่ธรรมชาติ API สามารถเป็นชุดของวัตถุวิธีเช่น - นั่นไม่ใช่ DSL เว็บ API อาจใช้ DSL (หรือถ้ามันเงียบคุณอาจอ้างว่าเป็น DSL) แต่ภาษาเฉพาะโดเมนที่แชร์นั้นไม่ได้เป็นส่วนหนึ่งของคำนิยาม ซอฟต์แวร์ไดรเวอร์สำหรับอุปกรณ์อาจเขียนใน C, API กระจายเป็นไลบรารีที่รวบรวมโพรโทคอลทั้งหมดไบนารีและภาษาใด ๆ ที่สามารถใช้ไลบรารีอาจถูกใช้เพื่อสร้างไคลเอนต์ ไม่มีสิ่งใดใน API ที่สามารถเรียกว่า DSL (รายการชื่อสัญลักษณ์สำหรับฟังก์ชั่น API ไม่ได้ตัดออก)
ฉันสับสนเล็กน้อยว่าทำไมคุณสามารถเห็นความคล้ายคลึงกันได้โดยให้คำจำกัดความ
โดยทั่วไปไม่มี DSL นั้นทำขึ้นโดยไม่เจตนาเพื่อวัตถุประสงค์ในการทำให้การดำเนินการบางอย่างสะดวกยิ่งขึ้น สิ่งต่าง ๆ เช่น HTML หรือโลโก้เดิมเป็นภาษาเฉพาะโดเมน
โดยทั่วไปแล้วคุณไม่สามารถฝัง DSL เป็นภาษาอื่นได้แม้ว่าจะเป็น API ที่ทรงพลังที่สุดก็ตาม สิ่งที่คุณตั้งโปรแกรมให้กับ API นั้นจะยังคงดูเหมือนชุดของการแสดงออกในภาษาโฮสต์และไม่สะดวกเท่ากับการใช้ภาษาวัตถุประสงค์พิเศษ
ข้อยกเว้นเป็นภาษาที่ให้โอกาสพิเศษในการแปรปรวนไวยากรณ์ผ่านทางไลบรารี (ตัวดำเนินการโอเวอร์โหลดเช่น C ++ การประดิษฐ์ตัวดำเนินการใหม่เช่น Scala หรือแม้แต่การประกาศไวยากรณ์การอ่านที่แตกต่างอย่างสิ้นเชิงเช่น Perl กับตัวกรองแหล่งที่มา) เมื่อคุณใช้ภาษาดังกล่าวและใช้ประโยชน์อย่างเต็มที่จากความยืดหยุ่นที่มีให้ผลลัพธ์ก็จะดูเหมือนเป็นภาษาใหม่ที่มีวัตถุประสงค์พิเศษ (แต่ความหมายมักจะแตกต่างจากที่คุณคาดหวังอย่างมากหากภาษานั้นถูกประดิษฐ์ขึ้นจริง ๆจากพื้นดินขึ้นไปเพื่อให้บริการปลายของคุณ)
ที่นี่จากDslBoundaryโดย Martin Fowler
จากบทความความเข้าใจของฉันคือ DSL และ API ที่ฝังอยู่นั้นไม่แตกต่างกันนัก แต่อย่างไรก็ตามมีความแตกต่างเล็กน้อยที่นี่
แต่ถ้าพูดถึงDSL ภายนอกมันจะเป็นอีกเรื่องหนึ่ง DSL ภายนอกนั้นเหมือนกับภาษาการเขียนโปรแกรมขนาดเล็ก แต่แน่นอนว่ามันไม่ใช่ภาษาที่ใช้งานทั่วไปซึ่งหมายความว่ามันไม่สามารถแก้ปัญหาทั้งหมด แต่เป็นปัญหาที่เฉพาะเจาะจงแทน
ฉันคิดว่า API ทุกตัวเป็น DSL ที่ฝังตัว แต่การสนทนาไม่เป็นความจริง: ไม่ใช่ทุก ๆ DSL ที่ฝังตัวเป็น API เมื่อใช้ภาษาเป็นเครื่องมือในการรวมส่วนประกอบแล้วจะสามารถเรียกว่า API ได้
ทำไม API จึงถูกพิจารณาว่าเป็น DSL ในตัว? ก่อนอื่นมันเป็นภาษา: มันมีองค์ประกอบดั้งเดิม (ประเภทและการดำเนินงาน) ซึ่งสามารถรวมกัน (โดยวิธีการของภาษาโฮสต์) เพื่อสร้าง abstractions และแก้ปัญหาที่ซับซ้อน ตัวอย่างเช่น OpenGL API สามารถใช้เพื่อแสดงฉาก 3 มิติแบบเรียลไทม์ Collections API สามารถใช้ในการสร้างอัลกอริทึมที่ทำงานกับชุดของวัตถุและอื่น ๆ ประการที่สองเป็นโดเมนที่ชัดเจนโดยเฉพาะ ตัวอย่างเช่นโดเมนของ Collections API คือการจัดการชุดของวัตถุและโดเมนของ OpenGL API เป็นการแสดงผล 3 มิติ ดังนั้น API จึงเป็นภาษาเฉพาะโดเมน
แต่ไม่ใช่ทุก DSL ที่เป็น API ตัวอย่างเช่น DSL บางตัวไม่สามารถใช้งานได้โดยองค์ประกอบที่กำหนด ระบบทั้งหมดกำหนด abstractions บางส่วนและ abstractions ที่จัดการกับโดเมนเฉพาะบางรายการอาจถือได้ว่าเป็น DSL แต่นั่นไม่ได้หมายความว่าการนำไปใช้ของ abstractions เหล่านี้ควรเป็น "swappable" กล่าวอีกนัยหนึ่งพวกเขาไม่จำเป็นต้องสร้าง API . พวกเขาทำได้ แต่ไม่จำเป็นเสมอไป อย่างไรก็ตามในกรณีที่การใช้งานเป็น "องค์ประกอบ" (ขออภัยเนื่องจากขาดคำที่ดีกว่า), DSL จะกลายเป็น API อย่างแท้จริง