KOI: Exercise 1: Basics, phases and Linux

You can do this exercise in any size group you wish. Don't worry if you find some of the questions difficult to answer, since they may be intended to initiate a discussion rather than have a single correct answer.

Preparations

Before this exercise you should have:

Uppgift 1

När man skriver ett någorlunda stort program är det bra att dela upp det i moduler. Det gäller även kompilatorer. Vi gör ett försök att dela upp kompilatorn i moduler, och åstadkommer den här listan:
  1. debugger
  2. editor
  3. kodgenerering
  4. lexikalisk analys ("scanner")
  5. länkning
  6. maskinberoende optimering
  7. maskinoberoende optimering
  8. mellankodsgenerering
  9. semantisk analys
  10. symboltabellen
  11. syntaktisk analys ("parser")

a) En del av de uppräknade modulerna brukar kallas faser. Vad menas med en fas?

b) Ett annat uttryck som används i kompilatorsammanhang är pass. Vad är det för skillnad på en fas och ett pass?

c) I listan ovan är modulerna ordnade i bokstavsordning. Lista faserna i rätt ordning, till exempel som en rad av fyrkanter med pilar mellan.

d) Indata till den första fasen består av källprogrammet i textform (alltså en sekvens av tecken), medan utdata från den sista fasen utgörs av ett målprogram uttryckt i maskinspråk eller assemblerspråk. Beskriv alla fasernas indata och utdata, till exempel genom att skriva det på pilarna mellan fyrkanterna från uppgiften ovan.

e) En av modulerna ingår i kompilatorn, men är inte en fas. Vilken?

f) Några av de andra uppräknade sakerna ingår inte i kompilatorn, men används eller finns i anslutning till kompilatorn. Komplettera figuren ovan med de sakerna!

Uppgift 2

Vad är det för skillnad på en parser, en grammatik och ett språk?

Uppgift 3

Välj ett programmeringsspråk som du är van vid, till exempel C, C++ eller Java, och ge konkreta (dvs med utdrag ur programkoden) exempel på fel i ett källprogram som kan upptäckas i:

a) den lexikaliska analysen ("scannern")

b) den syntaktiska analysen ("parsern")

c) den semantiska analysen

Uppgift 4

Vi ska skriva ett program som hjälper elever i lågstadiet att träna på addition. Meningen är att eleven ska mata in två tal och även deras summa, och så skriver programmet ut om det var rätt eller fel. Två körexempel, med elevens inmatning understruken:
En övning i addition!
Ange två tal och deras summa: 10 29 39
Rätt!
En övning i addition!
Ange två tal och deras summa: 20 30 60
Nej, 20 + 30 blir 50!
C-programmet nedan är tyvärr inte helt korrekt, och när vi försöker köra det får vi de angivna fel- och varningsmeddelandena. I vilka av kompilatorns faser, eller vid andra tidpunkter, upptäcks vart och ett av de olika felen och varningarna? Motivera dina svar!

(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)

Program Fel och varningar
#include <stdio.h>

int main(void) {
  int a, b, summan;

  printf("En övning i addition!\n)
  printf("Ange två tal och deras summa: ");
  scanf("%d", &a);
  scanf("%d", b);
  scanf("%d", &gissning);
  if (gissning == summan)
    printf("Rätt!\n");
  else
    print("Nej, %d + %d blir %d!\n",
          a, b, summan);
  return "0";
}





warning: missing terminating " character
error: expected ';' before 'printf'

Segmentation fault (core dumped)
error: 'gissning' undeclared
warning: 'summan' is used uninitialized


undefined reference to 'print'

warning: returning 'char *' from a function with return type 'int'

Uppgift 5

När vi "bygger" (dvs kompilerar och länkar) följande försök till C-program, får vi de angivna fel- och varningsmeddelandena. I vilka faser, eller vid andra tidpunkter, upptäcks dessa fel och varningar?

(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)

Program Fel och varningar
#include <stdio.h>

int main(void) {
    int a;
    int 2a;

    printf("Hej!\n");
    printg("Ange ett tal: ");

    scanf("%d", &a);
    printf("Talet = %d\n", a);

    return 0;
}




error: invalid suffix "a" on integer constant


warning: implicit declaration of function 'printg'
error: undefined reference to `printg'





Uppgift 6

När vi "bygger" (dvs kompilerar och länkar) följande försök till C-program, får vi de angivna fel- och varningsmeddelandena. I vilka faser, eller vid andra tidpunkter, upptäcks dessa fel och varningar?

(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)

Program Fel och varningar
#include <stdio.h>

int main(void) {
  int i = 17;
  float f = 3.14;
  char c = 'x';
  char* s = "foo;

  s = f;
  printf("f = %f\n", i);

  c s;
  return;
}






missing terminating " character

error: incompatible types in assignment
warning: double format, different type arg (arg 2)

error: syntax error before "s"
warning: `return' with no value, in function returning non-void

Uppgift 7

När vi "bygger" (dvs kompilerar och länkar) följande försök till C-program, får vi de angivna fel- och varningsmeddelandena. I vilka faser, eller vid andra tidpunkter, upptäcks dessa fel och varningar?

(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)

Program Fel och varningar
#inglude <stdio.h>

int main(void) {
    int x, y, z, t;

    printf("Ange x: );
    scanf("%d", &x);
    printf("Ange y: ")
    scanf("%d", y);
    t = x + y;
    u = x + y;
    printf("z = %d\n", z);
    f(8);

} // main
error: invalid preprocessing directive #inglude




warning: missing terminating " character

error: expected ';' before '}' token
Segmentation fault (core dumped)
warning: variable 't' set but not used
error: 'u' undeclared
warning: 'z' is used uninitialized
warning: implicit declaration of function 'f'
undefined reference to 'f'

Uppgift 8

Vilka är de viktigaste skillnaderna mellan Linux, Windows och macOS (som är den stavning Apple använder nu)?

Uppgift 9

Vilka är de mest användbara kommandona som man kan ge i ett skal i Linux?


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 5 september 2021