Forum: PC-Programmierung Ansi C - Probleme mit Pointer


von Techniker (Gast)


Lesenswert?

Hallo,

in einer Applikation erhalte ich über den CAN-Bus ein Datenpacket von 
256 Bytes. Sobald die Daten auf dem Mikrocontroller anliegen wird die 
CallBack Funktion "DataRecv" ausgeführt. Nun möchte ich die empfangenen 
Daten "Data" der Funktion "FlashWritePage" übergeben. Wie müsste ich die 
Übergabe von Data realisieren ? Mit *Data funktioniert dies nicht.
1
void DataRecv (char Data[Len], int* pLen)
2
{
3
  FlashWritePage(*Data);
4
}

Deklaration von FlashWritePage:
1
unsigned int(*FlashWritePage)(unsigned char _huge *);

von Helmut L. (helmi1)


Lesenswert?

Techniker schrieb:
> Mit *Data funktioniert dies nicht.

Data ist doch schon ein Pointer. Du uebergibst bei dir die Addresse auf 
einem Pointer.
Einfach so:

FlashWritePage(Data);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

guennie schrieb im Beitrag #2856234:
> Würdest Du statt des C-Gefrickels eine richtige Programmiersprache
> verwenden, sollte sich die geschilderte Frage nicht stellen.

Hast du noch weitere derart hilfreiche Antworten parat?

Falls ja: behalt' selbige bitte für dich. Außer dir benötigt sie keiner.

von Helmut L. (helmi1)


Lesenswert?

Helmut Lenzen schrieb:
> Du uebergibst bei dir die Addresse auf
> einem Pointer.

Meinte den Wert wo der Pointer draufzeigt.

guennie schrieb im Beitrag #2856234:
> Würdest Du statt des C-Gefrickels eine richtige Programmiersprache
> verwenden, sollte sich die geschilderte Frage nicht stellen.

C ist eine Richtige Programmiersprache.

von Dominik S. (dasd)


Lesenswert?

guennie schrieb im Beitrag #2856234:
> Datenpaket mit 256 Bytes?Ein CAN-Frame bietet Platz für 8 Bytes.

Vielleicht wird zuerst gebuffert oder was weiß ich.

> Würdest Du statt des C-Gefrickels eine richtige Programmiersprache
> verwenden, sollte sich die geschilderte Frage nicht stellen.

C-Bashing? Gäähhn

Techniker schrieb:
> Nun möchte ich die empfangenen
> Daten "Data" der Funktion "FlashWritePage" übergeben. Wie müsste ich die
> Übergabe von Data realisieren ? Mit *Data funktioniert dies nicht.

Hierzu sollte dir klar sein, dass in C ein Array schon ein Pointer auf 
das erste Element (Data[0]) ist.
Schreibst du z.B. Data[1] behandelt dein Compiler das wie ein 
*(Data+sizeof(char)).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dominik S. schrieb:
> Hierzu sollte dir klar sein, dass in C ein Array schon ein Pointer auf
> das erste Element (Data[0]) ist.

Jein.  Ein Array ist natürlich schon ein Array, aber sowie man
den Namen eines Arrays ohne Dereferenzierungsoperator ("[...]")
benutzt, wird der Zeiger auf den Anfang gebildet.  Gleiches für
das Nennen einer Funktion ohne die runden Klammern.

von Udo S. (urschmitt)


Lesenswert?

Jetzt würde mich aber mal interessieren mit welcher Sprache guennie 
programmiert :-)

von Peter P. (Firma: Hartz4) (cannabis_engineer)


Lesenswert?

Ja mich auch, C als nicht richtige Programmiersprache zu bezeichnen 
zeugt von Wahnsinn, Selbstverliebtheit, Arroganz und vieles mehr ^^

von Ralf (Gast)


Lesenswert?

>void DataRecv (char Data[Len], int* pLen)
>{
>  FlashWritePage(*Data);
>}

Die Funktion muesste eigentlich so definiert sein:
1
void DataRecv(char Data[], int *pLen)
2
{
3
  FlashWritePage(Data);
4
}

Dann ist Data ein Pointer bzw. ein Element eines
Arrays, was ja auch nur ein Pointer ist.
Allerdings wird dir der C Compiler wohl ein
paar Warnungen um die Ohren hauen.

Ralf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

guennie schrieb im Beitrag #2856622:
> es gibt keine
> auch nur halbwegs brauchbare Stringverarbeitung

Genau, das ist gerade in Assembler viel besser.

Du, troll Dich einfach woanders.

von Helmut L. (helmi1)


Lesenswert?

guennie schrieb im Beitrag #2856622:
> Der Guenni programmiert in Assembler und umgeht damit den Schwachsinn,
> den die bastel- und frickel-Compiler liefern.

Aha du schreibst also Programme mit 100000 Zeilen Code in Assembler 
fehlerfrei?

guennie schrieb im Beitrag #2856622:
> häufig benötigte Zeichen sind auf
> Tastaturen mit deutschem Layout besch...en zu erreichen,

Dann kauf dir eine US Tastatur. So teuer sind die nicht.

guennie schrieb im Beitrag #2856622:
> Wer
> darauf angewiesen ist, mit seinen Produkten Geld zu verdienen bzw. diese
> in sicherheitskritischen Bereichen einsetzt und nicht auf
> hobby-frickler-Niveau herumlaboriert, wird den Quatsch meiden wie der
> "Teufel das Weihwasser"!

Und wann wirst du mit deinen riesen Assemblerprogrammen fertig? Dann 
wenn die Hardware schon laengst im Museum steht?

guennie schrieb im Beitrag #2856622:
> Der Sprachkonstrukt ist inhärent
> fehleranfällig

Noe. Das trifft eher auf Assembler zu.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Müll von "guenni" entsorgt. Wer so eklatant gegen Forenregeln verstößt, 
darf nicht damit rechnen, daß seine Absonderungen nicht entsorgt werden.

Nein, dieses Forum ist keine Provokationsplattform.

von guennie (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> guennie schrieb im Beitrag #2856622:
>> Der Guenni programmiert in Assembler und umgeht damit den Schwachsinn,
>> den die bastel- und frickel-Compiler liefern.
>
> Aha du schreibst also Programme mit 100000 Zeilen Code in Assembler
> fehlerfrei?
>
Nein. 180000 Zeilen. Läuft seit 1994 in einer Anlagensteuerung. 
Unterbrechung bisher nur durch Stromausfall bzw. Wartungsarbeiten.

> guennie schrieb im Beitrag #2856622:
>> häufig benötigte Zeichen sind auf
>> Tastaturen mit deutschem Layout besch...en zu erreichen,
>
> Dann kauf dir eine US Tastatur. So teuer sind die nicht.

Wozu? Ich "programmiere" nicht mit dem Mist.

>
> guennie schrieb im Beitrag #2856622:
>> Wer
>> darauf angewiesen ist, mit seinen Produkten Geld zu verdienen bzw. diese
>> in sicherheitskritischen Bereichen einsetzt und nicht auf
>> hobby-frickler-Niveau herumlaboriert, wird den Quatsch meiden wie der
>> "Teufel das Weihwasser"!
>
> Und wann wirst du mit deinen riesen Assemblerprogrammen fertig? Dann
> wenn die Hardware schon laengst im Museum steht?

Nein. Im laufe der Zeit sammeln sich Funktionen bzw. Prozeduren an, 
welche mann problemlos in Bibliotheken sammeln kann...

>
> guennie schrieb im Beitrag #2856622:
>> Der Sprachkonstrukt ist inhärent
>> fehleranfällig
>
> Noe. Das trifft eher auf Assembler zu.

Erneut unfug. Jeder Befehl ist eindeutig und wird 1:1 umgesetzt. Kein 
"Kaputt-Optimieren" durch den Compiler...

von guennie (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Müll von "guenni" entsorgt. Wer so eklatant gegen Forenregeln verstößt,
> darf nicht damit rechnen, daß seine Absonderungen nicht entsorgt werden.
>
> Nein, dieses Forum ist keine Provokationsplattform.

Spielverderber.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Helmut Lenzen schrieb:
>> häufig benötigte Zeichen sind auf
>> Tastaturen mit deutschem Layout besch...en zu erreichen,
>
> Dann kauf dir eine US Tastatur.

Was ich nun seit 22 Jahren mache: die Tasten ÄÖÜ liefern ohne
weitere Umschaltungen die Zeichen [\], mit Shift dann {|}, und
erst zusammen mit AltGr die Umlaute.   Auch wenn das nicht der
Reinen Schreibmaschinenlehre[TM] entspricht :), die AltGr-Taste
lässt sich prima gemeinsam mit diesen Tasten drücken.

Auf diese Weise habe ich beide Welten bequem zur Hand: die fürs
Programmieren wichtigen Klammern und die deutschen Umlaute, damit
meine Mitmenschen meinen Text auch flüssig lesen können.

Solange man nicht in APL programmieren will, ist das alles kein
Problem.

von Helmut L. (helmi1)


Lesenswert?

guennie schrieb:
> Nein. 180000 Zeilen. Läuft seit 1994 in einer Anlagensteuerung.
> Unterbrechung bisher nur durch Stromausfall bzw. Wartungsarbeiten.

Und was machst du wenn die Hardware in die Jahre kommt und es keine 
Ersatzteile mehr gibt?

guennie schrieb:
> Erneut unfug. Jeder Befehl ist eindeutig und wird 1:1 umgesetzt. Kein
> "Kaputt-Optimieren" durch den Compiler...

Warum sollte der Compiler was kaputt optimieren?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Helmut Lenzen schrieb:
> Warum sollte der Compiler was kaputt optimieren?

Helmut, lass ihn.  Das ist ein Troll.

von Yalu X. (yalu) (Moderator)


Lesenswert?

@guenni, egbert oder wie immer du dich morgen nennen magst:

Den einzigen Nachteil von C sehe ich darin, dass diese Sprache es dir
ermöglicht, deine seltsamen Ansichten hier zu eröffentlichen.

In welcher Sprache ist wohl der Web-Browser geschrieben, den du zum
Posten benutzt?

In welcher Sprache ist wohl das Betriebssystem geschrieben, auf dem dein
Web-Browser läuft?

In welcher Sprache ist wohl der Web-Server geschrieben, mit dem sich
dein Web-Browser verbindet?

Glaubst du im Ernst, die Informationstechnik hätte sich so rasant bis
zum heutigen Stand entwickeln können, wenn sämtliche Software immer noch
in Assembler geschrieben würde?

Assembler programmiert man heute zu 99% nicht mehr selber, sondern
lässt programmieren, nämlich den Compiler.

guennie schrieb:
> 180000 Zeilen.

In C wären es höchtens 9000 gewesen.

von guennie (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> guennie schrieb:
>> Nein. 180000 Zeilen. Läuft seit 1994 in einer Anlagensteuerung.
>> Unterbrechung bisher nur durch Stromausfall bzw. Wartungsarbeiten.
>
> Und was machst du wenn die Hardware in die Jahre kommt und es keine
> Ersatzteile mehr gibt?
>

Solange noch irgendwo ein funktionsfähiger 80x86 aufzutreiben ist, sehe 
ich da keine Probleme... Und da ich für das Unternehmen nicht mehr tätig 
bin...

> guennie schrieb:
>> Erneut unfug. Jeder Befehl ist eindeutig und wird 1:1 umgesetzt. Kein
>> "Kaputt-Optimieren" durch den Compiler...
>
> Warum sollte der Compiler was kaputt optimieren?

Aus eigener Erfahrung mit den verschiedenen C-Compiler für 
Mikrochip-Produkte kann ich ein langes Klagelied auf z.B. die 
unterschiedlich Behandlung von Arrays in MPLAB-C und C18 singen... Der 
C18 hat die Eigenart, zwar Indizies größer als 255 zuzulassen, jedoch 
nur auf die ersten 256 Byte-Elemente zugreifen zu können... Stundenlange 
Fehlersuche - wo? Na klar, im erzeugten Assembler-Listing. Dann kann 
ich's auch gleich in Assembler schreiben!

Und: Eine "Programmiersprache", die sowas hier ernsthaft zulässt:

inv v,i,j,k,l,s,a[99];
main () 
{for(scanf("%d",&s);*a-s;v=a[j*=v]-a[i],k=i<s,j+=(v=j<s&&(!k&&!!printf(2 
+"\n\n%c"-(!1<<!j)," 
#x"[1^v=(1^j)&1:2])&&++1||a[i]<s&&v&&v-i+j&&v+i-j))&&!(1%=s),v||(i==j?a[ 
i+=k]=0:++a[i])>=s*k&&++a[--i]);}

Kann nicht ernst gemeint sein.

von troll (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> guennie schrieb:
>> Erneut unfug. Jeder Befehl ist eindeutig und wird 1:1 umgesetzt. Kein
>> "Kaputt-Optimieren" durch den Compiler...
>
> Warum sollte der Compiler was kaputt optimieren?
Vielleicht weil/wenn man als Anwender unfähig ist ihn richtig zu 
benutzen? duckundweg

von Proxxon (Gast)


Lesenswert?

Helmut Lenzen (helmi1) schrieb:

guennie schrieb:
>> Nein. 180000 Zeilen. Läuft seit 1994 in einer Anlagensteuerung.
>> Unterbrechung bisher nur durch Stromausfall bzw. Wartungsarbeiten.

> Und was machst du wenn die Hardware in die Jahre kommt und es keine
> Ersatzteile mehr gibt?

Und was macht das "180.000 Zeilen Projekt" erst wenn Wartende mal 
vorzeitig aus dem Leben scheidet? Die Hinterlassenschaft soll wohl der 
Nachwuchs dann am Leben halten? Der wird "sich freuen". In diesem 
Zusammenhang einfach mal an Dirk Bach denken ..

von guennie (Gast)


Lesenswert?

Yalu X. schrieb:
> @guenni, egbert oder wie immer du dich morgen nennen magst:
>
> Den einzigen Nachteil von C sehe ich darin, dass diese Sprache es dir
> ermöglicht, deine seltsamen Ansichten hier zu eröffentlichen.
>
> In welcher Sprache ist wohl der Web-Browser geschrieben, den du zum
> Posten benutzt?
>
> In welcher Sprache ist wohl das Betriebssystem geschrieben, auf dem dein
> Web-Browser läuft?
>
> In welcher Sprache ist wohl der Web-Server geschrieben, mit dem sich
> dein Web-Browser verbindet?

Was tut das zur Sache?

> Glaubst du im Ernst, die Informationstechnik hätte sich so rasant bis
> zum heutigen Stand entwickeln können, wenn sämtliche Software immer noch
> in Assembler geschrieben würde?

Ja, mit Sicherheit sogar weiter und schneller. Dann hätten wir uns 
nämlich nicht jahrelang mit nicht-funktionierender Bluescreen-Software 
von Microsoft rumärgern müssen, mit Buffer-Overflows, u.s.w.

> Assembler programmiert man heute zu 99% nicht mehr selber, sondern
> lässt programmieren, nämlich den Compiler.

In sicherheitskritischen Bereichen: NEIN.

>
> guennie schrieb:
>> 180000 Zeilen.
>
> In C wären es höchtens 9000 gewesen.

Auch hier: Sicherlich nicht, vielleicht 40.000. Aber 40.000 
unverständliche und unübersichtliche Zeilen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

guennie schrieb:
> Und: Eine "Programmiersprache", die sowas hier ernsthaft zulässt:
>
> ...
>
> Kann nicht ernst gemeint sein.

Aha, da sieht man mal, wieviel Ahnung du von C hast:
1
$ gcc -c guenni.c 
2
guenni.c:1:1: error: unknown type name ‘inv’
3
guenni.c: In function ‘main’:
4
guenni.c:3:6: warning: incompatible implicit declaration of built-in function ‘scanf’ [enabled by default]
5
guenni.c:3:65: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
6
guenni.c:4:20: warning: missing terminating " character [enabled by default]
7
guenni.c:4:1: error: missing terminating " character
8
guenni.c:5:2: error: invalid preprocessing directive #x
9
guenni.c:5:3: warning: missing terminating " character [enabled by default]
10
guenni.c:6:5: error: expected ‘)’ before ‘]’ token
11
guenni.c:6:5: error: expected ‘)’ before ‘]’ token
12
guenni.c:6:5: error: expected ‘)’ before ‘]’ token
13
guenni.c:6:5: error: expected ‘)’ before ‘]’ token
14
guenni.c:6:5: error: expected statement before ‘]’ token
15
guenni.c:6:6: error: expected expression before ‘=’ token
16
guenni.c:6:15: error: expected statement before ‘)’ token
17
guenni.c:6:16: error: expected expression before ‘>=’ token
18
guenni.c:6:31: error: expected statement before ‘)’ token

:D

von guennie (Gast)


Lesenswert?

Proxxon schrieb:
> Helmut Lenzen (helmi1) schrieb:
>
> guennie schrieb:
>>> Nein. 180000 Zeilen. Läuft seit 1994 in einer Anlagensteuerung.
>>> Unterbrechung bisher nur durch Stromausfall bzw. Wartungsarbeiten.
>
>> Und was machst du wenn die Hardware in die Jahre kommt und es keine
>> Ersatzteile mehr gibt?
>
> Und was macht das "180.000 Zeilen Projekt" erst wenn Wartende mal
> vorzeitig aus dem Leben scheidet? Die Hinterlassenschaft soll wohl der
> Nachwuchs dann am Leben halten? Der wird "sich freuen". In diesem
> Zusammenhang einfach mal an Dirk Bach denken ..

Obsoleszens ist ein generelles Problem aller technischen 
Errungenschaften. Die Wartungsarbeiten beziehen sich auf 
elektromechanische Anlagenteile, nicht auf die Software. Da ich nicht 
mehr für das Unternehmen tätig bin, stellt sich mir die Frage auch 
nicht.

von guennie (Gast)


Lesenswert?

Yalu X. schrieb:
> guennie schrieb:
>> Und: Eine "Programmiersprache", die sowas hier ernsthaft zulässt:
>>
>> ...
>>
>> Kann nicht ernst gemeint sein.
>
> Aha, da sieht man mal, wieviel Ahnung du von C hast:
>
> ...
> guenni.c:6:5: error: expected ‘)’ before ‘]’ token
> guenni.c:6:5: error: expected ‘)’ before ‘]’ token
> guenni.c:6:5: error: expected ‘)’ before ‘]’ token
> guenni.c:6:5: error: expected ‘)’ before ‘]’ token
> guenni.c:6:5: error: expected statement before ‘]’ token
> guenni.c:6:6: error: expected expression before ‘=’ token
> guenni.c:6:15: error: expected statement before ‘)’ token
> guenni.c:6:16: error: expected expression before ‘>=’ token
> guenni.c:6:31: error: expected statement before ‘)’ token
>
> :D

Aber, aber. Ich habe nie behauptet, tiefergehende Kenntnisse von C zu 
haben, geschweige denn - solange mir nicht irgendetwas schweres auf den 
Kopf fällt - mir ebendiese aneignen zu wollen.

Ich muss den Quatsch nicht verstehen, der Kompiler tut es offensichtlich 
auch nicht; Die Fehlermeldungen sind wenig hilfreich und welche Funktion 
das "Programm" - trotz des wohl tatsächlich vorhandenen 
Übertragungsfehlers - aufweist, hat noch keiner herausbekommen.

von guennie (Gast)


Lesenswert?

So, jetzt hat der Onkel Guenni aber noch wichtigere Dinge zu erledigen.
Ich komme dann die nächsten Tage wieder zum bashen vorbei.

von Helmut L. (helmi1)


Lesenswert?

guennie schrieb:
> So, jetzt hat der Onkel Guenni aber noch wichtigere Dinge zu erledigen.

Das Assemblerprogramm fertig schreiben das er 1994 begonnen hat und 
immer noch nicht fertig ist :=)

guennie schrieb:
> Ja, mit Sicherheit sogar weiter und schneller. Dann hätten wir uns
> nämlich nicht jahrelang mit nicht-funktionierender Bluescreen-Software
> von Microsoft rumärgern müssen, mit Buffer-Overflows, u.s.w.

Jepp, dann wuerde der Computer sich noch so melden:

C:>

von why not (Gast)


Lesenswert?

> Und was machst du wenn die Hardware in die Jahre kommt und es keine
> Ersatzteile mehr gibt?
so ganz unrecht hat Günni nicht.
Die Hardware sollte abwärtskompatibel sein, dann ergibt sich kein 
Problem bei Assembler.
Besser wie Assembler geht es nun mal nicht, dafür natürlich auch 
komplizierter.
Alternativen wären ja auch noch Ada oder ein paar andere exotische 
Sprachen.
Außerdem: Die Wiederverwendbarkeit von Code ist auch so eine Mär, wie 
man ja beim Arieneabsturz mitbekommen haben sollte.

von Helmut L. (helmi1)


Lesenswert?

why not schrieb:
> Außerdem: Die Wiederverwendbarkeit von Code ist auch so eine Mär, wie
> man ja beim Arieneabsturz mitbekommen haben sollte.

Da war aber schon in der Originalsoftware ein Bug drin. Der ist bloss 
nicht aufgefallen weil deren Wertebereich bei der 4 nicht ueberschritten 
wurde.
Wenn man das Zeug nie richtig testet ...

why not schrieb:
> Die Hardware sollte abwärtskompatibel sein, dann ergibt sich kein
> Problem bei Assembler.

Dann sag das mal den Halbleiterherstellern. Wenn das Chip keinen Gewinn 
mehr bringt wird es abgekuendigt. (65er,68000 etc) Mag zwar noch ein 
paar Teile davon geben.

von Karl H. (kbuchegg)


Lesenswert?

guennie schrieb:

> Obsoleszens ist ein generelles Problem aller technischen
> Errungenschaften. Die Wartungsarbeiten beziehen sich auf
> elektromechanische Anlagenteile, nicht auf die Software. Da ich nicht
> mehr für das Unternehmen tätig bin, stellt sich mir die Frage auch
> nicht.

Ja das kennen wir schon.
Erst sein Softwaresystem möglichst exotisch aufbauen und dann: Hinter 
mir die Sintflut. Soll sich doch wer anderer mit dem unwartbaren Kram 
rumärgern.

von Karl H. (kbuchegg)


Lesenswert?

guennie schrieb:

> Aber, aber. Ich habe nie behauptet, tiefergehende Kenntnisse von C zu
> haben

Warum nimmst du dir dann das Recht heraus, C Programme als Mist zu 
bezeichnen?
Nur weil >>>DU<<< C nicht gut genug kannst um damit Projekte 
abzuwickeln? Sorry, aber das ist kein Massstab. Andere können das 
nämlich.

von why not (Gast)


Lesenswert?

> Dann sag das mal den Halbleiterherstellern. Wenn das Chip keinen Gewinn
> mehr bringt wird es abgekuendigt. (65er,68000 etc) Mag zwar noch ein
> paar Teile davon geben.
jetzt haben wir aber im PC-Bereich eine Vereinheitlichung der Hardware, 
nur noch Intel oder AMD und die gestalten Ihre CPUs ja auch 
abwärtskompatibel.
Die Frage ist nur noch welche Programmier-Software sich langfristig 
durchsetzen wird.
Reines Ansi C ist m.E. nicht schlecht, d.h. aber im Umkehrschluß 
bedeutet das nicht auch noch neue Sprachen auf Assemblerbasis möglich 
wären, die C Paroli bieten könnten. Ansätze sind ja da, aber gehen 
leider unter, da C erst einmal geschlagen werden muß - C hat nun einmal 
auch viele Tücken und deshalb gabs ja die angeblichen Verbesserungen C++ 
und C#
Zur Not reichen aber die Ursprachen (also Assembler) oder neuerdings 
Basic-Derivate völlig aus (auch für Mikrocontroller-Programmierung, 
sonst gäbe es kein Bascom-Basic, etc.).
Softwaremäßig gibt es noch keine Vereinheitlichung, alles ist noch 
möglich.

von Karl H. (kbuchegg)


Lesenswert?

why not schrieb:
> Reines Ansi C ist m.E. nicht schlecht, d.h. aber im Umkehrschluß
> bedeutet das nicht auch noch neue Sprachen auf Assemblerbasis möglich
> wären, die C Paroli bieten könnten.

Du kannst es drehen und wenden wie du willst. Assembler ist im 
industriellen Umfeld de facto tod. Zu fehleranfällig, zu langsam in der 
Entwicklung. Und wenn du ein Team von Leuten hast, dann geht ohne 
entsprechende Compilerunterstützung erst mal gar nichts. Sorry, aber 
180000 Lines of Code ist für ein industrielles Projekt nicht wirklich 
viel. Häng noch eine 0 an, und wir haben realistische Größen. Und ich 
mein damit Hochsprachencode, nicht Assemblercode mit einer LOC Explosion 
von 1:10 nach der Compilierung.

> Ansätze sind ja da,

So, welche denn?

> aber gehen
> leider unter, da C erst einmal geschlagen werden muß

Nicht C ist zu schlagen. Der Wegfall der kleinen Fehlerquellen, mit 
denen man sich als Assemblerprogrammierer rumschlagen muss ist es, der 
einen zur Hochsprache treibt. Während ein Assembler Programmierer noch 
seine Push und Pop zählt und versucht rauszukriegen, wo und wie er sich 
wieder das Carry Flag zerschossen hat, unterhalten sich Hochsprachen 
Programmierer lieber über den Aufbau von dynamischen Datenstrukturen.
Da hast du noch gar nicht die Stellen gefunden, an denen du bei der 
indirekten Adressierung eingreifen musst, hab ich schon in eine Struktur 
ein neues Member eingefügt und den Compiler über den Code gejagt um eine 
Datenstruktur zu erweitern.

> - C hat nun einmal
> auch viele Tücken und deshalb gabs ja die angeblichen Verbesserungen C++
> und C#

JEDE Programmiersprache hat ihre Tücken. Wieviele kennst du denn? Ich 
glaube ich lehn mich nicht zu weit aus dem Fenster wenn ich sage: die 
meisten Profis hier kennen mehr Sprachen zumindest soweit, dass sie 
darin programmieren können, als du überhaupt (oder guennie) kennst. Oder 
hast du schon mal APL programmiert. Was ist mit LISP, Prolog, F#, ...

> Zur Not reichen aber die Ursprachen (also Assembler)

Assembler reicht schon lange nicht mehr. Die Anforderungen in der 
Industrieprogrammierung haben sich geändert. Die 5% Laufzeitpenalty 
interessieren heute keinen mehr, den man sich mit einer Hochsprache 
einhandelt. Heutzutage sind Entwicklungskosten die treibende Kraft. Und 
weitgehende Fehlerfreiheit von Anfang an. Bei beidem hat Assembler das 
nachsehen. Nur darfst du das, was hier im Forum passiert nicht mit dem 
da draussen verwechseln, was in den Firmen gemacht werden muss.
Hier sind Amateure am Werk (nicht negativ gemeint). Diejenigen, die hier 
mit C Problemen aufschlagen (und vor allen Dingen mit welchen Problemen 
sie aufschlagen), haben in der Industrieprogrammierung nichts verloren. 
Dort muss man erst mal sein Handwerkszeug beherrschen, sonst bist du 
schneller weg vom Fenster als du Muh sagen kannst.

von troll (Gast)


Lesenswert?

Karl Heinz wie er leibt und lebt. :-)

Trotzdem, ich mag Assembler (und C).

von Karl H. (kbuchegg)


Lesenswert?

troll schrieb:
> Karl Heinz wie er leibt und lebt. :-)
>
> Trotzdem, ich mag Assembler (und C).

Ist ja auch nix dagegen einzuwenden.
Nur kriegt man große Projekte damit einfach nicht mehr gebacken. Nicht 
mit einer vorgegebenen Menge Zeit und Geld.

Die Zeiten, in denen man ein Programm irgendwie zum Laufen bringen muss 
und das reicht dann schon, sind lange vorbei. Hacker haben in der 
Industrie einen schweren Stand.

von Sam P. (Gast)


Lesenswert?

guennie schrieb:
>> Assembler programmiert man heute zu 99% nicht mehr selber, sondern
>> lässt programmieren, nämlich den Compiler.
>
> In sicherheitskritischen Bereichen: NEIN.

Witzig, dass du das erwähnst. Assembler ist da eher hinderlich als 
förderlich -- für formale Verifikation eignen sich Hochsprachen besser, 
gerade wegen der höheren Abstraktionsebene. Da will man ja gerade weg 
von der Hardwareebene und möglichst funktional beschreiben.

Dazu gibt es dann C-Compiler, die verifiziert sind, d.h. es ist 
mathematisch bewiesen, dass das, was der Compiler ausspuckt, exakt die 
Funktion erfüllt, die das Quellprogramm in Kombination mit der Semantik 
von C vorschreibt.

Andererseits wird noch nicht einmal auf die Maschinensprache vertraut -- 
da wird auch verifiziert, dass ein Maschinenbefehl unter allem Umständen 
und Randbedingungen (auch unter abnormalen Bedingungen!) das tut, was 
für ihn dokumentiert ist, inklusive Zeitverhalten. Eine 
rückwärtskompatible Architektur ist da irrelevant -- man denke da nur an 
die Peinlichkeiten, die es über die Jahrzehnte in der x86-Architektur 
gab, z.B. der FDIV-Bug, F00F, und andere. So einen unverifizierten 
Prozessor würde man in wahrhaft sicherheitskritischen Bereichen niemals 
einsetzen.

Zu den praktischen Aspekten von Hochsprachen hat Karl Heinz ja schon 
genug gesagt.

von Sam P. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hacker haben in der
> Industrie einen schweren Stand.

Ausser bei Siemens :p

Ne mal im Ernst, Sicherheit ist für Konzerne doch auch nur ein 
Bilanzposten.

Regressforderungen =
  Durchschnitts-Regresskosten mal Wahrscheinlichkeit für einen 
Regressfall

Genau so viel wird in Sicherheitsmaßnahmen investiert. Ein 
Betriebswirtschafter, der wesentlich davon abweicht (in beide 
Richtungen) macht seinen Job nicht richtig. Traurig, aber wahr. Traurig 
auch, dass er eher gefeuert wird, wenn er zu viel in Sicherheit 
investiert, weil sich diese Kosten sofort zeigen, während man die 
Verantwortung für zu wenig Sicherheit nach unten weitergeben kann.

von noergler (Gast)


Lesenswert?

Lustig, dass hier über Programmiersprachen statt über den 
Code-Ausschnitt diskutiert wird.

Da gäbe es nämlich genug Diskussionspotential. Scheint nicht so, als 
wüsste der TE so genau was er da eigentlich tut.
Jedenfalls ergeben sich eine ganze Menge Annahmen:
- die pagesize soll vermutlich 256 Byte sein
- pLen wird schon immer genau 256 Byte sein
- irgendein CAN-Layer kümmert sich scheinbar schon um das Zusammensetzen 
der 256 Byte aus einzelnen CAN-Daten
- die Zielpage wird schon irgendwie vorher irgendwo initialisiert
- um das page erase kümmert sich schon jmd. anders vorher, bzw. 
FlashWritePage selbst

void DataRecv (char Data[Len], int* pLen) { FlashWritePage(Data); }
klingt viel zu einfach als dass da nicht ein ungutes Gefühl bei mir 
entstünde.

von Why not (Gast)


Lesenswert?

guennie schrieb:
>> Assembler programmiert man heute zu 99% nicht mehr selber, sondern
>> lässt programmieren, nämlich den Compiler.
>
> In sicherheitskritischen Bereichen: NEIN.

> Witzig, dass du das erwähnst. Assembler ist da eher hinderlich als
> förderlich -- für formale Verifikation eignen sich Hochsprachen besser,
> gerade wegen der höheren Abstraktionsebene.
wieso da hat er doch indiret recht - in sicherheitskritischen Bereichen 
(Militär,u.a.) wird ADA verwandt ... deshalb ist diese Sprache auch 
heute noch auf dem Markt.

zu Karl Heinz Buchegger Post sag ich nachher noch was.

von Why not (Gast)


Lesenswert?

> Lustig, dass hier über Programmiersprachen statt über den
> Code-Ausschnitt diskutiert wird.
es ist eben nur ein Ausschnitt, dazu ist auch schon alles gesagt worden 
... und mehr hat der TO offenbar nicht zu bieten, soll er seine 
Hausaufgaben ruhig selber machen.

von Karl H. (kbuchegg)


Lesenswert?

Why not schrieb:
> guennie schrieb:
>>> Assembler programmiert man heute zu 99% nicht mehr selber, sondern
>>> lässt programmieren, nämlich den Compiler.
>>
>> In sicherheitskritischen Bereichen: NEIN.
>
>> Witzig, dass du das erwähnst. Assembler ist da eher hinderlich als
>> förderlich -- für formale Verifikation eignen sich Hochsprachen besser,
>> gerade wegen der höheren Abstraktionsebene.
> wieso da hat er doch indiret recht - in sicherheitskritischen Bereichen
> (Militär,u.a.) wird ADA verwandt ... deshalb ist diese Sprache auch
> heute noch auf dem Markt.

Die aufgeworfene Argumentation war aber nicht
  ADA oder C

sondern sie war
  C oder Assembler.

Wobei hier (zugegebenermassen als künstlerische Freiheit aufgefasst) die 
Erweiterung der Fragestellung zu "Hochsprache oder Assembler" vollzogen 
wurde.
Ich kenn natürlich nicht alle sicherheitskritischen Projekte. Trotzdem 
würde es mich dann doch sehr wundern, wenn irgendeines davon in den 
letzten 10 Jahren (mit nennenswertem Umfang, also nicht unbedingt einen 
Tiny13 der ein Relais schaltet) in Assembler realisiert worden wäre.

von Why not (Gast)


Lesenswert?

> Ich kenn natürlich nicht alle sicherheitskritischen Projekte.
wer kennt die schon, Insider werden auch nicht unbedingt auspacken.
Keiner weiß es, da Geheimhaltung herrscht.
Gerade in Sicherheitsbereichen halten sich Uralt-Programme sehr sehr 
lange, weil Neuerungen aufgrund von Haftungsfragen 100% stimmen müssen, 
d.h. es gibt dann keine komplette Neuentwicklung, sondern nur ein 
kleines Update bevor nicht wirklich alles getestet wurde.
Typisches Beispiel, daß sich Tradition hält ist SPS - könnte man 
komplett verbessern, aber zu wenig Nachfrage bzw. sicherheitstechnisch 
viel zu bedenklich.



> Trotzdem
> würde es mich dann doch sehr wundern, wenn irgendeines davon in den
> letzten 10 Jahren (mit nennenswertem Umfang, also nicht unbedingt einen
> Tiny13 der ein Relais schaltet) in Assembler realisiert worden wäre.
also ich kenne z.B. Pascalprogramme, da wurden dann einfach 
Inline-Assemblerroutinen aufgerufen.
Das kann ich in C oder ADA auch machen.
Assembler ist die traditionelle Sprache und Dein Denkfehler ist, daß 
jedes Gui, usw. unbedingt mit Assembler programmiert werden muß - nein, 
das war nie Sinn und Zweck von Assembler und damals war die 
Programmbedienbarkeit ohne Gui eben komplizierter für den Anwender bzw. 
aufgrund der Rechenleistung auch nie angedacht.
Deswegen sind als erstes Interpreter und später Compilersprachen 
entstanden, weil der Programmieraufwand für die ganzen Gadgets zu hoch 
wurde und die Programmierung für die Einfach-Programmierer nicht 
nachvollziehbar war.
Es spricht nichts dagegen, daß man sinnvollerweise den Weg der 
Vereinfachung für den reinen Anwender bzw. überforderten Programmierer 
wählt - denn Programmbedienung und Programmierung kostet Anlernzeit und 
Zeit ist Geld.
Früher kam das fertige Programm aus einem Guß (von einem Programmierer) 
und heute werden die Aufgaben aufgeteilt, Programmieren am Fließband 
sozusagen - deshalb wohl auch der Hype zum Retrocomputing und 
Exotensprachen.

Ich geb Dir recht, daß Assembler so gut wie tot ist. Andererseits 
solltest Du bedenken, daß eine vernünftige Compilersprache nur aus 
Assembler entstehen kann, alles anderes wird mit 
Geschwindigkeitseinbußen erkauft.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Why not schrieb:
> daß eine vernünftige Compilersprache nur aus Assembler entstehen kann,

Hä? Ich verstehe diesen Satz nicht. Compiler selbst sind in Hochsprache 
(fast immer C) geschrieben, und das was der Compiler aus einem 
Quellprogramm (C oder sonstewas) erzeugt ist "natürlich" irgendwas 
assemblerisches ..

Was genau wolltest du aussagen?

> alles anderes wird mit Geschwindigkeitseinbußen erkauft.

selbst 50% Geschwindigkeits- und Codezunahme sind lächerlich im 
Vergleich zu 500% Zunahme des Entwicklungsaufwands von was-auch-immer 
(assembler vs. Hochsprache).

Pack einen 2. Speicherchip rein, takte dein Kram doppelt so schnell, 
schon ist deine Einbuße hinfällig. Das skaliert wunderbar linear und 
"kost nix"

Du wirst aber unwahrscheinlicherweise keine weitere Spezifikateure, 
Entwickler, Koordinatoren nutzen wollen, welche dir deine 
Entwicklungsaufgabe dann in Assembler auf mehr Köpfe verteilt lösen 
sollen....

von Karl H. (kbuchegg)


Lesenswert?

Why not schrieb:

> Deswegen sind als erstes Interpreter und später Compilersprachen
> entstanden, weil der Programmieraufwand für die ganzen Gadgets zu hoch
> wurde und die Programmierung für die Einfach-Programmierer nicht
> nachvollziehbar war.


Darf ich fragen, wie alt du bist und wie lange du schon programmierst?

Die ersten verbreiteten Compiler (und damit Hochsprachen) waren
  ALOGOL
  Fortran
  Cobol
  PL/1

und die Entwicklungszeit dieser Compiler war irgendwann in den 
50-er/60-er Jahren des letzten Jahrhunderts. Entwickelt hat sich das 
ganze aus der Erkentnis, dass die Makro-Fähigkeiten der Assembler
a) sowieso immer gleich benutzt werden
b) viele typischen Fehler nicht abfangen
Gefragt war also ein 'Sprachtypus' bei dem man weg kam, von den 
typischen Assemblerspezifischen Problemen und Problemkreisen, die 
hauptsächlich technischer Natur waren und mit dem eigentlich 
algorithmisch zu lösendem Problem nichts zu tun haben. Mit Assembler war 
in dieser Richtung Ende der Fahnenstange und man sah auch nicht, wie man 
das erhalten könnte. Selbst die ausgefuchstesten Makro-Fähigkeiten 
halfen nicht mehr weiter. Also lehnte man sich zurück, identifizierte 
typische Programmstrukturen (die vielerorts schon lange mittels Makros 
vereinheitlicht worden waren) und suchte nach Wegen, wie man die in 
einer Sprache formalisieren könne. Und zwar ohne den ganzen Kleinkram 
wie CPU-Flags, Stack, Registerklauberei oder Push/Pop Zählerei. Da diese 
Themenkreise sowieso immer nach fixen Mustern abgehandelt wurden, konnte 
man das genausogut auch der Maschine überantworten. Die machte dabei 
wenigstens keine Fehler mehr, sobald das Basismuster erst mal stimmte.
Sobald man angefangen hat, Computer für mehr als nur Spielerein in einer 
Uni zu benutzen, waren Compiler unumgänglich.

Und es gab zuerst Compiler und erst dann, viiiel später Interpreter. 
"Einfach-Programmierer" gab es zum damaligen Zeitpunkt schon gleich gar 
nicht. Da waren Spezialisten am Werk, die die ersten kommerziell 
eingesetzten Programme schufen. - ausschliesslich Spezialisten. Die 
Spezies der "Einfach-Programmierer" kam erst mit der Verbreitung der PC, 
rund 30 bis 40 Jahre später, auf.


> Assembler ist die traditionelle Sprache und Dein Denkfehler ist,
> daß jedes Gui, usw. unbedingt mit Assembler programmiert werden muß
> - nein, das war nie Sinn und Zweck von Assembler und damals war die
> Programmbedienbarkeit ohne Gui eben komplizierter für den Anwender
> bzw. aufgrund der Rechenleistung auch nie angedacht.

Sorry. Wenn das jetzt brutal klingt.
Aber irgendwie hab ich den Eindruck, du weißt nicht wirklich wovon du 
redest. Speziell auf dieser Ebene war Assembler noch nie ein Thema.

Ich war dabei! Ich bin in dieser Zeit groß geworden als die ersten Guis 
auf den Markt kamen! Ich hab das alles aus erster Hand erlebt. Ich hab 
die ersten Guis programmiert! Ich hab Betriebssystem-Code studiert und 
analysiert! Direkt im Source Code. Von CP/M konnte man sich (über 
Umwege) den Originalcode organisieren. Geschrieben in PL/M. GEM .. 
geschrieben in C. Die ersten Apple GUI's (stark beeinflusst von der 
allerersten GUI, die bei Xerox entstanden ist), geschrieben in C.
Assembler war in diesem Bereich nie auch nur das geringste Thema. Ausser 
auf der Ebene der Device-Treiber. Sofern man diese Ebene überhaupt als 
'Treiber' ansehen kann. Mit dem was heutige Treiber machen, hatte das 
nicht viel gemeinsam.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und es gab zuerst Compiler und erst dann, viiiel später Interpreter.

Interessanterweise war das gar nicht viel später. Fortran (1957) war die
erste implementierte höhere Programmiersprache und wurde kompiliert.
Schon eineinhalb Jahre später (1958) kam die erste Lisp-Implementation
von Steve Russel, diesmal als Interpreter.

Weitere bekannte interpretierte Sprachen folgten in der ersten Hälfte
der 60er Jahre mit APL und Basic.

von troll (Gast)


Lesenswert?

Wenn schon über Geschichte und Compiler diskutiert wird eine Frage die 
ich mir immer wieder stelle: In welcher Sprache wurde der erste Compiler 
geschrieben? In Assembler? Und der erste Assembler? In ???

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

troll schrieb:
> Wenn schon über Geschichte und Compiler diskutiert wird eine Frage die
> ich mir immer wieder stelle: In welcher Sprache wurde der erste Compiler
> geschrieben? In Assembler? Und der erste Assembler? In ???

Bootstrap-Ansatz. Der Compiler wird in der Sprache geschrieben, in der 
er anschliessend Nutzprogramme übersetzten soll. C-Compiler werden also 
in C geschrieben.

http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29

von Why not (Gast)


Lesenswert?

> Darf ich fragen, wie alt du bist und wie lange du schon programmierst?
seit dem Aufkommen der ersten Heimcomputer - insofern hast Du recht, in 
puncto Basic ist mir ein Fehler unterlaufen, kam erst um einiges später.
Wobei programmieren bei mir Hobby ist, ich bild mir auch nichts darauf 
ein.

> Die ersten verbreiteten Compiler (und damit Hochsprachen) waren
>  ALOGOL
>  Fortran
>  Cobol
>  PL/1
>
> und die Entwicklungszeit dieser Compiler war irgendwann in den
> 50-er/60-er Jahren des letzten Jahrhunderts.
ja wenn schon Aufklärung, dann bitte auch mal Quellen angeben:
http://de.wikipedia.org/wiki/Zeittafel_der_Programmiersprachen

> Und zwar ohne den ganzen Kleinkram
> wie CPU-Flags, Stack, Registerklauberei oder Push/Pop Zählerei. Da diese
> Themenkreise sowieso immer nach fixen Mustern abgehandelt wurden, konnte
> man das genausogut auch der Maschine überantworten.
ist ja alles richtig, aber nur so lernt man, wie die Materie 
funktioniert - nicht durch reinschieben von Speicherriegeln und schnell 
vergessen wie die Ursprünge aussahen.

> Da diese Themenkreise sowieso immer nach fixen Mustern abgehandelt
> wurden, konnte man das genausogut auch der Maschine überantworten. Die
> machte dabei wenigstens keine Fehler mehr, sobald das Basismuster erst
> mal stimmte.
zumal damals Lehrbücher und Dokus in der Regel auch nur den Spezialisten 
zur Verfügung standen bzw. die fixen Muster nur die Spezialisten 
kannten, die damit täglich umgehen durften und mußten - es gab noch 
keinen Massenmarkt.

> Da waren Spezialisten am Werk, die die ersten kommerziell
> eingesetzten Programme schufen. - ausschliesslich Spezialisten.
kein Massenmarkt eben, aus denen man Spezialisten hätte generieren 
können - d.h. wenige Uni-Professore, Angestellte in gehobenen 
Positionen, etc. denen das Equipment zur Verfügung stand und die 
natürlich auch das Talent und die Zeit hatten da was draus zu 
programmieren, zweifelsohne.

> Die Spezies der "Einfach-Programmierer" kam erst mit der Verbreitung der > PC, 
rund 30 bis 40 Jahre später, auf.
zum Glück, sonst hätten wir heute noch Steinzeit und elitäre Zustände.


> Was genau wolltest du aussagen?
ich muß doch an der Basis ansetzen, im Prinzip sogar noch eine Ebene 
tiefer auf Maschinencodeebene, um ein schnelle Programmiersprache zu 
entwickeln (falls Geschwindigkeit und Speicherresourcen Aspekte sind - 
viele werden das verneinen ?!).
Bei einem lahmen Rechner wirst Du die Unterschiede sehr deutlich sehen 
können.
Doppelcompilation,etc. geht zwar dank der heutigen Rechnerkapazitäten, 
aber ist das unbedingt sinnvoll?
Dann kann ich auch gleich bei C bleiben und mir das letzte Drittel der 
kryptischen Fenster- und Gui-Programmierung unter C antun - als Amateur 
sowieso.

von Why not (Gast)


Lesenswert?

> In welcher Sprache wurde der erste Compiler geschrieben?
keine Ahnung

> Und der erste Assembler? In ???
Binärcode (das meinte ich auch vorhin, nicht Maschinencode sondern 
Binärcode).
siehe:
http://www.topbox.at/INFORMATIONSTECHNIK/Moderne_Computer/Binaercode_und_Maschinencode/

von (prx) A. K. (prx)


Lesenswert?

why not schrieb:
> nur noch Intel oder AMD und die gestalten Ihre CPUs ja auch
> abwärtskompatibel.

Vom Befehlssatz her ja, aber mittlerweile gibt es andere Grenzen. 
Versuch mal, ein zwar altes aber immer noch häufig eingesetztes 
Betriebssystem wie den Windows Server 2003 auf einem aktuellen 
Intel-Server zu installieren. Es geht nicht.

von (prx) A. K. (prx)


Lesenswert?

Why not schrieb:
>> In welcher Sprache wurde der erste Compiler geschrieben?
> keine Ahnung

FORTRAN ist nicht der allererste Compiler, aber der erste der populär 
wurde. Die Entwicklung des Compilers dauerte 18 Personenjahre.

Der erste Pascal-Compiler wurde übrigens in Pascal geschrieben.

von troll (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

<blockquote>
In welcher Sprache wurde der erste Compiler
geschrieben? In Assembler? Und der erste Assembler? In ???
</blockquote>

Du darfst dir das nicht so vorstellen, dass sich jemand hingesetzt hat 
und sich gesagt hat: So jetzt schreib ich mal einen Compiler/Assembler

Das ganze hat sich historisch entwickelt.
Natürlich wurde in der Anfangszeit direkt in Binärcode programmiert. Da 
wurden Löcher in Filstreifen gestanzt, Lochkarten händisch gelocht, etc.

All dem lag zugrunde, dass man erst mal sein Programm niedergeschrieben 
hatte. Da stand dann eben auf dem papier

   CD 01 08
   AC
   BD

wobei jede Zahl für einen Befehl stand und ob das tatsächlich Hex-Zahlen 
waren, kann ich dir auch nicht sagen. Wahrscheinlich aber eher nicht.

Diejenigen die sich mit der Materie beschäftigt haben haben dann ganz 
schnell erkannt (das dauer nur ein paar Stunden :-), dass diese 
Schreibweise höchst fehleranfälig ist. Also haben sie sich Mnemnoics 
ausgedacht

   ADD   A, B
   JP    0801
   RET

und haben so ihre Programme auf dem Papier geschrieben und nachdem es 
dort zum Test fertig war händisch in die Codes übertragen. Und da ist 
jetzt der Schritt nicht mehr weit, ein Programm zu schreiben, welches 
diese Eingabe in Textform von Lochkarten abliest (speziell wenn man eine 
Lochkartenstanze mit Schreibmaschinentastatur hat) [eine Lochkarte ist 
gleich 1 Zeile] und anhand einfacher Regeln aus dem ADD und den 
zusätzlichen Argumenten die entsprechenden Codes erzeugt und auf neuen 
Lochkarten ausstanzt. Das mag zwar primitiv sein, erfüllt aber erst mal 
seinen Zweck - der erste primitive Assembler ist geboren.

Dieses allererste Progamm muss man mangels Assembler natürlich noch in 
der hergebrachten Art und Weise (also direkt mit den Codes) schreiben. 
Aber: es muss ja auch nicht viel können. Genau genommen muss es nur die 
Befehle können, die in ihm selber vorkommen. Denn dann kann man den 
soweit vorhandenen Assembler in seiner eigenen Sprache nochmal neu 
schreiben und so den Bootstrap-Prozess einleiten. Mit dem vorhandenen 
einfachen Assembler schreibt man eine kompliziertere Variante, die schon 
mehr kann. Und mit der kommt dann die nächste Stufe, die wieder mehr 
kann, usw. usw.

Und genauso funktioniert das auch noch bei heutigen Compilern. Nur das 
man die nicht mehr in Assembler anfängt sondern man schreibt einen 
hypotetischen XYZ Compiler zb erst mal in C. Wieder: Der braucht noch 
nicht allzuviel können. Gerade das, was in ihm selber vorkommt. Danach 
wird dieser Einfachcompiler in seiner eigenen Sprache nochmal neu 
geschrieben und dann beginnt sich das Bootstrap Karusell zu drehen - der 
vorhandene XYZ Compiler wird dazu benutzt um bessere Versionen eines XYZ 
Compilers herzustellen, die schon wieder mehr können.

Eine Erstversion eines Compiler muss zb keine Funktionen kennen, oder 
lokale Variablen oder Floating Point Arithmetik. Er muss auch nicht 
optimieren oder besonders guten Code erzeugen. Es reicht völlig aus, 
wenn er erst mal nur seine Quellsprache soweit übersetzen kann, dass es 
reicht um einen in dieser Sprache geschriebenen Einfachst-Compiler 
übersetzen zu können, wobei das Ergebnis lediglich funktionsfähig sein 
muss.

von Sam P. (Gast)


Lesenswert?

Why not schrieb:
> ich muß doch an der Basis ansetzen, im Prinzip sogar noch eine Ebene
> tiefer auf Maschinencodeebene, um ein schnelle Programmiersprache zu
> entwickeln (falls Geschwindigkeit und Speicherresourcen Aspekte sind -
> viele werden das verneinen ?!).

Eben. Geschwindigkeit ist ein wichtiger Punkt bei der 
Compiler-Entwicklung, aber nur begrenzt bei der Sprach-Entwicklung.

Und da algorithmische Optimierungen immer noch mit Abstand die größten 
Geschwindigkeitssteigerungen liefern, ist eine schnelle Sprache eine, 
die abstrakt genug ist, Algorithmen komfortabel zu formulieren. 
Klassisches Beispiel sind die Fibonacci-Zahlen. Sprachen mit multiplen 
Rückgabewerten für Funktionen können einen schnelleren Algorithmus 
verwenden als eine Sprache, in der nur ein einziger Wert zurückgegeben 
werden kann. In letzterer muss man dann zur Verwendung des optimaleren 
Algorithmus zusätzlich manuell das mit den Rückgabewerten emuliert 
werden, und die naive Implementierung ist halt doppelt so lahm.

Was das Übersetzen in Maschinencode angeht, ist es sehr schwer, den 
optimalsten Code zu erzeugen. Selbst bei einfachen CPUs ist das ein 
NP-vollständiges Problem, also für alle praktischen Belange nicht 
hundertprozentig optimal lösbar, weder für Menschen noch für Compiler. 
Dazu kommt, dass auch hier die vielversprechenderen Optimierungen noch 
auf einer abstrakten, maschinenunabhängigen Zwischenstufe des Programms 
durchgeführt werden.

Die Assemblerebene ist also in weiten Bereichen irrelevant. Bei der 
Parallelisierung von Aufgaben z.B. sind Compiler noch nicht so gut, 
darum ist für SIMD (MMX, SSE und Co) Assemblersprache populär, aber eben 
nur dort, wo der Aufwand in vernünftiger Relation zum Ergebnis steht. 
Dank besserer Compiler wird das immer weniger.

Selbst bei GPU-Berechnungen ist man doch schon vom Assembler weg. Ich 
habe das noch gemacht, weil GLSL noch nicht wirklich praxistauglich war 
zu der Zeit. Das war Low-Level-Optimierung vom feinsten, Feilschen um 
jedes Bit und jede Instruktion. Und es war nötig, es lief gerade so 
eben, total am Limit der damaligen Standardhardware. Heute sehe ich 
meine eigenen Programme, und sie sind de facto unwartbar, weil der Code 
die zugrundeliegenden Algorithmen nicht wiedergibt. Der Aufwand, mich in 
meine eigenen Programme von 30-40 Instruktionen(!) neu einzuarbeiten, 
ist die Mühe nicht wert. Ich benutze das lieber mit leichten Fehlern.

Die selben Algorithmen neu geschrieben in GLSL (was ja sehr an C 
orientiert ist) wären unter Garantie nicht so optimal, ich tippe auf 
Faktor 2. Aber wen kümmert's? GPUs sind inzwischen 10 mal so schnell, da 
werf ich auch gleich noch eine algorithmische Optimierung über den 
Haufen, die ich damals einbaute, aber die praktische Nachteile hat. Noch 
ein Faktor 4 langsamer. Immer noch egal, dafür könnte ich dann neue 
Funktionen einbauen, Fehler beheben, und so weiter.


> Bei einem lahmen Rechner wirst Du die Unterschiede sehr deutlich sehen
> können.

Es gibt immer Randbedingungen, unter denen deine Aussagen und 
Prioritäten korrekt sind. Aber es sind heutzutage Ausnahmefälle. Die 
Rechensekunde kostet nicht mehr 1DM, neue/schnellere/mehr Hardware ist 
billig, aber die Programmiererstunde ist teuer.

Mich regt z.b. die heutige Desktopsoftware auch auf. Und es gibt auch 
ganz böse Sünder, die ungerechtfertigt verschwenderisch mit Ressourcen 
umgehen. Aber ich rege mich ganz schnell wieder ab, wenn ich dann einen 
alten Win95-Rechner anmache. 4MB RAM, 100MHz, sagenhaft. Sowas fand man 
mal komfortabel. Und was der alles nicht kann! Das übersieht man 
nämlich schnell, den Anwenderkomfort den man heute gewohnt ist.

Dann doch lieber heutige Desktopsoftware. Die würde es ohne die 
Verschwendung schlicht und ergreifend nicht geben. Ich will gar nicht, 
dass die Programmierer alle genau wissen, was auf der Assemblerebene 
abgeht. Die haben genug andere Probleme, und als Hintergrundwissen für 
guten Programmierstil gibt es ebenfalls viel nützlichere Dinge.

Und all das kann man 1:1 auf Mikrocontroller übertragen. Auch da gibt es 
Grenzfälle, z.B. wenn man schon das größte Modell einer Familie 
einsetzt. Aber bevor man da ans Optimieren geht, sollte man sich fragen, 
wie viel Zyklen/Bytes man gewinnt, und wie lange das reicht, bis die 
nächste Funktion nicht mehr reinpasst. Großzügig überdimensionieren 
kostet ein paar Euro, ein Bruchteil eines Stundenlohns. Von den 
geschonten Nerven und der schnelleren Fertigstellung des Geräts mal ganz 
abgesehen.



> Doppelcompilation,etc. geht zwar dank der heutigen Rechnerkapazitäten,
> aber ist das unbedingt sinnvoll?
> Dann kann ich auch gleich bei C bleiben und mir das letzte Drittel der
> kryptischen Fenster- und Gui-Programmierung unter C antun - als Amateur
> sowieso.


Und machst all die Fehler, die man in C gerne macht. Ich weiss seit 
gestern, warum mein Rechner nach 2 Wochen 4GB Swap voll hat -- ein 
Memory Leak in einer kleinen banalen Hilfsanwendung, die ich irgendwann 
mal fix gestrickt hab. Typischer Fehler für ein C-Programm. Von einem 
erfahrenen Programmierer. In gerade mal 1000 Zeilen Code. Fehler, die 
die Sprache zulässt, passieren auch. Immer. Und zu all den typischen 
Gefahren bei der Programmierung in C kommen bei Assembler noch zig neue 
Gefahren hinzu.

GUI-Anwendungen schreibe ich z.B. grundsätzlich in einer interpretierten 
Skriptsprache, weil der Performanceverlust dabei sch*egal ist, aber weil 
ich dann auch nicht mehr auf's Memory Management achten muss und ich 
noch abstraktere Sprachfunktionen nutzen kann. Ich bin schneller fertig 
und die Software hat weniger Fehler. Dass sie statt 5ms nun 10ms 
Antwortzeit hat, kümmert keinen. Dass sie doppelt so viel Speicher 
verbrät, ist sicherlich nicht ideal und summiert sich dann doch auf, 
aber ich brauche nur ein einziges Memory Leak fixen und hab genug 
Speicher gewonnen für 10 verschwenderische Programme ;) Und dann hat das 
Progremm auch noch jeden Komfort, den man sich denken kann. In C würden 
etliche sekundäre Funktionen wegfallen, weil es eben so viel Aufwand 
ist.

Und ist es dann doch mal zu langsam/zu verschwenderisch mit Speicher, 
dann, und nur dann, misst man mal aus, wo genau das Problem ist und 
überlegt sich einen besseren Algorithmus. Gibt es keinen, dann (und nur 
dann) geht man eine Sprachebene tiefer, also z.B. Skriptsprache->C und 
von C->Assembler. Oder man nimmt größere Hardware, was von beidem halt 
einfacher/billiger ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

troll schrieb:
> Trotzdem, ich mag Assembler (und C).

Ich mag auch CW (Morse-Telegrafie im Funkverkehr).

Trotzdem würde ich mich lächerlich machen, wenn ich mich hinstelle
und GSM & Co. als überflüssigen Mist zu bezeichne, weil man ja auch
mit CW prima Daten übertragen kann und dafür deutlich weniger (und
weniger fehleranfällige) Technik braucht.

CW ist mittlerweile aus dem professionellen Funkverkehr komplett
verschwunden.  Die letzten, die sich (nach knapp 100 Jahren) davon
verabschiedet haben, waren die Seenotfunkdienste.  Genauso wird
sich der Assembler nahezu vollständig aus professioneller (*)
Programmierung verabschieden.

(*) Zur Erinnerung: professionell ist kein Hinweis auf besonders
gute oder besonders schlechte Qualität, sondern es heißt lediglich,
dass derjenige, der es tut, sich damit seine Brötchen verdienen muss.
Das bedingt u. a., dass er mit seiner Produktivität konkurrenzfähig
sein muss.

von troll (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> troll schrieb:
>> Trotzdem, ich mag Assembler (und C).
> Ich mag auch CW (Morse-Telegrafie im Funkverkehr).
> [...]
Ich habe ja nirgendswo C verteufelt... Ich meine nur auch Assembler hat 
noch seine Berechtigung, und sei es nur wenn man (als Hobby) hochgradig 
zeitkritische Sachen auf unterdimensionierten AVRs machen will... Soll 
doch jeder so programmieren wie er will und alle sind zufrieden. :-)
(Und wenn ich mal die Afu-Prüfung mache will ich auch CW lernen.)

Nebenbei noch Danke an  Karl Heinz Buchegger  für den sehr interessanten 
Beitrag zum Compiler-Henne-Ei-Problem!

von Karl H. (kbuchegg)


Lesenswert?

troll schrieb:
> Jörg Wunsch schrieb:
>> troll schrieb:
>>> Trotzdem, ich mag Assembler (und C).
>> Ich mag auch CW (Morse-Telegrafie im Funkverkehr).
>> [...]
> Ich habe ja nirgendswo C verteufelt... Ich meine nur auch Assembler hat
> noch seine Berechtigung, und sei es nur wenn man (als Hobby) hochgradig
> zeitkritische Sachen auf unterdimensionierten AVRs machen will...


Hat es.

Ausgansgpunkt der Sache war aber C-Bashing mit der Alternative der 
einzig selig machenden, 'richtigen' Sprache Assembler. Und das kann man 
so weder stehen lassen noch akzeptieren.
Wer heute aus Liebhaberei einen Ford Model-T am Leben erhält, ist ein 
Enthusiast. Einem Autobauer dieses Modell aber als das einzig wahre Auto 
verkaufen zu wollen, grenzt an Masochismus.

(Und zudem ist guennie nicht das erste mal mit diesem Blödsinn 
aufgefallen)

von troll (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und das kann man
> so weder stehen lassen noch akzeptieren.
Dann sind wir uns ja einig. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.