was ist ein "intrinsic"

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6780
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

was ist ein "intrinsic"

Beitrag von af0815 »

Einfache Frage, was ist ein "intrinsic" Wie erklärt man sowas einem Laien (wie mir) ? Und verwendet man den Begiff auch bei Übersetzungen bzw. Programmerklärung ins deutsche ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 364
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: was ist ein "intrinsic"

Beitrag von Jorg3000 »

Hi!
Mir gefällt der Begriff "Compiler Magic" am besten - falls damit das Gleiche gemeint ist. :?:
"Compiler Primitive" ist auch so ein Begriff, schon ziemlich selbsterklärend.

Ich würde es so beschreiben, dass ein "intrinsic" eine Basisfunktion oder eine Sonderfunktion des Compilers ist, die zum Einsatz kommt, wenn sich eine Funktionalität in der Hochsprache nicht einfach umsetzen lässt, z.B. weil die Spezifikation einen benötigten Typen oder die benötigte Flexibilität eigentlich nicht hergibt.
Oder wenn etwas Typ-abhängiges oder Plattform-spezifisches passieren muss, was der Compiler am besten selbst unterscheiden und liefern kann.
Zuletzt geändert von Jorg3000 am Fr 24. Jan 2025, 10:44, insgesamt 1-mal geändert.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 364
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: was ist ein "intrinsic"

Beitrag von Jorg3000 »

Bezüglich der Übersetzung:
Es gibt im Deutschen die Worte "intrinsisch" und "inhärent" - wobei die vermutlich ähnlich selten verwendet werden, wie "intrinsic" in der englischen Alltagssprache wohl auch nur selten vorkommen dürfte.

Wiktionary beschreibt "intrinsisch" als: von sich aus aufweisend; einem Ding oder System innewohnend.
Und "inhärent" als: (einer Sache) anhaftend, innewohnend.

Entweder der Zuhörer kann von sich aus mit "intrinsic" oder "intrinsisch" etwas anfangen, oder man braucht eine fachspezifische Erklärung. :D

Benutzeravatar
Zvoni
Beiträge: 376
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: was ist ein "intrinsic"

Beitrag von Zvoni »

Abweichend zu Joergs Antwort:
Ein "Intrinsic" ist eine Funktion, welche der Compiler selbst zur Verfügung stellt bzw. benutzt, im Gegensatz zu einer "Laufzeit"-Funktion.

Beispiel:
Stell dir vor, es gäbe eine Funktion namens "Mul2" (entweder selbst geschrieben, oder in einer Laufzeit-Lib)

Code: Alles auswählen

Function Mul2(Const arg:LongInt):LongInt;
Begin
  Result:=LongInt * 2;
End;
.....
//Aufruf
MeineVar:=Mul2(4);
Geschrieben, benutzt, funktioniert

ABER: Anstelle o.g. Funktion zu benutzen, könntest du auch die "intrinsic" des Compiler nutzen

Code: Alles auswählen

//Aufruf
MeineVar:=4 shl 1;
In der Regel: Die "intrinsic"-Funktionen sind die am besten optimierten (schnellsten), weil diese direkt auf den Befehlssatz der CPU zugreifen/nutzen

Zumindest verstehe ich es so. Vielleicht hab auch hier nur grossen Schmarrn geschrieben..... :lol:
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 364
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: was ist ein "intrinsic"

Beitrag von Jorg3000 »

Jau stimmt, ich hatte zu sehr an Sonderfälle gedacht, z.B. an die Str() Funktion aus dem anderen Thread.
Aber schon solche Sachen, z.B. wie eine Integer-Addition durchzuführen ist, weiß der Compiler selbst und erzeugt CPU-spezifischen Maschinencode.

Benutzeravatar
Zvoni
Beiträge: 376
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: was ist ein "intrinsic"

Beitrag von Zvoni »

Eine weitere Erklärung für "Eine Intrinsic-Funktion wird vom Compiler zur Verfügung gestellt":
Hier die Übersicht der Funktionen in der Unit "System" (welche immer im Hintergrund eingebunden wird):
https://www.freepascal.org/docs-html/rt ... dex-5.html

Man könnte jetzt behaupten: Alle Funktionen, welche NICHT in (irgendeiner) Unit definiert sind, sind "intrinsic"

Dazu zähle ich z.B. die ganzen math. Operatoren
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Warf
Beiträge: 2121
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: was ist ein "intrinsic"

Beitrag von Warf »

Ein Intrinsic ist "compiler magic", es ist also eine "funktion" die nicht direkt in Pascal implementiert (oder sogar implementierbar) ist, sondern bei dem der Compiler speziellen code erzeugt.

Intrinsics haben vor allem drei eigenschaften:
1. Sie sind typagnostisch, WriteLn funktioniert mit (fast) jedem typen, weil der Compiler typspezifischen code generierren kann und nicht eine funktion für einen speziellen typen erzeugen muss
2. Sie erlauben besondere syntax, z.b. kann man in WriteLn Floats formatieren:

Code: Alles auswählen

  WriteLn('1/3 = ' , 1/3:4:2); 
3. Sie können zur compilezeit aufgelöst werden:

Code: Alles auswählen

const maxInt = High(Integer);

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: was ist ein "intrinsic"

Beitrag von Socke »

Warf hat geschrieben: Fr 24. Jan 2025, 13:17 Intrinsics haben vor allem drei eigenschaften:
1. Sie sind typagnostisch, WriteLn funktioniert mit (fast) jedem typen, weil der Compiler typspezifischen code generierren kann und nicht eine funktion für einen speziellen typen erzeugen muss
2. Sie erlauben besondere syntax, z.b. kann man in WriteLn Floats formatieren:

Code: Alles auswählen

  WriteLn('1/3 = ' , 1/3:4:2); 
3. Sie können zur compilezeit aufgelöst werden:

Code: Alles auswählen

const maxInt = High(Integer);
Ich würde hier nur den dritten Punkt gelten lassen. Die ersten beiden Punkten hängen einfach von der Implementierung der Funktion ab. Nur weil Write(Ln) und Str so mächtig sind, muss das nicht für alle gelten. Willst du z.B. nur einen Assembler-Befehl zur Verfügung stellen, sind die Parametermöglichkeiten wahrscheinlich eingeschränkt. Da der Compiler aber beim Übersetzen die Datentypen auswerten kann, können so typagnostische Funktionen im Compiler effizienter umgesetzt werden, als wenn du zur Laufzeit immer mit einem array of const hantieren musst und bei jedem Aufruf die sich nicht ändernden Datentypen auswertest.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1647
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: was ist ein "intrinsic"

Beitrag von fliegermichl »

Write ist ein gutes Beispiel dafür.
Normalerweise muß bei einer Pascal Prozedur bei der Deklaration angegeben werden, wieviele Parameter und von welchem Typ dieser zu übergeben sind.
write und writeln können beliebig viele Parameter von fast beliebigem Typ ausgeben.

Warf
Beiträge: 2121
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: was ist ein "intrinsic"

Beitrag von Warf »

Socke hat geschrieben: Fr 24. Jan 2025, 13:55 Ich würde hier nur den dritten Punkt gelten lassen. Die ersten beiden Punkten hängen einfach von der Implementierung der Funktion ab. Nur weil Write(Ln) und Str so mächtig sind, muss das nicht für alle gelten. Willst du z.B. nur einen Assembler-Befehl zur Verfügung stellen, sind die Parametermöglichkeiten wahrscheinlich eingeschränkt. Da der Compiler aber beim Übersetzen die Datentypen auswerten kann, können so typagnostische Funktionen im Compiler effizienter umgesetzt werden, als wenn du zur Laufzeit immer mit einem array of const hantieren musst und bei jedem Aufruf die sich nicht ändernden Datentypen auswertest.
Ich wollte nicht sagen das alle Intrinsics diese Eigenschaften haben, sondern das das die dinge sind die Intrinsics können, die man mit normalen Funktionen nicht machen kann.
Im grunde sind Intrics funktionalitäten die man gerne hätte, die man aber nicht in Pascal code selbst ausdrücken kann.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6780
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: was ist ein "intrinsic"

Beitrag von af0815 »

Das ist aktuell einmal die beste Arbeitshypothese zur Erklärung
Warf hat geschrieben: Fr 24. Jan 2025, 13:17 Ein Intrinsic ist "compiler magic", es ist also eine "funktion" die nicht direkt in Pascal implementiert (oder sogar implementierbar) ist, sondern bei dem der Compiler speziellen code erzeugt.
Die Erklärung ist aber auch nicht schlecht.
Warf hat geschrieben: Fr 24. Jan 2025, 13:17 Intrinsics haben vor allem drei eigenschaften:
1. Sie sind typagnostisch, WriteLn funktioniert mit (fast) jedem typen, weil der Compiler typspezifischen code generierren kann und nicht eine funktion für einen speziellen typen erzeugen muss
2. Sie erlauben besondere syntax, z.b. kann man in WriteLn Floats formatieren:

Code: Alles auswählen

  WriteLn('1/3 = ' , 1/3:4:2); 
3. Sie können zur compilezeit aufgelöst werden:

Code: Alles auswählen

const maxInt = High(Integer);
Vielleicht stolpert PascalDragon auch noch über den Thread und hat die beste Erklärung. :-)

Weil ich habe bisher keine wirklich bessere Erklärung zu dem Thema gefunden. Und mich interessiert das Thema der Erklärungen, weil ich wieder etwas Zeit habe an meinen LazInfos zu arbeiten. Und da habe ich mir gedacht, so Begriffe auch in deutscher Sprache mal zu erklären zu können, nur bin ich drauf gekommen, das ich den Begriff nicht wirklich schlüssig erklären kann. Aber man sieht auch hier im Thread, das das Thema sehr wohl breitgestreut ist von der Wahrnehmung. Nur Wahrnehmung ist nicht Wahrheit :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: was ist ein "intrinsic"

Beitrag von Mathias »

Was ich zu intrinsic sagen kann, wen ich in /usr/include nach Dateien suche, welche im Datei-Namen intrinsic einhalten, bekomme ich 63 Suchergebnisse.
So wie ich festgestellt habe. sie das die Header, die viele Basis Funktionen eine Paketes enthalten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: was ist ein "intrinsic"

Beitrag von m.fuchs »

Schon mal einen Blick hier hinein geworfen?

https://de.wikipedia.org/wiki/Intrinsische_Funktion
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalDragon
Beiträge: 955
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: was ist ein "intrinsic"

Beitrag von PascalDragon »

af0815 hat geschrieben: Fr 24. Jan 2025, 16:03 Die Erklärung ist aber auch nicht schlecht.
Warf hat geschrieben: Fr 24. Jan 2025, 13:17 Intrinsics haben vor allem drei eigenschaften:
1. Sie sind typagnostisch, WriteLn funktioniert mit (fast) jedem typen, weil der Compiler typspezifischen code generierren kann und nicht eine funktion für einen speziellen typen erzeugen muss
2. Sie erlauben besondere syntax, z.b. kann man in WriteLn Floats formatieren:

Code: Alles auswählen

  WriteLn('1/3 = ' , 1/3:4:2); 
3. Sie können zur compilezeit aufgelöst werden:

Code: Alles auswählen

const maxInt = High(Integer);
Vielleicht stolpert PascalDragon auch noch über den Thread und hat die beste Erklärung. :-)
Die Erklärungen, die ich soweit gelesen habe, passen alle prinzipiell. Nur zu Warfs Erklärung würde ich sagen, dass das Eigenschaften sind, die Intrinsics haben können, aber es müssen nicht alle drei erfüllt sein.
Mathias hat geschrieben: Fr 24. Jan 2025, 17:49 Was ich zu intrinsic sagen kann, wen ich in /usr/include nach Dateien suche, welche im Datei-Namen intrinsic einhalten, bekomme ich 63 Suchergebnisse.
So wie ich festgestellt habe. sie das die Header, die viele Basis Funktionen eine Paketes enthalten.
Der Ausdruck "Intrinsic" in C Headern hat meist nichts mit Intrinsics zu tun, wie sie hier gemeint sind. Ausnahme sind Header wie mmintrin.h und ähnliches, da diese auch Funktionen enthalten, die vom Compiler bereitgestellt werden und ziemlich direkt auf Assemblyinstruktionen runtergehen.

Das ist übrigens auch in welche Richtung zukünftig die Atomic*-Intrinsics in FPC gehen werden. Aktuell sind die Intrinsics implementiert durch Assemblyfunktionen, die zuvor die Basis für die Interlocked*-Funktionen gebildet haben, aber in Zukunft können für jede Platform die Intrinsics auch direkt in Assemblycode umgewandelt werden, da dann der Aufruf vermieden werden kann und der Compiler beliebige Register verwenden und dadurch besseren Code generieren kann.
FPC Compiler Entwickler

Antworten