Có thể kết hợp các ngôn ngữ lập trình?


27

Tôi đã lập trình được một thời gian, tôi đã viết một số chương trình thô sơ và tôi muốn tiếp tục học hỏi. Tôi đã đạt đến điểm mà bạn không biết phải học gì tiếp theo và tôi muốn đặt câu hỏi cho sự tò mò của riêng tôi.

Câu hỏi ngắn gọn là liệu bạn có thể kết hợp nhiều ngôn ngữ lập trình thành 1 kết quả không? Ví dụ, mã này có thể được không?

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

hoặc là

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

Điều này cảm thấy giống như một câu hỏi ngớ ngẩn nhưng tôi không thể biết liệu nó có thể hay không, vì vậy đó là lý do tại sao tôi hỏi nó. Trong câu hỏi này tôi nhận thấy anh ta đang sử dụng mã Python trong mã html, nếu ví dụ trên của tôi là không thể, anh ta đã làm gì?


12
Để làm việc này (không khiến mọi người mất trí), người ta cần ít nhất các quy tắc nghiêm ngặt về cách họ tương tác và phần nào nên được xử lý như ngôn ngữ nào.

6
Nó sẽ mất một lexer / trình phân tích cú pháp hellova.
Chad Harrison

2
@Brian Lua được nhúng trong đó trình thông dịch được liên kết với một số mã C hoặc C ++ và được sử dụng để chạy mã Lua được lưu trữ trong chuỗi hoặc tệp bên ngoài, có thể hiển thị các đối tượng C / C ++ cho mã Lua. Lua không (không thường xuyên, nếu có) được "nhúng" theo nghĩa của câu hỏi này.

2
Điều đó giống như tạo ra năm bảng chữ cái với mỗi ký hiệu khác nhau cho 26 chữ cái và xen kẽ chúng trong một cuốn sách: vô nghĩa, khó chịu và dư thừa.
ThomasX

7
Tôi nghĩ mọi người rõ ràng đang quên đi trường hợp sử dụng phổ biến nhất (và duy nhất mà tôi có thể nghĩ đến) trong trường hợp sử dụng "ngôn ngữ kết hợp" - các đoạn ASM trong các chương trình C / C ++ , thường là vì lý do hiệu suất.
TC1

Câu trả lời:


43

Ví dụ đầu tiên của bạn là loại có thể. Thông thường những điều như vậy xảy ra trong PHP (và các ngôn ngữ lập trình web có liên quan khác) như thế này:

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

Một số điểm quan trọng cần lưu ý về ví dụ này:

  • HTML KHÔNG phải là ngôn ngữ progamming, nó là ngôn ngữ đánh dấu.
  • PHP và HTML và không được thực thi / giải thích ở cùng một nơi: Mã PHP được thực thi bởi một trình thông dịch PHP chạy trên máy chủ và kết quả là "được đưa" vào HTML xung quanh. Sau đó, toàn bộ blob được gửi đến máy khách / trình duyệt sẽ hiển thị HTML hoàn chỉnh.

Ví dụ thứ hai của bạn trông giống như một số kết hợp của C ++ và Java. Có thể có các mô-đun biên dịch được viết bằng các ngôn ngữ khác nhau nói chuyện với nhau, nhưng để kết hợp Java và C ++ trong cùng một tệp nguồn sẽ vô cùng khó hiểu và khó khăn: làm thế nào trình biên dịch biết câu lệnh nào là Java và C ++ là gì?

Tôi cho rằng trên lý thuyết bạn có thể viết một trình biên dịch / tiền xử lý đặc biệt với các chỉ số "ngôn ngữ" như:

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

Nhưng tôi thực sự không chắc chắn bạn sẽ đạt được bất cứ điều gì hữu ích bằng cách làm điều này.

Ngoài ra, môi trường ngôn ngữ lai này sẽ xử lý các tính năng ngôn ngữ không tương thích giữa hai như thế nào?


Một ví dụ mà mọi người đều quên (bao gồm cả bản thân tôi), vì vậy xin vui lòng thêm nó vào câu trả lời của bạn : CUDA. Đó là sự pha trộn của hai ngôn ngữ C rất khác nhau, với một số chức năng được biên dịch cho một thiết bị (GPU) và một số ngôn ngữ còn lại trên máy chủ, với lớp giao tiếp được suy ra.
SK-logic

7
Không có gì lạ khi có JavaScript cũng như HTML và PHP trên một trang. Kinh khủng, nhưng không hiếm.
Michael Borgwardt

1
Không quá quen thuộc với PHP, nhưng mã ASP.NET (dù là C # hoặc VB.NET) tạo HTML và JavaScript - và JavaScript thường được nhúng ngay tại đó trong trang .aspx. Sự tách biệt hoàn toàn thường được trích dẫn là một lý tưởng, nhưng tổng quan nhanh về các câu hỏi trên ASP.NET được gắn thẻ SO sẽ cho bạn ý tưởng về mức độ phức tạp của nó.
sq33G

@ sq33G - ASP.NET tạo mã HTML. Bạn có thể bao gồm javascript nếu bạn muốn. ASP.NET chắc chắn KHÔNG phải là những gì tác giả mô tả là muốn làm.
Ramhound

Tôi sẽ đưa lên PHP / HTML / JS trong một tài liệu nếu không có ai khác.
Ben Brocka

19

Câu trả lời ngắn

Không hẳn vậy.


Câu trả lời dài

Nhúng

Nói chung, một tệp nguồn duy nhất chứa mã cho chính xác một ngôn ngữ lập trình. Rất hiếm khi nhiều ngôn ngữ được kết hợp trong một tệp vì một vài lý do:

  • Phân tích một số ngôn ngữ cú pháp khác nhau cùng một lúc là vô cùng khó khăn (nếu không nói là hoàn toàn không thể).
  • Các ngôn ngữ khác nhau đối xử với lập trình khác nhau . Khái niệm về chức năng của Haskell khác với C ++.

Liên kết

Các ngôn ngữ lập trình khác nhau có chung giao diện nhị phân ứng dụng chung có thể được kết hợp để tạo thành một thư viện hoặc thư viện thực thi duy nhất. Để chữ ký của hai ngôn ngữ có sẵn bên trong nhau thường mất một chút công việc, nhưng các công cụ tồn tại để giảm bớt quá trình.

Đa sắc

Mã polyglot hợp lệ và tương đương với nhiều ngôn ngữ. Trang 404 của Stack Overflow có một chương trình như vậy:

Ngăn xếp chồng tràn 404 polyglot

Điều này in "404" bằng Python, Perl, Ruby, C, Brainfuck và Befunge.

Phần kết luận

Ngôn ngữ hiếm khi được trộn lẫn trong các tập tin, và khi chúng là, nó là để cười . Mọi người thậm chí cố gắng tránh trộn lẫn các ngôn ngữ trong các dự án vì những rắc rối thêm mà nó giới thiệu. Vì vậy, trong khi có thể về mặt kỹ thuật, việc trộn các ngôn ngữ khác nhau không phổ biến cũng không thực dụng.


Tôi không thấy Ruby ở đây ...
Jason Lewis

@JasonLewis Tôi không biết Ruby, nhưng bài đăng này nói rằng nó đánh giá dòng số 4.
Tối đa

9
Ngôn ngữ không phải lúc nào cũng lẫn lộn để cười. Hầu hết các trình biên dịch C cho phép bạn kết hợp hội và C, và nhiều Forths cũng vậy. Quay trở lại thập niên tám mươi, một trong những phương ngữ BASIC tốt nhất trong trò chơi, Acorn's BBC Basic, cho phép bạn kết hợp lắp ráp 6502 và đó là một tính năng rất đáng mong đợi sau đó. Nó chắc chắn đã làm cho người dùng BBC cười, nhưng khá nhiều người khác đã khóc, đặc biệt là những người phải lắp ráp mã máy 6502 bằng tay và dán các mã thô trong các chương trình của họ DATA. Không phải tôi cay đắng hay gì cả. Không
Alexios

1
@ SK-logic SQL là Ngôn ngữ truy vấn có cấu trúc, không phải là ngôn ngữ lập trình.
Tối đa

1
Một trong những điều đáng buồn về phát triển phần mềm hiện đại là nhiều ứng dụng ngôn ngữ giờ đã khó hơn rất nhiều. Quay trở lại thời DOS, gần như mọi thứ được biên dịch vào cùng một tệp đối tượng và sử dụng cùng một quy ước thông qua các quy ước. Thật dễ dàng để liên kết chúng lại với nhau. Ngày nay, không quá nhiều ...
Brian Knoblauch

7

Vâng, nó thực sự có thể. Tất nhiên, không phải theo cách bạn tưởng tượng. Có một số ngôn ngữ được xây dựng đặc biệt cho mục đích này.

Trong thực tế, có thể rất hữu ích khi trộn một số ngôn ngữ dành riêng cho tên miền vào một ngôn ngữ máy chủ duy nhất. Hiếm khi có nhu cầu trộn hai hoặc nhiều ngôn ngữ "mục đích chung" bằng nhau trong tệp mã nguồn đơn, mặc dù bạn sẽ thường tìm thấy các dự án được viết bằng cả hai, như VB.NET và C #, với các thành phần ngôn ngữ khác nhau được biên dịch riêng.

Đối với HTML, nó chỉ là một ngôn ngữ đánh dấu. Bạn thường có thể tìm thấy mã phía máy chủ (ví dụ: trong VB.NET), mã đánh dấu HTML và mã Javascript phía máy khách được trộn vào một tệp nguồn duy nhất, mặc dù nhiều người cho rằng đó là một thực tiễn xấu.


7

Đây thường được gọi là mã polyglot - có một số ví dụ thú vị / điên rồ nếu bạn theo liên kết hoặc ở nhiều nơi khác trên web. Hầu hết trong số này chỉ để cho vui / để chứng minh điều đó là có thể.

Nghiêm trọng hơn, có nhiều ví dụ thực tế khác nhau trong đó hai hoặc nhiều ngôn ngữ khác nhau có thể được kết hợp hữu ích:

  • Tạo khuôn mẫu web - các ngôn ngữ như tệp PHP hoặc tệp JSP trộn mã vào HTML. Ý kiến ​​khác nhau về việc đây có phải là một ý tưởng tốt hay không.
  • Ngôn ngữ macro - thường là ngôn ngữ macro được trộn vào tệp nguồn, chẳng hạn như macro tiền xử lý C / C ++. Cũng có những trường hợp thú vị như Lisp trong đó ngôn ngữ macro là chính Lisp (sự khác biệt duy nhất là liệu mã có được chạy trong thời gian biên dịch hay thời gian chạy không)
  • DSL - thường là một ngôn ngữ cụ thể miền được xác định để giúp giải quyết vấn đề cụ thể một cách hiệu quả, được nhúng vào mã nguồn của ngôn ngữ khác. Đây là một ví dụ về DSL đẹp cho SQL có thể được nhúng trong mã Clojure.
  • Viết kịch bản - một số ngôn ngữ động đặc biệt hữu ích cho các tập lệnh ngắn và được thiết kế để được nhúng trong phần mềm được viết bằng ngôn ngữ khác. Các kịch bản Groovy chẳng hạn rất dễ nhúng vào một ứng dụng Java.
  • Các dự án polyglot - đôi khi có ý nghĩa khi sử dụng nhiều ngôn ngữ chỉ để khai thác các khả năng khác nhau của từng ngôn ngữ. Ví dụ, JVM hỗ trợ nhiều ngôn ngữ có thể tương tác khá trong suốt, do đó bạn có thể trộn Java (cho tốc độ và gõ tĩnh OOP) với Clojure (để phát triển tương tác, đồng thời và lập trình chức năng). Các dự án như vậy vẫn thường tách các ngôn ngữ khác nhau thành các tệp / thư mục nguồn riêng biệt, nhưng chúng được biên dịch cùng lúc để tạo ra một ứng dụng.

6

Có thể thực hiện một số kết hợp các ngôn ngữ bằng Perl Inline cho phép viết tập lệnh Perl và chèn các đoạn mã được viết bằng một ngôn ngữ khác:

Inline có hỗ trợ cho C, C ++, Java, Python, Ruby, Tcl, Trình biên dịch, Cơ bản, Guile, Befunge, Octave, Awk, BC, TT (Bộ công cụ mẫu), WebChat và thậm chí PERL


Tôi chưa bao giờ nghe nói về Perl Inline. Đó là một ý tưởng thú vị, nhưng nó có mang lại lợi thế nào cho cách tiếp cận thông thường của việc có các mô-đun riêng cho mã không PERL không?
Thất vọngWithFormsDesigner

1
@FrustratedWithFormsDesigner: Inline Perl là một mô-đun tuyệt vời, nhưng nó có một số sai sót. Nó hoạt động tốt, nhưng chỉ trong phạm vi của mã khá cơ bản. Mặc dù nó đã được thực hiện trong một thời gian, tôi sẽ không sử dụng nó trong bất kỳ loại sản xuất nào.
Năng động

3

SQL nhúng là một cách phổ biến để nhúng các câu lệnh SQL vào các chương trình của các ngôn ngữ khác.

Ngày nay, nó đã được thay thế gần như hoàn toàn bằng quyền truy cập Cơ sở dữ liệu dựa trên API dễ biên dịch hơn mà không cần sửa đổi ngôn ngữ máy chủ, nhưng thay vào đó hãy sử dụng các khả năng thông thường của nó.


1
Ngày nay, một SQL nhúng đã trở lại dưới dạng LINQ và nó vẫn ở đây.
SK-logic

@ SK-logic: LINQ có gì giống như SQL nhúng? Nó không phải là một ngôn ngữ khác, nó chỉ đơn giản là ứng dụng của các cấu trúc ngôn ngữ bổ sung trong ngôn ngữ máy chủ.
Joachim Sauer

LINQ là một DSL nhúng rất điển hình, xa lạ về mặt ngữ nghĩa đối với ngôn ngữ máy chủ của nó. Và, trong trường hợp LINQ2Query, nó hoạt động chính xác giống như SQL nhúng cũ đã làm, nó được dịch theo nghĩa đen sang SQL.
SK-logic

Nhưng SQL nhúng không được "dịch sang SQL". Bạn viết SQL bằng chữ bên trong mã C của bạn (và thường không nằm trong các hằng chuỗi). Ngay cả 'mặc dù LINQ sử dụng các tính năng ngôn ngữ (theo như tôi biết) được phát triển riêng cho LINQ, đó là "chỉ" một API trong ngôn ngữ máy chủ của nó.
Joachim Sauer

1
Pro C và Pro Fortran đã dịch các câu lệnh SQL một chút. Và LINQ không "chỉ" một API, đó là một API với đường cú pháp và một loạt các trình biên dịch có thể thay thế lẫn nhau. Điều này làm cho nó trở thành một ví dụ hoàn hảo về DSL nhúng toàn diện.
SK-logic

2

Một số ngôn ngữ lập trình có thể được sử dụng để tạo thành 1 exe. Một cách là sử dụng DLL. Tất nhiên có nhiều mối quan tâm về điều này. Ví dụ, tương thích tham số, tương thích COM và như vậy. Trong thực tế, nếu bạn nghĩ về cách bạn gọi một hệ thống cơ sở dữ liệu để làm việc, bạn có thể thấy rằng DBMS không phải lúc nào cũng được viết bằng ngôn ngữ mà bạn biết. Bạn có thể thậm chí không quan tâm miễn là giao diện được biết đến.

Khái niệm này được đưa ra xa hơn khi giải pháp của bạn sử dụng Dịch vụ web, đây thậm chí là một cách sạch hơn kết hợp nhiều thành phần phần mềm.

Trong thế giới .NET, tất cả những điều trên được áp dụng, hơn thế nữa, ở cấp độ giao diện XAML và giao diện HTML có thể sống cùng nhau trong Silverlight.

Trong thế giới UNIX, tại một thời điểm, chúng tôi đã sử dụng các tập lệnh KShell để khởi chạy các chương trình C ++ và COBOL để giải pháp có thể hoạt động.


2

Tôi nghĩ rằng nó sẽ được đề cập đến Cython ở đây. Đây là siêu ngôn ngữ của Python để viết các phần mở rộng C và mặc dù bản thân nó thực sự là một ngôn ngữ duy nhất, nhưng nó cho phép bạn sử dụng mã C trong mã Python, nếu bạn tuân thủ cú pháp kiểu Python của Cython


0

Ví dụ về kết hợp các ngôn ngữ: Jython (python trong Java), Cog (python được sử dụng như một trình tạo mã nhúng trong hầu hết mọi thứ). Tôi thường sử dụng mã Perl để tạo C ++, nếu bạn tính tạo mã.


0

.NET framework được xây dựng để cho phép một số ngôn ngữ tham gia vào một giải pháp. Nó hoạt động miễn là ngôn ngữ có thể tạo mã byte tương thích CLR.

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


Tôi không nghĩ đó là những gì các poster ban đầu có nghĩa. Mã byte kết quả có rất ít liên quan đến cách nó được viết bằng ngôn ngữ mà nó được biên dịch.
perdian

Tôi không nghĩ bạn đã hiểu câu hỏi. Tác giả đang nói về việc kết hợp nhiều ngôn ngữ trong một tệp tối nghĩa.
Craige

0

Rất khó, rất xấu và thường vô dụng khi kết hợp nhiều ngôn ngữ lập trình trong 1 tệp.

Tuy nhiên, có thể có một dự án lớn được viết bằng hơn 1 ngôn ngữ. Ví dụ, cả Mozilla Firefox và MySQL đều có mã C và C ++. Khi nói đến các dự án lớn, thực tế này thường được sử dụng vì một ngôn ngữ cụ thể cung cấp một số tính năng mà ngôn ngữ khác không có. Ví dụ, trong PHP, bạn có thể yêu cầu thực thi một tệp thực thi nhị phân, lấy kết quả của nó và sử dụng nó trong mã PHP của bạn kể từ thời điểm đó.

Nếu bạn tò mò về ngôn ngữ nào được sử dụng cho một số dự án nguồn mở quan trọng nhất trên thế giới, bạn có thể xem qua Ohloh.net. Thống kê về mã nguồn của nhiều dự án có thể được tìm thấy ở đó.


-1

Bạn có thể "trộn" các ngôn ngữ trong HTML. Điều thực sự quan trọng đối với cách nhiều trang web hoạt động mà bạn có thể nhúng javascript vào html. Nhưng tất nhiên, HTML là đánh dấu, không phải là ngôn ngữ lập trình.

Tôi nghĩ để làm những gì bạn đề xuất sẽ đòi hỏi phải viết một ngôn ngữ mới. Hoặc bạn sẽ phải tạo một trình thông dịch / trình biên dịch nói tất cả các ngôn ngữ đó và có thể đóng khung chúng một cách nhất quán hoặc bạn sẽ cần một số cách đánh giá từng dòng một cách rõ ràng bằng ngôn ngữ meta. Hai tùy chọn này về cơ bản là giống nhau ngoại trừ những gì lập trình viên phải làm để làm cho các ngôn ngữ hoạt động cùng nhau.


+1 về việc trộn các ngôn ngữ trong HTML, nhưng cá nhân tôi tin rằng sẽ tách biệt HTML / CSS và JS. Các nhà thiết kế web có thể thực hiện công việc của họ mà không cần cố gắng lội qua chuỗi JavaScript được nhúng trong trang web.
jmort253

Bạn có thể kết hợp các ngôn ngữ trong HTML, nhưng không nhiều ngôn ngữ trong số đó là ngôn ngữ lập trình , đây là chủ đề hiện có.
Alexios

Ơ Javascript không phải là ngôn ngữ lập trình? PHP? Tôi cũng đã thấy tiêm perl và python mặc dù đó là với các mô-đun Apache.
markw

-1

Ngôn ngữ là một công cụ. Trước khi chọn một công cụ (hơn nữa, thực hiện một số kết hợp máy quang phổ hummer-PC kỳ lạ) người ta nên tự hỏi - chính xác thì tôi muốn làm gì ?? Một khi câu trả lời được đưa ra, bạn sẽ phát hiện ra rằng loại hỗn hợp ngôn ngữ như vậy hiếm khi cần thiết.


-3

Có, có thể kết hợp các ngôn ngữ lập trình miễn là trình thông dịch / trình biên dịch của bạn có thể hiểu nó. Ví dụ, trộn javascript, PHP, python trong HTML hoặc C ++ trong C #.

Việc trộn các ngôn ngữ có thể làm cho việc đọc và sửa đổi mã trở nên khó khăn hơn, tuy nhiên, vì vậy nó phải được thực hiện một cách thận trọng. Một cách khác là tạo các tệp riêng cho mã bằng ngôn ngữ bạn cần gọi và nhập nó thay vì nhúng nó.

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.