Frage an #define-Experten - Seite 10

 
Алексей Тарабанов:

Na los! Zuerst die Definition, dann die ausführbare Datei, dann die Ausführung der ausführbaren Datei.

Ich habe sie. Die Definition beschleunigt also nur die Erstellung eines großen Projekts, nicht aber die Codeausführung in der ausführbaren Datei.

Im Allgemeinen bin ich zum Selbststudium an einer möglichst schnellen Implementierung von Code auf Hardware-Ebene interessiert.
Dabei spielt es keine Rolle, um welche Architektur oder welchen Bereich es sich handelt.
Ich weiß, dass es Sprachen gibt, die vollständig im Speicher laufen, was wahrscheinlich die schnellste Lösung wäre.
 
Roman:

Ich habe sie. So beschleunigt define nur die Erstellung eines großen Projekts, nicht aber die Codeausführung in der ausführbaren Datei.

Im Allgemeinen bin ich zum Zwecke der Selbsterziehung an einer möglichst schnellen Implementierung von Code auf Hardwareebene interessiert.
Dabei spielt es keine Rolle, um welche Architektur oder welchen Bereich es sich handelt.
Ich weiß, dass es Sprachen gibt, die komplett im Speicher laufen, das wäre wahrscheinlich die schnellste Lösung.

Definieren gibt überhaupt keine Beschleunigung. Vielleicht mit einer kleinen Ausnahme bei der Definition von Primzahlen wie #define FIVE 5.

Die Definition soll den Code besser lesbar und leichter zu ändern machen. Das war's. Dies vervollständigt seine Funktionalität.

 
Ich frage mich, in welcher Sprache man ISS oder medizinische Geräte schreibt.
Mikrocontroller und Treiber werden entweder in C oder in Assembler geschrieben.
Welche anderen Möglichkeiten gibt es? Hat jemand Q studiert?
 

IMHO Programmierphasen))

1 - Ich verstehe nichts

2 - Ich verstehe den prozeduralen Stil (es ist nicht einmal ein funktionaler Stil, es ist nur ein bisschen Code)

3 - Ich bin der Meinung, dass ich alles schreiben kann, was ich möchte (funktionaler Stil)

4 - Ich verstehe, dass ich OOP nicht verstehe

5 - OOP verstehen

6 - verstehen OOP immer noch nach dem Schweregrad

7 - Ich kann mir beliebige Kombinationen von Baumknoten in OOP ausdenken und sie alle hacken und mit Mängeln nach meinem Geschmack salzen

8 -all diese Programmierung, aber mit strengem Zugang nach Typ usw.

9 - verstehen, dass 7 Punkt das Böse ist (die dunkle Seite) und dass es eine Welt des zivilen Lebens gibt (Vorlagen)

10 - von denen, die ich als kühle Programmierer zunehmend hören "OOP ist böse", das heißt, es ist eine zivile Nutzung von Methoden und wenn alle direkt auf zivile zu tun, stellt sich heraus, dass die Notwendigkeit für alles nicht so groß ist, ja, es ist Routine, aber die Anwendung Geschwindigkeit des Codes schreiben mehrmals höher als meine :(

11 - Ich verstehe, dass moderne funktionale Sprachen in einigen Phasen OOP emulieren, all diese Funktionserweiterungen, mit anderen Worten, ich beginne den Ansatz der funktionalen Programmierung zu verstehen (Punkt 3).

Im Allgemeinen sehe ich keinen großen Unterschied zur Syntax der Sprache, die Prinzipien ändern sich nicht, es gibt strenge Sprachen und es gibt nicht strenge Sprachen. Es ist schwierig, in Sprachen zu kodieren, die nicht streng sind. C++ C# R Q Q GO JS Ruby macht nicht den geringsten Unterschied.

Low-Level ist schneller (es ist realistisch, ein eigenes sehr schnelles Stück Code zu schreiben, schneller als der Standard, aber warum?) - zum Beispiel ist es einfach, eine Sortierung schneller als der Standard zu schreiben, aber das Wesentliche einer rechtzeitigen Sortierung ist nicht Geschwindigkeit))), sondern eine minimale Anzahl von Aktionen, und die minimale Anzahl von Aktionen ist nicht immer der schnellste Weg, aber es ist sehr gut.

über Mikroprozessoren - nun, damit fängt man normalerweise an. Obwohl das Wesen der Sprache nicht so wichtig ist. High-Level-Programme ermöglichen es Ihnen, mit großen Codefragmenten zu arbeiten, während Low-Level-Programme vielseitiger sind.

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nein, nein, nein. No OOP ))
OOP ist ein Wrapper über einer Prozedurensprache.
Das ist eine Erweiterung einer prozeduralen Sprache, aber mit eigenem Paradigma.
Ich persönlich halte OOP für eine Vermüllung einer bereits hochentwickelten Sprache ))
Alle oben genannten Sprachen sind hochentwickelte Sprachen, außer Q
Sie müssen an eine falsche Q denken. Q ist eine Erweiterung der Sprache K
Die Sprache Q implementiert die Datenbank KDB+

Kdb+, aus Kx , ist

  • leistungsstarke, plattformübergreifende, kolumnare Datenbank für historische Zeitreihen
  • In-Memory-Rechenkern
  • Echtzeit-Thread-Prozessor
  • aussagekräftige Abfragen und eine Programmiersprache namens q

Das ist ein ganz anderes Paradigma, nicht C-ähnlich. Ich denke, es gibt da eine Vektorlogik.
Aber ich denke, dass selbst die erfahrensten Programmierer in diesem Forum noch nie etwas von dieser Sprache gehört haben)).


w

 

0,0 die Entwicklung von q

Arthur Whitney entwickelte die Programmiersprache q und ihre Datenbank kdb+. Herausgegeben von Kx Systems, Inc. im Jahr 2003 waren die wichtigsten Designziele von q Ausdrucksstärke, Geschwindigkeit und Effizienz.
Es kommt nicht annähernd an sie heran. Der Kompromiss beim Design ist die Kürze, die Programmierer verwirren kann, die aus langatmigen traditionellen Datenbankprogrammierumgebungen -
wie C++, Java, C# oder Python - und relationalen DBMS kommen. Während die q-Programmiergötter sich an Programmen erfreuen, die einem ASCII-Kernel-Dump ähneln, ist dieser Leitfaden für uns alle gedacht.

Q hat sich aus der APL (Programmiersprache) entwickelt, die in den 1950er Jahren von Kenneth Iverson an der Harvard University als mathematische Notation erfunden wurde.
APL wurde in den 1960er Jahren von IBM als Vektorprogrammiersprache eingeführt, was bedeutet, dass sie eine Liste von Zahlen in einer Operation verarbeitet.
Sie war erfolgreich im Finanzwesen und in anderen Branchen, in denen es viel zu tun gibt.

Mitochondriale DNA q Spuren von APL zu A zu A+ und zu k. Sie sind alle gut geeignet, um komplexe Berechnungen mit Vektoren schnell durchzuführen.
Das Neue an q / kdb+ ist, dass es große Mengen von Zeitreihendaten sehr effizient in einem relationalen Paradigma verarbeitet.
Die Syntax erlaubt es Ihnen, Ausdrücke ähnlich wie in SQL 92 auszuwählen, und die Sammlung eingebauter Funktionen bietet eine vollständige und leistungsstarke Sprache für gespeicherte Prozeduren.

Auch in den Genen q wird etwas geflüstert: Das grundlegende Datenkonstrukt q ist eine Liste. Obwohl die Bezeichnungen und die Terminologie unterschiedlich sind, werden die Symbole von ihren Gegenstücken im Schema übernommen.

Der Stammbaum der APL q zeigt auch den Einfluss der funktionalen Programmierung.
In seiner Turing-Preis-Vorlesung von 1977, in der er die rein funktionale Programmierung vorstellte, würdigte Backus die Inspiration durch APL.
Obwohl q nicht rein funktional ist, ist es stark funktional in dem Sinne, dass sogar seine grundlegenden Datenstrukturen, Liste und Wörterbuch, als mathematische Zuordnungen behandelt werden.

0,1 Philosophie

Ein erfahrener q-Entwickler denkt anders als in herkömmlichen Programmierumgebungen wie C++, Java, C# oder Python, die im Folgenden als "traditionelle Programmierung" bezeichnet werden. -
Um Sie in die richtige Stimmung zu versetzen, fassen wir einige potenzielle Unstetigkeiten für Anfänger q - im Folgenden als qbie bezeichnet - zusammen.

Schauen wir uns einige der Datenprobleme der traditionellen Datenbankprogrammierung an:

  • Eine Darstellung im Speicher - z. B. eine Sammlung von Objekten - muss auf eine andere Darstellung - z. B. Tabellen - abgebildet werden, damit sie bestehen bleibt.
    Es ist ein erheblicher Aufwand erforderlich, um eine korrekte objektrelationale Übereinstimmung zu erzielen.
  • Die Objekte müssen für den Transport in eine andere Darstellung umgewandelt werden, in der Regel eine binäre oder XML-Form, die die Referenzketten glättet.
  • Datenmanipulationen - z. B. Auswahl, Gruppierung und Aggregation großer Datenmengen - werden am besten in gespeicherten Prozeduren auf dem Datenbankserver durchgeführt.
    Komplexe numerische Berechnungen werden am besten getrennt von der Datenbank auf dem Anwendungsserver durchgeführt.
  • Die Umwandlung von Daten zur Anzeige einer grafischen Oberfläche erfolgt am besten auf einer separaten Ebene - z. B. HTML5 und JavaScript im Browser.

Der größte Teil des traditionellen Programmierdesigns wird darauf verwendet, die verschiedenen Ansichten korrekt zu gestalten, was viele Codezeilen für die Bereitstellung von Ressourcen und die Synchronisierung der verschiedenen Ansichten erfordert.
Sie sind in q / kdb+ erstaunlich einfach.

Das interpretierbare Q wird interpretiert, nicht kompiliert. Zur Laufzeit befinden sich die Daten und Funktionen im Arbeitsbereich im Speicher.
Die Iterationen des Entwicklungszyklus sind in der Regel schnell, da alle Laufzeitinformationen, die zum Testen und Debuggen benötigt werden, sofort im Arbeitsbereich verfügbar sind.
Q-Programme werden als einfache Textdateien, so genannte Skripte, gespeichert und ausgeführt. Es stehen Interpreter-Eval- und Parse-Routinen zur Verfügung, mit denen Sie dynamisch und kontrolliert Code erzeugen können.

Typen Q ist eine dynamisch typisierte Sprache, in der die Typenprüfung meist unauffällig ist.
Jede Variable hat den Typ des ihr aktuell zugewiesenen Wertes, und die Typumwandlung erfolgt automatisch für die meisten numerischen Operationen. Bei Operationen auf homogenen Listen werden Typen geprüft.

Wenn q von links nach rechts eingegeben wird, werden Ausdrücke von rechts nach links oder, wie die Götter von q es bevorzugen, von links nach rechts ausgewertet - das bedeutet, dass die Funktion auf das Argument zu ihrer Rechten angewendet wird.
Es gibt keinen Vorrang der Operatoren, und die Funktionsanwendung kann ohne Klammern geschrieben werden. Interpunktionsgeräusche werden stark reduziert.

Null- und Unendlichkeitswerte in klassischem SQL sind NULL-Werte, die fehlende Daten für ein Feld beliebigen Typs darstellen und keinen Speicherplatz beanspruchen.
In q werden Nullwerte typisiert und nehmen denselben Platz ein wie Nicht-Nullwerte. Numerische Typen haben auch unendliche Werte.
Unendliche und Nullwerte können an arithmetischen und anderen Operationen mit (meist) vorhersehbaren Ergebnissen teilnehmen.

Die integrierte E/A wird mit Hilfe von Funktionsdeskriptoren durchgeführt, die als Fenster zur Außenwelt fungieren.
Sobald ein solcher Deskriptor initialisiert ist, ist die Übergabe eines Wertes an den Deskriptor ein Schreibvorgang.

Die Tabelle ist auf die Ablehnung von Artikeln ausgerichtet , die Sie hier eingeben. Im Gegensatz zu traditionellen Sprachen gibt es in q keine Klassen, Objekte, Vererbung oder virtuelle Methoden.
Stattdessen hat q Tabellen als Objekte erster Klasse. Das Fehlen von Objekten ist nicht so schlimm, wie es auf den ersten Blick erscheinen mag.
Objekte sind im Wesentlichen verherrlichte Datensätze (d.h. Entitäten mit benannten Feldern), die durch q-Wörterbücher modelliert werden. Eine Tabelle kann man sich als eine Liste von Datensatz-Wörterbüchern vorstellen.

Geordnete Listen , denn klassisches SQL ist eine Mengenalgebra, die ungeordnet ist und keine Duplikate aufweist, die Reihenfolge der Zeilen und Spalten ist nicht definiert,
was die Verarbeitung von Zeitreihen umständlich und langsam macht. In q basieren die Datenstrukturen auf geordneten Listen, so dass Zeitreihen die Reihenfolge beibehalten, in der sie erstellt werden.
Darüber hinaus benötigen einfache Listen einen kontinuierlichen Speicherplatz, so dass die Verarbeitung großer Datenmengen schnell erfolgt. Sehr schnell.

Spaltenorientierte SQL-Tabellen sind als über das Repository verteilte Zeilen organisiert, und Operationen werden auf Felder innerhalb der Zeile angewendet. Q-Tabellen sind Listen von Spalten in kontinuierlicher Speicherung, und Operationen werden auf alle Spalten angewendet.

Die In-Memory-Datenbank kdb+ kann als eine In-Memory-Datenbank mit kontinuierlicher Unterstützung betrachtet werden. Da die Datenverarbeitung mit q erfolgt, gibt es keine separate Stored-Procedure-Sprache.
Tatsächlich enthält kdb+ serialisierte Listen von q-Spalten, die in das Dateisystem geschrieben und dann im Speicher abgebildet werden.

 

eine junge Frau hat ein Ferkel gekauft (aus der Volksweisheit)

Ich habe in dieser Diskussion, ich habe keine Ruhe))

Ich habe einige weitere Varianten getestet, MQL5 führt eine sehr gute Laufzeitoptimierung durch, aber immer noch .... es ist nicht richtig, sich auf einen intelligenten Compiler zu verlassen - unnötige Funktionsaufrufe sind nicht die beste Lösung,

Imho ist dies der einzige Weg

void OnStart()
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
   
   sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum); //sum = 100
}

die erste Schleife - Suche in absteigender Reihenfolge der Array-Indizes

Untere Schleife - Suche in aufsteigender Reihenfolge der Indizes

 
Igor Makanu:

eine junge Frau hat ein Ferkel gekauft (aus der Volksweisheit)

Ich habe in dieser Diskussion, ich habe keine Ruhe))

Ich habe einige weitere Varianten getestet, MQL5 führt eine sehr gute Laufzeitoptimierung durch, aber immer noch .... es ist nicht richtig, sich auf einen intelligenten Compiler zu verlassen - unnötige Funktionsaufrufe sind nicht die beste Lösung,

Imho ist dies der einzige Weg

die erste Schleife - Suche in absteigender Reihenfolge der Array-Indizes

die untere Schleife - eine Suche in aufsteigender Reihenfolge der Array-Indizes

Eine Funktion ist nicht wie eine Funktion. Und vielleicht ist die Größe eines Arrays kein gutes Beispiel, weil sie in Bezug auf die Speichernutzung und den Zugriff darauf einer Variablen gleichkommt. Tatsächlich handelt es sich um eine Variable in einer Speicherzelle, die gefüllt wurde, als das Array deklariert wurde. Aber Maximum oder Minimum aus einem Array oder einfach die Berechnung in einer Schleifenbedingung von 10 Variablen sollten Sie nicht verwenden. Es ist besser, zuerst zu rechnen und zu substituieren.

Und soweit ich verstehe, sind Array-Elemente, Strukturelemente Variablen mit bestimmten Adressen im Speicher, und es ist nur eine Frage der Bequemlichkeit zu schreiben, A[10] und 10 Variablen A1 A2 ... A10 sind in Bezug auf Zugang und Größe identisch. Die Art des Kurses ist die gleiche)

 
Valeriy Yastremskiy:

Und soweit ich verstehe, sind Array-Elemente, Strukturelemente Variablen mit bestimmten Adressen im Speicher und es ist nur eine Bequemlichkeit zu schreiben, A[10] und 10 Variablen A1 A2 ... A10 sind in Bezug auf Zugang und Größe identisch. Die Art des Kurses ist die gleiche)

wenn physisch im CPU-Befehl, nein

ein Array ist ein Speicherbereich, der Zugriff auf die Array-Elemente besteht in der Berechnung des Elementindexes vom Anfang dieses Speicherbereichs und der Extraktion der Daten (Bytes) entsprechend dem gespeicherten Typ


wenn dies die Logik des Algorithmus ist, dann ja, es sind indizierbare Variablen.

Im Allgemeinen ist der einzig richtige Ratschlag zu dem untersuchten Problem: https: die Eingabeparameter überprüfen. Speichern - schiebt die Daten vom Stapel. Register speichern. Register wiederherstellen. Funktionsaufruf - Aufruf, dann Rückkehr. Was ich meine, ist, dass im Hintergrund viel passieren kann, was wir nicht sehen. Deshalb ist es besser, for (int i=0; i<size; i++) zu verwenden und sich nicht darauf zu verlassen, dass der Compiler tut, was wir von ihm erwarten.

 
Igor Makanu:

wenn physisch im CPU-Befehl, nein

ein Array ist ein Speicherbereich, der Zugriff auf Array-Elemente besteht darin, den Index eines Elements vom Anfang dieses Speicherbereichs aus zu berechnen und Daten (Bytes) entsprechend dem gespeicherten Typ abzurufen


wenn dies die Logik des Algorithmus ist, dann ja, es sind indizierbare Variablen.

Im Allgemeinen ist der einzig richtige Ratschlag zu dem untersuchten Problem: https: //www.mql5.com/ru/forum/354662/page4#comment_19039624:

Dem stimme ich zu, der Compiler ist eine Blackbox, man kann also nicht mit Sicherheit davon ausgehen.

Die Hauptsache ist, dass alles wie vorgesehen funktioniert)))