Czas działania a czas kompilacji


370

Jaka jest różnica między czasem wykonywania a czasem kompilacji?


Podałem bardzo mały, ale wyraźny przykład ... Nie onieśmiela go ogromnymi szczegółami. Następnie wszystkie odpowiedzi mogą zostać przejrzane. Są niesamowici ...
sankar banerjee

Odpowiedzi:


479

Różnica między czasem kompilacji a czasem wykonywania jest przykładem tego, co sprytni teoretycy nazywają rozróżnieniem fazowym . Jest to jedna z najtrudniejszych koncepcji do nauki, szczególnie dla osób bez dużego doświadczenia w językach programowania. Aby podejść do tego problemu, warto zapytać

  1. Jakie niezmienniki spełnia program?
  2. Co może pójść nie tak w tej fazie?
  3. Jeśli faza się powiedzie, jakie są dalsze warunki (co wiemy)?
  4. Jakie są wejścia i wyjścia, jeśli występują?

Czas kompilacji

  1. Program nie musi spełniać żadnych niezmienników. W rzeczywistości nie musi to być dobrze sformułowany program. Możesz podać ten kod HTML do kompilatora i oglądać go barf ...
  2. Co może pójść nie tak podczas kompilacji:
    • Błędy składniowe
    • Błędy sprawdzania typu
    • (Rzadko) awaria kompilatora
  3. Jeśli kompilator się powiedzie, co wiemy?
    • Program był dobrze uformowany - sensowny program w dowolnym języku.
    • Możliwe jest uruchomienie programu. (Program może ulec awarii natychmiast, ale przynajmniej możemy spróbować.)
  4. Jakie są wejścia i wyjścia?
    • Dane wejściowe były kompilowanym programem, a także wszelkie pliki nagłówkowe, interfejsy, biblioteki lub inne voodoo, które musiał zaimportować , aby się skompilować.
    • Mam nadzieję, że dane wyjściowe to kod asemblera, relokowalny kod obiektowy lub nawet program wykonywalny. Lub jeśli coś pójdzie nie tak, wynik jest wiązką komunikatów o błędach.

Czas pracy

  1. Nic nie wiemy o niezmiennikach programu --- są to wszystko, co umieścił programista. Niezmienniki w czasie wykonywania rzadko są wymuszane przez sam kompilator; potrzebuje pomocy programisty.
  2. To, co może pójść nie tak, to błędy w czasie wykonywania :

    • Dzielenie przez zero
    • Dereferencje wskaźnika zerowego
    • Kończy się pamięć

    Mogą również występować błędy wykrywane przez sam program:

    • Próbuję otworzyć plik, którego nie ma
    • Próbuję znaleźć stronę internetową i odkryć, że domniemany adres URL nie jest dobrze sformułowany
  3. Jeśli czas wykonywania powiedzie się, program kończy się (lub kontynuuje pracę) bez awarii.
  4. Wejścia i wyjścia zależą wyłącznie od programisty. Pliki, okna na ekranie, pakiety sieciowe, zadania wysyłane do drukarki, nazywacie to. Jeśli program uruchamia pociski, jest to wyjście i dzieje się to tylko w czasie wykonywania :-)

13
Bardzo dobra odpowiedź na to, co obejmuje (+1), jednak nawet nie dotykasz meta-programowania aspektów czasu kompilacji vs. czasu wykonywania i to, IMHO, jest najbardziej interesującą częścią. Przyznaję, biorąc pod uwagę, że odpowiedź została zaakceptowana, że ​​może być poza tym, czego szukał PO.
BCS

4
Fajnie, jeśli ktoś zapyta mnie o to podczas moich wykładów, skorzystam z twojej odpowiedzi :-)
e-satis

12
To naprawdę miła odpowiedź. Jest to dość jasne i zrozumiałe. Nie jest łatwo znaleźć tak jasne odpowiedzi w Google.
Tarik

7
Nawet jeśli zaprogramowałeś jakiś czas, nadal nie jest łatwo go zdobyć ... to nie tylko początkujący człowiek. Dobre pytanie OP.
PositiveGuy,

11
„Program nie musi spełniać żadnych niezmienników. W rzeczywistości nie musi być wcale dobrze uformowanym programem. Możesz podać ten kod HTML do kompilatora i oglądać go bez końca ...” Nie mam pojęcia, co mówisz tutaj. Czy możesz to wyjaśnić w prosty sposób, a nie przeciążony tymi wszystkimi śmieciami technicznymi?
PositiveGuy,

175

Myślę o tym pod kątem błędów i kiedy można je złapać.

Czas kompilacji:

string my_value = Console.ReadLine();
int i = my_value;

Do wartości ciągu nie można przypisać zmiennej typu int, więc kompilator na pewno wie w czasie kompilacji, że ten kod ma problem

Czas pracy:

string my_value = Console.ReadLine();
int i = int.Parse(my_value);

Tutaj wynik zależy od tego, jaki ciąg znaków został zwrócony przez ReadLine (). Niektóre wartości mogą być analizowane jako int, inne nie. Można to ustalić tylko w czasie wykonywania


59
Teraz wszyscy możemy to zrozumieć. Brak tutaj ogólnych słów śmieci. Miły.
PositiveGuy,

W przypadku aplikacji na iPhone'a: ​​czy czas kompilacji jest po raz pierwszy kompilowany przez programistę do .approzszerzenia? czy zdarza się to przy każdym uruchomieniu aplikacji przez użytkownika?
Kochanie,

1
@ Kochanie jest kompilowany po raz pierwszy przez programistę do .app
maj-

2
To świetna odpowiedź, która obejmuje koncepcyjnie różnicę między czasem kompilacji a czasem wykonywania. Doceniam wybraną odpowiedź naukową, profesorską, ale ta jest jasna i zwięzła. Po przeczytaniu tej odpowiedzi mogę wrócić i przeczytać wybraną odpowiedź, i ma to większy sens. Dzięki
mojave

72

Czas kompilacji: okres, w którym Ty, programista, kompilujesz swój kod.

Czas działania: okres, w którym użytkownik uruchamia oprogramowanie.

Czy potrzebujesz bardziej przejrzystej definicji?


12
@BCS: OP mógł mieć niezwykle proste wprowadzenie do programowania przy użyciu języka interpretowanego lub kompilowanego bajtowo, a następnie uruchamianego w jednym kroku, tak że rozróżnienie nigdy nie było potrzebne. Pytanie naiwne, ale nie głupie.
dmckee --- były moderator kociak

@dmckee: Myślę, że ta odpowiedź nie byłaby przydatna dla użytkownika, ponieważ nie zawiera więcej informacji niż oryginalne pytanie. Każdy, kto zadałby pytanie, na które odpowiada ta odpowiedź, nie ma programowania biznesowego (i nie sądzę, żeby OP to zadawał).
BCS

Mam szybkie pytanie. Kiedy ktoś mówi, że typowy błąd czasu wykonania dzieli się przez zero, ale co jeśli masz zmienną, powiedzmy, int x = 3/0ale nic nie robisz z tą zmienną. Nie drukujemy tego ani nic. Czy nadal będzie to uważane za błąd wykonania?
Robben,

W przypadku aplikacji na iPhone'a: ​​czy czas kompilacji jest po raz pierwszy kompilowany przez programistę do rozszerzenia .app? czy zdarza się to przy każdym uruchomieniu aplikacji przez użytkownika? Jeśli jest to czas kompilacji, dla którego kompilowany jest kod programisty, dlaczego miałbym się tym przejmować? Mam na myśli, że to nie wpłynie na komfort użytkowania, prawda? Ponieważ zabiłoby to programistów tylko czas!
Kochanie,

1
@Robben Zakładam, że masz odpowiedź po tak długim czasie, ale ja odpowiem na nią innym. Tak, byłby to błąd działania, nawet jeśli jej nie użyjesz
فربد ضروري

22

( edytuj : poniższe informacje dotyczą języka C # i podobnych, mocno pisanych języków programowania. Nie jestem pewien, czy to ci pomoże).

Na przykład następujący kompilator zostanie wykryty przez kompilator (w czasie kompilacji ) przed uruchomieniem programu i spowoduje błąd kompilacji:

int i = "string"; --> error at compile-time

Z drugiej strony kompilator nie może wykryć następującego błędu: Otrzymasz błąd / wyjątek w czasie wykonywania (gdy program jest uruchomiony).

Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"];  // --> exception at run-time

Wyjątki Hashtable był jednym, ale odkryłem, że największym krokiem było od .net 1.1 do .net 2.0, przechodząc od zestawów danych bez typów do typów (i teraz linq). Próbuję rozwiązać problem z uszkodzonym formularzem za pomocą podejrzanej bazy danych, która bardzo mnie zasmuciła!
Spence

19

Tłumaczenie kodu źródłowego na działające na ekranie [dysk | dysk | sieć] może odbywać się (z grubsza) na dwa sposoby; nazwać ich kompilacją i tłumaczeniem.

W skompilowanym programie (przykładami są c i fortran):

  1. Kod źródłowy jest wprowadzany do innego programu (zwykle nazywanego kompilatorem - rysunek go), który tworzy program wykonywalny (lub błąd).
  2. Plik wykonywalny jest uruchamiany (przez podwójne kliknięcie lub wpisanie jego nazwy w wierszu poleceń)

Mówi się, że rzeczy, które zdarzają się w pierwszym kroku, mają miejsce w „czasie kompilacji”, a rzeczy, które zdarzają się w drugim kroku, mają miejsce w „czasie wykonywania”.

W interpretowanym programie (przykład MicroSoft basic (on dos) i python (myślę)):

  1. Kod źródłowy jest podawany do innego programu (zwykle nazywanego tłumaczem), który „uruchamia” go bezpośrednio. Tutaj interpreter służy jako warstwa pośrednia między twoim programem a systemem operacyjnym (lub sprzętem w naprawdę prostych komputerach).

W takim przypadku różnica między czasem kompilacji a czasem wykonywania jest trudniejsza do ustalenia i znacznie mniej istotna dla programisty lub użytkownika.

Java jest rodzajem hybrydy, w której kod jest kompilowany do kodu bajtowego, który następnie działa na maszynie wirtualnej, która zwykle jest interpreterem kodu bajtowego.

Istnieje również przypadek pośredni, w którym program jest kompilowany do kodu bajtowego i uruchamiany natychmiast (jak w awk lub perl).


11

Zasadniczo, jeśli Twój kompilator może zrozumieć, co masz na myśli lub jaką wartość ma „w czasie kompilacji”, może to zakodować na stałe w kodzie wykonawczym. Oczywiście, jeśli kod środowiska wykonawczego musi wykonywać obliczenia za każdym razem, gdy będzie działał wolniej, więc jeśli można coś ustalić w czasie kompilacji, jest znacznie lepiej.

Na przykład.

Stałe składanie:

Jeśli napiszę:

int i = 2;
i += MY_CONSTANT;

Kompilator może wykonać tę kalkulację w czasie kompilacji, ponieważ wie, co to jest 2 i czym jest MY_CONSTANT. W ten sposób oszczędza się wykonywania obliczeń przy każdym wykonaniu.


Łatwiej jest utrzymać kod czasu kompilacji niż kod związany ze środowiskiem wykonawczym. W czasie kompilacji możesz użyć kompilatora, aby sprawdzić niektóre rzeczy. Sprawdzanie tych samych rzeczy w środowisku wykonawczym zajmuje więcej czasu, ponieważ obejmuje testowanie.
user1154664,

10

Hmm, ok, środowisko wykonawcze służy do opisania czegoś, co dzieje się, gdy program jest uruchomiony.

Czas kompilacji służy do opisania czegoś, co dzieje się podczas budowania programu (zwykle przez kompilator).


8

Czas kompilacji:

Rzeczy, które są wykonywane w czasie kompilacji, ponoszą (prawie) nie kosztują, gdy uruchamiany jest program wynikowy, ale mogą powodować duże koszty podczas kompilacji programu.

Czas pracy:

Mniej więcej dokładnie odwrotnie. Niewielkie koszty podczas kompilacji, większe koszty podczas uruchamiania programu.

Z innej strony; Jeśli coś jest wykonywane w czasie kompilacji, działa tylko na komputerze, a jeśli coś jest w czasie wykonywania, działa na komputerze użytkownika.

Stosowność

Przykładem tego, gdzie jest to ważne, jest typ nośny jednostki. Wersja czasu kompilacji (jak Boost.Units lub moja wersja w D ) kończy się tak samo szybko, jak rozwiązanie problemu z natywnym kodem zmiennoprzecinkowym, podczas gdy wersja wykonawcza kończy się pakowaniem informacji o jednostkach, które są wartościami i wykonuj w nich kontrole obok każdej operacji. Z drugiej strony wersje czasu kompilacji wymagają, aby jednostki wartości były znane w czasie kompilacji i nie mogły poradzić sobie z przypadkiem, gdy pochodzą one z danych wejściowych w czasie wykonywania.


8

Z poprzedniej podobnej odpowiedzi na pytanie Jaka jest różnica między błędem wykonania a błędem kompilatora?

Błędy kompilacji / Czas kompilacji / Składnia / Semantyczne: Błędy kompilacji lub czasu kompilacji są błędami, które wystąpiły w wyniku błędu literowego, jeśli nie będziemy przestrzegać właściwej składni i semantyki dowolnego języka programowania, wówczas kompilator generuje błędy czasu kompilacji. Nie pozwolą Twojemu programowi na wykonanie pojedynczego wiersza, dopóki nie usuniesz wszystkich błędów składniowych lub dopóki nie zdebugujesz błędów czasu kompilacji.
Przykład: brak średnika w C lub błędne wpisanie intjako Int.

Błędy w czasie wykonywania: Błędy w czasie wykonywania to błędy, które są generowane, gdy program działa. Tego rodzaju błędy powodują, że Twój program zachowuje się nieoczekiwanie, a nawet może go zabić. Są one często nazywane wyjątkami.
Przykład: Załóżmy, że czytasz plik, który nie istnieje, spowoduje błąd działania.

Przeczytaj więcej o wszystkich błędach programowania tutaj


7

Jako dodatek do innych odpowiedzi, oto jak wyjaśnię to laikowi:

Twój kod źródłowy jest jak plan statku. Określa sposób wykonania statku.

Jeśli oddasz swój plan stoczni, a podczas budowy statku znajdą usterkę, przestaną ją budować i zgłoś ją natychmiast, zanim statek opuści suchą przystań lub dotknie wody. Jest to błąd czasu kompilacji. Statek nigdy nawet nie unosił się na wodzie ani nie korzystał z silników. Błąd został znaleziony, ponieważ uniemożliwił nawet wykonanie statku.

Kiedy twój kod się kompiluje, to tak, jakby statek był ukończony. Zbudowany i gotowy do pracy. Wykonanie kodu to jak wypuszczenie statku w podróż. Pasażerowie są wsiadani, silniki pracują, a kadłub jest na wodzie, więc jest to czas pracy. Jeśli twój statek ma fatalną wadę, która tonie w jego dziewiczym rejsie (a może trochę później po dodatkowe bóle głowy), oznacza to, że wystąpił błąd w czasie wykonywania.


5

Na przykład: W silnie typowanym języku typ można sprawdzić w czasie kompilacji lub w czasie wykonywania. W czasie kompilacji oznacza to, że kompilator narzeka, jeśli typy nie są kompatybilne. W czasie wykonywania oznacza, że ​​możesz dobrze skompilować swój program, ale w czasie wykonywania zgłasza wyjątek.


4

Krótko mówiąc, różnica słów b / w Czas kompilacji i czas działania.

czas kompilacji: Deweloper zapisuje program w formacie .java i konwertuje do kodu bajtowego, który jest plikiem klasy, podczas tej kompilacji każdy błąd można zdefiniować jako błąd czasu kompilacji.

Czas działania: Wygenerowany plik .class jest wykorzystywany przez aplikację do dodatkowej funkcjonalności, a logika okazuje się nieprawidłowa i generuje błąd, który jest błędem w czasie wykonywania


4

Oto cytat Daniela Lianga, autora „Wstępu do programowania w JAVA” na temat kompilacji:

„Program napisany w języku wysokiego poziomu nazywany jest programem źródłowym lub kodem źródłowym. Ponieważ komputer nie może wykonać programu źródłowego, program źródłowy musi zostać przetłumaczony na kod maszynowy w celu wykonania . Tłumaczenie można wykonać za pomocą innego narzędzia programistycznego o nazwie tłumacz lub kompilator . ” (Daniel Liang, „Wprowadzenie do programowania JAVA” , s. 8).

...On kontynuuje...

„Kompilator tłumaczy cały kod źródłowy na plik kodu maszynowego , a następnie plik kodu maszynowego jest wykonywany”

Kiedy wciskamy kod wysokiego poziomu / czytelny dla człowieka, jest to na początku bezużyteczne! Musi to zostać przetłumaczone na sekwencję „elektronicznych wydarzeń” w twoim małym, małym procesorze! Pierwszym krokiem w tym kierunku jest kompilacja.

Mówiąc wprost: błąd kompilacji występuje podczas tej fazy, natomiast błąd wykonania pojawia się później.

Pamiętaj: sam fakt, że program jest skompilowany bezbłędnie, nie oznacza, że ​​będzie działał bezbłędnie.

Błąd czasu wykonywania wystąpi w części gotowej, działającej lub oczekującej cyklu życia programów, natomiast błąd czasu kompilacji wystąpi przed „nowym” etapem cyklu życia.

Przykład błędu czasu kompilacji:

Błąd składni - jak można skompilować kod w instrukcji na poziomie komputera, jeśli są one niejednoznaczne? Twój kod musi być w 100% zgodny z regułami składniowymi języka, w przeciwnym razie nie będzie można go skompilować w działający kod maszynowy .

Przykład błędu w czasie wykonywania:

Brak pamięci - na przykład wywołanie funkcji rekurencyjnej może spowodować przepełnienie stosu, biorąc pod uwagę zmienną określonego stopnia! Jak to kompilator może przewidzieć !? nie może.

Na tym polega różnica między błędem kompilacji a błędem wykonania


2

Czas działania oznacza, że ​​coś się dzieje po uruchomieniu programu.

Czas kompilacji oznacza, że ​​coś się dzieje podczas kompilacji programu.


2

Czas kompilacji:

Rzeczy, które są wykonywane w czasie kompilacji, ponoszą (prawie) nie kosztują, gdy uruchamiany jest program wynikowy, ale mogą powodować duże koszty podczas kompilacji programu. Czas pracy:

Mniej więcej dokładnie odwrotnie. Niewielkie koszty podczas kompilacji, większe koszty podczas uruchamiania programu.

Z innej strony; Jeśli coś jest wykonywane w czasie kompilacji, działa tylko na komputerze, a jeśli coś jest w czasie wykonywania, działa na komputerze użytkownika.


2

Czas kompilacji: czas kompilacji kodu źródłowego na kod maszynowy, tak aby stał się plikiem wykonywalnym, nazywa się czasem kompilacji.

Czas działania: gdy aplikacja jest uruchomiona, nazywa się to czasem działania.

Błędy czasu kompilacji to błędy składniowe, brakujące błędy odwołania do pliku. Błędy czasu wykonywania występują po skompilowaniu kodu źródłowego w programie wykonywalnym i podczas działania programu. Przykładami są awarie programów, nieoczekiwane zachowanie programu lub funkcje nie działają.


2

Wyobraź sobie, że jesteś szefem i masz asystenta i pokojówkę, i dajesz im listę zadań do wykonania, asystent (czas kompilacji) przejmie tę listę i sprawdzi, czy zadania są zrozumiałe i czy nie pisał w żadnym niezręcznym języku lub składni, więc rozumie, że chcesz przypisać kogoś do pracy, więc przypisuje go dla ciebie i rozumie, że chcesz kawy, więc jego rola się skończyła i pokojówka (czas pracy) zaczyna wykonywać te zadania, więc idzie zrobić ci kawę, ale nagle nie znajduje kawy, więc przestaje ją robić, albo zachowuje się inaczej i podaje ci herbatę (kiedy program działa inaczej, ponieważ znalazł błąd ).


1

Oto rozszerzenie odpowiedzi na pytanie „różnica między czasem wykonania a czasem kompilacji?” - Różnice w kosztach ogólnych związanych z czasem wykonywania i czasem kompilacji?

Wydajność produktu w czasie pracy przyczynia się do jego jakości poprzez szybsze dostarczanie wyników. Wydajność produktu w czasie kompilacji przyczynia się do jego aktualności poprzez skrócenie cyklu edycji-kompilacji-debugowania. Jednak zarówno wydajność w czasie wykonywania, jak i wydajność w czasie kompilacji są drugorzędnymi czynnikami w osiągnięciu terminowej jakości. Dlatego należy rozważyć poprawę wydajności w czasie wykonywania i kompilacji tylko wtedy, gdy jest to uzasadnione poprawą ogólnej jakości produktu i terminowości.

Świetne źródło do dalszego czytania tutaj :


1

Zawsze myślałem o tym w stosunku do ogólnych kosztów przetwarzania programu i o tym, jak wpływa to na wydajność, jak już wcześniej wspomniano. Prostym przykładem byłoby albo zdefiniowanie absolutnej pamięci wymaganej dla mojego obiektu w kodzie, albo nie.

Zdefiniowana wartość logiczna zajmuje pamięć x, która znajduje się w skompilowanym programie i nie można jej zmienić. Po uruchomieniu program wie dokładnie, ile pamięci należy przeznaczyć na x.

Z drugiej strony, jeśli po prostu zdefiniuję ogólny typ obiektu (tj. Rodzaj nieokreślonego uchwytu miejsca lub może wskaźnik do jakiegoś gigantycznego obiektu blob), rzeczywista pamięć wymagana dla mojego obiektu nie będzie znana, dopóki program nie zostanie uruchomiony i coś mu przypisam , dlatego należy to ocenić, a alokacja pamięci itp. zostanie następnie obsłużona dynamicznie w czasie wykonywania (więcej narzutu w czasie wykonywania).

To, jak jest obsługiwane dynamicznie, zależy od języka, kompilatora, systemu operacyjnego, kodu itp.

Od tej notatki będzie to jednak naprawdę zależeć od kontekstu, w którym używasz czasu wykonania vs czasu kompilacji.


1

możemy je zaklasyfikować do różnych dwóch szerokich grup wiązania statycznego i wiązania dynamicznego. Opiera się na tym, kiedy wiązanie jest wykonywane z odpowiednimi wartościami. Jeśli odwołania są rozstrzygane w czasie kompilacji, wówczas jest to wiązanie statyczne, a jeśli odniesienia są rozstrzygane w czasie wykonywania, to jest to wiązanie dynamiczne. Wiązanie statyczne i dynamiczne nazywane również wiązaniem wczesnym i późnym. Czasami są one również określane jako polimorfizm statyczny i polimorfizm dynamiczny.

Joseph Kulandai.


1

Główną różnicą między czasem wykonywania a czasem kompilacji jest:

  1. Jeśli w kodzie są jakieś błędy składniowe i sprawdzanie typu, wówczas generuje błąd czasu kompilacji, gdzie jak w czasie wykonywania: sprawdza po wykonaniu kodu. Na przykład:

int a = 1 int b = a/0;

tutaj pierwsza linia nie ma średnika na końcu ---> błąd czasu kompilacji po uruchomieniu programu podczas wykonywania operacji b, wynik jest nieskończony ---> błąd czasu wykonania.

  1. Czas kompilacji nie szuka danych wyjściowych funkcjonalności dostarczonych przez kod, podczas gdy czas wykonania tak.

1

oto bardzo prosta odpowiedź:

Czas działania i czas kompilacji to terminy programowania odnoszące się do różnych etapów tworzenia oprogramowania. Aby utworzyć program, programista najpierw pisze kod źródłowy, który określa sposób działania programu. Małe programy mogą zawierać tylko kilkaset linii kodu źródłowego, podczas gdy duże programy mogą zawierać setki tysięcy linii kodu źródłowego. Kod źródłowy musi zostać skompilowany w kod maszynowy, aby stać się programem wykonywalnym. Ten proces kompilacji nazywany jest czasem kompilacji (pomyśl o kompilatorze jako tłumaczu)

Skompilowany program może zostać otwarty i uruchomiony przez użytkownika. Gdy aplikacja jest uruchomiona, nazywa się to środowiskiem wykonawczym.

Terminy „środowisko wykonawcze” i „czas kompilacji” są często używane przez programistów w odniesieniu do różnych rodzajów błędów. Błąd czasu kompilacji to problem, taki jak błąd składni lub brak odniesienia do pliku, który uniemożliwia kompilację programu. Kompilator generuje błędy czasu kompilacji i zwykle wskazuje, który wiersz kodu źródłowego powoduje problem.

Jeśli kod źródłowy programu został już skompilowany do programu wykonywalnego, może nadal występować błędy występujące podczas działania programu. Przykłady obejmują funkcje, które nie działają, nieoczekiwane zachowanie programu lub awarie programu. Tego rodzaju problemy nazywane są błędami środowiska wykonawczego, ponieważ występują one w środowisku wykonawczym.

Referencje


0

IMHO musisz przeczytać wiele linków i zasobów, aby zrozumieć różnicę między czasem wykonania a czasem kompilacji, ponieważ jest to bardzo złożony temat. Mam poniżej listę niektórych z tych zdjęć / linków, które polecam.

Oprócz tego, co powiedziano powyżej, chcę dodać, że czasami zdjęcie jest warte 1000 słów:

  1. kolejność tych dwóch: najpierw jest czas kompilacji, a następnie uruchamiasz Skompilowany program może zostać otwarty i uruchomiony przez użytkownika. Gdy aplikacja jest uruchomiona, nazywa się to runtime: czas kompilacji, a następnie runtime1 czas kompilacji, a następnie środowisko uruchomieniowe 1;

Czas kompilacji CLR_diag, a następnie runtime2  Czas kompilacji CLR_diag, a następnie runtime2

 from Wiki  

https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)

Czas działania, czas działania lub środowisko wykonawcze mogą odnosić się do:

Przetwarzanie danych

Czas działania (faza cyklu życia programu) , okres, w którym program komputerowy jest wykonywany

Runtime Library , biblioteka programów zaprojektowana do implementacji funkcji wbudowanych w język programowania

Runtime system , oprogramowanie zaprojektowane do obsługi wykonywania programów komputerowych

Wykonanie oprogramowania, proces wykonywania instrukcji jedna po drugiej podczas fazy wykonywania

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj Lista kompilatorów https://en.wikipedia.org/wiki/List_of_compilerswprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

  • wyszukaj w Google i porównaj błędy środowiska wykonawczego z błędami kompilacji:

błędy w czasie wykonywania

błędy kompilacji ;

  1. Moim zdaniem bardzo ważna rzecz: 3.1 różnica między kompilacją a kompilacją a cyklem życia kompilacji https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

3.2 różnica między tymi 3 rzeczami: kompilacja vs kompilacja vs środowisko wykonawcze

https://www.quora.com/What-is-the-difference-between-build-run-and-compile Fernando Padoan, programista, który jest nieco ciekawy projektowania języka Odpowiedzi 23 lutego Wracam w związku na inne odpowiedzi:

uruchamianie powoduje, że jakiś binarny plik wykonywalny (lub skrypt dla języków interpretowanych) zostanie… dobrze wykonany jako nowy proces na komputerze; kompilacja to proces analizowania programu napisanego w jakimś języku wysokiego poziomu (wyższym w porównaniu do kodu maszynowego), sprawdzania jego składni, semantyki, łączenia bibliotek, być może robienia optymalizacji, a następnie tworzenia binarnego programu wykonywalnego jako wyniku. Ten plik wykonywalny może mieć postać kodu maszynowego lub innego rodzaju kodu bajtowego - to znaczy instrukcji kierowanych na jakąś maszynę wirtualną; budowanie zwykle obejmuje sprawdzanie i dostarczanie zależności, inspekcję kodu, kompilację kodu w plik binarny, uruchamianie automatycznych testów i pakowanie powstałych plików binarnych i innych zasobów (obrazów, plików konfiguracyjnych, bibliotek itp.) w określony format pliku do wdrożenia. Pamiętaj, że większość procesów jest opcjonalna, a niektóre zależą od docelowej platformy, dla której budujesz. Przykładowo, pakowanie aplikacji Java dla Tomcat spowoduje wyświetlenie pliku .war. Zbudowanie pliku wykonywalnego Win32 z kodu C ++ może po prostu wyprowadzić program .exe lub też spakować go w instalatorze .msi.


0

Spójrz na ten przykład:

public class Test {

    public static void main(String[] args) {
        int[] x=new int[-5];//compile time no error
        System.out.println(x.length);
    }}

Powyższy kod został pomyślnie skompilowany, nie ma błędu składniowego, jest całkowicie poprawny. Ale w czasie wykonywania generuje błąd.

Exception in thread "main" java.lang.NegativeArraySizeException
    at Test.main(Test.java:5)

Podobnie jak w czasie kompilacji niektóre przypadki zostały sprawdzone, po tym czasie niektóre przypadki zostały sprawdzone, gdy program spełni wszystkie warunki, otrzymasz wynik. W przeciwnym razie pojawi się błąd kompilacji lub błąd wykonania.


0

klasa publiczna RuntimeVsCompileTime {

public static void main(String[] args) {

    //test(new D()); COMPILETIME ERROR
    /**
     * Compiler knows that B is not an instance of A
     */
    test(new B());
}

/**
 * compiler has no hint whether the actual type is A, B or C
 * C c = (C)a; will be checked during runtime
 * @param a
 */
public static void test(A a) {
    C c = (C)a;//RUNTIME ERROR
}

}

class A{

}

class B extends A{

}

class C extends A{

}

class D{

}


0

Możesz zrozumieć strukturę kompilacji kodu po odczytaniu rzeczywistego kodu. Struktura czasu wykonywania nie jest jasna, chyba że zrozumiesz użyty wzorzec.


-1

To nie jest dobre pytanie dla SO (nie jest to konkretne pytanie programistyczne), ale ogólnie nie jest złe.

Jeśli uważasz, że jest to trywialne: co z czasem odczytu a czasem kompilacji i kiedy jest to użyteczne rozróżnienie? Co z językami, w których kompilator jest dostępny w czasie wykonywania? Guy Steele (bez manekina, napisał) napisał 7 stron w CLTL2 o EVAL-WHEN, których programiści CL mogą użyć do kontrolowania tego. Dwa zdania ledwo wystarczą na definicję , która sama w sobie jest daleka od wyjaśnienia .

Ogólnie rzecz biorąc, jest to trudny problem, którego projektanci języków starali się uniknąć. Często mówią po prostu: „tutaj jest kompilator, robi rzeczy w czasie kompilacji; wszystko po tym jest w czasie wykonywania, baw się dobrze”. C ma być prosty do wdrożenia, a nie najbardziej elastyczne środowisko do obliczeń. Jeśli nie masz kompilatora dostępnego w czasie wykonywania lub nie masz możliwości łatwego kontrolowania oceny wyrażenia, zwykle dochodzi do włamań w języku w celu sfałszowania typowych zastosowań makr lub użytkownicy opracowują Wzory projektowe do symulacji mając mocniejsze konstrukty. Prosty w implementacji język może zdecydowanie być wartościowym celem, ale to nie znaczy, że jest to projekt projektowania języka programowania. (Nie używam EVAL-WHEN, ale nie wyobrażam sobie życia bez niego.)

A obszar problemów wokół czasu kompilacji i wykonywania jest ogromny i wciąż w dużej mierze niezbadany. Nie oznacza to, że SO jest właściwym miejscem do dyskusji, ale zachęcam ludzi do dalszej eksploracji tego terytorium, szczególnie tych, którzy nie mają z góry pojęcia, co to powinno być. Pytanie nie jest ani proste, ani głupie, a my moglibyśmy przynajmniej skierować inkwizytora we właściwym kierunku.

Niestety nie znam żadnych dobrych referencji na ten temat. CLTL2 mówi o tym trochę, ale nie nadaje się do nauki.


4
koleś, to, co nie jest dla ciebie dobrym pytaniem programistycznym, jest względne. Pomyślałem, że to doskonałe pytanie i chciałbym dowiedzieć się więcej. Tak, znam ogólną „koncepcję” oraz czas kompilacji i środowisko uruchomieniowe, ale chcę poznać szczegóły, które mają miejsce naprawdę w czasie wykonywania, a nie w czasie kompilacji. To te pytania, które mają znaczenie, kiedy programujesz i musisz być tego świadomy. Nie jest to zbyt konkretne, dlatego pyta. Nienawidzę tego, gdy ludzie siedzą tutaj i mówią takie ogólne pytania, które są bezwartościowe, gdy są to jedne z najważniejszych pytań, które należy zrozumieć dla każdego twórcy.
PositiveGuy,

1
Jeśli nie widzisz wartości w pytaniu, to jest twój problem. Jeśli jest ogólna, istnieje ku temu powód. To, że nie lubisz ogólnych pytań, nie oznacza, że ​​świat kręci się wokół tego, co uważasz za przydatne. Ma pewien zamiar o to zapytać i chce szeregu odpowiedzi, aby lepiej zrozumieć i zdefiniować oba. Zdobyć?
PositiveGuy,
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.