วิธีให้โปรแกรมที่แตกต่างกันสองภาษาที่มีสองภาษาต่างกันโต้ตอบกันอย่างไร


26

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

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

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

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

ขอบคุณสำหรับการตอบกลับใด ๆ


ฉันรู้ว่ามีSwigดูเหมือนว่าจะทำสิ่งที่คุณต้องการ แต่ฉันไม่ได้ใช้มัน ดังนั้นคุณลองแล้วดู :)
user712092

1
โปรดทราบว่าคำถามของคุณมีสองวิชาที่ไม่เกี่ยวข้องกันอย่างสิ้นเชิงหนึ่งเรื่องเป็นการสื่อสารทั่วไประหว่าง 2 กระบวนการ / แอปพลิเคชันที่โฮสต์เดียวกันอีกรายการหนึ่งคือสถาปัตยกรรมเว็บเซิร์ฟเวอร์ / ไคลเอนต์ปกติโดยใช้ JS บนไคลเอนต์และหลามบนเซิร์ฟเวอร์
João Pinto

คุณได้ทบทวนแนวคิดของหลอดไฟแล้วหรือยัง? คุณสามารถสื่อสารผ่านฐานข้อมูลได้มากมาย
SDsolar

คำตอบ:


28

รหัสที่เขียนในภาษาต่าง ๆ สามารถโต้ตอบได้หลายวิธี

ในระดับต้นทางการคอมไพล์ข้ามจากภาษาหนึ่งเป็นอีกภาษาหนึ่งสามารถทำได้สำหรับบางภาษา (ตัวอย่างเช่น GWT ของ Google มีคอมไพเลอร์ java-to-javascript คอมไพเลอร์ Glasgow Haskell สามารถคอมไพล์เป็น C; C ++ เวอร์ชันแรก เรียบเรียงเป็น C) ส่วนใหญ่เวลานี้เป็นไปไม่ได้จริง ๆ

ภาษาที่ใช้แพลตฟอร์มเสมือนเช่น JVM หรือ. NET runtime สามารถโต้ตอบผ่านกลไกที่เปิดเผยโดยแพลตฟอร์มตัวอย่างเช่นภาษา JVM ทั้งหมดสามารถเข้าถึงไลบรารี Java และใช้พวกเขาในการสื่อสารระหว่างกันและพวกเขาสามารถเรียกวิธีการ และใช้คลาสที่สร้างขึ้นในภาษา JVM อื่น ๆ

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

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


คำตอบที่ดี ความเป็นไปได้อีกอย่างหนึ่งก็คือล่ามที่จะฝังอยู่ในโปรแกรมหลักโดยทั่วไปจะทำระหว่าง C ++ กับ Lua สำหรับการพัฒนาเกม หรือดูกฎที่สิบของ Greenspun: en.wikipedia.org/wiki/Greenspun% 27s_tenth_rule
Andrew

11

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

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

หากคุณต้องการตั้งค่า API สำหรับหนึ่งโปรแกรมเพื่อใช้เรียกโปรแกรมอื่นคุณอาจต้องการดูใน RPC (การเรียกขั้นตอนระยะไกล) ซึ่งมักจะได้รับการสนับสนุนในระดับระบบปฏิบัติการ

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

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


2

การส่งข้อความดูเหมือนจะเป็นแนวคิดทั่วไปที่นี่เนื่องจากมีตัวอย่างมากมายที่หนึ่งสามารถมีภาษาที่แตกต่างกันเช่นหนึ่งสามารถใช้คลาสสิก ASP กับองค์ประกอบ COM และ JavaScript บางส่วนเพื่อให้ได้ 3 ภาษาที่แตกต่างกันที่ใช้ในแอพลิเคชันเดียวกัน

ในตัวอย่างที่คุณระบุล็อคจะไม่เป็นสิ่งที่ระบบปฏิบัติการจะจัดการกับระบบไฟล์หรือไม่? แต่ละโปรแกรมไม่ทราบเกี่ยวกับการจำอื่น ๆ ที่จำเป็น


0

ส่วนประกอบซอฟต์แวร์ส่วนใหญ่ไม่ควรสื่อสารในแง่ของคำแนะนำ แต่รับส่งข้อมูล: โต้ตอบกับฐานข้อมูลส่ง / รับคำขอ JSON / XML เป็นต้น


0

ขึ้นอยู่กับประเภทของปัญหาการใช้เชลล์มาตรฐานของท่ออาจเพียงพอ (พิมพ์ในเชลล์ของคุณ):

โปรแกรม 1 | program2

ด้วยวิธีนี้ผลลัพธ์ของ program1 ไปที่อินพุตของ program2 โดยตรง แน่นอนว่าวิธีนี้ใช้ไม่ได้กับทุกปัญหา แต่ปัญหา (ไม่โต้ตอบ) จำนวนมากสามารถแก้ไขได้โดยใช้วิธีนี้

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