2.4 Software
33
Unter Programmiersprachen der 2. Generation versteht man Assembler-
sprachen, die auf demselben Programmiermodell wie die Maschinensprachen
basieren. Die reale Programmierung wird aber durch dem Menschen entge-
genkommende Vereinfachungen unterst¨
utzt. So werden die Befehle nicht mehr
als Zahlencodes, sondern in Form von mnemotechnischen Abk¨
urzungen ver-
wendet. Weiterhin kann der Programmierer etwa symbolische Speicheradres-
sen definieren und nutzen. So k¨
onnte die obige Operation als LDA betrag
codierbar sein (Laden eines Registers mit dem Inhalt der Speicherzelle, die
mit betrag benannt ist). Hieraus ergibt sich insbesondere eine verbesserte
Verst¨
andlichkeit der Programme. Allerdings ben¨
otigt man ein entsprechen-
des ¨
Ubersetzungsprogramm (Assembler), mit dem Assemblerprogramme in
Maschinencode umgewandelt werden. Trotzdem bleibt die Programmierung
in Assemblersprachen m¨
uhsam; weiterhin sind entsprechende Programme in
der Regel nicht portabel (d. h. sie sind ohne gr¨
oßere Ver¨
anderungen nicht auf
einer anderen Hardware ausf¨
uhrbar).
Bei den so genannten
prozeduralen Programmiersprachen der 3. Genera-
tion geschieht die Codierung von Programmen in problemorientierter und
weitgehend maschinenunabh¨
angiger Form. Damit sind Programme bei Ein-
haltung gewisser Standards auf mehreren Rechnertypen lauff¨
ahig (portabel).
Zur Transformation in die entsprechenden Maschinensprachen sind ¨
Uberset-
zungsprogramme n¨
otig (Compiler/Interpreter). Klassische Beispiele f¨
ur Pro-
grammiersprachen der 3. Generation sind Pascal, C, Cobol, Fortran und Mo-
dula. Bei einer
”
guten“ Programmierung mit solchen Programmiersprachen
ist die Verst¨
andlichkeit nicht zu umfangreicher Programme in der Regel rela-
tiv einfach. Als dem entgegenstehendes Beispiel sei das in Abbildung 2.3 dar-
gestellte syntaktisch korrekte C-Programm
19
angef¨
uhrt, dessen Zweck man
nur aufgrund eines außergew¨
ohnlichen Layouts vermuten kann.
Zielsetzung der so genannten Strukturierten Programmierung ist es, dass
der Programmcode die L¨
osung der Problemstellung auf einfache Art wider-
spiegelt. Mittel hierzu sind der modulare Aufbau von Programmen (z. B.
durch Verwendung von Unterprozeduren und Funktionen), die Verwendung
strukturierter Datentypen, die Verwendung von
”
sprechenden“ Variablenna-
men, die strukturierte Nutzung der Basiskonstrukte zur Definition von Algo-
rithmen (Sequenz, bedingte Anweisung, bedingte Iteration) usw. Beispiels-
weise sollte die Funktionsweise des in Abbildung 2.4 dargestellten Pascal-
Programms relativ offensichtlich sein.
Der Ansatz der Strukturierten Programmierung ist relativ erfolgreich bei
der
”
Programmierung im Kleinen“. Problematisch bleibt aber weiterhin die
Durchf¨
uhrung großer Programmierprojekte mit vielen Programmierern und
Zielsystemen mit mehreren Millionen Codezeilen. Dementsprechend wurden
hierf¨
ur neue Methoden und Techniken entwickelt; vgl. Kapitel 6.
19
Ausgezeichnet beim 12th International Obfuscated C Code Contest (1995); vgl.
http://www.de.ioccc.org.
34
2. Informatik und Informations- und Kommunikationstechnik
#include
#define l11l 0xFFFF
#define ll1 for
#define ll111 if
#define l1l1 unsigned
#define l111 struct
#define lll11 short
#define ll11l long
#define ll1ll putchar
#define l1l1l(l) l=malloc(sizeof(l111 llll1));l->lll1l=1-1;l->ll1l1=1-1;
#define l1ll1 *lllll++=l1ll%10000;l1ll/=10000;
#define l1lll ll111(!l1->lll1l){l1l1l(l1->lll1l);l1->lll1l->ll1l1=l1;}\
lllll=(l1=l1->lll1l)->lll;ll=1-1;
#define llll 1000
l111 llll1 {
l111 llll1 *
lll1l,*ll1l1
;l1l1
lll11 lll [
llll];};main
(){l111 llll1
*ll11,*l1l,*
l1, *ll1l, *
malloc ( ) ; l1l1
ll11l l1ll ;
ll11l l11,ll
,l;l1l1 lll11 *lll1,*
lllll; ll1(l
=1-1 ;l< 14; ll1ll("\t\"8)>l\"9!.)>vl"
[l]^’L’),++l
);scanf("%d",&l);l1l1l(l1l) l1l1l(ll11
) (l1=l1l)->
lll[l1l->lll[1-1]
=1]=l11l;ll1(l11
=1+1;l11<=l;
++l11){l1=ll11;
lll1 = (ll1l=(
ll11=l1l))->
lll; lllll =(
l1l=l1)->lll;
ll=(l1ll=1-1
);ll1(;ll1l->
lll1l||l11l!=
*lll1;){l1ll
+=l11**lll1++
;l1ll1 ll111
(++ll>llll){
l1lll lll1=(
ll1l =ll1l->
lll1l)->lll;
}}ll1(;l1ll;
){l1ll1 ll111
(++ll>=llll)
{ l1lll} } *
lllll=l11l;}
ll1(l=(ll=1-
1);(l
(l1->lll[ l]
!=l11l);++l);
ll1 (;l1;l1=
l1->ll1l1,l=
llll){ll1(--l
;l>=1-1;--l,
++ll)printf(
(ll)?((ll%19)
?"%04d":(ll=
19,"\n%04d")
):"%4d",l1->
lll[l] ) ; }
ll1ll(10); }
Do'stlaringiz bilan baham: