Apakah mungkin untuk menggabungkan bahasa pemrograman?

27

Saya telah pemrograman untuk sementara waktu, saya telah menulis beberapa program dasar, dan saya ingin terus belajar. Saya telah mencapai titik di mana Anda tidak tahu apa yang harus saya pelajari selanjutnya, dan saya ingin mengajukan pertanyaan atas keingintahuan saya sendiri.

Singkatnya, adalah apakah Anda dapat menggabungkan beberapa bahasa pemrograman menjadi 1 hasil? Misalnya, dapatkah kode ini dimungkinkan?

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

atau

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());

Ini terasa seperti pertanyaan konyol tapi saya tidak mungkin tahu apakah itu mungkin atau tidak, jadi itu sebabnya saya menanyakannya. Dalam pertanyaan ini saya perhatikan dia menggunakan kode Python dalam kode html, jika contoh saya di atas tidak mungkin, apa yang dia lakukan?

Bugster
sumber
12
Agar ini berfungsi (tanpa membuat orang gila), kita perlu setidaknya aturan ketat tentang bagaimana mereka berinteraksi dan bagian mana yang harus diproses sebagai bahasa mana.
6
Itu akan membutuhkan satu hellova lexer / parser.
Chad Harrison
2
@Brian Lua tertanam dalam bahwa interpreter dihubungkan ke beberapa kode C atau C ++ dan digunakan untuk menjalankan kode Lua yang disimpan dalam string atau file eksternal, mungkin mengekspos objek C / C ++ ke kode Lua. Lua tidak (tidak sering, jika sama sekali) "tertanam" dalam arti pertanyaan ini.
2
Itu seperti membuat lima huruf masing-masing dengan simbol yang berbeda untuk 26 huruf dan mencampurkannya dalam satu buku: tidak ada gunanya, menjengkelkan dan berlebihan.
ThomasX
7
Saya pikir orang-orang jelas melupakan kasus penggunaan "menggabungkan bahasa" yang paling umum (dan hanya kehidupan nyata yang valid) - fragmen ASM dalam program C / C ++ , biasanya karena alasan kinerja.
TC1

Jawaban:

43

Contoh pertama Anda adalah semacam kemungkinan. Biasanya hal-hal seperti itu terjadi di PHP (dan bahasa pemrograman web terkait lainnya) seperti ini:

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

Beberapa poin penting yang perlu diperhatikan tentang contoh ini:

  • HTML BUKAN bahasa pemrograman, itu adalah bahasa markup.
  • PHP dan HTML dan tidak dieksekusi / ditafsirkan di tempat yang sama: Kode PHP dijalankan oleh penerjemah PHP yang berjalan di server dan hasilnya "disuntikkan" ke dalam HTML sekitarnya. Kemudian seluruh gumpalan itu dikirim ke klien / browser yang merender HTML lengkap.

Contoh kedua Anda terlihat seperti semacam penyatuan C ++ dan Java. Dimungkinkan untuk menyusun modul yang ditulis dalam bahasa yang berbeda berbicara satu sama lain, tetapi untuk menggabungkan Java dan C ++ dalam file sumber yang sama akan sangat membingungkan dan sulit: bagaimana kompiler mengetahui pernyataan mana yang Java dan mana yang C ++?

Saya kira secara teori Anda dapat menulis kompiler / pra-prosesor khusus dengan indikator "bahasa" seperti:

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());
}

Tapi jujur ​​saya tidak yakin Anda akan mendapatkan sesuatu yang bermanfaat dengan melakukan ini.

Juga, bagaimana lingkungan bahasa hybrid ini menangani fitur bahasa yang tidak kompatibel di antara keduanya?

FrustratedWithFormsDesigner
sumber
Contoh orang lupa tentang (termasuk saya), jadi jangan ragu untuk menambahkannya ke jawaban Anda: CUDA. Ini adalah campuran dari dua bahasa C yang sangat berbeda, dengan beberapa fungsi yang dikompilasi untuk perangkat (GPU), dan beberapa yang tersisa di host, dengan lapisan komunikasi yang disimpulkan.
SK-logic
7
Tidak jarang memiliki JavaScript dan juga HTML dan PHP pada satu halaman. Mengerikan, tetapi tidak jarang.
Michael Borgwardt
1
Tidak begitu terbiasa dengan PHP, tetapi kode ASP.NET (apakah C # atau VB.NET) menghasilkan HTML dan JavaScript - dan JavaScript sering disematkan di sana di halaman .aspx. Pemisahan total sering dikutip sebagai yang ideal, tetapi tinjauan singkat dari pertanyaan pada SO tagged ASP.NET akan memberi Anda gambaran tentang betapa rumitnya hal itu.
sq33G
@ sq33G - ASP.NET menghasilkan kode HTML. Anda dapat memasukkan javascript jika Anda mau. ASP.NET jelas BUKAN apa yang penulis uraikan ingin lakukan.
Ramhound
Saya akan membuka PHP / HTML / JS dalam satu dokumen jika tidak ada orang lain yang memilikinya.
Ben Brocka
19

Jawaban singkat

Tidak juga.


Jawaban panjang

Menanamkan

Secara umum, satu file sumber berisi kode untuk satu bahasa pemrograman. Jarang beberapa bahasa digabungkan dalam satu file karena beberapa alasan:

  • Mem - parsing beberapa bahasa yang berbeda secara sintaksis sekaligus sangat sulit (jika tidak langsung mustahil).
  • Bahasa yang berbeda memperlakukan pemrograman secara berbeda . Gagasan Haskell tentang fungsi berbeda dari C ++.

Menautkan

Bahasa pemrograman yang berbeda yang berbagi antarmuka biner aplikasi umum dapat digabungkan untuk membentuk satu executable atau pustaka. Mendapatkan tanda tangan kedua bahasa yang tersedia di dalam satu sama lain seringkali membutuhkan sedikit pekerjaan, tetapi ada alat untuk memudahkan proses.

Poliglot

Kode polyglot valid dan setara dalam lebih dari satu bahasa. Halaman 404 Stack Overflow menampilkan satu program seperti:

Stack Overflow 404 polyglot

Ini mencetak "404" dalam Python, Perl, Ruby, C, Brainfuck dan Befunge.

Kesimpulan

Bahasa jarang tercampur dalam file, dan ketika itu, itu untuk tertawa . Orang-orang bahkan mencoba untuk menghindari pencampuran bahasa dalam proyek karena kerumitan tambahan yang diperkenalkannya. Jadi, meskipun secara teknis memungkinkan, menggabungkan bahasa yang berbeda bukanlah hal yang umum atau pragmatis.

tidak diketahui
sumber
Saya tidak melihat Ruby di sini ...
Jason Lewis
@JasonLewis Saya tidak tahu Ruby, tetapi posting ini mengatakan bahwa ia mengevaluasi baris # 4.
Maks.
9
Bahasa tidak selalu tercampur untuk tertawa. Kebanyakan kompiler C memungkinkan Anda untuk mencampur Majelis dan C, dan begitu juga banyak Keempat. Kembali ke Eighties, salah satu dialek BASIC terbaik dalam gim ini, Acorn's BBC Basic, memungkinkan Anda untuk mencampur 6502 rakitan dan itu adalah fitur yang sangat diinginkan saat itu. Ini tentu saja membuat para pengguna BBC tertawa, tetapi hampir semua orang menangis, terutama mereka yang harus mengumpulkan 6502 kode mesin dengan tangan dan menempelkan opcode mentah dalam program mereka dalam DATApernyataan. Bukannya aku pahit atau apalah. Tidaaaak
Alexios
1
@ SK-logic SQL adalah Bahasa Permintaan Terstruktur, bukan bahasa pemrograman.
Maks.
1
Salah satu hal yang menyedihkan tentang pengembangan perangkat lunak modern adalah aplikasi multi-bahasa sekarang jauh lebih sulit. Kembali pada hari-hari DOS, hampir semuanya dikompilasi ke file objek yang sama dan menggunakan konvensi melewati parameter yang sama. Sangat mudah untuk hanya menghubungkan mereka bersama. Saat ini, tidak terlalu banyak ...
Brian Knoblauch
7

Ya, memang mungkin. Bukan seperti yang Anda bayangkan, tentu saja. Ada beberapa bahasa di luar sana yang dibuat khusus untuk tujuan ini.

Dalam praktiknya, mungkin sangat berguna untuk mencampur sejumlah bahasa khusus domain ke dalam satu bahasa host. Jarang ada kebutuhan dalam mencampur dua atau lebih sama "tujuan umum" bahasa bersama dalam file kode sumber tunggal, meskipun Anda akan sering menemukan proyek ditulis dalam keduanya, katakanlah, VB.NET dan C #, dengan komponen bahasa yang berbeda dikompilasi secara terpisah.

Adapun HTML, itu hanya bahasa markup. Anda mungkin sering menemukan kode sisi-server (misalnya, dalam VB.NET), markup HTML dan kode Javascript sisi-klien bercampur menjadi satu file sumber, meskipun itu dianggap praktik buruk oleh banyak orang.

Logika SK
sumber
7

Ini sering disebut kode polyglot - ada beberapa contoh menyenangkan / gila jika Anda mengikuti tautan atau di berbagai tempat lain di web. Sebagian besar ini hanya untuk bersenang-senang / membuktikan bahwa itu mungkin.

Lebih serius, ada berbagai contoh kehidupan nyata di mana dua atau lebih bahasa yang berbeda dapat dikombinasikan secara bermanfaat:

  • Templating web - bahasa seperti file PHP atau JSP mencampur kode ke dalam HTML. Pendapat sangat berbeda pada apakah ini ide yang baik atau tidak.
  • Bahasa makro - seringkali bahasa makro dicampur ke file sumber seperti makro preprocessor C / C ++. Ada juga kasus menarik seperti Lisp di mana bahasa makro itu sendiri Lisp (satu-satunya perbedaan adalah apakah kode dijalankan pada waktu kompilasi atau runtime)
  • DSL - seringkali bahasa khusus domain didefinisikan untuk membantu memecahkan masalah tertentu secara efektif, yang tertanam ke dalam kode sumber bahasa lain. Berikut adalah contoh DSL yang indah untuk SQL yang dapat disematkan dalam kode Clojure.
  • Scripting - beberapa bahasa dinamis sangat berguna untuk skrip pendek dan dirancang untuk tertanam dalam perangkat lunak yang ditulis dalam bahasa lain. Skrip Groovy misalnya sangat mudah ditanamkan dalam aplikasi Java.
  • Proyek Polyglot - kadang-kadang masuk akal untuk menggunakan beberapa bahasa hanya untuk mengeksploitasi kemampuan yang berbeda dari masing-masing. Sebagai contoh, JVM mendukung banyak bahasa yang dapat beroperasi dengan cukup transparan, sehingga Anda dapat mencampur Java (untuk OOP yang diketik dengan kecepatan dan statis) dengan Clojure (untuk pengembangan interaktif, konkurensi, dan pemrograman fungsional). Proyek-proyek semacam itu biasanya masih memisahkan bahasa yang berbeda ke dalam file / folder sumber yang terpisah, tetapi mereka dikompilasi pada saat yang sama untuk menghasilkan satu aplikasi.
mikera
sumber
6

Dimungkinkan untuk melakukan beberapa kombinasi bahasa menggunakan Perl Inline yang memungkinkan untuk menulis skrip Perl dan menyisipkan bagian kode yang ditulis dalam bahasa yang berbeda:

Inline memiliki dukungan untuk C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (Template Toolkit), WebChat dan bahkan PERL

JohnTESlade
sumber
Saya belum pernah mendengar tentang Perl Inline. Ini adalah ide yang menarik, tetapi apakah itu memberikan keuntungan apa pun yang mungkin merupakan pendekatan yang biasa untuk memiliki modul terpisah untuk kode non-PERL?
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner: Inline Perl adalah modul yang hebat, tetapi memiliki beberapa kekurangan. Ini bekerja dengan baik, tetapi hanya sejauh kode yang cukup mendasar. Meskipun sudah dikerjakan untuk sementara waktu, saya tidak akan menggunakannya dalam jenis produksi apa pun.
Dinamis
3

Embedded SQL adalah cara umum untuk menanamkan pernyataan SQL ke dalam program bahasa lain.

Saat ini hampir semua telah diganti oleh akses basis data berbasis API yang lebih mudah dikompilasi yang tidak perlu mengubah bahasa host, tetapi gunakan kemampuan normalnya.

Joachim Sauer
sumber
1
Hari-hari ini SQL yang tertanam membuat comeback-nya dalam bentuk LINQ, dan ia tetap di sini.
SK-logic
@ SK-logic: bagaimana LINQ seperti embedded SQL? Ini bukan bahasa yang berbeda, itu hanya penerapan konstruksi bahasa tambahan dalam bahasa host.
Joachim Sauer
LINQ adalah DSL tertanam yang sangat tipikal, asing secara asing dengan bahasa host-nya. Dan, dalam kasus LINQ2SQL, ia berperilaku persis sama seperti yang dilakukan SQL tertanam lama, itu diterjemahkan secara harfiah ke SQL.
SK-logic
Tetapi embedded SQL tidak "diterjemahkan ke SQL". Anda menulis SQL literal di dalam kode C Anda (dan biasanya tidak dalam konstanta string). Meskipun LINQ menggunakan fitur bahasa yang (sejauh yang saya tahu) dikembangkan khusus untuk LINQ itu "hanya" sebuah API dalam bahasa host-nya.
Joachim Sauer
1
Pro C dan Pro Fortran menerjemahkan pernyataan SQL sedikit. Dan LINQ bukan "hanya" sebuah API, itu adalah API dengan gula sintaks dan sekelompok kompiler yang dapat dipertukarkan. Yang menjadikannya contoh sempurna dari DSL tertanam full-blown.
SK-logic
2

Beberapa bahasa pemrograman dapat digunakan untuk membentuk 1 exe. Salah satu caranya adalah dengan menggunakan DLL. Tentu ada berbagai kekhawatiran tentang hal ini. Misalnya, kompatibilitas parameter, kompatibilitas COM dan semacamnya. Bahkan, jika Anda memikirkan bagaimana Anda memanggil sistem database untuk melakukan pekerjaan Anda, Anda mungkin menemukan bahwa DBMS tidak selalu ditulis dalam bahasa yang Anda tahu. Anda mungkin bahkan tidak peduli selama antarmuka diketahui.

Konsep ini diambil lebih lanjut ketika solusi Anda menggunakan Layanan Web, yang bahkan merupakan cara yang lebih bersih untuk menggabungkan beberapa komponen perangkat lunak.

Di dunia .NET, semua hal di atas berlaku, terlebih lagi, pada tingkat antarmuka XAML dan antarmuka HTML dapat hidup bersama di Silverlight.

Di dunia UNIX, pada suatu waktu, kami menggunakan skrip KShell untuk meluncurkan program C ++ dan COBOL sehingga solusinya dapat bekerja.

Tidak ada kesempatan
sumber
2

Saya pikir layak menyebutkan Cython di sini. Ini adalah superset dari Python untuk menulis ekstensi C dan meskipun itu benar-benar bahasa yang unik, itu cukup banyak memungkinkan Anda untuk menggunakan kode C dalam kode Python, jika Anda mematuhi sintaks gaya Python Cython

Magnus
sumber
0

Contoh menggabungkan bahasa: Jython (python di Jawa), Cog (python digunakan sebagai pembuat kode yang tertanam di hampir semua hal). Saya sering menggunakan kode Perl untuk menghasilkan C ++, jika Anda menghitung pembuatan kode.

Michael Kohne
sumber
0

Kerangka .NET dibangun untuk memungkinkan beberapa bahasa berpartisipasi dalam satu solusi. Ini berfungsi selama bahasa dapat menghasilkan kode byte yang kompatibel dengan CLR.

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

Jalayn
sumber
Saya tidak berpikir itulah yang dimaksudkan oleh poster aslinya. Bytecode yang dihasilkan sangat sedikit hubungannya dengan cara itu ditulis dalam bahasa yang dikompilasi.
perdian
Saya pikir Anda tidak mengerti pertanyaan itu. Penulis sedang berbicara tentang menggabungkan beberapa bahasa dalam satu file yang tidak jelas.
Craige
0

Sangat sulit, sangat jelek dan sering tidak berguna untuk menggabungkan beberapa bahasa pemrograman dalam 1 file.

Namun dimungkinkan untuk memiliki proyek besar yang ditulis dalam lebih dari 1 bahasa. Misalnya, baik Mozilla Firefox dan MySQL memiliki kode C dan C ++ di dalamnya. Ketika datang ke proyek-proyek besar, praktik ini sering digunakan karena bahasa tertentu menyediakan beberapa fitur yang tidak dimiliki orang lain. Dalam PHP, misalnya, Anda dapat meminta eksekusi binary executable, mengambil hasilnya dan menggunakannya dalam kode PHP Anda sejak saat itu.

Jika Anda ingin tahu tentang bahasa apa yang digunakan untuk beberapa proyek sumber terbuka paling penting di dunia, Anda dapat melihatnya Ohloh.net. Statistik tentang kode sumber banyak proyek dapat ditemukan di sana.

Radu Murzea
sumber
-1

Anda dapat "mencampur" bahasa dalam HTML. Ini sebenarnya penting untuk cara kerja banyak situs web yang dapat Anda tanamkan javascript ke html. Tapi tentu saja, HTML adalah markup, bukan bahasa pemrograman.

Saya pikir untuk melakukan apa yang Anda usulkan akan memerlukan penulisan bahasa baru. Entah Anda harus membuat juru bahasa / kompiler yang berbicara semua bahasa itu dan dapat membingkai mereka secara konsisten, atau Anda akan memerlukan beberapa cara untuk mengevaluasi baris demi baris secara eksplisit dalam apa yang akan menjadi bahasa meta. Kedua opsi itu pada dasarnya sama kecuali untuk apa yang harus dilakukan programmer untuk membuat bahasa bekerja bersama.

markw
sumber
Memberi +1 pada pencampuran bahasa dalam HTML, tapi saya pribadi percaya lebih baik memisahkan HTML / CSS dan JS. Para desainer web dapat melakukan hal mereka tanpa mencoba mengarungi JavaScript ketat yang tertanam di seluruh situs.
jmort253
Anda dapat mencampur bahasa dalam HTML, tetapi tidak banyak dari mereka adalah bahasa pemrograman , yang merupakan topik pembicaraan.
Alexios
Eh? Javascript bukan bahasa pemrograman? PHP? Saya juga melihat injeksi perl dan python meskipun itu dengan modul Apache.
markw
-1

Bahasa adalah alat. Sebelum memilih alat (apalagi, membuat kombinasi hummer-PC-spectroscope yang aneh) orang harus bertanya pada dirinya sendiri - apa sebenarnya yang ingin saya lakukan ?? Setelah jawaban diberikan, Anda akan menemukan bahwa campuran bahasa seperti itu jarang diperlukan.

Hamo
sumber
-3

Ya, dimungkinkan untuk mencampur bahasa pemrograman selama penerjemah / kompiler Anda dapat memahaminya. Misalnya mencampur javascript, PHP, python dalam HTML atau C ++ di C #.

Namun, mencampur bahasa dapat membuatnya lebih sulit untuk membaca dan memodifikasi kode, sehingga harus dilakukan dengan hati-hati. Salah satu cara mengatasi hal ini adalah dengan membuat file terpisah untuk kode dalam bahasa yang Anda perlu panggil dan mengimpornya daripada menanamkannya.

Garrett Hall
sumber