Czy można łączyć języki programowania?

27

Od dłuższego czasu programuję, napisałem kilka podstawowych programów i chcę się uczyć. Dotarłem do punktu, w którym po prostu nie wiesz, czego się uczyć dalej i chciałbym zadać pytanie o moją ciekawość.

Krótko mówiąc, pytanie brzmi, czy można połączyć wiele języków programowania w jeden wynik? Na przykład, czy ten kod jest możliwy?

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

lub

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

To głupie pytanie, ale nie mogę wiedzieć, czy to możliwe, czy nie, dlatego zadaję to pytanie. W tym pytaniu zauważam, że używa kodu Python w kodzie HTML, jeśli mój powyższy przykład nie jest możliwy, co zrobił?

Bugster
źródło
12
Aby to zadziałało (bez doprowadzania ludzi do szaleństwa), potrzebne są co najmniej surowe zasady dotyczące ich interakcji i które części powinny być przetwarzane jako język.
6
Zajmie to jeden Hellova Lexer / Parser.
Chad Harrison
2
@Brian Lua jest osadzony w tym, że interpreter jest połączony z jakimś kodem C lub C ++ i służy do uruchamiania kodu Lua przechowywanego w ciągach znaków lub plikach zewnętrznych, prawdopodobnie wystawiając obiekty C / C ++ na kod Lua. Lua nie jest (nie często, jeśli w ogóle) „osadzona” w sensie tego pytania.
2
To tak, jakby stworzyć pięć alfabetów, każdy z różnymi symbolami dla 26 liter i połączyć je w jedną książkę: bezcelowe, irytujące i zbędne.
ThomasX
7
Wydaje mi się, że ludzie wyraźnie zapominają o najczęstszym (i tylko poprawnym, prawdziwym życiu, o którym mogę myśleć) przypadku użycia „łączenia języków” - fragmentów ASM w programach C / C ++ , zwykle ze względu na wydajność.
TC1

Odpowiedzi:

43

Twój pierwszy przykład jest w pewnym sensie możliwy. Zwykle takie rzeczy zdarzają się w PHP (i innych powiązanych językach programowania):

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

Kilka ważnych uwag na temat tego przykładu:

  • HTML NIE jest językiem programowania, to język znaczników.
  • PHP i HTML, a nie wykonywane / interpretowane w tym samym miejscu: kod PHP jest wykonywany przez interpretera PHP działającego na serwerze, a wynik jest „wstrzykiwany” do otaczającego HTML. Następnie ten cały obiekt blob jest wysyłany do klienta / przeglądarki, która renderuje pełny kod HTML.

Drugi przykład wygląda jak połączenie C ++ i Java. Możliwe, że skompilowane moduły napisane w różnych językach będą ze sobą rozmawiać, ale połączenie Java i C ++ w tym samym pliku źródłowym byłoby niezwykle mylące i trudne: skąd kompilator wiedziałby, które instrukcje to Java, a które C ++?

Teoretycznie można by napisać specjalny kompilator / preprocesor ze wskaźnikami „języka”, takimi jak:

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

Ale nie jestem pewien, czy robiąc to, zyskasz coś przydatnego.

W jaki sposób to hybrydowe środowisko językowe poradzi sobie z funkcjami językowymi, które są ze sobą niezgodne?

FrustratedWithFormsDesigner
źródło
Przykładem wszyscy zapomnieli o (w tym ja), więc prosimy, aby dodać go do swojej odpowiedzi: CUDA. Jest to połączenie dwóch bardzo różnych języków C, z niektórymi funkcjami skompilowanymi dla urządzenia (GPU), a niektóre pozostają na hoście, z wnioskiem o warstwie komunikacyjnej.
SK-logic
7
Często zdarza się, że JavaScript, HTML i PHP na jednej stronie. Okropne, ale nierzadkie.
Michael Borgwardt
1
Niezbyt dobrze zaznajomiony z PHP, ale kod ASP.NET (C # lub VB.NET) generuje HTML i JavaScript - i JavaScript jest często osadzony bezpośrednio na stronie .aspx. Całkowite rozdzielenie jest często cytowane jako ideał, ale szybki przegląd pytań w ASP.NET ze znacznikiem SO daje wyobrażenie o tym, jak skomplikowany może być.
sq33G
@ sq33G - ASP.NET generuje kod HTML. Możesz dołączyć javascript, jeśli chcesz. ASP.NET z pewnością NIE jest tym, co autor opisuje jako chęć zrobienia.
Ramhound
Chciałem przedstawić PHP / HTML / JS w jednym dokumencie, jeśli nikt inny tego nie zrobił.
Ben Brocka
19

Krótka odpowiedź

Nie całkiem.


Długa odpowiedź

Osadzanie

Zasadniczo pojedynczy plik źródłowy zawiera kod dla dokładnie jednego języka programowania. Zdarza się, że wiele języków jest łączonych w jednym pliku z kilku powodów:

  • Przetwarzanie kilku składniowo różnych języków jednocześnie jest niezwykle trudne (jeśli nie wręcz niemożliwe).
  • Różne języki traktują programowanie inaczej . Pojęcie funkcji przez Haskell jest inne niż C ++.

Łączenie

Różne języki programowania, które mają wspólny interfejs binarny aplikacji, mogą być łączone w jeden plik wykonywalny lub bibliotekę. Udostępnienie podpisów dwóch języków często wymaga trochę pracy, ale istnieją narzędzia ułatwiające ten proces.

Poligloty

Kod Polyglot jest prawidłowy i równoważny w więcej niż jednym języku. Strona 404 Stack Overflow zawiera jeden taki program:

Przepełnienie stosu 404 poliglota

Wypisuje „404” w Pythonie, Perlu, Ruby, C, Brainfuck i Befunge.

Wniosek

Języki rzadko mieszają się w plikach, a kiedy już są, to śmieje się . Ludzie starają się nawet unikać mieszania języków w projektach ze względu na dodatkowe problemy, które wprowadza. Tak więc, chociaż jest to technicznie możliwe, mieszanie różnych języków nie jest ani powszechne, ani pragmatyczne.

nieznanych
źródło
Nie widzę tu Ruby ...
Jason Lewis
@JasonLewis Nie znam Ruby, ale ten post mówi, że ocenia linię nr 4.
Maks.
9
Języki nie zawsze są mieszane dla śmiechu. Większość kompilatorów C pozwala na łączenie Asemblera i C, podobnie jak wiele Forths. W latach osiemdziesiątych jeden z najlepszych dialektów BASIC w grze, Acorn's BBC Basic, pozwalał na mieszanie zestawu 6502, co było wtedy bardzo pożądaną funkcją. Z pewnością rozśmieszyło to użytkowników BBC, ale prawie wszyscy inni płakali, zwłaszcza ci, którzy musieli ręcznie składać kod maszynowy 6502 i umieszczać w swoich programach surowe kody operacyjne DATA. Nie to, że jestem zgorzkniały czy coś takiego. Nieeee
Alexios
1
@ SK-logic SQL to język zapytań strukturalnych, a nie język programowania.
Maks.
1
Jedną ze smutnych rzeczy związanych z nowoczesnym tworzeniem oprogramowania jest to, że aplikacje w wielu językach są teraz o wiele trudniejsze. W czasach DOS prawie wszystko zostało skompilowane do tego samego pliku obiektowego i używało tych samych konwencji przekazywania parametrów. Naprawdę łatwo było połączyć je ze sobą. W dzisiejszych czasach nie tyle ...
Brian Knoblauch
7

Tak, to jest rzeczywiście możliwe. Oczywiście nie tak, jak sobie wyobrażałeś. Istnieje kilka języków stworzonych specjalnie do tego celu.

W praktyce bardzo przydatne może być mieszanie wielu języków specyficznych dla domeny w jednym języku hosta. Rzadko zachodzi potrzeba mieszania dwóch lub więcej języków „ogólnego przeznaczenia” razem w jednym pliku kodu źródłowego, chociaż często można znaleźć projekty napisane w obu, powiedzmy, VB.NET i C #, z różnymi komponentami językowymi skompilowanymi osobno.

Jeśli chodzi o HTML, to tylko język znaczników. Często możesz znaleźć kod po stronie serwera (np. W VB.NET), znacznikach HTML i kodzie JavaScript po stronie klienta zmieszanych w jednym pliku źródłowym, choć wielu uważa to za złą praktykę.

Logika SK
źródło
7

Jest to często nazywane kodem polyglot - istnieje kilka zabawnych / szalonych przykładów, jeśli podążasz za linkiem lub w różnych innych miejscach w sieci. Większość z nich jest po prostu dla zabawy / aby udowodnić, że jest to możliwe.

Mówiąc poważniej, istnieją różne przykłady z życia, w których można połączyć dwa lub więcej różnych języków:

  • Szablony WWW - języki takie jak pliki PHP lub JSP mieszają kod w HTML. Opinie różnią się znacznie, czy jest to dobry pomysł, czy nie.
  • Języki makr - często język makr jest mieszany z plikiem źródłowym, takim jak makra preprocesora C / C ++. Istnieją również interesujące przypadki, takie jak Lisp, w których językiem makr jest sam Lisp (jedyną różnicą jest to, czy kod jest uruchamiany w czasie kompilacji, czy w czasie wykonywania)
  • DSL - często definiowany jest język specyficzny dla domeny, aby pomóc skutecznie rozwiązać konkretny problem, który jest osadzony w kodzie źródłowym innego języka. Oto przykład pięknej DSL dla SQL, którą można osadzić w kodzie Clojure.
  • Skrypty - niektóre dynamiczne języki są szczególnie przydatne w przypadku krótkich skryptów i zostały zaprojektowane do osadzenia w oprogramowaniu napisanym w innym języku. Na przykład skrypty Groovy są bardzo łatwe do osadzenia w aplikacji Java.
  • Projekty Polyglot - czasem sensowne jest używanie wielu języków, aby wykorzystać różne możliwości każdego z nich. Na przykład JVM obsługuje wiele języków, które mogą współpracować dość transparentnie, więc możesz mieszać Javę (dla szybkości i statycznego OOP) z Clojure (dla interaktywnego programowania, współbieżności i programowania funkcjonalnego). Takie projekty nadal zazwyczaj dzielą różne języki na osobne pliki / foldery źródłowe, ale są one kompilowane w tym samym czasie, aby utworzyć pojedynczą aplikację.
mikera
źródło
6

Możliwe jest wykonanie kombinacji języków za pomocą Perla Inline, co pozwala napisać skrypt Perla i wstawić sekcje kodu napisane w innym języku:

Inline obsługuje C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (zestaw narzędzi szablonów), WebChat, a nawet PERL

JohnTESlade
źródło
Nigdy nie słyszałem o Perlu Inline. To ciekawy pomysł, ale czy daje przewagę nad tym, jakie jest prawdopodobnie zwykłe podejście do posiadania oddzielnych modułów dla kodu nie-PERL?
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner: Inline Perl to świetny moduł, ale ma pewne wady. Działa dobrze, ale tylko w zakresie dość podstawowego kodu. Chociaż nad tym pracowano przez jakiś czas, nie używałbym go w żadnej produkcji.
Dynamiczny
3

Wbudowany SQL był powszechnym sposobem osadzania instrukcji SQL w programach innych języków.

Obecnie został prawie całkowicie zastąpiony przez łatwiejszy do skompilowania dostęp do bazy danych oparty na API, który nie musi modyfikować języka hosta, ale zamiast tego korzystać z jego normalnych umiejętności.

Joachim Sauer
źródło
1
Obecnie osadzony SQL powrócił w formie LINQ i już tu zostanie.
SK-logic
@ SK-logic: w jaki sposób LINQ jest podobny do wbudowanego SQL? To nie jest inny język, to po prostu zastosowanie dodatkowych konstrukcji języka w języku hosta.
Joachim Sauer
LINQ jest bardzo typowym osadzonym DSL, semantycznie obcym względem języka hosta. W przypadku LINQ2SQL zachowuje się dokładnie tak samo jak stary wbudowany SQL, jest tłumaczony dosłownie na SQL.
SK-logic
Ale osadzony SQL nie jest „tłumaczony na SQL”. Piszesz dosłownego SQL wewnątrz kodu C (a nie zazwyczaj w stałych łańcuchowych albo). Nawet „chociaż LINQ używa funkcji językowych, które (o ile mi wiadomo) zostały opracowane specjalnie dla LINQ, jest to„ tylko ”interfejs API w języku hosta.
Joachim Sauer
1
Pro C i Pro Fortran trochę przetłumaczyły instrukcje SQL. LINQ to nie tylko „API”, to API z cukrem składniowym i szeregiem wymiennych zaplecza kompilatora. Co czyni go doskonałym przykładem w pełni wbudowanego DSL.
SK-logic
2

Do utworzenia 1 exe można użyć kilku języków programowania. Jednym ze sposobów jest użycie bibliotek DLL. Oczywiście istnieją różne obawy dotyczące tego. Na przykład zgodność parametrów, zgodność COM i tym podobne. W rzeczywistości, jeśli pomyślisz o tym, jak wywołać system bazy danych w celu wykonywania pracy, może się okazać, że DBMS nie zawsze jest napisany w języku, który znasz. Prawdopodobnie nie obchodzi Cię to, dopóki interfejs jest znany.

Ta koncepcja jest kontynuowana, gdy twoje rozwiązanie korzysta z usług sieciowych, co jest jeszcze czystszym sposobem łączenia wielu składników oprogramowania.

W świecie .NET wszystkie powyższe zasady obowiązują na poziomie interfejsu. Interfejsy XAML i HTML mogą żyć razem w Silverlight.

W świecie UNIX używaliśmy kiedyś skryptów KShell do uruchamiania programów C ++ i COBOL, aby rozwiązanie mogło działać.

Bez szans
źródło
2

Myślę, że warto tu wspomnieć o Cython . Jest to nadzbiór Pythona do pisania rozszerzeń C i chociaż jest to naprawdę unikalny język sam w sobie, w zasadzie pozwala ci używać kodu C w kodzie Pythona, jeśli jesteś zgodny ze składnią stylu Pythona

Magnus
źródło
0

Przykłady łączenia języków: Jython (python w Javie), Cog (python używany jako generator kodu osadzonego w prawie wszystkim). Często używałem kodu Perla do generowania C ++, jeśli liczyć generowanie kodu.

Michael Kohne
źródło
0

Struktura .NET została stworzona, aby umożliwić udział kilku języków w jednym rozwiązaniu. Działa tak długo, jak długo język może wygenerować kod bajtowy zgodny z CLR.

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

Jalayn
źródło
Nie sądzę, żeby to oznaczało oryginalny plakat. Wynikowy kod bajtowy ma bardzo mało wspólnego ze sposobem, w jaki został napisany w języku, z którego został skompilowany.
Perdian
Nie sądzę, że zrozumiałeś pytanie. Autor mówi o łączeniu wielu języków w jeden niejasny plik.
Craige
0

Łączenie wielu języków programowania w jednym pliku jest bardzo trudne, bardzo brzydkie i często bezużyteczne.

Można jednak mieć duży projekt napisany w więcej niż 1 języku. Na przykład zarówno Mozilla Firefox, jak i MySQL mają w sobie kod C i C ++. W przypadku dużych projektów praktyka ta jest często stosowana, ponieważ określony język zapewnia pewne funkcje, których inny nie. Na przykład w PHP możesz poprosić o wykonanie binarnego pliku wykonywalnego, pobrać jego wynik i użyć go w kodzie PHP od tego momentu.

Jeśli jesteś ciekawy, jakie języki są używane w najważniejszych projektach typu open source na świecie, możesz to sprawdzić Ohloh.net. Można tam znaleźć statystyki dotyczące kodu źródłowego wielu projektów.

Radu Murzea
źródło
-1

Możesz „mieszać” języki w HTML. W rzeczywistości ważne jest, jak wiele witryn działa, dzięki czemu można osadzić JavaScript w HTML. Ale oczywiście HTML to znaczniki, a nie język programowania.

Myślę, że zrobienie tego, co proponujesz, i tak pociągałoby za sobą napisanie nowego języka. Albo będziesz musiał stworzyć interpretera / kompilatora, który mówiłby we wszystkich tych językach i mógłby konsekwentnie je obramować, albo potrzebowałbyś jakiegoś sposobu oceny linii po linii, wyraźnie w jakimś meta-języku. Te dwie opcje są w zasadzie takie same, z wyjątkiem tego, co programista musi zrobić, aby języki współpracowały ze sobą.

markw
źródło
+1 za mieszanie języków w HTML, ale osobiście uważam, że oddzielenie HTML / CSS i JS jest czystsze. Projektanci stron internetowych mogą robić swoje, nie próbując przedzierać się przez ciąg JavaScript, który jest osadzony w całej witrynie.
jmort253
Możesz mieszać języki w HTML, ale niewiele z nich to języki programowania , o czym jest mowa.
Alexios
Co? JavaScript nie jest językiem programowania? PHP? Widziałem także zastrzyki w perlu i pythonie, chociaż było to z modułami Apache.
markw
-1

Język to narzędzie. Przed wybraniem narzędzia (co więcej, stworzenia dziwnej kombinacji hummer-PC-spektroskop) należy zadać sobie pytanie - co dokładnie chcę zrobić? Po udzieleniu odpowiedzi przekonasz się, że taka mieszanka języków rzadko jest konieczna.

Hamo
źródło
-3

Tak, można mieszać języki programowania, o ile Twój interpreter / kompilator może to zrozumieć. Na przykład mieszanie javascript, PHP, python w HTML lub C ++ w C #.

Mieszanie języków może jednak utrudniać czytanie i modyfikowanie kodu, dlatego należy to robić ostrożnie. Jednym ze sposobów jest utworzenie osobnych plików dla kodu w języku, do którego chcesz zadzwonić, i zaimportowanie go zamiast osadzenia.

Garrett Hall
źródło