Question pour les experts en #define - page 10

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

Allez. D'abord la définition, puis l'exécutable, puis l'exécution de l'exécutable.

Je l'ai. Ainsi, définir accélère seulement la construction d'un grand projet, mais pas l'exécution du code dans l'exécutable.

En général, pour l'autoformation, je m'intéresse à la mise en œuvre maximale possible du code au niveau matériel, en termes de vitesse d'exécution.
Peu importe l'architecture ou le domaine.
Je sais qu'il existe des langages qui fonctionnent entièrement en mémoire, ce qui serait probablement la solution la plus rapide.
 
Roman:

Je l'ai. Ainsi, définir accélère uniquement la construction d'un grand projet, mais pas l'exécution du code dans l'exécutable.

D'une manière générale, dans un souci d'auto-éducation, je m'intéresse à la mise en œuvre maximale du code au niveau matériel, en termes de vitesse d'exécution.
Peu importe l'architecture ou le domaine.
Je sais qu'il existe des langages qui fonctionnent entièrement en mémoire, ce serait probablement la solution la plus rapide.

Définir ne donne aucune accélération du tout. A l'exception peut-être de la définition des nombres premiers comme #define FIVE 5.

La définition a pour but de rendre le code plus lisible et plus facile à modifier. C'est tout. Cela complète sa fonctionnalité.

 
Je me demande quelle langue est utilisée pour écrire ISS ou équipement médical.
Les microcontrôleurs et les pilotes sont écrits soit en langage C, soit en langage assembleur.
Quelles sont les autres options ? Quelqu'un a-t-il étudié Q ?
 

Des étapes de programmation IMHO))

1 - Je ne comprends rien

2 - Je comprends le style procédural (ce n'est même pas un style fonctionnel, c'est juste un bout de code)

3 - Je considère que je peux écrire tout ce que je veux sur le style fonctionnel)

4 - Je comprends que je ne comprends pas la POO.

5 - comprendre la POO

6 - comprend toujours la POO par sévérité

7 - Je peux imaginer n'importe quelle combinaison de nœuds d'arbre dans OOP et hacher le tout et le saler avec des défauts à mon goût.

8 -toute cette programmation mais avec un accès strict par type et ainsi de suite.

9 - comprendre que le point 7 est le mal (le côté obscur) et qu'il existe un monde de Dieu civil (modèles)

10 - de ceux que je considère cool programmeurs de plus en plus entendre "OOP est le mal", c'est, il ya une utilisation civile des méthodes et si tous directement sur le civil à faire, il s'avère que la nécessité de tout n'est pas si grand, oui, il est de routine, mais la vitesse d'application de l'écriture du code à des moments plus élevés que le mien :(

11 - Je comprends que les langages fonctionnels modernes émulent la POO à certains stades, toutes ces extensions de fonctions, en d'autres termes je commence à comprendre l'approche de la programmation fonctionnelle (point 3).

En général, je ne vois pas beaucoup de différence par rapport à la syntaxe de la langue, les principes ne changent pas, il y a des langues strictes et des langues non strictes. Il est difficile de coder dans des langues qui ne sont pas strictes. C++ C# R Q Q GO JS Ruby ne fait pas la moindre différence.

Le bas niveau est plus rapide (il est réaliste d'écrire son propre morceau de code très rapide, plus rapide que la norme, mais pourquoi ?) - par exemple, il est facile d'écrire un tri plus rapide que la norme, mais l'essence d'un tri opportun n'est pas la vitesse))) mais un nombre minimum d'actions, et le nombre minimum d'actions n'est pas toujours le moyen le plus rapide, mais il est très bon.

sur les microprocesseurs - et bien, c'est généralement là que tu commences à apprendre. Bien que l'essence de la langue ne soit pas si importante. Ceux de haut niveau vous permettent de travailler avec de grands fragments de code, tandis que ceux de bas niveau sont plus polyvalents.

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Non, non, non. No OOP ))
La POO est une enveloppe sur un langage de procédures.
C'est une extension d'un langage procédural mais avec son propre paradigme.
Personnellement, je pense que la POO est une pollution d'un langage déjà de haut niveau ;))
Tous les langages ci-dessus sont des langages de haut niveau, sauf Q
Vous devez penser à un mauvais Q. Q est une extension du langage K
Le langage Q implémente la base de données KDB+

Kdb+, à partir de Kx , est

  • base de données de séries chronologiques historiques colonnaires multiplateforme haute performance
  • moteur de calcul en mémoire
  • processeur de fils en temps réel
  • des requêtes expressives et un langage de programmation appelé q

Il y a là un paradigme très différent, qui n'est pas du type C. Je pense qu'il y a une logique de vecteur.
Mais je pense que même les programmeurs les plus expérimentés de ce forum n'ont pas entendu parler de ce langage)).


w

 

0,0 l'évolution de q

Arthur Whitney a développé le langage de programmation q et sa base de données kdb+. Publié par Kx Systems, Inc. en 2003, les principaux objectifs de conception de q étaient l'expressivité, la vitesse et l'efficacité.
Il est loin de les égaler. La contrepartie de cette conception est la brièveté, qui peut dérouter les programmeurs venant d'environnements de programmation de bases de données traditionnels verbeux -
tels que C++, Java, C# ou Python - et de SGBD relationnels. Alors que les dieux de la programmation se délectent de programmes qui ressemblent à un vidage de noyau ASCII, ce guide s'adresse à nous tous.

Q a évolué à partir de l' APL (langage de programmation), qui a été inventé en tant que notation mathématique par Kenneth Iverson à l' université de Harvard dans les années 1950.
L'APL a été introduit dans les années 1960 par IBM en tant que langage de programmation vectoriel, ce qui signifie qu'il traite une liste de nombres en une seule opération.
Elle a connu le succès dans le secteur de la finance et dans d'autres secteurs qui nécessitaient un grand nombre de calculs.

ADN mitochondrial q traces de APL à A à A+ et à k. Ils ont tous été bien adaptés pour effectuer rapidement des calculs complexes sur des vecteurs.
La nouveauté de q / kdb+ est qu'il traite très efficacement de grandes quantités de données de séries temporelles dans un paradigme relationnel.
Sa syntaxe vous permet de réaliser des expressions " select " similaires à celles de SQL 92, et sa collection de fonctions intégrées constitue un langage de procédures stockées complet et puissant.

Il y a aussi du chuchotement dans les gènes q: la construction de données fondamentale q est une liste. Bien que les désignations et la terminologie soient différentes, les symboles sont repris de leurs homologues dans le schéma.

Le pedigree d'APL q montre également l'influence de la programmation fonctionnelle.
Dans sa conférence du prix Turing 1977, qui a introduit la programmation purement fonctionnelle, Backus a reconnu l'inspiration de l'APL.
Bien que q ne soit pas purement fonctionnel, il est fortement fonctionnel dans le sens où même ses structures de données de base, liste et dictionnaire, sont traitées comme des mappings mathématiques.

0,1 philosophie

Un développeur q compétent pense différemment que dans les environnements de programmation classiques tels que C++, Java, C# ou Python, que l'on appelle désormais "programmation traditionnelle". -
Pour vous mettre dans le bon état d'esprit, nous allons résumer quelques discontinuités potentielles pour le débutant q - désormais appelé qbie.

Revenons sur certains des problèmes liés aux données dans la programmation traditionnelle des bases de données :

  • Une représentation en mémoire - telle qu'une collection d'objets - doit être mise en correspondance avec une autre représentation - telle que des tables - pour persister.
    Des efforts considérables sont nécessaires pour obtenir une correspondance objet-relationnel correcte.
  • Les objets doivent être mis en correspondance avec une autre représentation pour le transport, généralement sous une forme binaire ou XML qui lisse les chaînes de référence.
  • La manipulation des données - par exemple la sélection, le regroupement et l'agrégation de grands ensembles de données - est mieux réalisée dans des procédures stockées sur le serveur de la base de données.
    Il est préférable d'effectuer les calculs numériques complexes séparément de la base de données sur le serveur d'application.
  • La conversion des données en vue de l'affichage d'une interface graphique est mieux réalisée sur une couche séparée - par exemple, HTML5 et JavaScript dans le navigateur.

La plupart des conceptions de programmation traditionnelles sont consacrées à l'obtention correcte des différentes vues, ce qui nécessite de nombreuses lignes de code pour rassembler les ressources et synchroniser les différentes vues.
Ils sont étonnamment simples dans q / kdb+.

Q interprétable est interprété, pas compilé. Au moment de l'exécution, les données et les fonctions se trouvent dans l'espace de travail en mémoire.
Les itérations du cycle de développement sont généralement rapides car toutes les informations d'exécution nécessaires aux tests et au débogage sont immédiatement disponibles dans l'espace de travail.
Les programmes Q sont stockés et exécutés sous forme de simples fichiers texte appelés scripts. Des routines d'évaluation et d' analyse de l'interpréteur sont disponibles pour vous permettre de générer dynamiquement du code de manière contrôlée.

Types Q est un langage dynamiquement typé où la vérification des types est le plus souvent discrète.
Chaque variable a un type correspondant à la valeur qui lui est actuellement attribuée, et la promotion du type se produit automatiquement pour la plupart des opérations numériques. Les types sont vérifiés pour les opérations sur les listes homogènes.

Lorsque q est entré de gauche à droite, les expressions sont évaluées de droite à gauche ou, comme le préfèrent les dieux de q, de gauche à droite - ce qui signifie que la fonction est appliquée à l'argument situé à sa droite.
Il n'y a pas de précédence d'opérateur, et l'application de la fonction peut être écrite sans parenthèses. Les bruits de ponctuation sont fortement réduits.

Les valeurs NULL et Infinity en SQL classique sont des valeurs NULL qui représentent des données manquantes pour un champ de n'importe quel type et qui n'occupent pas d'espace de stockage.
Dans q, les valeurs nulles sont typées et occupent le même espace que les valeurs non nulles. Les types numériques ont également des valeurs infinies.
Les valeurs infinies et nulles peuvent participer à des opérations arithmétiques et autres avec des résultats (généralement) prévisibles.

Les E/S intégrées sont réalisées à l'aide de descripteurs fonctionnels, qui agissent comme des fenêtres sur le monde extérieur.
Une fois qu'un tel descripteur est initialisé, le passage d'une valeur au descripteur est une écriture.

La table est orientée vers le rejet des articles, vous qui entrez ici. Contrairement aux langages traditionnels, vous ne trouverez pas de classes, d'objets, d'héritage ou de méthodes virtuelles dans q.
Au lieu de cela, q a des tables comme objets de première classe. Le manque d'objets n'est pas aussi grave qu'il n'y paraît à première vue.
Les objets sont essentiellement des enregistrements glorifiés (c'est-à-dire des entités avec des champs nommés) qui sont modélisés par des dictionnaires q. Une table peut être considérée comme une liste de dictionnaires d'enregistrements.

Les listes ordonnées parce que le SQL classique est une algèbre d'ensembles non ordonnés sans doublons, l'ordre des lignes et l'ordre des colonnes sont indéfinis,
ce qui rend le traitement des séries chronologiques lourd et lent. En q, les structures de données sont basées sur des listes ordonnées, de sorte que les séries chronologiques conservent l'ordre dans lequel elles sont créées.
En outre, les listes simples occupent un espace de stockage continu, de sorte que le traitement des données volumineuses est rapide. Très rapide.

Les tables SQL orientées colonnes sont organisées sous forme de rangées réparties dans le référentiel, et les opérations sont appliquées aux champs de la rangée. Les tableaux Q sont des listes de colonnes en stockage continu, et les opérations sont appliquées à toutes les colonnes.

La base de données en mémoire peut être considérée comme kdb+ comme une base de données en mémoire avec un support continu. Le traitement des données étant effectué avec q, il n'existe pas de langage de procédure stockée distinct.
En fait, kdb+ contient des listes sérialisées de q colonnes écrites sur le système de fichiers et ensuite mappées en mémoire.

 

une jeune femme a acheté un porcelet (de la sagesse populaire)

Je suis entré dans cette discussion, je n'ai pas la paix;))

J'ai testé d'autres variantes, MQL5 réalise une très bonne optimisation du temps d'exécution, mais toujours ..... il n'est pas juste de compter sur un compilateur intelligent - un appel de fonction inutile n'est pas la meilleure solution,

imho, c'est le seul moyen

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
}

la première boucle - recherche dans l'ordre décroissant des index du tableau

boucle inférieure - recherche dans l'ordre ascendant des indices

 
Igor Makanu:

une jeune femme a acheté un porcelet (de la sagesse populaire)

Je suis entré dans cette discussion, je n'ai pas la paix:))

J'ai testé d'autres variantes, MQL5 réalise une très bonne optimisation du temps d'exécution, mais toujours ..... il n'est pas juste de compter sur un compilateur intelligent - un appel de fonction inutile n'est pas la meilleure solution,

imho, c'est le seul moyen

la première boucle - recherche dans l'ordre décroissant des index du tableau

la boucle inférieure - une recherche dans l'ordre ascendant des index du tableau

Une fonction n'est pas comme une fonction. Et peut-être que la taille d'un tableau n'est pas un bon exemple, car elle est égale à une variable en termes d'utilisation de la mémoire et d'accès à celle-ci. En fait, il s'agit d'une variable dans une cellule de mémoire, qui a été remplie lorsque le tableau a été déclaré. Mais le maximum ou le minimum d'un tableau, ou juste le calcul dans les conditions d'une boucle de 10 variables, ça ne vaut pas la peine. Il est préférable de calculer et de substituer d'abord.

Et pour autant que je comprenne, les éléments de tableau, les éléments de structure sont des variables avec des adresses spécifiques en mémoire, et il s'agit juste d'écrire commodément, A[10] et 10 variables A1 A2 .... A10 sont les mêmes en termes d'accès et de taille. Le type de cours est le même)

 
Valeriy Yastremskiy:

Et pour autant que je comprenne, les éléments de tableau, les éléments de structure sont des variables avec des adresses spécifiques dans la mémoire et c'est juste une commodité d'écrire, A[10] et 10 variables A1 A2 .... A10 sont les mêmes en termes d'accès et de taille. Le type de cours est le même)

si physiquement dans la commande CPU, non

un tableau est une zone de mémoire, l'accès aux éléments du tableau consiste à calculer l'indice de l'élément à partir du début de cette zone de mémoire et à extraire les données (octets) en fonction du type stocké.


si c'est la logique de l'algorithme, alors oui - ce sont des variables indexables

en général sur le problème étudié, le seul conseil correct est vérifier les paramètres d'entrée. Sauvegarder - pousser les données hors de la pile. Sauver les registres. Restaurer les registres. Appel de fonction - appel, puis retour. Ce que je veux dire, c'est que beaucoup de choses peuvent se passer en arrière-plan et que nous ne pouvons pas les voir. C'est pourquoi il est préférable d'utiliser for (int i=0 ; i<size ; i++) et de ne pas compter sur le compilateur pour faire ce que nous attendons de lui.

 
Igor Makanu:

si physiquement dans la commande CPU, non

un tableau est une zone de mémoire, l'accès aux éléments du tableau consiste à calculer l'indice d'un élément à partir du début de cette zone de mémoire et à extraire des données (octets) en fonction du type stocké.


si c'est la logique de l'algorithme, alors oui, ce sont des variables indexables.

en général sur le problème étudié, le seul conseil correct est https://www.mql5.com/ru/forum/354662/page4#comment_19039624 :

Je suis d'accord avec cela, le compilateur est une boîte noire, donc vous ne pouvez pas supposer avec certitude.

L'essentiel est que tout ce qui est conçu fonctionne comme prévu))))

Raison: