pregunta para los expertos en #define - página 10

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

Vamos. Primero la definición, luego el ejecutable, luego la ejecución del ejecutable.

Lo tengo. Por lo tanto, definir acelera sólo la construcción del proyecto grande, pero no la ejecución del código en el ejecutable.

En general, para la autoformación, me interesa la máxima implementación posible del código a nivel de hardware, en términos de velocidad de ejecución.
No importa la arquitectura o el dominio.
Sé que hay lenguajes que se ejecutan completamente en memoria, lo que probablemente sería la solución más rápida.
 
Roman:

Lo tengo. Por lo tanto, definir sólo acelera la construcción de un proyecto grande, pero no la ejecución del código en el ejecutable.

Por lo general, en aras de la autoeducación, me interesa la máxima implementación posible de código a nivel de hardware, en términos de velocidad de ejecución.
No importa la arquitectura o el dominio.
Sé que hay lenguajes que se ejecutan completamente en memoria, esta sería probablemente la solución más rápida.

Definir no da ninguna aceleración. Con la pequeña excepción de la definición de números primos como #define FIVE 5.

La definición tiene por objeto hacer el código más legible y más fácil de modificar. Eso es todo. Esto completa su funcionalidad.

 
Me pregunto qué idioma se utiliza para escribir ISS o equipo médico.
Los microcontroladores y los controladores se escriben en C o en lenguaje ensamblador.
¿Qué otras opciones hay? ¿Alguien ha estudiado Q?
 

Etapas de programación IMHO))

1 - No entiendo nada

2 - Entiendo el estilo procedimental (ni siquiera es funcional, es sólo un poco de código)

3 - Considero que puedo escribir todo lo que me gusta en el estilo funcional)

4 - Entiendo que no entiendo la POO

5 - entender la POO

6 - todavía entiende la OOP por la gravedad

7 - Puedo pensar en cualquier combinación de nudos del árbol en OOP y hash todo y sal con defectos a mi gusto

8 -toda esta programación pero con acceso estricto por tipo y demás.

9 - entender que el 7 punto es el mal (el lado oscuro) y hay un mundo de ood civil (plantillas)

10 - de los que considero programadores cool cada vez más escuchar "OOP es el mal", es decir, hay un uso civil de los métodos y si todo directamente en civil para hacer resulta que la necesidad de todo no es tan grande, sí es la rutina, pero la velocidad de aplicación de la escritura de código varias veces mayor que la mía :(

11 - Entiendo que los lenguajes funcionales modernos emulan la POO en algunas etapas, todas estas extensiones de funciones, es decir, empiezo a entender el enfoque de la programación funcional (punto 3)

En general, no veo mucha diferencia respecto a la sintaxis del lenguaje, los principios no cambian, hay lenguajes estrictos y lenguajes no estrictos. Es difícil codificar en lenguajes que no son estrictos. C++ C# R Q GO JS Ruby no supone la más mínima diferencia.

El bajo nivel es más rápido (es realista escribir tu propio trozo de código muy rápido, más rápido que el estándar, pero ¿por qué?) - por ejemplo es fácil escribir una ordenación más rápida que el estándar, pero la esencia de la ordenación oportuna no es la velocidad)) sino un número mínimo de acciones, y el número mínimo de acciones no es siempre la forma más rápida, pero es muy buena.

sobre los microprocesadores... pues ahí es donde se suele empezar a aprender. Aunque la esencia de la lengua no es tan importante. Los de alto nivel permiten operar con grandes fragmentos de código, mientras que los de bajo nivel son más versátiles.

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
No, no, no. No OOP ))
OOP es una envoltura sobre un lenguaje de procedimientos.
Es una extensión de un lenguaje procedimental pero con su propio paradigma.
Personalmente, creo que la POO es una basura de un lenguaje ya de alto nivel ))
Todos los lenguajes anteriores son de alto nivel, excepto Q
Debes estar pensando en un Q equivocado. Q es una extensión del lenguaje K
El lenguaje Q implementa la base de datos KDB+

Kdb+, a partir de Kx , es

  • base de datos de series temporales históricas en columnas de alto rendimiento y multiplataforma
  • motor de cálculo en memoria
  • procesador de hilos en tiempo real
  • consultas expresivas y un lenguaje de programación llamado q

Hay un paradigma muy diferente allí, no como C. Creo que hay una lógica de vectores.
Pero creo que incluso los programadores más experimentados de este foro no han oído hablar de este lenguaje)).


w

 

0,0 la evolución de q

Arthur Whitney desarrolló el lenguaje de programación q y su base de datos kdb+. Publicado por Kx Systems, Inc. en 2003, los principales objetivos de diseño de q eran la expresividad, la velocidad y la eficiencia.
No se acerca a ellos. La contrapartida del diseño es la brevedad, que puede confundir a los programadores que vienen de entornos de programación de bases de datos tradicionales verbosos -
como C++, Java, C# o Python - y los SGBD relacionales. Mientras los dioses de la programación q se deleitan con los programas que se parecen a un volcado de núcleo ASCII, esta guía es para todos nosotros.

Q evolucionó a partir de APL (lenguaje de programación), que fue inventado por primera vez como notación matemática por Kenneth Iverson en la Universidad de Harvard en la década de 1950.
APL fue introducido en la década de 1960 por IBM como un lenguaje de programación vectorial, lo que significa que maneja una lista de números en una sola operación.
Tuvo éxito en las finanzas y otros sectores que requerían mucho crujido.

El ADN mitocondrial q traza de APL a A a A+ y a k. Todos han sido bien adaptados para realizar cálculos complejos rápidamente en vectores.
La novedad de q / kdb+ es que maneja grandes cantidades de datos de series temporales de forma muy eficiente en un paradigma relacional.
Su sintaxis permite realizar expresiones " select " similares a las de SQL 92, y su colección de funciones incorporadas proporciona un completo y potente lenguaje de procedimientos almacenados.

También hay algo de susurro en los genes q: la construcción de datos fundamental q es una lista. Aunque las denominaciones y la terminología son diferentes, los símbolos se han tomado de sus homólogos en el esquema.

El pedigrí de APL q también muestra la influencia de la programación funcional.
En su conferencia del Premio Turing de 1977, que introdujo la programación puramente funcional, Backus reconoció la inspiración de APL.
Aunque q no es puramente funcional, es fuertemente funcional en el sentido de que incluso sus estructuras de datos básicas, lista y diccionario, se tratan como mapeos matemáticos.

0.1 filosofía

Un desarrollador experto en q piensa de forma diferente a como lo hace en entornos de programación convencionales como C++, Java, C# o Python, lo que en adelante se denominará "programación tradicional". -
Para que te pongas en situación, vamos a resumir algunas discontinuidades potenciales para el principiante q - en adelante conocido como qbie.

Veamos algunos de los problemas de datos en la programación tradicional de bases de datos:

  • Una representación en memoria -como una colección de objetos- debe ser mapeada a otra representación -como las tablas- para que persista.
    Se requiere un esfuerzo considerable para obtener una correspondencia objeto-relacional adecuada.
  • Los objetos deben ser mapeados a otra representación para su transporte, normalmente alguna forma binaria o XML que suavice las cadenas de referencia.
  • La manipulación de datos -por ejemplo, la selección, agrupación y agregación en grandes conjuntos de datos- se realiza mejor en procedimientos almacenados en el servidor de la base de datos.
    Los cálculos numéricos complejos se realizan mejor por separado de la base de datos en el servidor de aplicaciones.
  • La conversión de datos para mostrar una interfaz gráfica se realiza mejor en una capa separada, por ejemplo, HTML5 y JavaScript en el navegador.

La mayor parte del diseño de la programación tradicional se gasta en conseguir las diferentes vistas correctamente, lo que requiere muchas líneas de código para organizar los recursos y sincronizar las diferentes vistas.
Son sorprendentemente simples en q / kdb+.

Q interpre table se interpreta, no se compila. En tiempo de ejecución, los datos y las funciones están en el espacio de trabajo en la memoria.
Las iteraciones del ciclo de desarrollo suelen ser rápidas porque toda la información en tiempo de ejecución necesaria para las pruebas y la depuración está inmediatamente disponible en el espacio de trabajo.
Los programas Q se almacenan y ejecutan como simples archivos de texto llamados scripts. Las rutinas de evaluación y análisis del intérprete están disponibles para que puedas generar código de forma dinámica y controlada.

Tipos Q es un lenguaje dinámicamente tipado en el que la comprobación de tipos es mayormente discreta.
Cada variable tiene un tipo de su valor actualmente asignado, y la promoción de tipo se produce automáticamente para la mayoría de las operaciones numéricas. Se comprueban los tipos para las operaciones sobre listas homogéneas.

Cuando q se introduce de izquierda a derecha, las expresiones se evalúan de derecha a izquierda o, como prefieren los dioses de q, de izquierda a derecha, lo que significa que la función se aplica al argumento de su derecha.
No hay precedencia de operadores, y la aplicación de la función puede escribirse sin paréntesis. El ruido de la puntuación se reduce considerablemente.

Los valores nulos e infinitos en el SQL clásico son valores NULL que representan datos faltantes para un campo de cualquier tipo y no ocupan espacio de almacenamiento.
En q los valores nulos se escriben y ocupan el mismo espacio que los valores no nulos. Los tipos numéricos también tienen valores infinitos.
Los valores infinitos y nulos pueden participar en operaciones aritméticas y de otro tipo con resultados (en su mayoría) predecibles.

La E/S integrada se realiza mediante descriptores funcionales, que actúan como ventanas al mundo exterior.
Una vez inicializado un descriptor de este tipo, pasar un valor al descriptor es una escritura.

La mesa está orientada al rechazo de artículos, tú que entras aquí. A diferencia de los lenguajes tradicionales, en q no encontrarás clases, objetos, herencia o métodos virtuales.
En cambio, q tiene tablas como objetos de primera clase. La falta de objetos no es tan grave como podría parecer a primera vista.
Los objetos son esencialmente registros glorificados (es decir, entidades con campos nombrados) que se modelan mediante diccionarios q. Una tabla puede considerarse como una lista de diccionarios de registros.

Listas ordenadas porque el SQL clásico es un álgebra de conjuntos sin duplicados, el orden de las filas y el de las columnas no están definidos,
lo que hace que el procesamiento de las series temporales sea engorroso y lento. En q las estructuras de datos se basan en listas ordenadas, por lo que las series temporales mantienen el orden en que se crean.
Además, las listas simples ocupan un almacenamiento continuo, por lo que el procesamiento de grandes datos es rápido. Muy rápido.

Las tablas SQL orientadas a columnas se organizan como filas repartidas por el repositorio, y las operaciones se aplican a los campos dentro de la fila. Las tablas Q son listas de columnas en almacenamiento continuo, y las operaciones se aplican a todas las columnas.

La base de datos en memoria puede considerarse kdb+ como una base de datos en memoria con soporte continuo. Dado que el procesamiento de datos se realiza con q, no existe un lenguaje de procedimientos almacenados independiente.
De hecho, kdb+ contiene listas serializadas de columnas q se escriben en el sistema de archivos y luego se asignan a la memoria.

 

una joven ha comprado un lechón (de la sabiduría popular)

Me metí en esta discusión, no tengo paz))

He probado algunas variantes más, MQL5 realiza una muy buena optimización en tiempo de ejecución, pero todavía .... no es correcto confiar en un compilador inteligente - la llamada de función innecesaria no es la mejor solución,

imho, esta es la única manera

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
}

el primer bucle - búsqueda en orden descendente de los índices de la matriz

bucle inferior - búsqueda en orden ascendente de los índices

 
Igor Makanu:

una joven ha comprado un lechón (de la sabiduría popular)

Me metí en esta discusión, no tengo paz))

He probado algunas variantes más, MQL5 realiza una muy buena optimización en tiempo de ejecución, pero todavía .... no es correcto confiar en un compilador inteligente - la llamada de función innecesaria no es la mejor solución,

imho, esta es la única manera

el primer bucle - búsqueda en orden descendente de los índices de la matriz

el bucle inferior - una búsqueda en orden ascendente de los índices de la matriz

Una función no es como una función. Y tal vez el tamaño de un array no sea un buen ejemplo, porque es igual a una variable en términos de uso de memoria y acceso a ella. De hecho, es una variable en una celda de memoria, que se llenó cuando se declaró el array. Pero el máximo o el mínimo de un array, o simplemente el cálculo en una condición de bucle de 10 variables, no debería. Es mejor calcular y sustituir primero.

Y por lo que tengo entendido, los elementos de los arrays, los elementos de las estructuras son variables con direcciones específicas en la memoria, y sólo es cuestión de escribir a conveniencia, A[10] y 10 variables A1 A2 ... A10 son iguales en acceso y tamaño. El tipo es, por supuesto, el mismo)

 
Valeriy Yastremskiy:

Y por lo que entiendo, los elementos del array, los elementos de la estructura son variables con direcciones específicas en la memoria y es sólo una conveniencia de escribir, A[10] y 10 variables A1 A2 ... A10 son iguales en acceso y tamaño. El tipo de curso es el mismo)

si físicamente en el comando de la CPU, no

un array es una zona de memoria, el acceso a los elementos del array es el cálculo del índice del elemento desde el principio de esta zona de memoria y la extracción de los datos (bytes) según el tipo almacenado


si esta es la lógica del algoritmo, entonces sí, son variables indexables.

en general sobre el problema en estudio, el único consejo correcto es comprobar los parámetros de entrada. Guardar - empujar los datos fuera de la pila. Guarda los registros. Restaurar registros. Llamada de función - llamar y luego devolver. Lo que quiero decir es que pueden estar pasando muchas cosas en el fondo y no podemos verlas. Por eso es mejor usar for (int i=0; i<size; i++) y no confiar en que el compilador haga lo que esperamos que haga.

 
Igor Makanu:

si físicamente en el comando de la CPU, no

un array es una zona de memoria, el acceso a los elementos del array consiste en calcular el índice de un elemento desde el principio de esta zona de memoria y recuperar los datos (bytes) según el tipo almacenado


si esta es la lógica del algoritmo, entonces sí, son variables indexadas.

en general sobre el problema en estudio, el único consejo correcto es https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

Estoy de acuerdo con eso, el compilador es una caja negra, así que no se puede asumir con seguridad.

Lo principal es que todo lo concebido funcione como está previsto)))

Razón de la queja: