Käännösaika ja Runtime ovat kaksi ohjelmointitermiä, joita käytetään ohjelmistokehityksessä. Käännösaika on aika, jolloin lähdekoodi muunnetaan suoritettavaksi koodiksi, kun taas suoritusaika on aika, jolloin suoritettava koodi käynnistetään. Sekä käännösaika että suoritusaika viittaavat erityyppisiin virheisiin.
Käännösajan virheet
Käännösaikavirheet ovat virheitä, jotka tapahtuivat, kun kirjoitamme väärän syntaksin. Jos kirjoitamme jonkin ohjelmointikielen väärän syntaksin tai semantiikan, kääntäjä heittää käännösaikavirheet. Kääntäjä ei salli ohjelman suorittamista ennen kuin kaikki virheet on poistettu ohjelmasta. Kun kaikki virheet on poistettu ohjelmasta, kääntäjä luo suoritettavan tiedoston.
Käännösaikavirheet voivat olla:
- Syntaksivirheet
- Semantisia virheitä
Syntaksivirheet
Jos ohjelmoija ei noudata minkään ohjelmointikielen syntaksia, kääntäjä heittää syntaksivirheen.
python-tavut merkkijonoon
Esimerkiksi,
int a, b:
Yllä oleva ilmoitus luo käännösaikavirheen kuten C:ssä, jokainen lause päättyy puolipisteeseen, mutta laitamme lauseen loppuun kaksoispisteen (:).
Semantisia virheitä
Semanttisia virheitä esiintyy, kun lausunnot eivät ole merkityksellisiä kääntäjälle.
Esimerkiksi,
a+b=c;
Yllä oleva lause aiheuttaa käännösaikavirheitä. Yllä olevassa lauseessa annamme 'c':n arvon 'a' ja 'b':n summalle, mikä ei ole mahdollista C-ohjelmointikielessä, koska se voi sisältää vain yhden muuttujan määritysoperaattorin vasemmalla puolella ja oikealla osoitusoperaattori voi sisältää useamman kuin yhden muuttujan.
Yllä oleva lausunto voidaan kirjoittaa uudelleen seuraavasti:
c=a+b;
Ajonaikaiset virheet
Ajonaikaiset virheet ovat virheitä, jotka tapahtuvat suorituksen aikana ja kääntämisen jälkeen. Esimerkkejä ajonaikaisista virheistä ovat jako nollalla jne. Näitä virheitä ei ole helppo havaita, koska kääntäjä ei osoita näihin virheisiin.
Tutkitaanpa joitain tyypillisiä C ajonaikaiset virhetyypit, tapaukset ja niiden mahdolliset vaikutukset.
Nollalla jakaminen:
Koska jako nollalla on matemaattisesti määrittelemätön , yrittää jakaa kokonaisluvun arvolla nolla johtaa a suorituksenaikainen virhe . Tämä virhe aiheuttaa ohjelman kaatumisen tai poikkeuksen. Tässä on esimerkki:
#include int main() { int a = 10; int b = 0; int result = a / b; // Division by zero printf('Result: %d ', result); return 0; }
Lähtö:
Floating point exception (core dumped)
Selitys:
A 'liukulukupoikkeus' virhesanoma tuotetaan, kun ohjelma kohtaa ajonaikaisen ongelman nollalla jakamisen vuoksi.
Matriisin käyttö rajojen ulkopuolella:
A suorituksenaikainen virhe tapahtuu, kun taulukon elementtiä käytetään tiettyjen rajojen ulkopuolella. Virhe tapahtuu, kun indeksi on suurempi kuin taulukon koko ja muistin käyttölakeja rikotaan. Tässä on esimerkki:
java merkkijonomenetelmät
#include int main() { int arr[5] = {1, 2, 3, 4, 5}; int index = 10; int value = arr[index]; // Accessing array out of bounds printf('Value: %d ', value); return 0; }
Lähtö:
Segmentation fault (core dumped)
Selitys:
Elementti osoitteessa indeksi 10 on taulukon rajojen ulkopuolella, kun ohjelma yrittää käyttää sitä. Tämän seurauksena a tapahtuu segmentointivirhe , ja ohjelma päättyy virheeseen.
Nollaosoittimen viittaus:
A suorituksenaikainen virhe tapahtuu, kun yrität käyttää a nollaosoittimen muisti osoite, joka tunnetaan nimellä viittausten poistaminen nollaosoitin. Nollaosoittimien käyttäminen johtaa arvaamattomaan toimintaan, koska ne eivät osoita laillisia muistipaikkoja . Tässä on esimerkki:
#include int main() { int* ptr = NULL; // Null pointer int value = *ptr; // Null pointer dereference printf('Value: %d ', value); return 0; }
Lähtö:
Segmentation fault (core dumped)
Selitys:
Yritys viittaus tyhjä osoitin johtaa a segmentointivirhe , mikä saa ohjelman kaatumaan virheilmoituksella.
Pinon ylivuoto:
A pinon ylivuoto tapahtuu, kun kutsupino kasvaa suunniteltua suuremmiksi ja sisältää tietoa funktiokutsuista. An ääretön rekursio yleensä syntyy, kun rekursiivisilla funktioilla ei ole asianmukaisia lopetusehtoja. Tässä on esimerkki:
#include void recursiveFunction() { recursiveFunction(); // Recursive call without termination condition } int main() { recursiveFunction(); return 0; }
Lähtö:
Segmentation fault (core dumped)
Selitys:
Ohjelma käynnistyy loputon rekursio , joka vuotaa pinon yli ja aiheuttaa segmentointivirheen.
Käyttämättömät muuttujat:
Koska alustamattomia muuttujia omistaa määrittelemättömät arvot , niiden käyttö saattaa aiheuttaa ajonaikaisia virheitä. Ohjelma voi tuottaa yllättäviä tuloksia tai kaatua olosuhteista riippuen. Tässä on esimerkki:
#include int main() { int uninitializedVariable; printf('Value: %d ', uninitializedVariable); // Using uninitialized variable return 0; }
Lähtö:
arp-a-komento
Some random value (varies each time)
Selitys:
Tässä esimerkissä an alustamaton muuttuja voi olla mikä tahansa satunnainen arvo, joka valitaan satunnaisesti tälle muuttujalle osoitetulta muistialueelta.
Katsotaanpa eroja käännösajan ja suoritusajan välillä:
Käännösaika | Suoritusaika |
---|---|
Käännösaikavirheet ovat käännöshetkellä syntyviä virheitä, jotka kääntäjä havaitsee. | Ajonaikaiset virheet ovat virheitä, joita kääntäjä ei synny ja jotka tuottavat odottamattoman tuloksen suoritusaikana. |
Tässä tapauksessa kääntäjä estää koodin suorittamisen, jos se havaitsee ohjelmassa virheen. | Tässä tapauksessa kääntäjä ei havaitse virhettä, joten se ei voi estää koodin suorittamista. |
Se sisältää syntaksi- ja semanttiset virheet, kuten puuttuvan puolipisteen lauseen lopusta. | Se sisältää virheet, kuten nollalla jakamisen, negatiivisen luvun neliöjuuren määrittämisen. |
Esimerkki käännösaikavirheestä
#include int main() { int a=20; printf('The value of a is : %d',a): return 0; }
Yllä olevassa koodissa olemme yrittäneet tulostaa 'a':n arvon, mutta se antaa virheen. Laitamme lauseen loppuun kaksoispisteen puolipisteen sijaan, joten tämä koodi tuottaa käännösaikavirheen.
Lähtö
Esimerkki ajonaikaisesta virheestä
#include int main() { int a=20; int b=a/0; // division by zero printf('The value of b is : %d',b): return 0; }
Yllä olevassa koodissa yritämme jakaa 'b':n arvon nollalla, ja tämä aiheuttaa ajonaikaisen virheen.
Lähtö
Johtopäätös:
Yhteenvetona ajanjaksot ohjelmistokehitys tunnetaan käännösaika ja ajonaikaiset virheet ovat erillisiä, ja jokaisella on ainutlaatuinen joukko vikoja joka saattaa tapahtua. Käännösajan virheet tapahtuu, kun koodi muunnetaan suoritettavaan muotoon käännösvaiheen aikana. Näitä virheitä ovat mm semanttiset virheet , jotka tuottavat epäloogista tai absurdi koodi , ja syntaksivirheitä , jotka ovat ohjelmointikielen lakien vastaisia. Nämä virheet tunnistavat kääntäjä ja raportoitu, estäen suorituksen koodista, kunnes ne on korjattu.
Toisaalta, ajonaikaiset virheet esiintyvät, kun ohjelma on käynnissä, eikä kääntäjä havaitse niitä. Ne voivat johtua useista olosuhteista, mukaan lukien jako nollalla, virheellinen muistin käyttö tai muita odottamattomia tapahtumia. Ajonaikaiset virheet on vaikeampi löytää ja korjata, koska ne johtavat usein ohjelman kaatumiseen tai odottamattomaan toimintaan. Kehittäjät käyttävät ajonaikaisten virheiden hallintaan tyylikkäästi ja ohjelman vakauden takaamiseen virheenkäsittelytekniikat Kuten poikkeuskäsittely .