/media/sda-magnetic/david/Dok-15-2023-11-27/Dokumente-15-appended-2023-10-11/append-temporarly/beitrag1.5.txt


https://www.davidvajda.de/viewtopic.php?t=79&start=1

Der witz bei der Geschichte ist, dass sie in der Informatik, aber die Bakus-Naurr Form brauchen.

Das ist relativ simpel zu erklären.

Im Deutschunterricht, lautet die Vorschrift, für die Grammatik, eines Deutsches Satzes so:

<Satz> ::= <Subjekt> <Prädikat> <Objekt>

Das

<Subjekt>

ist genauso wie

<Objekt>

durch jedes beliebige Substantiv in der richtigen Form zu ersetzen. Das selbe gilt für

<Prädikat>

mit Verb.

Wenn sie in der Informatik die Bakus-Naur Normalform nicht hinkriegen wird es schlecht.

Programmieren können ist das eine. Das machen alle. Informatiker machen den Übersetzer

Wenn sie jetzt einen Ausdruck angucken, dann sieht der so aus

Das ist die Mathematische so in etwa Definition, das Beispiel für einen Ausdruck

x*((10+y)+2)*3

Gut:

Das hat auch eine Grammatik. Die geht so:

<expr> ::= <term> | <term> '+' <expr>
<term> ::= <factor> | <factor> '*' <term>
<factor ::= <num> | <id> | '('<expr>')'

So, wenn sie das hinkriegen, dann lassen sie mich aufklären. sie müssen in der Informatik 2 Dinge können

    TTL, VHDL, FPGA und Prozessor wissen,
    Sie müssen Programmiersprache können - Compiler

Zu (1.) sage ich was. Das mit den Transistoren ist so eine Sache. Das weiss ich auch auswendig teilweise, da sage ich ein paar Beispiele

    Technisches für den Prozessor
        Dinge, wie Widerstände, Kondensatoren, ... sollten klar sein. Man kann physikalische Formeln lernen, wie

             E = U/d 

             C = A/d 

             E, B, H, D 

        Oder auch nicht. Widerstände, Kondensatoren, Spulen müssen sitzen.
        Sie sind aber nicht unbedingt Teil der technischen Informatik

        74xx

        Gatter lassen sich ganz einfach verwenden. Ohne über den Stromkreis bescheid zu wissen. Das heisst, wenn wir die aneinander schalten, geht es ganz von alleine - wir müssen ausser

        0,1

        nichts über Signale wissen
        Natürlich wäre es gut Transistoren zu kennen, weil

        FPGA, CPLD, PLA, PAL, ...

        kommen vor. Und wenn man den Transistor kann, wird es easy
        Die Kirchhoffschen Regeln sind ganz einfach. Es gibt die erste und die zweite
            Die Summe zufliessenden Ströme in einem Knotenpunkt ist gleich die Summe der abfliessenden
            Die Summe aller Spannungen einer Masche sind gleich 0
        Basis, Emitter, Collector - beim Transistor. Basis - Emitter - Steuerstromkreis - Collector - Arbeitsstromkreis

        Dann haben sie kennlinien - wie
            Arbeitspunkteinstellung
            Übersteuerungsgränze
            Sättigungsspannung
            Kleinsignalverhalten
            Stromverstärkungsgruppen
            Restströme
            Hochfrequenz, Grenzfrequenz
        das erkläre ich mal. das weiss ich alles auswendig: Wenn sie den Transistor angucken, dann steuert der von der Basis - eingangsignal zum Emitter den Arbeitsstromkreis - Collector - Emitter. Und: Wenn sie einen Arbeitspunkt einstellen, dann legen sie einen Widerstand vom Collector - zur Basis - dass auf der Basis, wo das Eingangssignal rein kommt, immer 5 Volt sind.

        So: Sättigungsspannung weiss ich nicht. Übersteuerrungsgrenze - wird das maximale Signal, also Spannung. Kleinsignalverhalten, das ist denke ich: Wie mit ganz nieder Spannungen im Eingang ist. Stromverstärkungsgruppen ist einfach - das bedeutet: Haben sie 1:2 oder 1:200 Verstärkung, am Signal. Reststrom weiss ich nicht. Grenzfrequenz - wenn sie einen Hochfrequenz Transistor haben, dann kann der mit 1 GHz unter Umständen zu recht kommen, der für die Stereoanlage taugt unter Umständen nicht.

        Es gibt verschiedene Gehäusebauformen - die gehen SOT und TO, dazu gehören die Nummern 89 und 39 und 93 oder so. Irgendwas.

        Jetzt kommt: Jetzt gibt es den FET

        Feldeffekttransistor. Der hat nicht

        E, B, C

        , sondern der hat
            Source, Quelle
            Drain, Tor
            Gate, Tor
            Bulk
        Das ist der FET

        Und da gibt es den

            MISFET

            MESFET

            MOSFET

            JFET

            IGFET

            SFET

            MESFET: Metal Insulator Semiconductor
            JFET: Junction FET
            IG: Insulator Gate FET
            SFET: Sperrschicht FET.
        Dann gibt es den LASER - den Light Ampilification by Stimulated Emission of Radiation

        Und der Witz bei der Geschichte ist. Das müssen sie nicht wissen.

        Es gibt die TTL-Gatter. Die haben die Nummer

        74xx

        Und dabei steht zum Beispiel glaube

        04

        hinten dran, für

        OR

        , oder

        NOR

        oder

        NOT

        . der

        01

        ist wichtig. Ich glaube

        7483

        ist Addierer. Und so.

        Nur, da brauchen sie gar keine Elektrotechnik. Sie müssen wissen, was

        5 Volt

        sind

        Die Gatter, die kommen im IC daher. Jetzt. Die sind so gemacht, dass sie gar nichts Elektrotechnisches wissen müssen. sondern, die tun einfach indem sie sie anschliessen. Wenn sie mit einer Stricknadel klar kommen, dann kriegen sie die Maschen auf die Reihe.

        Am TTL-Gatter, da sind generell ungefähr 4 Gatter. Und das bedeutet:

        A, B, C

        Sie haben die Eingänge

        A

        und

        B

        und den Ausgang

        C

        . Gut, da müssen sie wie bei der Stricknadel nicht wissen. Sie müssen wissen, zwei Signale gehen rein und eines kommt raus. Zum Beispiel als

        AND

        . Und das geht kommt bei

        C

        raus.

        Die können sie beliebig aneinander schalten, die TTL-74xx-Gatter, da brauchen sie nur wissen, was 5V sind. Und dann müssen sie wissen,

        was

        VCC

        ist und was

        GND

        ist - nämlich

        VCC

        auch

        5V

        . Dann haben sie ihre Schaltung.

        Jetzt kommt der FPGA - der wird mit VHDL programmiert

        VHDL bedeutet: VHSIC Hardware Description Language

        und VHSIC - bedeutet: Very High Speed Integrated Circuit

        Und das ist so. Angenommen, sie haben ihren FPGA - den MIPS Prozessor haben sie im Kopf. Dann bringen mit VHDL den MIPS Prozessor auf dem FPGA unter. Sie müssen sich nicht schämen, weil sie würden das mit den TTL-Gattern schon hinkriegen.

        So: Zunächst zu den Bausteinen. Der FPGA kommt daher mit

        PLD - Programmable Logic Device
        PLA - Programmable Logic Array - da ist ODER-Programmierbar
        Sie müssen wissen, die PLD's sind in Disjunktiver Normalform DNF. Das heisst, lauter UND und ODER - UND-Programmierbar

        Gut:

        Jetzt
        PAL: Programmable Array Logic: Programmierbare ODER Matrix glaube ich. Umgekehrt, auf jeden Fall, der PROM

        Und: dann ist das halt ein CPLD - ein complex Programmable Logic Device - und das hat 1000 Gatter und ein FPGA 1000000 Gatter.

        Und mit VHDL bringen sie die Schaltung an. Und das ist nicht schwer. Weil sie können jedes Teil in der Digitaltechnik durch durch NOT, AND OR darstellen.

        Dann müssen sie VHDL können.

        Das ist nicht schwer. Weil: Sie müssen wissen
            Header
            Entity
            Architecture.
        Entity legt die Signale rein und raus fest. Und Architecture die Schaltung vom Element. Nicht anders, als mit AND und OR
    Gut. Und dann haben sie ihren Prozessor. Was sie jetzt können müssen ist eine Programmiersprache selber schreiben

    Und eine Programmiersprache.

    Ich wurde gerade auf Facebook gesperrt - für 24h, weil ich mich nicht an die Gemeinschaftsstandards halte. Warum? Weil ich das hier poste. Keine Sorge, ich bin nicht dauerhaft auf Facebook gesperrt, 24h. Und nicht richtig gesperrt, nur nichts posten, wegen dem Spam. Ich habe die Funktion zu oft genutzt. Zu schnell etwas zu posten. Oder sie haben den Zusammenhang, zwischen fpga und aussagenlogik nicht verstanden. Darauf will ich ja hinaus. Für Info brauchen sie diese zwei Dinge.

    Ich wollte erklären. Was das mit Algebra zu tun hat, mit Ausdruck und Ausdrucksform und Aussage, und warum man das braucht. Wenn das so ist.

    Also, ich erkläre das jetzt mal langsam.

    Sie haben in der Mathematik, einerseits, die Geometrie. Und die Algebra.

    Und: Zunächst, bei den Griechen, war das getrennt. Die Geometrie gehörte nicht zur Algebra.

    Danke, das bisher gesagte, weiss ich auswendig. Das heisst, ich habe es auswendig gelernt. Warum sage ich das?
    Die Informatik hat zwei wichtige Teile
        Den Prozessor
        Den Compiler
        Der Prozessor, der MIPS ist schnell verstanden. Mit VHDL und FPGA lässt er sich auf eine Schaltung unterbringen. Für die Schaltung kann Elektrotechnik nicht schaden. Was ich über die Transistoren auswendig sagte, allerdings brauche ich das für den FPGA nicht. hier muss ich wissen, was CPLD ist. Schon kann ich die Schaltung auf dem FPGA unterbringen
        Der zweite Teil ist der Compilerbau, für die Programmiersprachen. Hier muss ich Bakus-Naurr-Form wissen und was in der Mathematik ein Ausdruck und eine Aussage ist
    Und zu Algebra gehört:
        Ich sage jetzt mal so: Die Entwicklung der Mathematik dauerte lange. Ich habe hier mal eine Liste mit griechischen Mathematikern.
            Ionische Periode
                Thales
                Pythagoras
                Anaxagoras
                Demokrit
                Hippokrates
                Theodoros
            Athenische Periode
                Sophisten
                Platon
                Aristoteles
                Theaitetos
                Eudoxos von Knidos
                Menaichmos
                Deinostratos
                Autolykos von Pitane
            Alexandrinische Periode
                Euklides
                Aristarchos
                Archimedes
                Erathostenes
                Nikomedes
                Appollonios
            Sp"atzeit
                Hipparchos
                Menelaos
                Heron von Alexandria
                Ptolemäus
                Diophant von Alexandrien
                Pappos
        Die habe ich aus https://www.wikipedia.de. Und: Die Mathematik war am Anfang noch nicht so, wie wir sie heute haben. Heute kennen wir Ausdrücke, wie

        an*xn+a[n-1]*x[n-1]+...a1x1+a0

        Und wir kennen Gleichungen wie

        ax+b=0

        Wir wisse, dass eine Gleichung nichts anderes ist als eine Aussage, oder eine Aussagenform. Letzteres ist eine Aussagenform, schlussendlich, nicht einfach eine Aussage - wobei wir das beim Programmieren nicht unterscheiden. Für uns bleibt lediglich zu tun,

        x

        Die Griechen hatten noch keine derartig entwickelte Mathematik.

        Sie hatte zwei Zweige.
            Geometrie
            Algebra
        Später spielten für die Algebra, die Araber eine grosse Rolle. Dazu gehören:
            Al-Chwarizmi - Frühzeit: 820 n. Chr. - Algorithmus
            Al-dschabr wa'l muqabalah
            Thabit ibn Qurra, al-Battani
            al-Dschawhari, Abu l-Wafa.
            al-Karadschi: Hochbl"ute:
            Avicenna (Ibn Sina)
            al-Bīrūnī; Ibn al-Haitham (Alhazen)
            Omar Chayyām (um 1100)
            Nasir al-Din al-Tusi
            al-Kaschi (um 1400)
        Das Wort Algebra und Algorithmus leitet sich aus dem Arabischen ab
            Algebra bedeutet wir haben es mit Variablen, Konstanten Werten, Operatoren, Klammern und Gleichheitszeichen, Termen, Ausdrücken, Aussagen und so weiter zu tun
            Algorithmus steht für das wiederholte anwenden von bestimmten Schritten. Das spielt zum Beispiel Rolle bei dem Algorithmus von Gauss zur Lösung von Matrizen. In der Fernuni Hagen. benutzt man nicht einfach den Schritt - im LGS - die Zeilen zu vertauschen. Man macht es Mathematisch noch korrekter. Man fasst ein LGS als eine Matrix auf und das Vertauschen von Zeilen, lässt sich über die Multiplikation mit Matrizen, etwa Einheitsmatrizen erreichen. Für den Mathematiker ist es wohl egal, in welcher Reihenfolge Gleichungen stehen

            Doch: Schon dieses Vertauschen und das wiederholte anwenden, diese Zeilenumformungen, aber auch das Addieren von Konstanten werten zu einer Zeile, wird wiederholt angewendet. Das Gaussche Elemeninationsverfahren.

            Algorithmus bezieht sich zunächst darauf, wiederholt Schritte an zu wenden. Das drückt man in der Programmierung mit der WHILE-Schleife aus

            WHILE ... DO
            BEGIN 

            END;

        Dabei müssen entscheidungen getroffen werden, bei der Wiederholung, verfahren wir im nächsten Schritt so oder so.
        Das

        IF ... THEN 
        BEGIN 

        END
        ELSE
        BEGIN 

        END;

        spielt dann eine Rolle. Der Algorithmus war ein Lösungsmittel - um zum Beispiel Gleichungen durch wiederholtes Anwenden von Schritten systematisch zu lösen.

        Das Programm ist eng verwandt mit dem Algorithmus. Das Computerprogrammiert formuliert einen Algorithmus, der zunächst dazu da war, Gleichungen zu lösen.

        Doch neuere Algorithmen beziehen sich wiederum auf die Auswertung, einerseits eines Arithmetischen Ausdruck, einer Gleichung, eines Terms. Oder eines Computerprogramms. Also der Algorithmus bezieht sich wieder auf ein Programm. Ein Term und eine Programmiersprache lässt sich nicht trennen. Wer Bakus-Naur-Form sagt, wird auch irgendwann

        WHILE ... DO

        . Bzw. besonders umgekehrt.
        Das zweite war die Geometrie. Beides lässt sich auf eine gemeinsame Form bringen, bis zu einem gewissen Grad, je nach wissen. Für die Griechen war das zunächst nicht bekannt, sie mussten diesen Gedanken erst entwickeln
    Eine Deutsche Grammatik geht so:

    <Satz> ::= <Subjekt> <Prädikat> <Objekt> '.'

    Diese Regel müssen wir zum Text erweitern:

    <Text> ::= <Satz> | <Satz> <Text>
    <Satz> ::= <Subjekt> <Prädikat> <Objekt> '.'

    Damit wir wissen, was ein

    <Subjekt>, <Prädikat>,<Objekt> 

    ist. Gilt

    <Subjekt> ::= <Substantiv in der entsprechenden Form>
    <Prädikat> ::= <Verb in der entsprechenden Form>
    <Objekt> ::= <Substantiv in der entsprechenden Form>

    Um diesen diesen Ausdruck zu Parsen, brauchen wir zwei Funktionen in der Programmierung

    text () {
      satz ();
      if ... then text ();
    }

    satz () {
      if (substantiv () ... )
        if (prädikat () ...)
          if (obeject ()...)
          else error;; else error (); else error ();
    }

    Man sieht hier kann man eine Linksrekursion erzeugen:

    <Text> ::= <Text> <Satz> | <Satz> 
    <Satz> ::= <Subjekt> <Prädikat> <Objekt> '.'

    In dem Falle ruft

    text()

    immer wieder

    text() 

    auf. Das gilt auch für mathematische Ausdrücke.

    Bei der einfachsten Form, taucht die Linksrekursion nicht auf:

    <expr> ::= <term> | <term> '+' <expr>
    <term> ::= <factor> | <factor> '*' <term>
    <factor ::= <num> | <id> | '('<expr>')'

    Sollte sie das tun, brauchen wir eine erweiterte Form, mit 5 Zeilen, die ich nicht auswendig kenne

    Worum es jetzt geht, ist Mathematik

    Denn wir kennen aus der Programmierung, die Worte

    Ausdruck, Expression, Aussage, ...

    Dies bezieht sich auf die Mathematik. Die gleichung

    x*9 = 10*y

    ist in Wirklichkeit eine Aussagenform. Das möchte ich genauer machen, mit hilfe der Mathematik. Später jetzt muss ich zur Mutter.

    Also, in der Mathematik müssen wir wissen, was ein Term ist. Ein Term ist etwas, wie

    (3*x+2)/(4+(x+3)*4)

    Grammatisch richtig ist das nicht. Grammatisch unterscheiden wir

    Ausdruck
    Term
    Faktor

    Trotzdem: Nun unterscheiden wir bei Termen, zum Beispie
        Bruchterme
        Polynome
        Exponentialterme
    Sie haben die gewohnte Form. In der Programmierung finden wir lauter solche Terme, einerseits bei der Zuweisung eines Wertes eines Ausdrucks an eine Variable, oder bei einer Aussage

    b:=(a+1)
    if (b == a) ...

    Eine Gleichung ist wiederum eine Verknüpfung zweier Terme über ein Gleichheitszeichen

    T1 = T2

    oder

    T1 == T2

    Eine Gleichung ist wiederum eine Aussage. Sie ist entweder

    wahr

    oder

    falsch

    Wir müssen unterscheiden, zwischen
        Aussagen
        Aussagenformen
        Aussagen: Eine Gleichung bei der keine Variablen auftauchen
        Aussagenformen: Eine Gleichung bei der Variablen auftauchen
    Was uns bei

    if x == 5 then ...

    begegnet, ist als

    x == 5

    Eine Aussagenform. Aussagen sind entweder

    WAHR

    oder

    FALSCH

    Somit lassen sich Aussagen miteinander logisch verknüpfen. Damit ist die Aussagenlogik geboren

    Aussage1 UND Aussage2
    Aussage1 ODER Aussage2
    NICHT Aussage

    Da unsere Aussagen in Wirklichkeit Gleichungen sind, steht da:

    (x==5) UND (y==(6+1))
    (x==5) ODER (y==(6+1))
    NICHT (y==(6+1))

    da eine Aussage

    WAHR

    oder

    FALSCH

    sein kann, lautet die Vorschrift

    WAHR UND WAHR ::= WAHR
    WAHR UND FALSCH ::= FALSCH
    FALSCH UND WAHR ::= FALSCH
    FALSCH UND FALSCH ::= FALSCH

    das ist allerdings keine Boolesche Algebra. Es bezieht sich darauf ob die Aussagen

    5 == 6

    oder

    5 == 5

    WAHR

    oder

     FALSCH 

    sind
    Die Boolsche Logik ersetzt das ohne Aussagen durch Werte

    Ein Compiler ist schnell gemacht. Ich stelle einen von mir in Python und in JavaScript vor.

    Ein mit Node ausgeführter - Backus-Naur Parser in JavaScript

    /*
    expr ::= expr + term | term
    term ::= term * factor | factor
    factor ::= '(' expr ')' | const 

    Bzw. 

    expr ::= term | term '+' expr 
    term ::= factor | factor '*' term
    factor ::= '(' expr ')' | const

    const ::= '9', '8', ..., '0'
    */

    /* Lexer */
    let i = 0;
    let s = "((4+5*(4+2))+1)*3";

    function nexttoken () {
        return s [i++];
    }

    function tokenback () {
        i--;
    }

    function expr () {
        let x;
        let y = 0;
        
        x = term ();
        if (nexttoken () == '+')  {
            y = expr ();
        }
        else
            tokenback ();
    return x + y;
    }

    function term () {
        let x;
        let y = 1;
        
        x = factor ();
        if (nexttoken () == '*') 
            y = term ();
        else
            tokenback ();
    return x * y;
    }

    function factor () {
        let s = nexttoken ();
        let x1 = parseInt (s);
        let x;
        
        if (s == '(') {
            x = expr ();
            if (nexttoken () != ')')
                throw new Error("Missing closing bracket");
        }
        else if ((x1 >= 0) && (x1 <= 9))
            x = x1;
        else
            throw new Error("Unknown or wrong character");
    return x;
    }

    console.log (expr ());
    console.log (((4+5*(4+2))+1)*3);

    Sorry, dass das so lange gedauert hat, eine Variable war falsch benannt

    # expr ::= expr + term | term
    # term ::= term * factor | factor
    # factor ::= '(' expr ')' | const 

    # Bzw. 

    # expr ::= term | term '+' expr 
    # term ::= factor | factor '*' term
    # factor ::= '(' expr ')' | const

    # const ::= '9', '8', ..., '0'

    i=0
    s = "((4+5*(4+2))+1)*3";

    def nexttoken ():
        global i
        j = i
        if i >= len(s):
            return 'e'
        i = i+1
        return s[j]

    def tokenback ():
        global i
        i = i-1
        
    def expr ():
        y = 0
        
        x = term()
        s = nexttoken ()
        if s == '+':
            y = expr()
        elif s == 'e':
            return x+y
        else:
            tokenback()
        return x+y

    def term ():
        y = 1
        
        x = factor()
        s = nexttoken ()
        if s == '*':
            y = term ()
        elif s == 'e':
            return x*y
        else:
            tokenback()
        return x*y

    def factor ():
        s = nexttoken ()
        if s.isdigit ():
            y = int(s)
        
        if s == '(':
            x = expr()
            if nexttoken () != ')':
                exit ()
        elif s == 'e':
            return 0
        elif (y >= 0) and (y <= 9):
            x = y
        else:
            exit ()
        return x

    print(expr())

    Diese Compiler habe ich selber geschrieben, entsprechend der Bakus-Naur Normalform ohne Linksrekursion - parsen sie arithmetische Terme. Zu Aussagen, kommen wir schnell - indem wir das

    ==

    zeichen nehmen, auch zu

    WHILE ... DO