forked from rostgaard/Linuxbog
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfri2try.sgml
835 lines (751 loc) · 27.5 KB
/
fri2try.sgml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
<chapter id="c-intro"><title>Repræsentation og modeller</title>
<sect1 id="c-prof-vaerksted"><title>Et professionelt værksted</title>
<para>
Hvis du har en maskine med Linux i en af de større
distributioner (fx. Red Hat eller Debian) har du samtidig en
samling af de mest avancerede værktøjer til fremstilling af
software.
</para>
<para>
Det er ikke blot en "sandkasse", du sidder med, men et professionelt
udviklingsmiljø. Der er optimerende oversætter, standardiserede biblioteker,
supplerende biblioteker med et væld af funktionalitet, debugger, source
management med alt, hvad dertil hører, og oven i det er Linux jo et
professionelt afviklingsmiljø med automatisk jobstart, kommandofortolkere og
andre fortolkede sprog i mange varianter, serverfaciliteter, samt ikke mindst
dørvogterfaciliteter (Firewall værktøjer eller TCP-IP filtrering).
</para>
<para>
Det avancerede i denne her sammenhæng ligger ikke i et
smart peg - og - klik interface til en programgenerator. Just for
the record: En programgenerator er et udmærket værktøj i visse
sammenhæng. Med sådan et værktøj kan du kan vælge mellem et
begrænset antal på forhånd programmerede moduler ved hjælp af en
mus, klik og vupti, så har du et resultat bestående af objekter,
der er sat sammen (nogen kalder peg og klik - programmering for
objektorienteret programmering, men det er en fordrejning af
begreber).
</para>
<para><emphasis>Et sidespring:</emphasis> På Linux findes mindst
én klik-og-peg generator, nemlig "glade", en GTK+ User Interface
Builder, skrevet af Damon Chaplin, http://glade.pn.org. Kan
anbefales.
</para>
<figure id="fig-glade-palet" float="1">
<title>glade, en GTK+ GUI generator.</title>
<graphic fileref="glade_palet.&magic;" scale="100"></graphic>
</figure>
<figure id="fig-glade-canvas" float="1">
<title>glade, projekt vindue.</title>
<graphic fileref="glade_canvas.&magic;" scale="100"></graphic>
</figure>
<para>
Nej, det avancerede består i, at du kan styre genereringen
af programkode fuldstændig professionelt. Hvis du for eksempel ønsker at
skrive en ny og bedre database server, så værsgo', gå i gang. Den
nødvendige dokumentation er til rådighed, og der findes desuden
lærebøger som forklarer om low-level ting og high-performance
problematikker på Linux.
</para>
<para>
Oven i alt dette får du den fordel, at dine Linux
programmer i de fleste tilfælde kan anvendes uden ændringer på
andre Linux-systemer, inclusive 64-bit systemer, og med få
ændringer på mange andre Unix systemer som for eksempel Solaris, AIX,
HP-UX.
</para>
<indexterm><primary>Cygwin</primary></indexterm>
<para>
Mere overraskende er det måske, at man også kan køre
Linux-udviklede programmer på Microsoft NT ved hjælp af
Cygwin systemet fra Cygnus.
</para>
<para>
Det er en væsentlig del af filosofien i GNU og C - sproget,
at man skal kunne genbruge sin kode, hvis hardwaren skal
udskiftes; og det skal den før eller senere! Hardware forgår,
brainware består. Sådan da.
</para>
<para>
Udover C-oversætteren har du med Linux adgang til C++ og
mange andre sprog.
</para>
<sect2 id="hvad-er-debugger">
<title>Hvad er en debugger?</title>
<para>
Debuggeren er et værktøj, som kan vise, linje for linje,
hvad der sker i et program. Selv om det hedder en debugger, så er
det er ikke så godt at bruge den til at fjerne fejl <footnote id="C-bug">
<para> Det kaldes aflusning eller debugging, bug == insekt, - der
skulle engang være opstået en fejl i en af de første computere
p.g.a. nogle insekter, som syntes, at der var varmt og rart at
være oven på sådan nogen elektronik-komponenter. </para>
</footnote>.
</para>
<para>
Hvis et program er så fejlbehæftet, at man overvejer at anvende
en debugger, så bør man begynde forfra og reimplementere sine
programmer med de nyvundne erfaringer. Ok, der er undtagelser,
hvor man kan lokalisere en vanskelig, periodisk fejl ved at
anvende en debugger med omtanke, men det er ikke noget, som man
skal gøre til en fast vane!
</para>
</sect2>
<sect2 id="bib-eksempel">
<title>Biblioteker - et eksempel</title>
<para>
Det vigtigste er imidlertid, at der med de almindelige Linux-distributioner
er et stort arsenal af frie biblioteker til database, netværk, grafik
etc.
</para>
<para>
Som et eksempel kan det fremhæves, at der findes frie biblioteker til
netværksprogrammering. For eksempel <emphasis>Remote Procedure
Call</emphasis>, både til klient- og tjenersiden. <!-- TCP/UDP/IP -->
Det er en teknik, som kan benyttes til at udføre en routine på en anden
computer (som selvfølgelig skal være forberedt til dette!) Dette er værd at
understrege, idet den meget udbredte PC-software har indført nogle økonomisk
betingede useriøse skel mellem server og klient programmer.
</para>
<para>
Desuden har du adgang til mange gode eksempler på, hvordan
i hvert fald nogle af bibliotekerne anvendes. Kort sagt, hvis du
går i gang, kan du satse på at nå et professionelt niveau på de
områder, som du udvælger.
</para>
</sect2>
<sect2 id="hvordan-i-gang">
<title>Hvordan kommer man igang?</title>
<para>
Hvad gør man så for at komme igang?
</para>
<para>
Hvis der skulle være et mirakel-ord, som er nøgle til
forståelse af computerens magi, så er det ordet
DATA-REPRÆSENTATION.
</para>
<para>
Godt nok følger computerens elektriske signaler de fysiske
love, men computeren er et instrument til at manipulere store
mængder af impulser ud fra nogle få regler valgt af programmøren.
Med andre ord, vi kan tillægge elektriske signaler en betydning.
Et enkelt elektrisk signal kaldes oftest en bit, binary digit.
Otte af dem kaldes en byte eller, mere officielt, en octet.
</para>
<para>
En enkelt bit kan være en besked om at åbne sluserne
for at undgå en oversvømmelse. Eller en prik på en billedskærm.
Eller forskellen mellem et punktum og et komma (i en dårlig
skrifttype! Anstrengende for øjnene!)
</para>
<para>
Som regel bruger man flere bits til vigtige beskeder for
at sikre, at man nu også har forstået hinanden rigtigt. Det
kaldes redundans.
</para>
<para>
Bogstaver repræsenteres som regel ved en byte, men ved
anvendelse af Unicode bruges 16 bit eller 2 bytes. Der er også
systemer, som repræsenterer bogstaver ved hjælp af variabelt
antal bytes. Kig for eksempel på en HTML-side.
</para>
</sect2>
</sect1>
<sect1 id="repraesentation-af-data"><title>Repræsentation af data</title>
<para>
Hvis du ved en masse om computere, så vil du nok finde
dette afsnit overflødigt. Spring straks videre!
</para>
<para>
En computer kan bruges til tekstbehandling, styring af
produktionsmaskineri, til teleudstyr, og, selvfølgelig, til den
"klassiske" lommeregner. Hvor kommer denne fleksibilitet fra? Fra
programmøren, eller mere korrekt: De forskellige applikationer af
computerteknikken beror på muligheden for at repræsentere
information af mange forskellige typer ved hjælp af elektriske
spændinger.
</para>
<para>
Konstruktøren af en harddisk bestemmer f.x., at når man
sætter strøm på ledning 77, så er det en besked til harddisken om,
at den skal begynde en read-operation.
</para>
<para>
De, der konstruerer computeren, bestemmer, hvad de
forskellige elektriske signaler skal få de forskellige dele af
maskineriet til at udføre. Når han én gang har bestemt, at
ledning 77 er read-request, og maskinen er bygget efter hans
anvisninger, så er vi bundet af denne mening med signal 77, men
det kan altså laves om - næste gang, vi konstruerer et harddisk
interface.
</para>
<para>
Den ene dag repræsenterer bit nummer 1000017 en kerne i en
tomat, næste sekund måske et punktum på en skærm, og næste dag
kunne den være en del af en ordre til en harddisk.
</para>
<para>
Hvis du vil i dybden med forståelse af computerens
virkemåde og muligheder, kan du læse for eksempel Joseph Weizenbaum's
"Computer Power and Human Reason".
</para>
<para>
Datarepræsentation handler om teknikker til at
repræsentere forskellige typer af objekter. For programmøren er
det vigtigere at spørge, hvilke informationer, det egentlig er
interessant at repræsentere. Det kan computeren ikke finde ud af
uden kyndig vejledning fra programmører!
</para>
<para>
Hvordan vælger vi at repræsentere en tomat, hvad vælger vi
at se? Er det prisen, der interesserer os? Vægten? Udseendet?
Surhed? Arvelige egenskaber? Vi vælger ud fra en idé om, hvad vi
vil med objektet.
</para>
</sect1>
<sect1 id="repraesentation-af-tal"><title>Repræsentation af tal</title>
<para>
Lad os se på, hvordan computeren repræsenterer tal. Det er
vel det, den er bedst til? Jo, måske nok, men alligevel, der er
faktisk en hage eller to ved computerens måde at repræsentere tal
på.
</para>
<indexterm><primary>heltal</primary></indexterm>
<para>
Fx. taler vi om heltal, de naturlige tal, tallene fra 0 og
opefter. Eller er det fra 1 og opefter ;-) Nå, i hvert fald så
siger vi, at vi kan repræsentere heltallene med en computers
kalkulator register eller en memory celle. Men det er ikke helt
rigtigt! Det er nemlig kun et udsnit af de naturlige tal, som vi
kan repræsentere. Så ikke engang denne enkle opgave kan en
computer klare så godt som en almindelig dødelig! Forklaring
følger.
</para>
<para>
Et register er en slags tælleværk, der i dag typisk består
af 32 bits - binary digits. De enkelte digits er lavet ved hjælp
af et transistor mønster, der kan være i to tilstande,
enten i en tilstand, hvor strømmen kan passere, eller også i en
tilstand, hvor strømmen blokeres. Når der er 32 bits, kan de
danne ca. 4 mia. mønstre eller kombinationer af on/off, 0 eller
1. Det er maximum antal kombinationer. Hvis vi altså tæller fra
0, kan vi komme op på 4 mia med et 32-bit register.
</para>
<para>
Det er derfor, at der har været en grænse for filstørrelser
på de almindeligst forekommende filsystemer. Siger 2 Gb grænsen
dig noget? Det er den største fil på for eksempel Linux' ext2-filsystemer.
Det kunne have været en 4 Gb grænse, men én af bit'ene er
reserveret til et andet formål, nemlig til angivelse af, om
systemet er i en fejltilstand efter en skrive- eller
læseoperation. En bit, on/off, svarer altså til en fordobling af
kombinationsmulighederne, se nærmere nedenfor.
</para>
<para>
Bits er altså repræsenteret ved hjælp af elektriske
kredsløb, der kan aflæses af andre kredsløb.
</para>
<para>
Kalkulator registeret, det vigtigste register på den
traditionelt opbyggede CPU, er en slags tælleværk bestående af
bits (i dag som regel 32), som en kilometertæller, som
kan udføre forskellige regnestykker på det tal, den indeholder.
</para>
<para>
En CPU kan have mange kalkulator-registre. De har navne,
ofte noget med R1 og R2, i Intel-arkitekturen (x86 - CPU'er)
hedder de imidlertid EAX, EBX, ECX etc (hvilket er copyrighted!)
Mange af dem kan udføre regnestykker. På Intel 386 arkitekturen
(og Pentium m.v.) kan man dog se en vis fortrinsstilling for EAX
registeret. Men denne bog handler ikke om Intel. Hvis Intels
CPU'er interesserer dig, så hent fra www.intel.com "Intel
Architecture Software Developer's Manual" (det er 3 PDF-filer på
ialt omkring 15 Mb), eller find en bog om assemblerprogrammering,
eller prøv at læse den Assembly-HOWTO, som følger med bl.a.
Red Hat Linux.
</para>
<para>
Hvis CPU-en har 32-bit registre, så kan man skrive tal fra
0 til 4 milliarder. Selv om det er mange, er det ikke ALLE de
naturlige tal - de fortsætter jo opefter, mod uendelig, som man
siger. Selv om det heller ikke er muligt at finde noget i
universet, som er uendeligt, man bliver om jeg så må sige træt
inden man når dertil, er det alligevel en mere begrænset
repræsentation af talsystemet, som vi får med en 32-bit computer
<footnote id="C-tid"><para>En lidt mere seriøs beskrivelse af tid,
uendelighed og rum kan man finde i Stephen Hawking's "Brief
History Of Time", nej, ikke Stephen King!</para></footnote>
Metoden til at tælle ved hjælp af bits, som du sikkert kender
eller allerede har regnet ud, kan illustreres med følgende tabel
(med kun 4 bit):
</para>
<para>
<informaltable frame="all">
<tgroup cols="5">
<thead>
<row>
<entry>ottere</entry>
<entry>firere</entry>
<entry>toere_</entry>
<entry>enere_</entry>
<entry>værdi med almindeligt 10-talsystem</entry>
</row>
</thead>
<tbody>
<row>
<entry>0</entry>
<entry>0</entry>
<entry>0</entry>
<entry>0</entry>
<entry> == 0</entry>
</row><row>
<entry>0</entry>
<entry>0</entry>
<entry>0</entry>
<entry>1</entry>
<entry> == 1</entry>
</row><row>
<entry>0</entry>
<entry>0</entry>
<entry>1</entry>
<entry>0</entry>
<entry> == 2</entry>
</row><row>
<entry>0</entry>
<entry>0</entry>
<entry>1</entry>
<entry>1</entry>
<entry> == 3</entry>
</row><row>
<entry>0</entry>
<entry>1</entry>
<entry>0</entry>
<entry>0</entry>
<entry> == 4</entry>
</row><row>
<entry>0</entry>
<entry>1</entry>
<entry>0</entry>
<entry>1</entry>
<entry> == 5</entry>
</row><row>
<entry>0</entry>
<entry>1</entry>
<entry>1</entry>
<entry>0</entry>
<entry> == 6</entry>
</row><row>
<entry>0</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry> == 7</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
<para>
Som man kan se kan kolonnerne kaldes ENERE, TOERE og FIRERE
i analogi med vores ti-tal system, hvor vi siger, at kolonnerne
repræsenterer enere, tiere og hundreder etc.
</para>
<para>
Hvis vi har brug for mere, kan vi imidlertid godt sætte
flere registre, eller flere memory celler, sammen, så vores tal
kan blive større. Det er forholdsvis enkelt.
</para>
<para>
De negative tal kunne vi repræsentere ved at markere med en
ekstra bit (eventuelt et helt andet sted) at vi skulle gange med
-1. Nogle maskiner kan faktisk skelne mellem +0 og -0! Men det er
ikke populært i dag. Man vælger som regel en anden metode.
</para>
<para>
Man indretter CPU registrene sådan, at når man tæller op,
så bliver 1...1111 til 0...0000 (for ikke at skrive alle 32 bit,
skriver jeg 1...1111.) Det ligner lidt en kilometertæller, som
når den har nået det største tal, den kan vise, går tilbage til
0, altså for eksempel går fra 99999 til 00000.
</para>
<para>
Men altså, det skal forestille, at alle bit er tændt - det kalder
man, at de er sat. Hvis det er et 32-bit register, svarer det til
ca. 4 milliarder. Når man så lægger 1 til, bliver resultatet 0!
Det ligner ikke helt den verden, vi ønsker at repræsentere
med vores computer programmer. Derfor bør man under programmering
altid være opmærksom på grænserne for de tal, man arbejder med.
Det er imidlertid ikke så slemt, som det lyder.
</para>
<informaltable frame="all">
<tgroup cols="32">
<tbody>
<row>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<sidebar>
<para>
Ovenstående forestiller en kilometertæller som tæller med nuller
og enere. Den er løbet fuld! Næste gang, den skal tælle opad,
skifter alle cifre, ligesom 99.999km ville skifte til 00.000km.
</para>
</sidebar>
<para>
Altså, når alle bit er sat, og vi lægger en til, så slukker
de alle sammen. Derfor kunne det være en god idé at lade 1...1111
repræsentere det negative tal -1.
</para>
<informaltable frame="all">
<tgroup cols="5">
<thead>
<row>
<entry>fortegn</entry>
<entry>_______</entry>
<entry>_______</entry>
<entry>_______</entry>
<entry>værdi med almindeligt 10-talsystem</entry>
</row>
</thead>
<tbody>
<row>
<entry>1</entry>
<entry>0</entry>
<entry>0</entry>
<entry>0</entry>
<entry> == -8</entry>
</row><row>
<entry>1</entry>
<entry>0</entry>
<entry>0</entry>
<entry>1</entry>
<entry> == -7</entry>
</row><row>
<entry>1</entry>
<entry>0</entry>
<entry>1</entry>
<entry>0</entry>
<entry> == -6</entry>
</row><row>
<entry>1</entry>
<entry>0</entry>
<entry>1</entry>
<entry>1</entry>
<entry> == -5</entry>
</row><row>
<entry>1</entry>
<entry>1</entry>
<entry>0</entry>
<entry>0</entry>
<entry> == -4</entry>
</row><row>
<entry>1</entry>
<entry>1</entry>
<entry>0</entry>
<entry>1</entry>
<entry> == -3</entry>
</row><row>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>0</entry>
<entry> == -2</entry>
</row><row>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry>1</entry>
<entry> == -1</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>
Som man kan se, nytter det ikke noget her at kalde
kolonnerne for ENERE, TOERE og FIRERE. Hvis man skal give denne
"konvertering af betydningen" et navn, så plejer man at kalde den
2's komplement. Men egentlig er det
2<superscript>32</superscript>'s komplement, d.v.s.
2<superscript>32</superscript>-tal.
</para>
<para>
Det er nok lettere at se det for sig med en illustration.
Man repræsenterer f.x. 1 med en bit i den ene ende. Når man
vender alle bits om, så 0'er bliver til 1 og omvent (inverterer),
og lægger 1 til, så får man bitmønsteret til repræsentation af
-1.
</para>
<example id="ex-tal-0-7">
<title> tallene fra 0 til 7 og 0 til -7.</title>
<programlisting>
0: 0000, Inverted: 1111, Complement(til 2^4): 0000
1: 0001, Inverted: 1110, Complement(til 2^4): 1111
2: 0010, Inverted: 1101, Complement(til 2^4): 1110
3: 0011, Inverted: 1100, Complement(til 2^4): 1101
4: 0100, Inverted: 1011, Complement(til 2^4): 1100
5: 0101, Inverted: 1010, Complement(til 2^4): 1011
6: 0110, Inverted: 1001, Complement(til 2^4): 1010
7: 0111, Inverted: 1000, Complement(til 2^4): 1001
</programlisting>
</example>
<para>
Når der er tale om 32 bit heltals repræsentation, er det lettere
at benytte hexadecimal notation. Tallene fra 0-9 skrives som
sædvanlig 0-9, men 10-15 skrives a-f. Det betyder, at man kan
repræsentere 4 bit med ét 'ciffer', hvor ciffer skal forstås som
0-9a-f.
</para>
<example id="ex-numrep1">
<title> tallene fra 0 til 7 og 0 til -7.</title>
<programlisting>
Word: 00000000, Inverted: ffffffff, Complement: 00000000
Word: 00000001, Inverted: fffffffe, Complement: ffffffff
Word: 00000002, Inverted: fffffffd, Complement: fffffffe
Word: 00000003, Inverted: fffffffc, Complement: fffffffd
Word: 00000004, Inverted: fffffffb, Complement: fffffffc
Word: 00000005, Inverted: fffffffa, Complement: fffffffb
Word: 00000006, Inverted: fffffff9, Complement: fffffffa
Word: 00000007, Inverted: fffffff8, Complement: fffffff9
</programlisting>
</example>
<para>
Fortsætter man denne tankegang, så bliver det største tal
med 32 - bit ca. 2 milliarder, og det er stadigvæk en pæn sjat.
</para>
<para>
Grunden til, at Linux' ext2-filsystem ikke kan have filer, som er større end
2 Gb er forresten, at grænsesnittene der bruges til at læse og skrive filer
arbejder med 32 bit heltal (hvoraf en bit bruges til fortegnet).
</para>
<para>
Et program, som frembringer udskriften ovenfor (fig
<xref linkend="ex-numrep1"/>) er vist i <xref
linkend="outformat1"/>.
</para>
<para>
Det er muligt at repræsentere tal på andre måder end
den her viste. <!-- (TODO: henvisning!) --> Men vigtigere, det er
muligt at repræsentere andet end tal. Bogstaver kan repræsenteres
ved hjælp af tal, den simpleste løsning på en computer med
mulighed for at repræsentere tekst er jo den kendte metode med en
byte pr. bogstav. Det er ikke nok, hvis der også skal være plads
til at repræsentere græske bogstaver, matematiske symboler, og
slet ikke, hvis også forskellige grafiske symboler,
skrifttypebeskrivelser etc. skal repræsenteres. Men det er en helt
anden historie.
</para>
<para>
Andre ting, som for eksempel grøntsager og frugt, må repræsenteres
ved bits og bytes på samme måde som tal og bogstaver. Hvis du er
ny i programmering, vil det klogeste være at afprøve nogle
programmer nu, måske endda bruge 3 - 4 måneder på eksemplerne og
øvelserne i <xref linkend="tour"/> kapitlet.
Hvis du på den anden side kender lidt til programmering og
gerne vil køre tanken om repræsentation til ende, så er der to
begreber, som vi skal tygge lidt på: Simuleringer og modeller.
</para>
</sect1>
<sect1 id="simulering-modeller">
<title>Simulering - Modeller</title>
<para>
For lige at få lidt mere 'real-life' perspektiv på
datarepræsentation, så forestil dig et program, som skal simulere
noget, der foregår i det virkelige liv, matador-spil,
adventure-spil (som på visse punkter forventes at svare til ting,
vi kender fra dagligdagen), eller beregning af en vejrudsigt.
Vind fra vest med lavtryk - hvor ligger grænsen (isobar linjen)
for 990 millibar etc.etc. Man kan for eksempel opdele luftrummet over
Skandinavien i firkanter med hver deres vejr-målinger og beregne
interaktionen mellem firkanterne efter de fysiske love for tryk
udligning, temperaturudvidelser etc. - pyha, godt det ikke skal
udregnes i hånden!
</para>
<para>
Simuleringer er så forskellige. Man kan simulere
reaktionerne på håndtag og visningen i instrumenter i et
flycockpit for at give piloterne øvelse i at betjene
styremekanismerne; eller man kan simulere eller efteligne lydene
fra et spillende symfoniorkester. Simuleringerne svarer ikke på
alle punkter til virkeligheden, men kan være nyttige og mere
eller mindre tæt på virkeligheden.
</para>
<para>
Hvis vi skulle beregne det mest rentable dyrkningsforløb for
tomater i drivhus, hvad skulle vi så vide om dem? Jeg behøver
ikke spørge, om vi kunne spise resultatet af simuleringen! Men en
ting er sikkert, der skulle mange oplysninger til, de fleste af
dem skulle opsamles ved hjælp af grundige forsøg og målinger, som
ville ende med nogle tal, der repræsenterede egenskaber ved
forløbet.
</para>
<para>
Derimod så ligner et investeringsspil og en investerings
service for bankkunder hinanden så meget, at man kan bruge det
ene program som grundlag for den virkelige service. Her bliver
der blot koblet betalingstransaktioner på spillet, med tilhørende
retsansvar.
</para>
<para>
Kobler vi simuleringerne på virkelige objekter (med passende
teknik, som i sig selv kan være komplicerede computersystemer) kan
computeren anvendes som værktøj til at "styre virkeligheden",
måske bedre, end vi kan gøre det, men til syvende og sidst blot
som vores "forlængede arm".
</para>
<para>
Simulerings- og styringsteknikker hviler på evnen til at
repræsentere begreber og objekter ved hjælp af computerens bits.
Som nævnt er denne repræsentation altid mangelfuld. Den
opfattelse af verden, som måtte ligge til grundlag for
simuleringerne, kaldes en model. Modellen er altså ikke kun
repræsentationen af statiske, ubevægelige, egenskaber, som
tingene har, men også af deres måde at bevæge sig og indgå
forbindelser med hinanden, sådan som for eksempel de enkelte styrehåndtag
i en flysimulator må reagere på og med hinanden.
</para>
<para>
Men ligesom talrepræsentationen er mangelfuld, så vil
modeller også være mangelfulde. Ikke kun fordi der mangler den
syvende decimal, men fordi der er grænser for, hvor
meget programmøren kan forudse. Havarisituationer,
vejrsituationer, forskellige former for landskabsforhindringer
etc. kan kun i et begrænset antal være repræsenteret i en
computer. På et eller andet tidspunkt kommer man (efter meget
arbejde) formentlig til en model, som tilfredsstiller brugerne af
modellen så meget, at de opfatter modellen som en fuldt funktionel
fremstilling af virkeligheden.
</para>
<para>
Den slags tanker virker specielt tiltrækkende på børn og
reklamefolk. Måske også på fabrikanter af computerspil. Ord som
cybernetics, cyberspace og cyborg spiller på dette element af "en
verden inde i computeren".
</para>
<indexterm><primary>mapning</primary></indexterm>
<para>
Man kunne sige, at vi har "mappet", kortlagt, en del af den
virkelige verden ved hjælp af vores computers bits og nogle
programmer, som behandler dem i overensstemmelse med vores
fortolkning.
</para>
<para>
Denne teknik, at "mappe" en mængde af elementer, således at
de repræsenteres af en anden mængde, er den grundlæggende disciplin
for applikationsprogrammører. Alan Turing har omkring 1940-1950
beskrevet det teoretiske grundlag for computerens virkemåde, og hans
arbejde er stadig interessant for programmører, der vil forstå muligheder
og grænser for computerens "indre univers".
</para>
</sect1>
<sect1 id="c-program-planlaegning">
<title>Planlægning af et program</title>
<para>
For at omsætte teori til praksis er det bedst at begynde med
en opgavetype, som man kender lidt til i forvejen, og helst et
område, som ikke involverer kompliceret teknik. I denne sammenhæng
er spil og simuleringer er gode.
</para>
<para>
Det er vigtigt, at man ikke begynder for ambitiøst. Pas på ikke
at gøre for meget ud af detaillerne i første omgang. Prøv for
eksempel at skitsere, hvilke oplysninger, der bør være med i et
CD kartotek. Når det viser sig, at denne opgave er af næsten
uoverskuelig kompleksitet og involverer ansættelse af 10 erfarne
bibliotekarer (jvf. Knuth [2]) så er man gået for langt.
</para>
<para>
For at repræsentere et medlem i et medlemskartotek er det
indlysende, at der skal være navn og medlemsnummer (eller er
medlemsnummer nok?), måske skal navnet deles i for/efternavn,
formentlig skal vi have adressen med. Hvordan vi vil nedfælde
adressen kommer an på meningen med kartoteket. Normalt skal der
være forskellige måder at kontakte personen. Det kunne måske
klares ved et telefonnummer eller en e-postadresse. Skal der være
felter for indbetalt kontingent eller vil vi henvise til et
kontonummer og dermed bevæge os ind på posteringsteknikker?
</para>
<para>
Det er rart at prøve det nogle gange. Det er også ganske
underholdende, fordi man (forhåbentlig) opdager en masse om, hvad
man kan forvente af funktionalitet ud fra de data, man agter at
registrere.
</para>
<para>
Opgave: Prøv at tegne/skitsere en repræsentation af noget, du
kender godt, f.eks. et medlemskartotek, og beskriv de
operationer, du ønsker at kunne foretage. Hvis det bliver
nødvendigt at ændre i datarepræsentationen, så gør det, og tjek,
at de gamle operationer stadig kan fungere. Prøv at holde skitsen
så simpel som muligt, således at man stort set kunne gøre de
samme ting ved hjælp af en editor (tekstbehandling).
</para>
<para>
Det er den samme fremgangsmåde som ved objektorienteret analyse
og planlægning, med den lille undtagelse, at vi ikke hævder at
afspejle den ydre verdens datastruktur i vores interne
datarepræsentation.
</para>
<para>
Man kan selvfølgelig også begynde med de <emphasis> operationer
</emphasis>, som man ønsker at have til rådighed. Derefter
finder man ud af, hvilke data, som kræves for at kunne gøre det.
</para>
<para>
Med denne metode skal man være mere opmærksom på, hvordan de
forskellige data skal grupperes. Det sjove ved den
"objektorienterede" analyse er jo, at man anvender sit
forudfattede billede af den eksisterende opgave til at gruppere
sine data.
</para>
<para>
Uanset hvilken indfaldsvinkel man foretrækker, så er det vigtigt
at tegne og tale med kolleger, i nødsfald med sig selv, om
hvordan man kunne gribe sagen an. Brug meget gerne
pseudo-programmering, d.v.s. almindelige sætninger, som
beskriver, hvordan programmet skal fungere. <!--TODO
Henvisning--> Det kunne man kalde aktions-orienteret
programmering ;-)
</para>
<para>
Den her foreslåede fremgangsmåde er jo den samme procedure som
ved objektorienteret analyse til for eksempel programmering i C++, Det er
ikke umuligt at skrive strukturerede, objektorienterede
programmer ved hjælp af C sproget. Det er selvfølgelig nemmere at
gøre det med C++ (eller bør være nemmere), men der er stadig
nogle situationer, hvor C er mere effektivt.
</para>
</sect1>
</chapter>