可靠的语言编程-新手评论。 第一部分

我又花了两天时间只编写和调试四百行系统库代码,但这个想法浮出水面:“如果程序以更轻松的方式编写,那似乎很好”。

首先,由于调试要比编写代码花费更多的时间-在编写阶段,您需要保护免受傻瓜(包括您自己)的影响。 我想从使用的编程语言(YP)中获得它。

当然,我们需要发明一种新的,最好的YaP!
不,首先,我们将尝试表达我们的愿望,并看看我们已经发明了什么。

因此,我希望收到:

  • 抵抗人为错误,消除编译过程中的歧义
  • 输入电阻
  • 抵抗程序或数据损坏的能力-媒体故障,黑客攻击
  • 同时,每个人都有或多或少可以容忍的语法和功能

应用领域是机械,运输,工业控制系统,物联网,包括电话在内。

对于Web来说几乎没有必要,它是基于“退出并重新启动”(即失而复得)的原理(目前)构建的。

很快,您可以得出一个结论,即必须对语言进行编译(至少是Pi编译),以便在没有VS的情况下最大程度地执行所有检查,而VS(以下称为“否定反对派”)“哦,这个对象没有这样的属性”在运行时。 甚至接口描述的脚本也已经使其必须通过测试完全覆盖此类脚本。

就我个人而言,我不想花我的资源(包括花钱购买更快,更昂贵的硬件)来进行解释,因此,建议您使用最少的JIT编译。

因此,要求。

人为容错


认真浏览了PVS-Studio的Talmuds之后,我发现最常见的错误是错别字和未纠正的复制粘贴。

我还将根据自己的经历添加一些事件,并在各种文献中遇到,作为负面的例子。 此外,更新了内存中的MISRA C规则。

经过一番思考后,我得出的结论是,实际应用的短绒棉布存在“幸存者的错误”,因为在旧项目中,已经修复了严重的错误。

a)摆脱相似的名字

-必须对变量和函数的可见性进行严格检查。 密封后,您可以使用更广泛范围的标识符,而不是所需的标识符
-使用不区分大小写的名称。 (VS)“让我们仅在Camelcase中将函数作为变量调用”,然后与某些东西进行比较-在C中可以做到这一点(我们获得了函数的地址,这是一个很大的数字)
-名称相差1个字母应该引起警告(可以在IDE中突出显示),但是一个非常常见的复制粘贴错误.x,.y,.w,.h。
-我们不允许以相同的方式命名不同的实体-如果存在具有该名称的常量,则不应有相同名称或类型名称的变量
-非常希望检查所有项目模块的命名-容易混淆,尤其是当不同的人编写不同的模块时

b)一旦提到-必须具有模块化并且最好是分层的-一个目录中有12,000个文件的VS项目是一个搜索地狱。
仍然需要模块化来描述一个项目的不同部分(模块,程序)之间的数据交换结构。 VS我遇到了一个错误,原因是接收器和发送器的交换结构中的数字对齐方式不同。

-排除重复链接(布局)的可能性。

c)歧义
-必须有特定的函数调用顺序。 当编写X = funcA()+ fB()或Fn(funcA(),fB(),callC())时-您需要了解这个人期望以书面顺序(VS)接收计算,而不是像优化程序那样思考。
-排除类似的运营商。 而且不像在C:+ ++,<<<,| ||,&&&,= ==
-建议有一些易于理解的运算符,并且具有明显的优先级。 您好,三元运算符。
-压倒运营商是非常有害的。 您输入i:= 2,但是(VS)实际上会隐式创建一个对象,该对象没有足够的内存,并且交换时磁盘崩溃,卫星崩溃到火星:-(

实际上,从个人经验来看,我在ConnectionString =“ DSN”行上观察到崩溃,事实证明是打开数据库的安装员(服务器在网络上不可见)。

-我们需要使用默认值初始化所有变量。
-而且,OOP方法避免了健忘,从而以某种新的百分之一的功能重新分配了对象中所有字段的位置。
-类型系统必须是安全的-您需要控制分配的对象的尺寸-防止内存覆盖,65535 + 1类型的算术溢出,强制转换时丧失准确性和重要性,不包括无与伦比的比较-因为整数2在通常情况下不等于2.0。

甚至是典型的除以0都可以得到非常确定的+ INF,而不是错误,需要对结果进行精确定义。

输入电阻


-程序应在任何输入数据上工作,最好是在大约同一时间。 (VS)您好,Android对听筒按钮的反应从0.2s改为5s; 最好不要用Android驱动汽车ABS。

例如,程序应正确处理1Kb的数据和1TB的数据,而不会耗尽系统的资源。

-非常需要在RAII中进行可靠且明确的错误处理,而不会导致副作用(例如资源泄漏)。 (VS)一个很有趣的事情是手柄的泄漏,这种泄漏可能会在几个月后显现出来。
-保护自己免受堆栈溢出的影响很好-禁用递归。
-由于所需的内存超出可用卷的问题,由于动态分配/重新分配过程中的碎片,消耗的增长不受控制。 如果该语言具有依赖于堆的运行时,则情况很可能是不好的-Hello STL和Phobos。 (VS)有一个故事,说微软的C时间很旧,它没有将内存返回给系统,这是因为msbackup在那个时间内大容量崩溃了。
-我们需要使用字符串进行良好而安全的工作-不受资源的限制。 它高度依赖于实现(不可变,COW,R / W数组)
-超过系统反应时间,独立于程序员。 这是一个典型的垃圾收集器问题。 尽管它们避免了某些编程错误,但其他诊断却带来了错误的诊断。
-在某类任务中,事实证明您完全可以不使用动态内存,也可以在启动时选择一次。
-要控制超出数组边界的退出,编写运行时警告并忽略它是完全可以接受的。 通常,这些都是非严重错误。
-防止访问未由程序初始化的存储区,包括对空区域的访问,以及对他人地址空间的访问。
-解释器,JIT-额外的层降低了可靠性,垃圾回收存在问题(一个非常复杂的子系统-它会出错),并且保证了响应时间。 我们将其排除在外,但是原则上存在Java Micro Edition(与Java 截然不同 ,只有我保留了), dernasherbrezon撰写一篇有趣的文章 (对不起,开枪)和带有C#的.NET Micro Framework。

但是,经考虑,这些选项已消失:

  • 事实证明.NET Micro是一个普通的解释器(速度不一);
  • Java Micro仅适用于嵌入式应用程序,因为它过于受API的限制,因此您必须至少切换到SE Embedded进行开发(已关闭)或普通Java,因为Java太怪异且无法预测。
    但是,仍然有很多选择 ,尽管对于可行的基础来说这似乎不是空白,但可以将其与其他语言进行比较,甚至是过时的语言或存在某些缺点。


-抵抗多线程工作-保护流的私有数据,以及确保流之间交换的机制。 具有200个线程的程序可能根本无法像两个线程一样工作。
-合同编程加上内置的单元测试也有助于安眠。

抵抗程序或数据损坏的能力-媒体故障,黑客攻击


-程序必须完全加载到内存中-不能加载模块,尤其是远程加载模块。
-释放后清除内存(而不仅仅是分配)
-监视堆栈溢出,可变区域,尤其是字符串。
-发生故障后重新启动。

顺便说一下,这种方法在运行时具有自己的日志记录时,不仅显示了北极狐和stackrace,还给我留下了深刻的印象。

语言-合规性


乍一看,为了进行分析,我们采用了专门设计的安全PL:

  1. 活性欧伯龙
  2. 艾达
  3. BetterC(dlang子集)
  4. IEC 61131-3 ST
  5. 保险箱

并按照上述条件仔细研究它们。

但是,如果业力允许,这已经是续篇的内容。

鉴于表中突出显示了上述因素,那么从评论中可能会得出其他明智的结论。

至于其他有趣的语言-C ++,Crystal,Go,Delphi,Nim,Red,Rust,Zig(添加口味),那么我将其留给那些希望填写对应表的人。

免责声明:

  • 原则上,如果某个程序(例如Python)占用30 MB内存,并且反应要求是几秒钟,并且微型计算机具有600 MB的可用内存和600 MHz的百分比,那为什么不呢? 只有这样的程序才能以一定的概率(尽管达到96%)可靠,再也没有。
  • 另外,该语言应尽量方便程序员使用-否则没人会使用它。 这样的文章“我想出了一种理想的编程语言,因此对我来说只是方便编写”在哈布雷市也很常见,但这是关于其他方面的内容。

Source: https://habr.com/ru/post/zh-CN437830/


All Articles