Programlama dillerini birleştirmek mümkün mü?


27

Bir süredir programlama yapıyorum, bazı temel programlar yazdım ve öğrenmeye devam etmek istiyorum. Bundan sonra ne öğreneceğinizi bilmediğiniz bir noktaya geldim ve kendi merakım için bir soru sormak istiyorum.

Özetle, birden çok programlama dilini 1 sonuçta birleştirebilmeniz mümkün değil mi? Örneğin, bu kod mümkün olabilir mi?

<html>
cout << "Hello world!";
</html>

veya

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

Bu aptalca bir soru gibi geliyor ama mümkün olup olmadığını bilemiyorum, bu yüzden soruyorum. Gelen bu benim Yukarıdaki örnek mümkün değilse sorusuna ben, o html kodu Python kodunu kullanıyor fark, o ne yaptı?


12
Bunun çalışması için (insanları delirttirmeden), nasıl etkileşime girdikleri ve hangi dillerin hangi dilde işlenmesi gerektiği konusunda en azından katı kurallara ihtiyaç vardır.

6
Bir hellova lexer / parser alacaktı.
Chad Harrison,

2
@Brian Lua, yorumlayıcının bazı C veya C ++ kodlarına bağlı olduğu ve dizgelerde veya harici dosyalarda saklanan Lua kodunu çalıştırmak için kullanıldığı ve muhtemelen C / C ++ nesnelerini Lua koduna maruz bıraktığı şekilde gömülüdür. Lua olduğu değil (değil sık, hiç değilse) bu soruya anlamında "embedded".

2
Bu, 26 harf için her biri farklı sembollerle beş alfabe yapmak ve bunları tek bir kitapta karıştırmak gibidir: anlamsız, rahatsız edici ve gereksiz.
ThomasX

7
İnsanların, açıkça performans nedenleriyle, C / C ++ programlarında "dilleri birleştirmek" - ASM fragmanlarını kullandıkları en yaygın (ve sadece düşünebildiğim gerçek hayatı) unutuyorlar .
TC1

Yanıtlar:


43

İlk örnek, mümkün olabilir. Genellikle böyle şeyler PHP'de (ve diğer ilgili web programlama dillerinde) şöyle olur:

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

Bu örnek hakkında not edilmesi gereken bazı önemli noktalar:

  • HTML bir program dili değil, bir işaretleme dilidir.
  • PHP ve HTML ve aynı yerde çalıştırılmadı / yorumlanmadı: PHP kodu, sunucuda çalışan bir PHP yorumlayıcısı tarafından yürütülür ve sonuç, çevresindeki HTML'ye "enjekte edilir". Sonra tüm blob, HTML'nin tamamını işleyen müşteriye / tarayıcıya gönderilir.

İkinci örneğiniz bir çeşit C ++ ve Java karışımı gibi gözüküyor. Farklı dillerde yazılmış derlenmiş modüllerin birbirleriyle konuşmalarını sağlamak mümkündür, ancak Java ve C ++ 'ı aynı kaynak dosyada birleştirmek oldukça kafa karıştırıcı ve zor olurdu: derleyici hangi ifadelerin Java ve hangilerinin C ++ olduğunu nasıl bilebilir?

Sanırım teoride aşağıdaki gibi "dil" göstergeleri olan özel bir derleyici / ön işlemci yazabilirsiniz:

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

Ama dürüstçe, bunu yaparak faydalı bir şey elde edeceğinizden emin değilim.

Ayrıca, bu karma dil ortamı ikisi arasında uyuşmayan dil özelliklerini nasıl ele alır?


Bir örnek herkesi (ben dahil) unuttu, bu nedenle cevap eklemek için çekinmeyin: CUDA. Haberleşme katmanı çıkarılan, bazıları bir cihaz (GPU) için derlenmiş, bazıları da bir ana bilgisayar üzerinde kalan iki farklı C dilinin karışımı.
SK-mantık

7
Bir sayfada JavaScript'in yanı sıra HTML ve PHP'nin olması da nadir değildir. Korkunç, ama nadir değil.
Michael Borgwardt

1
PHP'ye pek aşina olmamakla birlikte, ASP.NET (C # veya VB.NET) kodu HTML ve JavaScript oluşturur - ve JavaScript genellikle .aspx sayfasına katıştırılmıştır. Toplam ayrılık çoğu zaman ideal olarak ifade edilir, ancak SO etiketli ASP.NET hakkındaki sorulara hızlı bir genel bakış size bunun ne kadar karmaşık olabileceği konusunda bir fikir verecektir.
sq33G

@ sq33G - ASP.NET, HTML kodu üretir. İsterseniz javascript ekleyebilirsiniz. ASP.NET kesinlikle yazarın yapmak istediğini açıkladığı şey DEĞİLDİR.
Ramhound,

Başka kimsede yoksa PHP / HTML / JS'yi bir belgede açacaktım.
Ben Brocka,

19

Kısa cevap

Pek sayılmaz.


Uzun cevap

Gömme

Genel olarak, tek bir kaynak dosya, tam olarak bir programlama dili için kod içerir. Birkaç nedenden dolayı tek bir dosyada birden fazla dilde bir araya gelmesi nadir görülen bir durumdur:

  • Birden çok sözdizimsel olarak farklı dilin bir kerede ayrıştırılması son derece zordur (eğer tamamen mümkün değilse).
  • Farklı diller programlamayı farklı şekilde ele alır . Haskell'in bir fonksiyon nosyonu C ++ 'dan farklıdır.

bağlayıcı

Ortak bir uygulama ikili arayüzü paylaşan farklı programlama dilleri, tek bir çalıştırılabilir veya kütüphane oluşturmak için birleştirilebilir. İki dilin imzalarını birbirlerinin içinde kullanmak çoğu zaman biraz iş gerektirir, ancak süreci kolaylaştırmak için araçlar var .

Polyglots

Polyglot kodu birden fazla dilde geçerlidir ve eşdeğeridir. Yığın Taşması'nın 404 sayfası şu programlardan birine sahiptir:

Yığın Taşması 404 polyglot

Bu Python, Perl, Ruby, C, Brainfuck ve Befunge'de "404" yazıyor.

Sonuç

Diller dosyalar içinde nadiren karışır ve olduklarında gülüşler içindir . İnsanlar, tanıttığı ekstra güçlük nedeniyle projelerdeki dilleri karıştırmaktan bile kaçınıyorlar. Dolayısıyla, teknik olarak mümkün olsa da, farklı dilleri karıştırmak ne yaygın ne de pragmatiktir.


Burada Ruby'yi göremiyorum ...
Jason Lewis

@ JasonLewis Ruby'yi tanımıyorum, ancak bu yayın 4 no'lu satırı değerlendirdiğini söylüyor.
Saat

9
Diller her zaman gülmek için karışık değildir. Çoğu C derleyicisi, Assembly ve C'yi karıştırmanıza izin verir ve birçok Forths yapar. Oyunun en iyi BASIC lehçelerinden biri olan 80'lerin Acorn's BBC Basic'i 6502 düzeneğini karıştırmanıza izin verdi ve bu o zaman çok istenen bir özellikti. Kesinlikle BBC kullanıcılarının güldürmesine neden oldu, ama hemen hemen herkes ağladı, özellikle 6502 makine kodunu elle bir araya getirmek ve ham opcod'ları programlarına yapıştırmak zorunda olanlar DATA. Acı olduğumdan falan değil. Noooo.
Alexios

1
@ SK-mantık SQL bir programlama dili değil, Yapısal bir Sorgu Dilidir.
Saat

1
Modern yazılım geliştirme konusundaki üzücü şeylerden biri, çoklu dil uygulamalarının şimdi çok daha zor olmasıdır. DOS günlerinde, hemen hemen her şey aynı nesne dosyasına derlendi ve aynı parametre geçirme kurallarını kullandı. Onları birbirine bağlamak gerçekten kolaydı. Bugünlerde, pek değil ...
Brian Knoblauch

7

Evet, gerçekten mümkün. Elbette hayal ettiğin gibi değil. Bu amaç için özel olarak oluşturulmuş bazı diller var.

Uygulamada, bir çok alana özgü dili tek bir ana bilgisayar dili ile karıştırmak çok yararlı olabilir . İki veya daha fazla eşit derecede "genel amaçlı" dilin tek bir kaynak kod dosyasında bir araya getirilmesine nadiren ihtiyaç duyulur, ancak her ikisi de, örneğin VB.NET ve C # dilinde yazılmış projeleri ayrı ayrı derlenmiş olarak bulabilirsiniz.

HTML gelince, sadece bir biçimlendirme dili. Birçok kişi tarafından kötü bir uygulama olarak kabul edilmesine rağmen, genellikle bir sunucu tarafı kodu (ör. VB.NET'te), HTML işaretlemesi ve istemci tarafı Javascript kodu tek bir kaynak dosyasına karıştırılmış olarak bulabilirsiniz.


7

Bu genellikle polyglot kodu olarak adlandırılır - bağlantıyı takip ederseniz veya web'deki diğer çeşitli yerlerde bazı eğlenceli / delice örnekler vardır. Bunların çoğu sadece eğlence amaçlıdır / mümkün olduğunu ispatlamak içindir.

Daha ciddi olarak, iki veya daha fazla farklı dilin yararlı bir şekilde birleştirilebileceği çeşitli gerçek yaşam örnekleri vardır:

  • Web şablonlaması - PHP veya JSP dosyaları gibi diller, kodu HTML'ye karıştırır. Görüşler, bunun iyi bir fikir olup olmadığı konusunda geniş ölçüde farklılık gösterir.
  • Makro dilleri - genellikle bir makro dili, C / C ++ önişlemci makroları gibi kaynak dosyaya karıştırılır. Makro dilinin Lisp olduğu Lisp gibi ilginç durumlar da vardır (tek fark, kodun derleme zamanında mı yoksa çalışma zamanında mı çalıştırılacağıdır)
  • DSL'ler - genellikle etki alanına özgü bir dil, belirli bir sorunun etkin bir şekilde çözülmesine yardımcı olmak üzere tanımlanır ve bu, başka bir dilin kaynak koduna eklenir. İşte Clojure koduna gömülebilen güzel bir SQL for SQL örneği .
  • Komut dosyası oluşturma - bazı dinamik diller kısa komut dosyaları için özellikle kullanışlıdır ve başka bir dilde yazılmış yazılımın içine yerleştirilmek üzere tasarlanmıştır. Örneğin Groovy scriptleri bir Java uygulamasına gömmek çok kolaydır.
  • Polyglot projeleri - bazen sadece her birinin farklı yeteneklerinden yararlanmak için birden fazla dil kullanmak mantıklıdır. Örneğin, JVM oldukça saydam bir şekilde birlikte çalışabilen birden fazla dili destekler, böylece Java'yı (hızlı ve statik olarak yazılmış OOP için) Clojure ile karıştırın (etkileşimli geliştirme, eşzamanlılık ve işlevsel programlama için). Bu tür projeler hala tipik olarak farklı dilleri ayrı kaynak dosyalara / klasörlere ayırır, ancak aynı anda tek bir uygulama oluşturmak için derlenir.

6

Bir Perl betiği yazmanıza ve farklı bir dilde yazılmış kod bölümlerini eklemenize izin veren Perl Satır İçi'ni kullanarak bazı dil kombinasyonları yapmak mümkündür :

Satır içi C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (Şablon Araç Takımı), WebChat ve hatta PERL desteği vardır.


Perl Inline'ı hiç duymamıştım. Bu ilginç bir fikir, ancak PERL olmayan kod için ayrı modüller kullanmanın genel yaklaşımının ne olduğu konusunda herhangi bir avantaj sağlıyor mu?
SinirliFormsDesigner ile

1
@FrustratedWithFormsDesigner: Inline Perl harika bir modül ama bazı kusurları var. İyi çalışıyor, ancak sadece oldukça temel kodlar kadar. Bir süredir çalışmış olmasına rağmen, herhangi bir üretimde kullanmazdım.
Dinamik

3

Gömülü SQL , SQL deyimlerini diğer dillerin programlarına yerleştirmenin yaygın bir yoluydu.

Bu günler neredeyse tamamen ana bilgisayar dilini değiştirmesi gerekmeyen, bunun yerine normal yeteneklerini kullanan, derlemesi daha kolay olan API tabanlı Veritabanı erişimiyle değiştirildi.


1
Bu günlerde yerleşik bir SQL, LINQ biçiminde geri dönüşünü sağladı ve burada kalacak.
SK-mantık

@ SK-mantık: LINQ nasıl gömülü SQL gibi bir şey? Farklı bir dil değil, sadece ana dilde ek dil yapılarının kullanılmasıdır.
Joachim Sauer

LINQ, kendi ana diline semantik olarak yabancı olan çok tipik bir yerleşik DSL'dir. Ve LINQ2SQL durumunda, eski gömülü SQL ile aynı şekilde davranır, kelimenin tam anlamıyla SQL'e çevrilir.
SK-mantık

Ancak gömülü SQL "SQL'e çevrilmiş" değildir. Sen yazmak literal (ya değil genellikle dize sabitleri içinde) C kodu içinde SQL. LINQ, özellikle LINQ için özel olarak geliştirilen (bildiğim kadarıyla) dil özelliklerini kullanmasına rağmen, ana bilgisayarında "sadece" bir API'dir.
Joachim Sauer

1
Pro C ve Pro Fortran, SQL ifadelerini biraz tercüme etti. Ve LINQ bir API "sadece" değildir, sözdizimi şekerine sahip bir API ve bir dizi değiştirilebilir derleyicinin arka uçlarıdır. Bu da onu tam gelişmiş bir dahili DSL'ye mükemmel bir örnek yapar.
SK-mantık

2

1 exe oluşturmak için çeşitli programlama dilleri kullanılabilir. Bir yol DLL kullanmaktır. Elbette bununla ilgili çeşitli endişeler var. Örneğin, parametre uyumluluğu, COM uyumluluğu ve benzeri. Aslında, çalışmak için bir veritabanı sistemini nasıl çağırdığınızı düşünüyorsanız, DBMS'nin her zaman bildiğiniz bir dilde yazılmış olmadığını görebilirsiniz. Arayüz bilindiği sürece muhtemelen umursamıyorsunuz bile.

Çözümünüz, birden fazla yazılım bileşenini birleştiren daha temiz bir yol olan Web Hizmetleri'ni kullandığında bu kavram daha da ileri götürülür.

.NET dünyasında, yukarıdakilerin tümü, XAML ve HTML arayüzleri arabirim düzeyinde daha fazla geçerlidir, Silverlight'ta birlikte yaşayabilir.

UNIX dünyasında, bir zamanlar C ++ ve COBOL programlarını başlatmak için KShell scriptlerini kullanarak çözümün çalışmasını sağladık.


2

Burada Cython'dan bahsetmeye değeceğini düşünüyorum . Bu, C uzantılarını yazmak için bir Python süpersetidir ve gerçekten de kendine özgü bir dil olmasına rağmen, eğer Cython'un Python tarzı sözdizimine uyursanız, C kodunu Python kodunda kullanmanıza izin verir.


0

Birleştirme dillerine örnekler: Jython (Java'da python), Cog (hemen hemen her şeyde gömülü kod üreticisi olarak kullanılan python). Kod oluşturma işlemini hesaba katarsanız, C ++ oluşturmak için sıklıkla Perl kodunu kullandım.


0

.NET çerçevesi, birkaç dilin tek bir çözüme katılmasına izin vermek için oluşturulmuştur. Dil CLR uyumlu bayt kodu üretebildiği sürece çalışır.

http://www.geekinterview.com/question_details/1047


Orijinal posterin ne anlama geldiğini sanmıyorum. Sonuçta ortaya çıkan bayt kodunun, derlendiği dilde yazılma şekli ile ilgisi yoktur.
perdian

Soruyu anladığını sanmıyorum. Yazar, birden fazla dili tek bir gizli dosyada birleştirmekten bahsediyor.
Craige

0

Birden fazla programlama dilini 1 dosyada birleştirmek çok zor, çok çirkin ve çoğu zaman işe yaramaz.

Bununla birlikte, 1'den fazla dilde yazılmış büyük bir projeye sahip olmak mümkündür. Örneğin, hem Mozilla Firefox hem de MySQL, içinde C ve C ++ kodlarına sahiptir. Büyük projeler söz konusu olduğunda, bu uygulama sıklıkla kullanılır, çünkü belirli bir dil başkalarının yapmadığı bazı özellikler sunar. Örneğin, PHP'de, bir ikili çalıştırılabilir dosyanın yürütülmesini isteyebilir, sonucunu alabilir ve bu noktadan itibaren PHP kodunuzda kullanabilirsiniz.

Dünyadaki en önemli açık kaynaklı projelerden bazıları için hangi dillerin kullanıldığını merak ediyorsanız, kontrol edebilirsiniz Ohloh.net. Birçok projenin kaynak koduyla ilgili istatistikler burada bulunabilir.


-1

Dilleri HTML olarak "karıştırabilirsiniz". Javascript'i html içine yerleştirebilmeniz için pek çok web sitesinin çalışması gerçekten önemlidir. Ama elbette, HTML bir programlama dili değil, bir işarettir.

Sanırım önerdiğini yap, yine de yeni bir dil yazmayı gerektiriyor. Bu dillerin hepsini konuşan ve bunları tutarlı bir şekilde çerçeveleyen bir tercüman / derleyici oluşturmanız gerekecek ya da bir meta dilin ne olacağı konusunda açıkça satır satır değerlendirme yapmanın bir yoluna ihtiyacınız olacaktır. Bu iki seçenek, programcının dilleri birlikte çalışması için yapması gerekenler dışında temelde aynıdır.


Dilleri HTML’de karıştırırken +1, ancak kişisel olarak HTML / CSS ve JS’yi ayrı tutmanın daha temiz olduğuna inanıyorum. Web tasarımcıları, site boyunca gömülü dizel JavaScript'i gözden geçirmeye çalışmadan işlerini yapabilirler.
jmort253,

Dilleri HTML ile karıştırabilirsiniz, ancak birçoğu eldeki konu olan programlama dilleri değildir .
Alexios

Eh? Javascript bir programlama dili değil mi? PHP? Apache modüllerinde olmasına rağmen perl ve python enjeksiyonları da gördüm.
00’de

-1

Dil bir araçtır. Bir araç seçmeden önce (dahası, biraz tuhaf hummer-PC-spektroskopi kombinasyonu yapmak) kendine sorması gerekir - tam olarak ne yapmak istiyorum? Cevap verildiğinde, bu tür dillerin karışımının nadiren gerekli olduğunu göreceksiniz.


-3

Evet, tercüman / derleyiciniz anlayabildiği sürece programlama dillerini karıştırmak mümkündür. Örneğin, javascript, PHP, HTML'de python veya C #'da C ++ ile karıştırma.

Ancak, dilleri karıştırmak kod okumayı ve değiştirmeyi zorlaştırabilir, ancak dikkatli bir şekilde yapılması gerekir. Bunun bir yolu, çağırmanız gereken dilde kod için ayrı dosyalar oluşturmak ve gömmek yerine içe aktarmaktır.

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.