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ł?


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?


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.


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ę.


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ę.

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


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.


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ć.


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


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.


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


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.


-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ą.


+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.


-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.