İki farklı dilde iki farklı program nasıl etkileşime girebilir?


26

Bu çok geniş mi değil mi bilmiyorum, ama ben hala üniversitede genç bir programcıyım, bu benim küçük yılım. Farklı diller için iyi bir tutuşa sahip olduğumu ve çok iyi bir temele sahip olduğumu hissediyorum. Ancak, örneğin, eğer bir program oluşturmaya çalışıp python'da bir kısmını sadece kolay olduğu için yazıp yazdığımı söylemeye çalışıyorum ama bu işin yazdığım başka bir programdan çıktı alması gerektiğini düşünüyorum. C ve hızları nedeniyle C kullanıyorum. Toplamda toplam bir program oluşturmak için iki farklı programın ve dilin birbiriyle nasıl etkileşime gireceğinden emin değilim. Bir dosyaya yazabildiğinizden emin olmayı düşünüyorum, ama peki eğer python ve C programları bir dosyaya erişiyorsa, kilitleri düşünmem gerekir.

Bunu çoğu kez yaptım, dosyaları bir programa aktarmakla, ancak bu durumda aynı dilde oldukları için kolaydı, sadece alma işlevini kullandım, ancak bir tutarlı çıktı oluşturmak için etkileşime giren iki dil / programla sorun yaşıyorum .

Bu soruyu düşünüyordum, çünkü sadece öğrenmek için bazı temel web uygulamalarını yaratmaya dalmayı düşünüyordum ama javascript dosyasını python veya tersi yazdığım bir şeyle nasıl etkileşimli olarak söyleyeceğimi bilemedim.

Burada gerçekten kolay bir şeyi kaçırdığımı ve anlamadığımı hissediyorum. Üzgünüm, eğer bu soru çok geniş ama çevrimiçi olarak net bir cevap bulamadım, açık kaynak kodlu bir webapp üzerinden bakmaya çalışıyordum, ancak gerçekten bir cevap alamadım, sanırım soru aptal görünüyorsa yine afedersiniz Bu, stackexchange'te okumayı sevdiğimi sormak için iyi bir yer olabilir.

Herhangi bir cevap için teşekkür ederim.


Swig olduğunu biliyorum , istediğin şeyi yapıyor gibi görünüyor, ama ben kullanmadım. Öyleyse dene ve gör :).
user712092

1
Lütfen sorunuzun tamamen ilgisiz iki konu içerdiğini unutmayın, biri genel olarak aynı ana bilgisayardaki 2 işlem / uygulama arasında iletişim kuruyor, diğeri ise normal web sunucusu / istemci mimarisi, istemcide JS ve sunucudaki python kullanıyor.
João Pinto

LAMP konseptini gözden geçirdiniz mi? Veritabanları aracılığıyla birçok iletişim kurabilirsiniz.
SDsolar

Yanıtlar:


28

Farklı dillerde yazılmış kodlar çeşitli şekillerde etkileşime girebilir.

Kaynak düzeyinde, bazı dil kombinasyonları için bir dilden diğerine çapraz derleme yapılabilir (örneğin, Google’ın GWT’si bir java-javascript derleyicisi içerir; Glasgow Haskell derleyicisi C’yi derleyebilir; C ++ 'nın ilk sürümleri C'ye derlenmiştir). Ancak çoğu zaman bu gerçekten mümkün değildir.

JVM veya .NET çalışma zamanı gibi sanal bir platformu paylaşan diller genellikle platformun maruz kaldığı mekanizmalar aracılığıyla etkileşime girebilir - örneğin tüm JVM dilleri Java kitaplıklarına erişebilir ve bunları birbirleri arasında iletişim kurmak için kullanabilir ve yöntemleri arayabilir ve başka herhangi bir JVM dilinde yaratılmış sınıfları kullanın.

Python dahil olmak üzere birçok programlama dili, tipik olarak C ile yazılmış yerel kütüphanelerle arayüz oluşturma mekanizması sunar. Böyle bir mekanizmayı kullanarak, yerel fonksiyonları başka, daha yüksek bir dilden çağırmak mümkündür. Popüler kütüphaneler çoğu zaman kolayca bağlantılara sahiptir. Bu teknik genellikle "Yabancı İşlev Arabirimi" olarak adlandırılır . Python-to-C arayüzü CFFI'dir .

Diğer bir seçenek ise iki tamamen ayrı program oluşturmak ve çalışma zamanında etkileşime girmelerini sağlamak. Bunu başarmak için çeşitli mekanizmalar vardır; en kolay olanı bir borudan geçer ( subprocesspython için modüle bakın): temel olarak bir program diğerini çağırır, std'üne girdi gönderir ve sonucu stdout'undan geri okur. Bu, bir programı diğerinin alt işlemi yapar; Her ikisinin de uzun ömürlü olması ve bağımsız olarak başlatılması gerekirse, veriler adlandırılmış yönelticiler, (yerel) ağ soketleri, paylaşılan dosyalar ve (platforma bağlı olarak) diğer yollarla ileri ve geri aktarılabilir. Hangisi en iyisidir.


Mükemmel cevap. Diğer bir olasılık, tercümanın birincil programa gömülmesidir, oyun geliştirme için genellikle C ++ ile Lua arasında yapılır. Ya da Greenspun'un onuncu kuralına bakınız: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew

11

İki programın birbiriyle iletişim kurmasının birkaç iyi bilinen yolu vardır. Zaten bir tanesini daha önceden dosya paylaşarak ve bir tanesinde bununla ilgili zorluklarla karşılaştınız. Fakat başka yollar da var.

Çoğu modern işletim sistemi , temel olarak bir programda giriş ucu ve farklı bir programda çıkışı sona eren veri akışı olan, adlandırılmış yöneltilmiş bir mekanizma içerir . Verileri bir bilgisayardan aynı bilgisayarda çalışan başka bir programa göndermeniz gerekiyorsa, bu kullanmak için iyi bir yöntem olabilir.

Bir programı diğer programı çağırmak için kullanmak üzere bir API ayarlamanız gerekiyorsa, genellikle işletim sistemi düzeyinde desteklenen RPC'ye (uzaktan yordam çağrıları) bakmak isteyebilirsiniz.

İki farklı bilgisayardaki iki program arasında iletişim kurmak istiyorsanız, işler daha karmaşık hale gelir. O zaman ağ iletişimi ve protokollerle çalışmanız gerekir. Bir soket açıp gelen mesajları dinleyebilmeniz, bir dahili yöntem çağrısına kod çözebilmeniz, işleyebilmeniz ve yanıt verebilmeniz için programlardan birine ihtiyacınız vardır. Bu işlevselliği sağlamak için C ve Python dahil olmak üzere farklı dillerde birçok kütüphane bulunmaktadır.

Temel olarak, kullanmanız gereken hangi yöntem, yapmaya çalıştığınız şeyin özelliklerine bağlıdır. Çeşitli süreçler arası iletişim ve ağ mesajlaşma biçimleri hakkında biraz araştırma yapın ve gereksinimlerinize en uygun olanı bulmanız gerekir.


2

Mesaj iletimi genel kavram olarak gözüküyor, çünkü farklı dillerin birbirleriyle etkileşime girebileceği çeşitli örnekler var; örneğin, aynı uygulamada kullanılan 3 farklı dilin bir karışımını elde etmek için klasik ASP, COM bileşenleri ve bazı JavaScript kullanabiliyor.

Belirttiğiniz örnekte, kilitler İşletim Sisteminin dosya sisteminde işlemesi için bir şey olmaz mı? Her program mutlaka diğerini hatırlamaz.


0

Çoğu yazılım bileşeni talimatlar açısından iletişim kurmamalı, veri gönderip almalıdır: bir veritabanıyla etkileşim kurun, JSON / XML isteklerini gönderin / alın, vb.


0

Sorununuzun türüne bağlı olarak, boruların standart kabuk kullanımı yeterli olabilir (kabuğunuzu yazın):

program1 | program2

Bu şekilde program1'in çıkışı doğrudan program2'nin girişine gider. Elbette bu her problem için işe yaramaz, ancak bu yaklaşım kullanılarak birçok (etkileşimli olmayan) sorun çözülebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.