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?
Odpowiedzi:
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 są 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,
make
a 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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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 .
źródło