domanda per gli esperti di #define - pagina 10

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

Andiamo. Prima la definizione, poi l'eseguibile, poi l'esecuzione dell'eseguibile.

Ho capito. Quindi, define accelera solo la costruzione di un grande progetto, ma non l'esecuzione del codice nell'eseguibile.

In generale, per l'autoformazione, sono interessato alla massima implementazione possibile del codice a livello hardware, in termini di velocità di esecuzione.
Non importa quale architettura o dominio.
So che ci sono lingue che girano interamente in memoria, il che sarebbe probabilmente la soluzione più veloce.
 
Roman:

Ho capito. Quindi, define accelera solo la costruzione di un grande progetto, ma non l'esecuzione del codice nell'eseguibile.

In generale, per auto-educazione, sono interessato alla massima implementazione possibile del codice a livello hardware, in termini di velocità di esecuzione.
Non importa quale architettura o dominio.
So che ci sono lingue che girano interamente in memoria, questa sarebbe probabilmente la soluzione più veloce.

Define non dà alcuna accelerazione. Con forse una piccola eccezione nella definizione dei numeri primi come #define FIVE 5.

La definizione ha lo scopo di rendere il codice più leggibile e più facile da modificare. Questo è tutto. Questo completa la sua funzionalità.

 
Mi chiedo che lingua si usa per scrivere ISS o attrezzature mediche.
I microcontrollori e i driver sono scritti in C o in linguaggio assembly.
Quali altre opzioni ci sono? Qualcuno ha studiato Q?
 

Fasi di programmazione IMHO))

1 - Non capisco niente

2 - Capisco lo stile procedurale (non è nemmeno funzionale, è solo un po' di codice)

3 - Considero che posso scrivere tutto quello che mi piace sullo stile funzionale)

4 - Ho capito che non capisco l'OOP

5 - capire OOP

6 - capire ancora l'OOP per gravità

7 - Posso pensare a qualsiasi combinazione di nodi d'albero in OOP e fare l'hashish e salarlo con difetti a mio gusto

8 -tutta questa programmazione ma con un accesso rigoroso per tipo e così via.

9 - capire che 7 punto è il male (il lato oscuro) e c'è un mondo di ood civile (modelli)

10 - da quelli che considero programmatori cool sempre più sentire "OOP è il male", cioè, c'è un uso civile dei metodi e se tutti direttamente sul civile a fare si scopre che la necessità di tutto non è così grande, sì è di routine, ma la velocità di applicazione di scrittura del codice a volte superiore al mio :(

11 - Capisco che i linguaggi funzionali moderni emulano OOP in alcune fasi, tutte queste estensioni di funzioni, in altre parole comincio a capire l'approccio della programmazione funzionale (punto 3)

In generale, non vedo molta differenza dalla sintassi della lingua, i principi non cambiano, ci sono lingue severe e non ci sono lingue severe. È difficile codificare in linguaggi che non sono rigorosi. C++ C# R Q Q GO JS Ruby non fa la minima differenza.

Il basso livello è più veloce (è realistico scrivere il proprio pezzo di codice molto veloce, più veloce dello standard, ma perché?) - per esempio è facile scrivere un ordinamento più veloce dello standard, ma l'essenza dell'ordinamento tempestivo non è la velocità))) ma un numero minimo di azioni, e il numero minimo di azioni non è sempre il modo più veloce, ma è molto buono.

sui microprocessori - beh, di solito è da lì che si comincia ad imparare. Anche se l'essenza della lingua non è così importante. Quelli di alto livello permettono di operare con grandi frammenti di codice, mentre quelli di basso livello sono più versatili.

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
No, no, no. No OOP ))
OOP è un wrapper su un linguaggio di procedure.
È un'estensione di un linguaggio procedurale ma con un proprio paradigma.
Personalmente, penso che l'OOP sia un'immondizia di un linguaggio già di alto livello ))
Tutti i linguaggi di cui sopra sono linguaggi di alto livello, tranne Q
Devi aver pensato a un Q sbagliato. Q è un'estensione del linguaggio K
Il linguaggio Q implementa il database KDB+

Kdb+, da Kx , è

  • database di serie temporali storiche colonnari multipiattaforma ad alte prestazioni
  • motore di calcolo in-memoria
  • processore di thread in tempo reale
  • query espressive e un linguaggio di programmazione chiamato q

Lì c'è un paradigma molto diverso, non simile al C. Credo che ci sia una logica vettoriale.
Ma credo che anche i programmatori più esperti di questo forum non abbiano mai sentito parlare di questo linguaggio)).


w

 

0,0 l'evoluzione di q

Arthur Whitney ha sviluppato il linguaggio di programmazione q e il suo database kdb+. Rilasciato da Kx Systems, Inc. nel 2003, i principali obiettivi del design di q erano l'espressività, la velocità e l'efficienza.
Non si avvicina al loro livello. Il compromesso del design è la brevità, che può confondere i programmatori provenienti dai verbosi ambienti di programmazione di database tradizionali -
come C++, Java, C# o Python - e i DBMS relazionali. Mentre gli dei della programmazione q si divertono con programmi che assomigliano a un dump del kernel ASCII, questa guida è per tutti noi.

Q si è evoluto da APL (linguaggio di programmazione), che è stato inventato per la prima volta come notazione matematica da Kenneth Iverson all' Università di Harvard negli anni '50.
APL è stato introdotto negli anni '60 da IBM come linguaggio di programmazione vettoriale, il che significa che gestisce una lista di numeri in una sola operazione.
Ha avuto successo nella finanza e in altre industrie che richiedevano molto crunch.

Il DNA mitocondriale q traccia da APL ad A ad A+ e a k. Sono stati tutti ben adattati per eseguire rapidamente calcoli complessi sui vettori.
La novità di q / kdb+ è che gestisce grandi quantità di dati di serie temporali in modo molto efficiente in un paradigma relazionale.
La sua sintassi permette di "selezionare" espressioni simili a SQL 92, e la sua collezione di funzioni incorporate fornisce un linguaggio di stored procedure completo e potente.

C'è anche qualche sussurro nei geni q: il costrutto di dati fondamentale q è una lista. Anche se le denominazioni e la terminologia sono diverse, i simboli sono presi dalle loro controparti nello schema.

Il pedigree di APL q mostra anche l'influenza della programmazione funzionale.
Nella sua conferenza del Premio Turing del 1977, che ha introdotto la programmazione puramente funzionale, Backus ha riconosciuto l'ispirazione da APL.
Sebbene q non sia puramente funzionale, è fortemente funzionale nel senso che anche le sue strutture dati di base, lista e dizionario, sono trattate come mappature matematiche.

0,1 filosofia

Un abile sviluppatore q pensa in modo diverso rispetto agli ambienti di programmazione convenzionali come C++, Java, C# o Python, d'ora in poi chiamato "programmazione tradizionale". -
Per farvi entrare nella giusta mentalità, riassumeremo alcune potenziali discontinuità per il principiante q - d'ora in poi conosciuto come qbie.

Diamo un'occhiata ad alcuni problemi di dati nella programmazione tradizionale dei database:

  • Una rappresentazione in memoria, come una collezione di oggetti, deve essere mappata in un'altra rappresentazione, come le tabelle, per persistere.
    Uno sforzo considerevole è richiesto per ottenere una corretta corrispondenza oggetto-relazione.
  • Gli oggetti devono essere mappati in un'altra rappresentazione per il trasporto, di solito qualche forma binaria o XML che appiana le catene di riferimento.
  • La manipolazione dei dati - per esempio la selezione, il raggruppamento e l'aggregazione su grandi insiemi di dati è meglio fatta in procedure memorizzate sul server del database.
    I calcoli numerici complessi sono meglio eseguiti separatamente dal database sul server dell'applicazione.
  • La conversione dei dati per visualizzare un'interfaccia grafica è meglio farla su un livello separato - per esempio HTML5 e JavaScript nel browser.

La maggior parte del design di programmazione tradizionale è speso per ottenere correttamente le diverse viste, richiedendo molte linee di codice per raccogliere le risorse e sincronizzare le diverse viste.
Sono sorprendentemente semplici in q / kdb+.

Q interpretabile è interpretato, non compilato. In fase di esecuzione, i dati e le funzioni sono nello spazio di lavoro in memoria.
Le iterazioni del ciclo di sviluppo sono di solito veloci perché tutte le informazioni di run-time necessarie per i test e il debug sono immediatamente disponibili nell'area di lavoro.
I programmi Q sono memorizzati ed eseguiti come semplici file di testo chiamati script. Le routine di eval e parse dell'interprete sono disponibili in modo da poter generare dinamicamente il codice in modo controllato.

Tipi Q è un linguaggio dinamicamente tipizzato dove il controllo dei tipi è per lo più discreto.
Ogni variabile ha un tipo del suo valore attualmente assegnato, e la promozione del tipo avviene automaticamente per la maggior parte delle operazioni numeriche. I tipi sono controllati per operazioni su liste omogenee.

Quando q viene inserito da sinistra a destra, le espressioni vengono valutate da destra a sinistra o, come preferiscono gli dei di q, da sinistra a destra - ciò significa che la funzione viene applicata all'argomento alla sua destra.
Non c'è precedenza dell'operatore, e l'applicazione della funzione può essere scritta senza parentesi. Il rumore della punteggiatura è notevolmente ridotto.

I valori Null e Infinity in SQL classico sono valori NULL che rappresentano dati mancanti per un campo di qualsiasi tipo e non occupano spazio in memoria.
In q i valori nulli sono digitati e occupano lo stesso spazio dei valori non nulli. I tipi numerici hanno anche valori infiniti.
I valori infiniti e nulli possono partecipare all'aritmetica e ad altre operazioni con risultati (per lo più) prevedibili.

L' I/O integrato viene eseguito usando descrittori funzionali, che agiscono come finestre sul mondo esterno.
Una volta che un tale descrittore è inizializzato, passare un valore al descrittore è una scrittura.

La tabella è orientata al rifiuto degli oggetti, voi che entrate qui. A differenza dei linguaggi tradizionali, non troverete classi, oggetti, ereditarietà o metodi virtuali in q.
Invece, q ha le tabelle come oggetti di prima classe. La mancanza di oggetti non è così grave come potrebbe sembrare a prima vista.
Gli oggetti sono essenzialmente record glorificati (cioè entità con campi nominati) che sono modellati da dizionari q. Una tabella può essere pensata come una lista di dizionari di record.

Liste ordinate perché l'SQL classico è un'algebra degli insiemi che non è ordinata senza duplicati, l'ordine delle righe e delle colonne non è definito,
che rende l'elaborazione delle serie temporali ingombrante e lenta. In q le strutture di dati sono basate su liste ordinate, quindi le serie temporali mantengono l'ordine in cui sono state create.
Inoltre, le liste semplici occupano una memoria continua, quindi l'elaborazione di grandi dati è veloce. Molto veloce.

Le tabelle SQL orientate alle colonne sono organizzate come righe sparse nel repository, e le operazioni sono applicate ai campi all'interno della riga. Le tabelle Q sono elenchi di colonne in memoria continua, e le operazioni sono applicate a tutte le colonne.

Il database in-memory può essere considerato kdb+ come un database in-memory con supporto continuo. Poiché l'elaborazione dei dati è fatta con q, non c'è un linguaggio di stored procedure separato.
Infatti, kdb+ contiene liste serializzate di colonne q scritte sul file system e poi mappate in memoria.

 

una giovane donna ha comprato un maialino (dalla saggezza popolare)

Sono entrato in questa discussione, non ho pace))

Ho testato alcune altre varianti, MQL5 esegue un'ottimizzazione di runtime molto buona, ma ancora .... non è giusto fare affidamento su un compilatore intelligente - la chiamata di funzione inutile non è la soluzione migliore,

imho, questo è l'unico modo

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
}

il primo ciclo - ricerca in ordine decrescente degli indici dell'array

ciclo inferiore - ricerca in ordine crescente di indici

 
Igor Makanu:

una giovane donna ha comprato un maialino (dalla saggezza popolare)

Sono entrato in questa discussione, non ho pace))

Ho testato alcune altre varianti, MQL5 esegue un'ottimizzazione di runtime molto buona, ma ancora .... non è giusto fare affidamento su un compilatore intelligente - la chiamata di funzione inutile non è la soluzione migliore,

imho, questo è l'unico modo

il primo ciclo - ricerca in ordine decrescente degli indici dell'array

il ciclo inferiore - una ricerca in ordine crescente degli indici dell'array

Una funzione non è come una funzione. E forse la dimensione di un array non è un buon esempio, perché è uguale a una variabile in termini di utilizzo della memoria e di accesso ad essa. Infatti, è una variabile in una cella di memoria, che è stata riempita quando l'array è stato dichiarato. Ma il massimo o il minimo da un array, o solo il calcolo nelle condizioni di un ciclo di 10 variabili, non ne vale la pena. È meglio calcolare e sostituire prima.

E per quanto ho capito, gli elementi dell'array, gli elementi della struttura sono variabili con indirizzi specifici nella memoria, e si tratta solo di scrivere convenienza, A[10] e 10 variabili A1 A2 ... A10 sono uguali per accesso e dimensioni. Il tipo di corso è lo stesso)

 
Valeriy Yastremskiy:

E per quanto ho capito, gli elementi dell'array, gli elementi della struttura sono variabili con indirizzi specifici nella memoria ed è solo una comodità di scrivere, A[10] e 10 variabili A1 A2 ... A10 sono uguali per accesso e dimensioni. Il tipo di corso è lo stesso)

se fisicamente nel comando CPU, no

una matrice è un'area di memoria, l'accesso agli elementi della matrice è il calcolo dell'indice dell'elemento dall'inizio di questa area di memoria e l'estrazione dei dati (byte) secondo il tipo memorizzato


se questa è la logica dell'algoritmo, allora sì - queste sono variabili indicizzabili

in generale sul problema in studio, l'unico consiglio corretto è controllare i parametri di ingresso. Salvare - spingere i dati fuori dallo stack. Salva i registri. Ripristinare i registri. Chiamata di funzione - chiamata, poi ritorno. Quello che voglio dire è che molte cose possono accadere sullo sfondo e noi non possiamo vederle. Ecco perché è meglio usare for (int i=0; i<size; i++) e non fare affidamento sul compilatore per fare ciò che ci aspettiamo che faccia.

 
Igor Makanu:

se fisicamente nel comando CPU, no

una matrice è un'area di memoria, l'accesso agli elementi della matrice consiste nel calcolare un indice di un elemento dall'inizio di quest'area di memoria e recuperare i dati (byte) secondo il tipo memorizzato


se questa è la logica dell'algoritmo, allora sì, sono variabili indicizzabili.

in generale sul problema in studio, l'unico consiglio corretto è https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

Sono d'accordo, il compilatore è una scatola nera, quindi non si può presumere con certezza.

La cosa principale è che tutto ciò che è stato concepito funziona come previsto)))

Motivazione: