Làm thế nào để có hai chương trình khác nhau với hai ngôn ngữ khác nhau tương tác?


26

Tôi không biết điều này có quá rộng hay không, nhưng tôi là một lập trình viên trẻ vẫn còn học đại học, đó là năm Junior của tôi. Tôi cảm thấy như tôi có một nắm bắt khá tốt cho các ngôn ngữ khác nhau và có một cơ sở khá tốt. Nhưng tôi đang loay hoay nghĩ làm thế nào nếu ví dụ, tôi đang cố gắng tạo một chương trình và nói rằng tôi đã viết một phần bằng python chỉ vì nó dễ, và thực hiện công việc, nhưng chương trình này sẽ cần lấy đầu ra từ một chương trình khác mà tôi đã viết trong C và tôi đang sử dụng C vì tốc độ của nó. Tôi không chắc làm thế nào để hai chương trình và ngôn ngữ khác nhau tương tác với nhau để tạo ra một tổng thể một chương trình. Tôi nghĩ rằng chắc chắn bạn có thể ghi vào một tệp, nhưng nếu các chương trình python và C đều truy cập vào một tệp thì tôi sẽ cần phải nghĩ đến các khóa.

Hầu hết tôi đã làm điều này là với việc nhập tệp vào một chương trình, nhưng trong trường hợp đó chúng có cùng ngôn ngữ nên tôi chỉ dễ sử dụng chức năng nhập, nhưng với hai ngôn ngữ / chương trình tương tác để tạo một đầu ra gắn kết, tôi gặp sự cố .

Tôi đã suy nghĩ về câu hỏi này bởi vì tôi đã nghĩ đến việc tạo ra một số ứng dụng web cơ bản chỉ để tìm hiểu nhưng tôi không biết làm thế nào để nói tệp javascript tương tác với thứ gì đó mà tôi đã viết bằng python hoặc ngược lại.

Tôi cảm thấy như tôi đang thiếu một cái gì đó thực sự dễ dàng ở đây và chỉ không hiểu. Xin lỗi nếu câu hỏi này quá rộng nhưng tôi thực sự không thể tìm thấy câu trả lời rõ ràng trên mạng, tôi đã cố gắng xem qua một ứng dụng web nguồn mở, nhưng tôi không thể thực sự nắm bắt được câu trả lời từ nó, một lần nữa xin lỗi nếu câu hỏi có vẻ ngu ngốc tôi nghĩ đây là một nơi tốt để hỏi tôi thích đọc trên stackexchange.

Cảm ơn bạn đã trả lời.


Tôi biết có Swig , nó dường như làm điều bạn muốn, nhưng tôi chưa sử dụng nó. Vì vậy, bạn hãy thử nó và xem :).
dùng712092

1
Xin lưu ý câu hỏi của bạn chứa hai đối tượng hoàn toàn không liên quan, một là giao tiếp chung giữa 2 quy trình / ứng dụng tại cùng một máy chủ, một là kiến ​​trúc máy chủ / máy khách web thông thường, sử dụng JS trên máy khách và python trên máy chủ.
João Pinto

Bạn đã xem lại khái niệm LAMP chưa? Bạn có thể làm rất nhiều giao tiếp thông qua cơ sở dữ liệu.
SDsolar

Câu trả lời:


28

Mã được viết bằng các ngôn ngữ khác nhau có thể tương tác theo một số cách.

Ở cấp độ nguồn, việc biên dịch chéo từ ngôn ngữ này sang ngôn ngữ khác có thể được thực hiện đối với một số kết hợp ngôn ngữ (ví dụ: Google GWT bao gồm trình biên dịch java-to-javascript; trình biên dịch Haskell của Glasgow có thể biên dịch sang C; phiên bản đầu của C ++ biên dịch thành C). Hầu hết thời gian, tuy nhiên điều này không thực sự khả thi.

Các ngôn ngữ chia sẻ một nền tảng ảo, chẳng hạn như JVM hoặc .NET runtime, thường có thể tương tác thông qua các cơ chế được nền tảng tiếp xúc - ví dụ: tất cả các ngôn ngữ JVM có thể truy cập các thư viện Java và sử dụng chúng để giao tiếp với nhau và chúng có thể gọi các phương thức và sử dụng các lớp được tạo bằng bất kỳ ngôn ngữ JVM nào khác.

Nhiều ngôn ngữ lập trình, bao gồm Python, cung cấp một cơ chế để giao tiếp với các thư viện nguyên gốc, thường được viết bằng C. Sử dụng cơ chế như vậy, có thể gọi các hàm riêng từ ngôn ngữ khác, cấp cao hơn. Thư viện phổ biến thường có sẵn các ràng buộc. Kỹ thuật này thường được gọi là "Giao diện chức năng nước ngoài" . Giao diện Python-to-C là CFFI .

Một lựa chọn khác là xây dựng hai chương trình hoàn toàn riêng biệt và để chúng tương tác khi chạy. Có nhiều cơ chế khác nhau để đạt được điều này; cách dễ nhất là thông qua một đường ống (nhìn vào subprocessmô-đun cho python): về cơ bản, một chương trình gọi chương trình kia, gửi đầu vào đến stdin của nó và đọc lại kết quả từ thiết bị xuất chuẩn của nó. Điều này làm cho một chương trình trở thành một quy trình con của chương trình kia; nếu bạn cần cả hai tồn tại lâu dài và bắt đầu độc lập, dữ liệu có thể được truyền qua lại thông qua các đường ống được đặt tên, ổ cắm mạng (cục bộ), tệp chia sẻ và (tùy thuộc vào nền tảng) các phương tiện khác. Cái nào là tốt nhất


Câu trả lời chính xác. Một khả năng khác là một trình thông dịch sẽ được nhúng trong chương trình chính, thường được thực hiện giữa C ++ và Lua để phát triển trò chơi. Hoặc, xem quy tắc thứ mười của Greensasta: en.wikipedia.org/wiki/G Greensasta% 27s_tenth_rule
Andrew

11

Có một số cách được thiết lập tốt khác nhau để hai chương trình giao tiếp với nhau. Bạn đã xác định được một điều hiển nhiên, bằng cách chia sẻ tệp và một khó khăn rõ ràng với nó. Nhưng có những cách khác.

Hầu hết các hệ điều hành hiện đại đều chứa một cơ chế gọi là ống có tên , về cơ bản là luồng dữ liệu với đầu vào của nó trong một chương trình và đầu ra của nó trong một chương trình khác. Nếu bạn cần gửi dữ liệu từ một chương trình này sang một chương trình khác đang chạy trên cùng một máy tính, đó có thể là một phương pháp tốt để sử dụng.

Nếu bạn cần thiết lập API cho một chương trình để sử dụng để gọi chương trình kia, bạn có thể muốn xem xét RPC, (các cuộc gọi thủ tục từ xa), thường được hỗ trợ ở cấp độ HĐH.

Nếu bạn muốn giao tiếp giữa hai chương trình trên hai máy tính khác nhau, mọi thứ trở nên phức tạp hơn. Sau đó, bạn cần phải làm việc với mạng và giao thức. Bạn cần một trong các chương trình để có thể mở một ổ cắm và lắng nghe các tin nhắn đến, giải mã chúng thành một cuộc gọi phương thức nội bộ, xử lý chúng và trả lời phản hồi. Có rất nhiều thư viện có sẵn để cung cấp chức năng này bằng nhiều ngôn ngữ khác nhau, bao gồm cả C và Python.

Về cơ bản, phương pháp nào bạn nên sử dụng phụ thuộc vào chi tiết cụ thể về những gì bạn đang cố gắng thực hiện. Thực hiện một số nghiên cứu về các hình thức khác nhau của giao tiếp liên lạc và nhắn tin mạng, và bạn sẽ có thể tìm ra những gì phù hợp nhất với nhu cầu của bạn.


2

Truyền tin nhắn dường như là khái niệm chung ở đây vì có nhiều ví dụ khác nhau trong đó người ta có thể có các ngôn ngữ khác nhau tương tác, ví dụ người ta có thể sử dụng ASP cổ điển với các thành phần COM và một số JavaScript để kết hợp 3 ngôn ngữ khác nhau được sử dụng trong cùng một ứng dụng.

Trong ví dụ bạn nêu, các khóa có phải là thứ để Hệ điều hành xử lý trên hệ thống tệp không? Mỗi chương trình không biết về điều khác nhất thiết phải nhớ.


0

Hầu hết các thành phần phần mềm không nên giao tiếp theo hướng dẫn nhưng gửi và nhận dữ liệu: tương tác với cơ sở dữ liệu, gửi / nhận yêu cầu JSON / XML, v.v.


0

Tùy thuộc vào loại vấn đề của bạn, việc sử dụng ống tiêu chuẩn có thể là đủ (nhập vào vỏ của bạn):

chương trình1 | chương trình2

Theo cách này, đầu ra của chương trình1 đi trực tiếp vào đầu vào của chương trình2. Tất nhiên điều này không hiệu quả đối với mọi vấn đề, nhưng rất nhiều vấn đề (không tương tác) có thể được giải quyết tốt bằng cách sử dụng phương pháp này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.