pergunta para #define experts - página 10

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

Vamos lá. Primeiro a definição, depois o executável, depois a execução do executável.

Eu peguei. Portanto, definir velocidades de construção apenas de grandes projetos, mas não de execução de código em executáveis.

Geralmente, para auto-educação, estou interessado na máxima implementação possível do código no nível do hardware, em termos de velocidade de execução.
Não importa qual arquitetura ou domínio.
Sei que existem idiomas que correm inteiramente na memória, o que provavelmente seria a solução mais rápida.
 
Roman:

Eu peguei. Assim, definir velocidades apenas para a construção de um grande projeto, mas não para a execução do código no executável.

Geralmente, para fins de auto-educação, estou interessado na máxima implementação possível do código no nível do hardware, em termos de velocidade de execução.
Não importa qual arquitetura ou domínio.
Sei que existem idiomas que correm inteiramente na memória, esta seria provavelmente a solução mais rápida.

Definir não dá nenhuma aceleração. Com talvez uma pequena exceção de definir números primos como #define FIVE 5.

A definição tem o objetivo de tornar o código mais legível e mais fácil de modificar. É isso aí. Isto completa sua funcionalidade.

 
Eu me pergunto que linguagem é usada para escrever ISS ou equipamento médico.
Os microcontroladores e controladores são escritos ou em linguagem C ou de montagem.
Que outras opções existem? Alguém já estudou Q?
 

IMHO estágios de programação))

1 - Eu não entendo nada

2 - Eu entendo o estilo de procedimento (não é nem funcional, é apenas um pouco de código)

3 - Eu considero que posso escrever tudo o que gosto no estilo funcional)

4 - Eu entendo que não entendo o OOP

5 - entenda o OOP

6 - ainda entende o OOP por severidade

7 - Eu posso pensar em qualquer combinação de nós de árvore no OOP e fazer tudo e sal com defeitos ao meu gosto

8 -toda essa programação, mas com acesso rigoroso por tipo e assim por diante.

9 - entender que 7 ponto é o mal (o lado negro) e que existe um mundo de ood civil (modelos)

10 - daqueles que eu considero os programadores legais cada vez mais ouvem "OOP é mau", ou seja, há um uso civil de métodos e se tudo diretamente no civil para fazer isso se revela que a necessidade de tudo não é tão grande, sim é rotina, mas a velocidade de aplicação da escrita de código várias vezes maior que a minha :(

11 - Entendo que as linguagens funcionais modernas imitam o OOP em algumas etapas, todas estas extensões de funções, em outras palavras, começo a entender a abordagem da programação funcional (ponto 3).

Em geral, não vejo muita diferença em relação à sintaxe do idioma, os princípios não mudam, há idiomas rígidos e não há idiomas rígidos. É difícil codificar em idiomas que não são rigorosos. C++ C# R Q Q GO JS Ruby não faz a menor diferença.

Baixo nível é mais rápido (é realista escrever seu próprio código muito rápido, mais rápido que o padrão, mas por quê?) - por exemplo, é fácil escrever uma classificação mais rápida que o padrão, mas a essência da classificação oportuna não é a velocidade)), mas um número mínimo de ações, e o número mínimo de ações nem sempre é o caminho mais rápido, mas é muito bom.

sobre microprocessadores - bem, geralmente é aí que você começa a aprender. Embora a essência do idioma não seja tão importante. Os de alto nível permitem operar com grandes fragmentos de código, enquanto os de baixo nível são mais versáteis.

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Não, não, não. No OOP ))
O OOP é um invólucro sobre uma linguagem de procedimento.
Ou seja, é uma extensão de uma linguagem processual, mas com seu próprio paradigma.
Pessoalmente, eu acho que o OOP é apenas uma ninharia de um idioma de alto nível )
Todos os idiomas listados são idiomas de alto nível, exceto Q
Você deve estar pensando em um Q errado. Q é uma extensão da linguagem K
A linguagem Q implementa o banco de dados KDB+

Kdb+, de Kx , é

  • banco de dados histórico de séries cronológicas colunares de alto desempenho entre plataformas
  • motor computacional in-memory
  • processador de fios em tempo real
  • consultas expressivas e uma linguagem de programação chamada q

Há ali um paradigma muito diferente, e não um paradigma C. Acho que há aí uma lógica vetorial.
Mas acho que mesmo os programadores mais experientes deste fórum não ouviram falar desta linguagem))).


w

 

0,0 a evolução da q

Arthur Whitney desenvolveu a linguagem de programação q e seu banco de dados kdb+. Lançado pela Kx Systems, Inc. em 2003, os principais objetivos do projeto q foram expressividade, velocidade e eficiência.
Não chega perto de corresponder a eles. O trade-off do projeto é a brevidade, que pode confundir programadores vindos de ambientes de programação de banco de dados tradicionais verbosos -
tais como C++, Java, C# ou Python - e SGBD relacional. Enquanto os deuses da programação q se divertem em programas que se assemelham a um despejo de kernel ASCII, este guia é para todos nós.

Q evoluiu do APL (linguagem de programação), que foi inventado pela primeira vez como uma notação matemática por Kenneth Iverson na Universidade de Harvard nos anos 50.
O APL foi introduzido nos anos 60 pela IBM como uma linguagem de programação vetorial, o que significa que ele lida com uma lista de números em uma única operação.
Foi um sucesso nas finanças e em outras indústrias que exigiram muita pressão.

Traços de DNA mitocondrial q de APL para A para A+ e para k. Todos eles foram bem adaptados para realizar cálculos complexos rapidamente em vetores.
O que é novo em q / kdb+ é que ele lida com grandes quantidades de dados de séries temporais de forma muito eficiente em um paradigma relacional.
Sua sintaxe permite que você " selecione " expressões similares à SQL 92, e sua coleção de funções integradas fornece uma linguagem de procedimento armazenada completa e poderosa.

Há também alguns sussurros nos genes q: a construção de dados fundamentais q é uma lista. Embora as designações e a terminologia sejam diferentes, os símbolos são retirados de suas contrapartes no esquema.

O pedigree do APL q também mostra a influência da programação funcional.
Em sua palestra do Prêmio Turing de 1977, que introduziu a programação puramente funcional, Backus reconheceu a inspiração da APL.
Embora q não seja puramente funcional, ele é fortemente funcional no sentido de que mesmo suas estruturas de dados básicos, lista e dicionário, são tratados como mapeamentos matemáticos.

0.1 filosofia

Um desenvolvedor q qualificado pensa de forma diferente do que em ambientes de programação convencionais como C++, Java, C# ou Python, doravante referido como "programação tradicional". -
Para que você tenha a mentalidade correta, resumiremos algumas descontinuidades potenciais para o iniciante q - doravante conhecido como qbie.

Vamos olhar para algumas das questões de dados na programação tradicional de bancos de dados:

  • Uma representação na memória - como uma coleção de objetos - deve ser mapeada para outra representação - como tabelas - para persistir.
    É necessário um esforço considerável para obter uma correspondência objeto-relacional adequada.
  • Os objetos devem ser mapeados para outra representação para transporte, geralmente alguma forma binária ou XML que suavize as cadeias de referência.
  • Manipulação de dados - por exemplo, a seleção, agrupamento e agregação em grandes conjuntos de dados é melhor feita em procedimentos armazenados no servidor de banco de dados.
    Os cálculos numéricos complexos são melhor realizados separadamente do banco de dados no servidor de aplicação.
  • A conversão de dados para exibir uma interface gráfica é melhor feita em uma camada separada - por exemplo, HTML5 e JavaScript no navegador.

A maioria dos projetos de programação tradicionais é gasta para obter as diferentes visões corretamente, exigindo muitas linhas de código para ordenar os recursos e sincronizar as diferentes visões.
Eles são surpreendentemente simples em q / kdb+.

O Q interpretável é interpretado, não compilado. Em tempo de execução, os dados e funções estão no espaço de trabalho em memória.
Iterações do ciclo de desenvolvimento são geralmente rápidas porque todas as informações de tempo de execução necessárias para testes e depuração estão imediatamente disponíveis no espaço de trabalho.
Os programas Q são armazenados e executados como simples arquivos de texto chamados scripts. As rotinas de avaliação e análise dos intérpretes estão disponíveis para que você possa gerar código dinamicamente de forma controlada.

O tipo Q é uma linguagem dinamicamente tipada onde a verificação de tipo é, na maioria das vezes, discreta.
Cada variável tem um tipo de valor atribuído atualmente, e a promoção do tipo ocorre automaticamente para a maioria das operações numéricas. Os tipos são verificados para operações em listas homogêneas.

Quando q é inserido da esquerda para a direita, as expressões são avaliadas da direita para a esquerda ou, como os deuses de q preferem, da esquerda para a direita, isto significa que a função é aplicada ao argumento à sua direita.
Não há precedente de operador, e a aplicação da função pode ser escrita sem parênteses. O ruído de pontuação é muito reduzido.

Valores Nulos e Infinitos no SQL clássico são valores NULL que representam dados ausentes para um campo de qualquer tipo e não ocupam espaço de armazenamento.
Em q os valores nulos são digitados e ocupam o mesmo espaço que os valores não nulos. Os tipos numéricos também têm valores infinitos.
Valores infinitos e nulos podem participar de operações aritméticas e outras com resultados (em sua maioria) previsíveis.

A E/S integrada é realizada utilizando descritores funcionais, que atuam como janelas para o mundo exterior.
Uma vez que tal descritor é inicializado, passar um valor para o descritor é uma escrita.

A tabela é orientada para a rejeição de itens, você que entra aqui. Ao contrário dos idiomas tradicionais, você não encontrará classes, objetos, herança ou métodos virtuais em q.
Ao invés disso, q tem tabelas como objetos de primeira classe. A falta de objetos não é tão ruim quanto poderia parecer à primeira vista.
Os objetos são essencialmente registros glorificados (ou seja, entidades com campos nomeados) que são modelados por dicionários q. Uma tabela pode ser pensada como uma lista de dicionários de discos.

Listas organizadas porque o SQL clássico é uma álgebra definida sem duplicatas, a ordem das filas e das colunas não são definidas,
o que torna o processamento da série temporal complicado e lento. Em q as estruturas de dados são baseadas em listas ordenadas, portanto, as séries temporais mantêm a ordem em que elas são criadas.
Além disso, listas simples ocupam um armazenamento contínuo, de modo que o processamento de dados grandes é rápido. Muito rápido.

As tabelas SQL orientadas por colunas são organizadas como linhas espalhadas pelo repositório, e as operações são aplicadas aos campos dentro da linha. As tabelas Q são listas de colunas em armazenamento contínuo, e as operações são aplicadas a todas as colunas.

O banco de dados in-memory pode ser considerado kdb+ como um banco de dados in-memory com suporte contínuo. Como o processamento de dados é feito com q, não há uma linguagem de procedimento armazenada separada.
Na verdade, o kdb+ contém listas serializadas de colunas q escritas no sistema de arquivos e depois mapeadas para a memória.

 

uma jovem mulher comprou um leitão (da sabedoria popular)

Eu entrei nesta discussão, não tenho paz))

Eu testei mais algumas variantes, a MQL5 executa muito bem a otimização do tempo de execução, mas ainda assim .... não é correto confiar em um compilador inteligente - uma chamada de função desnecessária não é a melhor solução,

imho, esta é a única maneira

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
}

o primeiro laço - busca em ordem decrescente dos índices da matriz

loop inferior - busca em ordem ascendente de índices

 
Igor Makanu:

uma jovem mulher comprou um leitão (da sabedoria popular)

Eu entrei nesta discussão, não tenho paz))

Eu testei mais algumas variantes, a MQL5 executa muito bem a otimização do tempo de execução, mas ainda assim .... não é correto confiar em um compilador inteligente - uma chamada de função desnecessária não é a melhor solução,

imho, esta é a única maneira

o primeiro laço - busca em ordem decrescente dos índices da matriz

o laço inferior - uma busca em ordem ascendente dos índices da matriz

Uma função não é como uma função. E talvez o tamanho de uma matriz não seja um bom exemplo, porque é igual a uma variável em termos de uso de memória e acesso a ela. Na verdade, é uma variável em uma célula de memória, que foi preenchida quando a matriz foi declarada. Mas o máximo ou mínimo de um array, ou apenas calculando em uma condição de loop de 10 variáveis, você não deve. É melhor calcular e substituir primeiro.

E até onde entendo, elementos de matriz, elementos de estrutura são variáveis com endereços específicos na memória, e é apenas uma questão de conveniência de escrita, A[10] e 10 variáveis A1 A2 ... A10 são os mesmos em acesso e tamanho. O tipo é, naturalmente, o mesmo)

 
Valeriy Yastremskiy:

E até onde entendo, elementos de matriz, elementos de estrutura são variáveis com endereços específicos na memória e é apenas uma conveniência de escrever, A[10] e 10 variáveis A1 A2 ... A10 são os mesmos em acesso e tamanho. O tipo de curso é o mesmo)

se fisicamente no comando CPU, não

uma matriz é uma área de memória, o acesso aos itens da matriz é o cálculo do índice de itens desde o início desta área de memória e a extração de dados (bytes) de acordo com o tipo armazenado


se esta é a lógica do algoritmo, então sim - estas são variáveis indexáveis

em geral, sobre o problema em estudo, o único conselho correto é verificar os parâmetros de entrada. Salvar - empurrar os dados para fora da pilha. Salvar registros. Restauração de registros. Chamada de função - chamar, depois retornar. O que quero dizer é que muita coisa pode estar acontecendo em segundo plano e não podemos vê-la. É por isso que é melhor usar para (int i=0; i<size; i++) e não depender do compilador para fazer o que esperamos que ele faça.

 
Igor Makanu:

se fisicamente no comando CPU, não

uma matriz é uma área de memória, o acesso aos elementos da matriz é calcular um índice de um elemento desde o início desta área de memória e recuperar dados (bytes) de acordo com o tipo armazenado


se esta é a lógica do algoritmo, então sim, elas são variáveis indexáveis.

em geral, sobre o problema em estudo, o único conselho correto é https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

Concordo com isso, o compilador é uma caixa preta, portanto não se pode assumir com certeza.

O principal é que tudo concebido funciona como pretendido)))

Razão: