向#define专家提问 - 页 10

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

来吧。首先是定义,然后是可执行文件,然后是可执行文件的执行。

我知道了。所以,定义只加快了大项目 的构建,而没有加快可执行代码的执行。

一般来说,为了自我教育,我对硬件层面上代码的最大可能实现感兴趣,就执行速度而言。
什么架构或领域并不重要。
我知道有一些语言是完全在内存中运行的,这可能是最快的解决方案。
 
Roman:

我知道了。因此,定义只加快了构建大型项目的速度,但没有加快可执行文件中的代码执行。

一般来说,为了自我教育,我对硬件层面上代码的最大可能执行速度感兴趣。
哪个架构或领域并不重要。
我知道有一些语言是完全在内存中运行的,这可能是最快的解决方案。

定义根本不提供加速度。也许在定义质数时有一个小的例外,比如#define FIVE 5。

定义是为了使代码更易读,更容易修改。就这样了。这就完成了它的功能。

 
我想知道用什么语言来写ISS或医疗设备。
微控制器和驱动器是用C语言或汇编语言编写的。
还有什么其他选择?有人研究过Q吗?
 

IMHO编程阶段))。

1 - 我什么都不懂

2 - 我理解程序化风格(它甚至不是一个功能性的,只是一点代码)。

3-我认为我可以在功能风格上写出我喜欢的一切)

4 - 我明白,我不了解OOP。

5 - 了解OOP

6 - 仍旧理解OOP的严重性

7 - 我可以在OOP中想出任何树结的组合,并根据我的口味将其全部粉碎,并在缺陷中加入盐。

8 -所有这些编程,但有严格的按类型访问等

9 - 明白7点是邪恶的(黑暗面),有一个文明的OOD世界(模板)。

10 - 从那些我认为很酷的程序员那里越来越多地听到 "OOP是邪恶的",也就是说,有一个民用的使用方法,如果所有的直接在民用上做,原来一切的需求并不是那么大,是的,它是常规的,但应用的代码编写速度有时比我高:(

11 - 我理解现代函数式语言在某些阶段模仿了OOP,所有这些函数的扩展,换句话说,我开始理解函数式编程方法(第3点)。

总的来说,我认为从语言的语法 上没有太大的区别,原则不会改变,有严格的语言,也有不严格的语言。用不严格的语言进行编码是很难的。而C++ C# R Q Q GO JS Ruby的差别很小。

低级别的速度更快(自己写一段非常快的代码是很现实的,比标准快,但是为什么呢)--比如说写一个比标准快的排序很容易,但是及时排序的本质不是速度)))而是最少的动作数,最少的动作数不一定是最快的方法,但是它非常好。

关于微处理器 - 嗯,这通常是你开始学习的地方。虽然语言的本质并不那么重要。高层的允许你对大的代码片段进行操作,而低层的则更通用。

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
不,不,不。没有OOP ))
OOP是对过程语言的一种包装。
那是一种程序性语言的 延伸,但有自己的范式。
我个人认为,OOP是对已经是高级语言的一种垃圾处理 ))
以上所有语言都是高级语言,除了Q
你一定是想错了一个Q。Q是K语言的扩展
Q语言实现了KDB+数据库

Kdb+,来自 Kx,是

  • 高性能跨平台柱状历史时间序列数据库
  • 内存中的计算引擎
  • 实时线程处理器
  • 抒发式查询和一种称为q的编程语言

那里有一个非常不同的范式,不是类似于C的范式。我认为那里有矢量逻辑。
但我认为,即使是这个论坛上最有经验的程序员也没有听说过这种语言))。


w

 

0.0时,q的演变

Arthur Whitney开发了q编程语言及其数据库kdb+。由Kx Systems, Inc.发布。2003,q的主要设计目标是表达能力、速度和效率。
,它并没有接近于与它们相匹配。设计上的权衡是简洁,这可能会使来自冗长的传统数据库编程环境--
,如C++、Java、C#或Python--和关系型DBMS的程序员感到困惑。 q编程之神陶醉于类似于ASCII内核转储的程序时,本指南是为我们所有人准备的。

Q是 APL (编程语言)演变而来, APL 最早是 哈佛大学 Kenneth Iverson 在20世纪50年代发明的一种数学符号。
APL是由IBM在20世纪60年代推出的一种矢量编程语言,这意味着它在一个操作中处理一个数字列表。
它在金融和其他需要大量紧缩的行业中是成功的。

线粒体DNA的q痕迹从APL到A A+ 到k,它们都已经很好地适应了在向量上快速执行复杂的计算。
q / kdb+的新之处在于,它以关系模式非常有效地处理大量的时间序列数据。
它的语法允许你使用类似于SQL 92的 "选择 "表达式,它的内置函数集合提供了一个完整和强大的存储过程语言。

在基因q中也有一些悄悄话 基本数据结构q是一个列表。虽然名称和术语不同,但这些符号都来自于模式中的对应符号。

APL q的血统也显示了函数式编程的影响。
在他1977年介绍纯函数式编程的图灵奖演讲中 Backus 承认来自APL的灵感。
虽然q不是纯函数式的,但它是强函数式的,因为即使它的基本数据结构,即列表和字典,也被当作数学映射来处理。

0.1哲学

一个熟练的q开发人员的思维方式与传统的编程环境(如C++、Java、C#或Python)不同,因此被称为 "传统编程"。-
为了让你进入正确的心态,我们将总结一些初学者q的潜在不连续情况--以后称为qbie。

让我们回顾一下传统数据库编程中的一些数据问题。

  • 记忆中的表征--如对象的集合--必须被映射到另一个表征--如表--才能持久。
    为了获得适当的对象-关系匹配,需要付出相当大的努力。
  • 对象必须被映射到另一种表示方法中进行传输,通常是一些二进制或XML形式,以平滑参考链。
  • 数据操作--例如对大型数据集的选择、分组和聚合,最好在数据库服务器的存储过程中完成。
    复杂的数值计算最好与应用服务器上的数据库分开进行。
  • 转换数据以显示图形界面最好在一个单独的层面上进行--例如浏览器中的HTML5和JavaScript。

大多数传统的编程设计都花在了正确地获取不同的视图上,需要很多行代码来调集资源和同步不同的视图。
它们在q / kdb+中出奇地简单。

可解释的 Q 是解释的,而不是编译的。在运行时,数据和函数都在内存的工作区。
开发周期的迭代通常是快速的,因为测试和调试所需的所有运行时信息都可以立即在工作区获得。
Q程序以简单的文本文件形式存储和执行,称为脚本。解释器的评估 解析例程是可用的,因此你可以以可控的方式动态地生成代码。

类型 Q是 一种动态类型的语言,类型检查大多是不显眼的。
每个变量都有一个其当前分配值的类型,对于大多数数字操作来说,类型推广会自动发生。对同质列表的操作要检查类型。

当q从左到右输入时,表达式从右到左被 评估 ,或者按照q神的喜好,从左到右--这意味着函数被应用于其右边的参数。
没有运算符优先级,函数应用可以不用括号写。标点符号的噪音大大减少。

经典SQL中的 Null和Infinity值 是NULL,代表任何类型字段的缺失数据,不占用存储空间。
在q中,空值是类型化的,与非空值占据相同的空间。数值类型也有无限的值。
无限值和空值可以参与算术和其他运算,并有(大部分)可预测的结果。

集成的I/O 是使用功能描述符进行的,这些描述符就像通往外部世界的窗口。
一旦这样的描述符被初始化,向描述符传递一个值就是一个写。

该表是面向 拒绝项目的,你谁进入这里。 传统语言不同,你不会在q中找到类、对象、继承或虚拟方法。
相反,Q将表作为第一类对象。物品的缺乏并不像乍看之下那么糟糕。
对象本质上是美化了的记录(即具有命名字段的实体),它由q字典建模。一个表可以被认为是一个记录字典的列表。

排列式列表 ,因为经典的SQL是一个没有重复的集合代数,行序和列序都没有定义,
,这使得时间序列的处理变得繁琐和缓慢。 q 数据结构是基于有序的列表,所以时间序列保持着创建时的顺序。
此外,简单的列表占用了连续的存储空间,所以处理大型数据的速度很快。非常快。

面向列的SQL表被组织成分布在资源库中的行,操作被应用于行中的字段。Q 表是连续存储的列的列表,操作适用于所有列。

内存 数据库 可以被认为是kdb+是一个具有持续支持的内存数据库。由于数据处理是用q完成的,所以没有单独的存储过程语言。
事实上,kdb+包含写入文件系统然后映射到内存的q列的序列化列表。

 

少女买小猪(众望所归)

我陷入了这场讨论,我没有和平))

我又测试了一些变体,MQL5的运行时优化表现非常好,但还是....依靠智能编译器是不对的--不必要的函数调用并不是最好的解决办法。

我认为,这是唯一的办法

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
}

第一个循环--按照数组索引的 降序进行搜索

下层循环--按照索引的升序进行搜索

 
Igor Makanu:

少女买小猪(众望所归)

我陷入了这场讨论,我没有和平))

我又测试了一些变体,MQL5的运行时优化表现非常好,但还是....依靠智能编译器是不对的--不必要的函数调用并不是最好的解决办法。

我认为,这是唯一的办法

第一个循环--按照数组索引的 降序进行搜索

下层循环--按照数组索引的升序进行搜索

一个函数不象一个函数。而且,也许数组的大小不是一个好的例子,因为就内存的使用和访问而言,它相当于一个变量。 事实上,它是内存单元中的一个变量,当数组被声明时,它就被填满了。但是,从数组中获取最大或最小值,或者只是在10个变量的循环条件下进行计算,你就不应该这样做。最好是先计算和替代。

而据我了解,数组元素、结构元素是内存中具有特定地址的变量,只需写上方便,A[10]和10个变量A1 A2 ...A10在访问和尺寸上都是一样的。类型当然是一样的)

 
Valeriy Yastremskiy:

而据我了解,数组元素、结构元素是内存中具有特定地址的变量,只是为了方便书写,A[10]和10个变量A1 A2 ...A10在访问和尺寸上都是一样的。课程的类型是一样的)

如果物理上在CPU命令中,没有

阵列是一个存储区域,对阵列项目的访问是指从该存储区域的开始计算项目索引,并根据存储类型提取数据(字节)。


如果这是算法的逻辑,那么是的--这些是可索引变量。

一般来说,在所研究的问题上,唯一正确的建议是检查输入参数。保存 - 将数据推离堆栈。保存登记簿。复原登记册。函数调用 - 调用,然后返回。我的意思是,很多事情可能在后台发生,而我们看不到。这就是为什么最好使用for (int i=0; i<size; i++),而不是依赖编译器来做我们期望它做的事。

 
Igor Makanu:

如果物理上在CPU命令中,没有

阵列是一个存储区域,对阵列元素的访问是从这个存储区域的开始计算一个元素的索引,并根据存储类型检索数据(字节)。


如果这是算法的逻辑,那么是的,它们是可索引变量。

一般来说,在所研究的问题上,唯一正确的建议是https://www.mql5.com/ru/forum/354662/page4#comment_19039624。

我同意这一点,编译器是一个黑盒子,所以你不能肯定地假设。

最主要的是,所设想的一切都按计划进行))))。