Czy kompilatory są używane poza programowaniem?

14

O ile mi wiadomo, kompilatory są przeznaczone dla programistów kompilujących swój kod w pliki wykonywalne (kod maszynowy). Kompilatory nie obejmują komputera klienta ani systemu użytkownika końcowego.

Zamiast tego programiści używają kompilatora do konwersji kodu na kod maszynowy, który jest następnie przenoszony na inne maszyny w celu wykorzystania jako aplikacje.

Czy kompilatory mają funkcję poza tym procesem? Jeśli tak, kiedy są używane?

Pankaj Upadhyay
źródło
21
Tak, kompilatory kompilują kod.
Tom Squires
@Tom: Czytałem gdzieś, że kompilatory C są instalowane na różnych komputerach, w tym na konsolach do gier. Czy to oznacza, że ​​piszemy kod w C, a następnie jest on wysyłany na te urządzenia, gdzie są kompilowane przez kompilator, a następnie wykonywane przez interpreter?
Pankaj Upadhyay
3
@Pankaj Upadhyay: Jest możliwe, że kod mógł wysyłane do urządzenia, a następnie zestawiane w procesie wewnętrznego. Jest mało prawdopodobne, aby użytkownik urządzenia kiedykolwiek to widział lub wiedział o tym. Można to zrobić, jeśli części kodu muszą zostać skompilowane dla określonego sprzętu, a rozwiązania testujące sprzęt w czasie wykonywania są zbyt wolne, co prowadzi do konieczności dystrybucji kodu i kompilacji podczas instalacji. Może ...
FrustratedWithFormsDesigner
3
@Pankaj Żadne konsole do gier nie są dostarczane z kompilatorami, ale niektóre można na nich zainstalować. Sony dostarczyło wersję systemu Linux i GCC, którą można na przykład zainstalować na PS2. Inne osoby włamały się / włamały się do innych systemów operacyjnych i oprogramowania na konsole.
IronMensan
4
@Stargazer: Czy chodziło Ci o: „Nie, kompilatory tłumaczą z języka źródłowego na język docelowy”? Pominięcie przecinka powoduje, że zdanie oznacza przeciwieństwo zamierzonego znaczenia.
Daniel Pryden

Odpowiedzi:

19

Tak i nie. Tak, klasyczny scenariusz polega na tym, że programista używa kompilatora do generowania kodu maszynowego z kodu źródłowego, a następnie kod maszynowy jest następnie dystrybuowany do użytkowników.

Tam kilka wyjątków od tego jednak. Po pierwsze, wiele projektów typu open source jest dystrybuowanych głównie (lub nawet wyłącznie) w formie kodu źródłowego, i oczekują, że użytkownik końcowy je zainstaluje, wpisując kilka poleceń, takich jak, makea następniemake intall. Spowoduje to wywołanie kompilatora, konsolidatora itp. W celu wygenerowania kodu maszynowego z kodu źródłowego dla tego komputera użytkownika. Jednak w takich przypadkach proces budowania i instalowania jest (przynajmniej zamierzony) zautomatyzowany do tego stopnia, że ​​użytkownik rzadko potrzebuje dużej wiedzy na ten temat, poza tym, że jeśli nigdy wcześniej nie instalował pakietu tylko do kodu źródłowego , ich menedżer pakietów zazwyczaj wymienia niektóre pakiety „programistyczne” jako warunek wstępny instalacji aplikacji, na których im naprawdę zależy (choć niektórzy nadal uważają to za nieprzyjazne dla użytkowników końcowych).

Kolejnym wyjątkiem (o którym wspomniano, ale nie wyjaśniono go zbyt dobrze w innych odpowiedziach, które widziałem) są kompilatory just-in-time (JIT). Kilka oczywistych przykładów kompilatorów JIT to Microsoft Common Language Runtime (CLR) i Java Virtual Machine (JVM). W takich przypadkach zwykle dwa całkowicie osobne kompilatory biorą udział w tłumaczeniu kodu źródłowego na kod maszynowy. Jeden jest używany przez programistę. Jednak zamiast generować kod maszynowy bezpośrednio, generuje kod bajtowy niezależny od maszyny. CLR / JVM zawiera następnie drugi kompilator, całkowicie odrębny od pierwszego, który konwertuje te kody bajtów na kod maszynowy dla komputera docelowego.

Powinienem dodać, że drugi kompilator nie jest absolutnie konieczny. Wczesne wersje JVM (na przykład) po prostu interpretowały kody bajtów zamiast ich kompilowania. Często wiąże się to jednak z dość poważnym ograniczeniem wydajności, więc najbardziej rozsądne najnowsze maszyny JVM przeznaczone do użytku produkcyjnego obejmują kompilator JIT.

Jerry Coffin
źródło
24

Tak, kompilatory są używane głównie przez programistów, z kilkoma ważnymi wyjątkami. Użytkownicy końcowi czasami używają kompilatorów do kompilacji i instalacji najnowszego oprogramowania typu open source, nawet jeśli nie wprowadzają żadnych zmian w kodzie. Ponadto niektóre języki programowania nie mają kompilatorów. Zamiast tego używają tłumaczy, którzy „kompilują” w locie. W takim przypadku użytkownicy końcowi muszą zainstalować tłumacza na swoich komputerach.

Karl Bielefeldt
źródło
4
Gdybyśmy ograniczyli definicję „kompilatorów” do programów generujących pliki wykonywalne, byłaby to dobra odpowiedź. Jest to jednak tylko podzbiór prawdziwej definicji „kompilatora”
riwalk
16
@Jan Soltis: Nie zgadzam się. Skompilowałem jądro Linux ze źródła: czy to oznacza, że ​​jestem programistą jądra Linux ? Nigdy nie modyfikowałem kodu jądra Linuksa ani nie przesyłałem łaty - powiedziałbym, że to znaczy, że nie jestem programistą jądra. Ponadto przez kilka lat, kiedy używałem Gentoo jako głównego systemu operacyjnego, kompilowałem każde oprogramowanie na maszynie. Jednak zdecydowana większość z nich została skompilowana automatycznie przez system zarządzania pakietami Portage. Twierdziłbym, że w takim przypadku działałem jako użytkownik końcowy, ale nie jako programista .
Daniel Pryden
8
@Jan Soltis: Wiem, że taka jest Twoja opinia. Z szacunkiem się nie zgadzam. Dostarczyłem kontrargumenty na poparcie mojej pozycji, podczas gdy ty nadal wysuwasz nieobsługiwane twierdzenia. Wydaje ci się, że istnieje wyraźna granica między „programistą” a „użytkownikiem końcowym”, która nie wydaje się istnieć.
Daniel Pryden,
6
Pobieranie źródeł, a następnie uruchamianie „make install” nie jest programistą. Jest to zdecydowanie operacja użytkownika końcowego.
Kristopher Johnson
3
@Jan: Mogę zaakceptować fakt, że używanie dystrybucji takiej jak Gentoo, która kompiluje pakiety, czyni cię przynajmniej zaawansowanym użytkownikiem, ale nadal jest to wyraźnie typ użytkownika. Kompilowanie kodu innych osób, bez modyfikowania go, dodawania do niego, a nawet czytania, nie czyni z ciebie programisty.
Carson63000,
10

tak

Kompilator jest zdefiniowany jako program, który tłumaczy kod z jednego języka na inny (patrz Wikipedia ). Najczęstszym zastosowaniem kompilatorów jest tłumaczenie języka źródłowego na kod maszynowy, ale to definiuje słowo „kompilator”.

Na przykład Python generuje kod bajtowy podczas importowania modułu, a zatem mieści się w definicji kompilatora (ponieważ konwertuje z języka źródłowego Python na język docelowy, kod bajtowy Python).

Innym przykładem jest silnik JavaScript V8. To konwertuje JavaScript w x86 kodu maszynowego , a zatem pasuje do definicji kompilatora, jak również. V8 nie tylko pasuje do definicji kompilatora, ale jest także zawarty w Chrome i jest bardzo szeroko stosowany na komputerach klienckich.

riwalk
źródło
4

Jeden przypadek dotyczyłby aplikacji, która dynamicznie generowała kod w czasie wykonywania, a następnie uruchamiała wygenerowany kod. Ten kod musiałby zostać skompilowany w czasie wykonywania.

Edycja: Istnieją inne wyjątki, ale zostały już wspomniane w innych odpowiedziach.

Morgan Herlocker
źródło
+1 po prostu powiedz JIT
gnat
1
Silnik V8 w Chrome nie jest wyjątkiem od nieparzystych.
riwalk
Zaktualizowano w celu wyjaśnienia. Zdaję sobie sprawę, że są inne wyjątki.
Morgan Herlocker
3

kompilatory są przeznaczone tylko dla programistów do kompilowania kodu języka programowania do plików wykonywalnych (kod-machin)

Powiedziałbym, że „kompilatory są przeznaczone głównie dla programistów ...”. Widziałem jednak przykłady, w których programy generują na bieżąco nowy kod języka programowania i dlatego wymagają kompilatora, który zostanie zainstalowany na komputerze użytkownika końcowego. Nie oznacza to, że użytkownik końcowy musi sam pracować z kompilatorem.

Możliwe przyczyny tego programu:

  • wydajność: pomyśl o aplikacji opartej na regułach, w której reguły są przechowywane w pewnego rodzaju magazynie danych użytkowników końcowych, a Ty masz pewne dane masowe do przetworzenia przez te reguły. Zamiast wielokrotnie interpretować reguły, program najpierw generuje kod przetwarzania, kompiluje go i uruchamia na danych, które mają być przetwarzane

  • pomyśl o programie, w którym użytkownik końcowy może dodać jakąś formułę matematyczną, a twórca programu nie chce w tym celu zaimplementować własnego parsera / interpretera. Zamiast tego program przyjmuje tę formułę, wprowadza pewne dodatki, aby przekształcić go w prawidłowy fragment kodu programu, pozwól kompilatorowi go skompilować, a następnie uruchomi.

Doktor Brown
źródło
hmm .... To nie znaczy, że użytkownik musi sam pracować z kompilatorem . To właściwie wyjaśnia i wyjaśnia.
Pankaj Upadhyay
2

Zgadza się - kompilatory kompilują kod źródłowy w postaci pliku wykonywalnego, który jest następnie łączony w wykonywalnym pliku binarnym przez linker. Kod źródłowy może być również wykonany bezpośrednio przez interpretera, takiego jak jedna z wielu powłok wiersza poleceń (powłoka C, bash, zsh itp.), Awk, sed i tak dalej.

Wyznaczenie wyraźnej granicy między „programistą” a „użytkownikiem końcowym” może być trudne, chyba że ograniczysz dyskusję do konkretnego produktu. Wszyscy programiści są „użytkownikami końcowymi” narzędzi, których używają, a „użytkownicy końcowi” mogą mieć narzędzia programistyczne, takie jak kompilatory i interpretery zainstalowane na ich komputerach.

Caleb
źródło
2
Ok, idę do -1 tego, ponieważ jest wiele nieporozumień na temat kompilatorów. Kompilatory tłumaczą kod z języka źródłowego na język docelowy. Powiedzenie, że generują kod maszynowy, przypomina powiedzenie, że pojazdy mają 4 koła (tak, większość pojazdów ma 4 koła, ale motocykl też jest pojazdem. W ten sam sposób większość kompilatorów generuje kod maszynowy, ale konwerter C # -> VB jest kompilator również)
riwalk
1
@ Stargazer712, zapewniam cię, że nie ma nieporozumień - bardzo dobrze wiem, co robią kompilatory, dzięki. Ale jeśli ktoś, kto nie wie, pyta mnie, co to jest samochód, prawdopodobnie powiedziałbym, że samochód ma cztery koła, mimo że niektórzy nie . Pedantyczna definicja często myli więcej, niż wyjaśnia osobie próbującej uporać się z koncepcją. „Kompilator” może być również opisem zadania, ale wzmianka o tym nie pomogłaby w tym przypadku.
Caleb
1

Administratorzy mogą również potrzebować używania języków programowania w pisaniu skryptów do wykonywania różnych zautomatyzowanych zadań. Na przykład skrypt, który usuwa stare pliki dziennika z serwera po 90 dniach, aby zwolnić miejsce na dysku. Język użyty do napisania skryptu musi zostać zinterpretowany lub skompilowany, aby można go było uruchomić w systemie.

JB King
źródło
1

Niektóre programy są metaprogramami : podczas działania mogą wygenerować inny program (lub kod źródłowy) i skompilować go, a następnie uruchomić w jakiś sposób. Przeczytaj także o programowaniu wieloetapowym .

Aby korzystać z tego rodzaju programów, kompilator byłby potrzebny, nawet jeśli użytkownik nie wie, jak sam się programować (ponieważ komputer wygenerowałby kod, który należy skompilować).

Na przykład zobacz MELT (który generuje kod C ++ w celu rozszerzenia GCC ) lub system sztucznej inteligencji CAIA J.Pitrat (który generuje kod C - w szczególności własny kod - w celu rozwiązania problemów kombinatorycznych).

Ponadto niektóre języki i niektóre implementacje prawie wymagają obecności kompilatora wszędzie (w każdym programie zakodowanym w tym języku i implementacji). Po pierwsze, kilka przeglądarek internetowych zawiera silnik Javascript JIT (jak V8 ). Ponadto większość implementacji Common Lisp - np. SBCL - zawiera kompilator (nawet przydatny do uruchamiania aplikacji, które mogą generować i oceniać wyrażenia). Przeczytaj także o językach homoiconic i programach Qine .

Basile Starynkevitch
źródło