Wirkungsgrad von 100 m RG213U

Am 22.09.23 um 00:45 schrieb Hans-Peter Diettrich:

Das ist dann aber kein Delphi mehr, sondern ein weiterer Dialekt...

Das Blöde an Pascal ist, das die offizielle Entwicklung der Sprache Ende der 80er Jahre (IEEE/ANSI 770X3.160-1989) stehen geblieben ist und danach nur noch Wildwuchs herrschte, mit zahlreichen Queranleihen zwischen den Entwicklungslinien, aber keiner garantierten Portabilität. Wenn der (englische) Wikipedia-Artikel stimmt, hat FreePascal selbst heute noch keine vollständige Kompatibilität zu der o.g. Norm... :-(

Die Architektur ist unerreicht was Projekt-Management,

Hey, Pascal war meine erste höhere Programmiersprache! Ich habe während Schule, Studium (Nebenjobs) und in den ersten Berufsjahren viel in Turbo Pascal und auch ein wenig Delphi gemacht.

Ich war dann aber ehrlich gesagt froh, davon weg zu kommen, habe allerdings C nur gekratzt (für einige uC-Projekte) und für die dicken Projekte gleich mit C++ weiter gemacht. Wenn ich mir den aktuellen C-Standard ansehe, ist da aber inzwischen viel zurück geflossen und einige Dinge sind sogar schöner gelöst als in C++.

Beide Sprachen leben, was man von Pascal, FORTH, etc. nicht behaupten kann. :-P

Reply to
Hergen Lehmann
Loading thread data ...

Am 22.09.23 um 00:23 schrieb Wolfgang Allinger:

Ein C-Programmierer sollte verstanden haben, was ein Zeiger ist, das ist aber auch alles.

Mehr Lowlevel-Kenntnisse sind nur erforderlich, wenn man tatsächlich hardwarenah programmiert. Dann ist es aber gerade ein Vorteil, das der Zusammenhang zwischen Quellcode und Maschinencode nachvollziehbar bleibt.

Und wenn er compiliert, compiliert er in echten Maschinencode? Wie soll das gehen, bei einer Stack-orientierten Spracharchitektur und Mikrocontrollern, deren Hardware-Stack teilweise auf eine handvoll Ebenen beschränkt ist?

Ja, für Rapid Prototyping kleiner Sachen hat eine Interpreter- oder JIT-Sprache Vorteile. Nicht umsonst hat Python in den vergangenen Jahren einen Siegeszug hingelegt.

Das ändert sich aber schnell, wenn die Projekte umfangreicher werden, wenn auf Performance optimiert werden soll, oder wenn in kommerziellen Projekten eine Weitergabe des Quellcode ausdrücklich unerwünscht ist.

Also scheinbar nicht so wirklich Produktions-tauglich?

Reply to
Hergen Lehmann

Man kann es schlecht genau in Prozent messen, aber die Standardimplementationen von Java oder Python (Compiler beziehungsweise Interpretierer und Laufzeitumgebungen) sind in C oder C++ geschrieben, genauso wie führende Betriebssysteme, Browser, Datenbanken oder Office-Pakete.

In diesem Sinne beruht die Infrastruktur auf C oder C++. Darauf aufbauend werden dann sicher auch andere Programmiersprachen verwendet.

In Python ist es auch möglich, Teile einer Bibliothek oder eines Programms zur Beschleunigung in C zu schreiben, und verschiedene Python-Software macht davon Gebrauch. Daher müßte man Software, die als "Python-Software" bekannt ist eigentlich "Python/C-Software" nennen.

Reply to
Stefan Ram

Am 22.09.2023 um 09:58 schrieb Leo Baumann:

Du mußt Delphi durch Assembler ergänzen. Ich nicht, weil C seit etwa 20 Jahren so gut kompiliert, daß ASM nicht mehr notwendig ist.

Ich habe in jedem C-Projekt-Verzeichnis eine Assembler-Datei datei.s. Diejenige zur bish ist etwa 2,5 MB groß. Ich kontrolliere damit sporadisch die Arbeit des verwendeten Compilers.

Ich hatte im Jahr 2000 rechts von mir einen Kollegen, Tarek, sitzen, der mit Delphi programmierte. Ich bekam mit, wie sehr er sich mit Delphi abmühen mußte. Delphi verlangte dauernd krampfartige Zusatzarbeiten, wenn man z.B. nur etwas bitweise Undieren wollte. Da gab es den Typ Kardinal, 29 Bit breit oder so - Hää?! Ja, Delphi macht Tests zur Runtime. Man merkt das deutlich! Brauche ich nicht, ich sorge selbst für Vorabsicherheit, plausible Werte, etc.

Kann ich auch, seit den 1980ern:

formatting link

Reply to
Helmut Schellong

Ja, C ist eine Two-Pass-Angelegenheit, wie ich in 21.09.2023 17:21 schrieb.

Reply to
Helmut Schellong

Dort wird der Wert eines Ausdruck "(void(*)())0" dereferenziert und aufgerufen. Dieser Wert ist 0 und der Typ des Ausdrucks ist "Adresse einer Funktion, die keinen Wert liefert".

Da in C praktisch nicht zwischen Funktionen und Funktionsadressen unterschieden wird, ist die Dereferenzierung mit dem ersten Sternchen unnötig, "((void(*)())0)()" wäre also dasselbe.

Der Aufruf einer Funktion an der Adresse 0 (wo gar keine Funktion ist) sollte allerdings undefiniertes Verhalten haben, so daß es nicht ganz klar ist, wofür dieser Code gut sein soll.

Reply to
Stefan Ram

Am 22.09.2023 um 10:54 schrieb Stefan Ram:

Beispiel: =================================================================================== /* X - B R A I N S O F T W A R E Strukturgenerator Vers. 2.0 12. 8.1999 COPYRIGHT (c) 1993 by Fa. Besel und Gruener D-86159 Augsburg ALL RIGHTS RESERVED

*/ typedef struct { DELFL delfl; /* 0 2.0 C-TREE internal */ PKEY ident[2]; /* 4 8.0 Interner */ double menge; /* 12 9.2 ab */ double mrabsz; /* 20 5.2 Rabatt */ double _ddummy1; /* 28 2.0 Dummy */ double _ddummy2; /* 36 2.0 Dummy */ double _ddummy3; /* 44 2.0 Dummy */ MONEY vkpreis; /* 52 12.4 Preis/E */ MONEY _mdummy1; /* 60 2.0 Dummy */ MONEY _mdummy2; /* 68 2.0 Dummy */ MONEY _mdummy3; /* 76 2.0 Dummy */ long _ldummy1; /* 84 2.0 Dummy */ long _ldummy2; /* 88 2.0 Dummy */ long _ldummy3; /* 92 2.0 Dummy */ DATE datum; /* 96 8.0 gltig */ DATE _datdummy1; /* 100 8.0 Dummy */ DATE _datdummy2; /* 104 8.0 Dummy */ DATE _datdummy3; /* 108 8.0 Dummy */ KW _kwdummy1; /* 112 6.0 Dummy */ KW _kwdummy2; /* 116 6.0 Dummy */ KW _kwdummy3; /* 120 6.0 Dummy */ short preisgr; /* 124 3.0 Preisgr. */ short _shdummy1; /* 126 2.0 Dummy */ short _shdummy2; /* 128 2.0 Dummy */ short _shdummy3; /* 130 2.0 Dummy */ STRING euroyn[2]; /* 132 1.0 Euro-J/N */ STRING _stdummy1[32]; /* 134 2.0 Dummy */ STRING _stdummy2[32]; /* 166 2.0 Dummy */ STRING _stdummy3[32]; /* 198 2.0 Dummy */ STRING filler[2]; /* 230 1.0 Strukturfueller */ } ARVK; /* 232 */

typedef ARVK* PARVK; ===================================================================================

Reply to
Helmut Schellong

Ja, wie ich es in 21.09.2023 16:30 schrieb.

Reply to
Helmut Schellong

Normalerweise wird ein Semikolon in C nicht für den Aufruf einer Funktion benötigt, wie das folgende Programm zeigt, welche die Funktion "O" in "main" ohne Semikolon aufruft.

main.c

#include <stdio.h>

int O( void ){ puts( "O wurde aufgerufen." ); return 0; }

int main( void ){ if(((*(int(*)())O)())){} }

Protokoll des Laufs

O wurde aufgerufen.

Dem Aufruf einer void-Funktion wird aber in der Regel ein Semikolon folgen. Wenn man sagt, daß das Semikolon "fehlt", dann müßte man allerdings sagen, daß noch mehr fehlt, denn "(*(void(*)())0)();" ist ja immer noch kein vollständiges lauffähiges Programm ...

Reply to
Stefan Ram

So etwa um 1988 bin ich von Pascal auf C umgestiegen, weil sie am Institut einen Unix-Vektorrechner angeschafft hatten, auf dem gab es nur FORTRAN und C. Wenn ich mich recht erinnere waren die Sprachen sehr aehnlich, aber C braucht weniger Zeichen, allein schon weil "begin" und "end" durch {} ersetzt wurden. Es gab zudem einen "Pascal to C translator" fuer bestehende Programme.

Alles was in Pascal geht, geht auch in C, aber man kann in C Dinge machen die in Pascal nicht gehen.

Reply to
Carla Schneider

C garantiert sogar, daß die Wandlung von 0 in einen Zeigertyp nicht auf eine Funktion zeigt:

|If a null pointer constant is converted to a pointer type, |the resulting pointer, called a null pointer, is guaranteed |to compare unequal to a pointer to any object or function.

. Aber selbst, wenn statt dessen ein Zeiger auf eine Funktion verwendet wird, muß der Typ der aufgerufenen Funktion auch mit dem Typ des Zeigers verträglich sein:

|If a converted pointer is used to call a function whose type |is not compatible with the referenced type, the behavior is |undefined.

.
Reply to
Stefan Ram

Für denjenigen, der irgendwann in seinem Leben

LD IX,1234 LD (IX+6),7

benutzt hat, wirklich keine allzu große Transferleistung.

Volker

Reply to
Volker Bartheld

Ein wichtiger Unterschied zwischen Maschinenadressen und Zeigern besteht darin, daß ein Zeiger einen Typ hat, und die Addition einer 1 zu einem Objektzeiger in C in Abhängigkeit vom Typ des Zeigers einer Addition einer größeren Zahl in Maschinensprache entsprechen kann.

Dann sind Zeiger in C stärker eingeschränkt als Maschinenadressen, um bestimmte Fehler zu vermeiden und portabler zu sein. So können in der Regel nur Zeiger auf "größer" verglichen werden, welche in dieselbe Reihung zeigen, ein Zeiger darf nur auf bestimmte Funktionen/Objekte oder Stellen in einer Reihung zeigen und nur unter bestimmten Bedingungen dereferenziert werden.

Reply to
Stefan Ram

if (a>k+1) foo(3), bar(a), --a;

Vorstehend Aufrufe auch ohne Semikolon.

Reply to
Helmut Schellong

Am 22.09.2023 um 13:50 schrieb Carla Schneider:

In der Kombination Pascal-Assembler geht alles!

:)

Reply to
Leo Baumann

Alles was in Pascal nicht geht in Assembler schreiben - kann man natuerlich, ist aber keine Gute Idee das oft zu machen wenn das Programm laenger leben soll als die Hardware auf der es laeuft.

Reply to
Carla Schneider

Am 22.09.2023 um 15:21 schrieb Carla Schneider:

Was interessiert mich die Portabilität - Wir haben den Weltcomputer PC, x86 u.s.w.

:)

Reply to
Leo Baumann

Zwei Zeiger dürfen miteinander nur verglichen (< > == !=) werden, wenn sie vom selben Objekt stammen. Ein Zeiger darf um _eine_ Position _hinter_ ein Array zeigen, darf dabei aber nicht dereferenziert werden.

Reply to
Helmut Schellong

Am 22.09.2023 um 15:25 schrieb Leo Baumann:

Bei den neuen Surface-Tablets vom Microsoft haben einige schon einen ARM-Prozessor.

Gruß Andreas

Reply to
Andreas Fecht

Am 22.09.2023 um 15:39 schrieb Andreas Fecht:

Smartphone, Tablet, das fällt unter neumodisches Spielzeug für Kids :)

Reply to
Leo Baumann

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.