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


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:

Code: Select all

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

Das

Code: Select all

<Subjekt>

ist genauso wie

Code: Select all

<Objekt>

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

Code: Select all

<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

Code: Select all

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

Gut:

Das hat auch eine Grammatik. Die geht so:

Code: Select all

<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

            Code: Select all

             E = U/d 

            Code: Select all

             C = A/d 

            Code: Select all

             E, B, H, D 

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

        Code: Select all

        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

        Code: Select all

        0,1

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

        Code: Select all

        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

        Code: Select all

        E, B, C

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

        Und da gibt es den

            Code: Select all

            MISFET

            Code: Select all

            MESFET

            Code: Select all

            MOSFET

            Code: Select all

            JFET

            Code: Select all

            IGFET

            Code: Select all

            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

        Code: Select all

        74xx

        Und dabei steht zum Beispiel glaube

        Code: Select all

        04

        hinten dran, für

        Code: Select all

        OR

        , oder

        Code: Select all

        NOR

        oder

        Code: Select all

        NOT

        . der

        Code: Select all

        01

        ist wichtig. Ich glaube

        Code: Select all

        7483

        ist Addierer. Und so.

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

        Code: Select all

        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:

        Code: Select all

        A, B, C

        Sie haben die Eingänge

        Code: Select all

        A

        und

        Code: Select all

        B

        und den Ausgang

        Code: Select all

        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

        Code: Select all

        AND

        . Und das geht kommt bei

        Code: Select all

        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

        Code: Select all

        VCC

        ist und was

        Code: Select all

        GND

        ist - nämlich

        Code: Select all

        VCC

        auch

        Code: Select all

        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 UND-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

        Code: Select all

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

        Und wir kennen Gleichungen wie

        Code: Select all

        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,

        Code: Select all

        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

            Code: Select all

            WHILE ... DO
            BEGIN 

            END;
            [code]
            [/list]

            Dabei müssen entscheidungen getroffen werden, bei der Wiederholung, verfahren wir im nächsten Schritt so oder so.
            Das 
            [code]
            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

            Code: Select all

            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:

        Code: Select all

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

        Diese Regel müssen wir zum Text erweitern:

        Code: Select all

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

        Damit wir wissen, was ein

        Code: Select all

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

        ist. Gilt

        Code: Select all

        <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

        Code: Select all

        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:

        Code: Select all

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

        In dem Falle ruft

        Code: Select all

        text()

        immer wieder

        Code: Select all

        text() 

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

        Bei der einfachsten Form, taucht die Linksrekursion nicht auf:

        Code: Select all

        <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

        Code: Select all

        Ausdruck, Expression, Aussage, ...

        Dies bezieht sich auf die Mathematik. Die gleichung

        Code: Select all

        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

        Code: Select all

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

        Grammatisch richtig ist das nicht. Grammatisch unterscheiden wir

        Code: Select all

        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

        Code: Select all

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

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

        Code: Select all

        T1 = T2

        oder

        Code: Select all

        T1 == T2

        Eine Gleichung ist wiederum eine Aussage. Sie ist entweder

        Code: Select all

        wahr

        oder

        Code: Select all

        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

        Code: Select all

        if x == 5 then ...

        begegnet, ist als

        Code: Select all

        x == 5

        Eine Aussagenform. Aussagen sind entweder

        Code: Select all

        WAHR

        oder

        Code: Select all

        FALSCH

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

        Code: Select all

        Aussage1 UND Aussage2
        Aussage1 ODER Aussage2
        NICHT Aussage

        Da unsere Aussagen in Wirklichkeit Gleichungen sind, steht da:

        Code: Select all

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

        da eine Aussage

        Code: Select all

        WAHR

        oder

        Code: Select all

        FALSCH

        sein kann, lautet die Vorschrift

        Code: Select all

        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

        Code: Select all

        5 == 6

        oder

        Code: Select all

        5 == 5

        Code: Select all

        WAHR

        oder

        Code: Select all

         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

        Code: Select all


        /*
        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

        Code: Select all

        # 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

        Code: Select all

        ==

        zeichen nehmen, auch zu

        Code: Select all

        WHILE ... DO