编程本质是什么?其实就是说话。要想让非程序员实现无代码编程,必须要理解下人类语言的本质。语言是人类思维的外部体现,程序也是语言,也是编程思维的物化表现。人类表达思维最有效的途径就是语言。今天重点说说编程和词汇的关系。
我们成天说话都在说什么?无外乎词汇和语法。
词汇分成名词,动词,形容词和副词。
名词分为普通名词和专有名词。普通名词例如“教师”、“杯子”,其实就是我们面向对象编程中的Class,叫做类别或者分类。专有名词例如“北京”,我们在编程中一般处理成“值对象”和数据字典。
动词中的不及物动词一般描述了名词的变化形态,可以作为面向对象编程分类中的函数或者方法。
动词中及物动词实际是描述名词之间的关系,这种就不要作为编程中的方法了,而是要单独处理为编程名词对象之间的关系。对于不同的及物动词,可以在编程中处理成不同的关系。
在编程中,形容词一般是名词的属性,副词可以作为动词的属性。
你可以想一下老师,学生,课程是如何通过语言建立关系的,在实际编程中,他们也是这样关联起来的。
面向对象小知识 软件架构师必读:面向对象编程思想(OOP)的由来与本质
#程序##数字化##程序员#
人工智能系列课程第57讲之生成器 #编程 #人工智能 #python #知识分享 #函数
畅游Python人工智能系列课程第57讲之生成器 #编程 #人工智能 #python
12:37什么是西门子博途的通用函数库?
通用函数库,英文名称:Library of General Functions,简写为LGF,它是西门子官方推出的用于博途环境下PLC编程的函数库。这个函数库提供了很多实用的函数,分成九个类别,包括:
1、位逻辑函数;
2、日期/定时器函数
3、计数器函数;
4、比较函数;
5、数学函数;
6、数据处理函数;
7、转换函数;
8、信号发生函数;
9、工艺处理函数;
通用函数库是博途系统库的延伸,跟随博途版本更新。比如目前(2021年)最新的是LGF v16。通用函数库可以免费下载,并且没有使用次数限制,是博途环境下编程开发的利器。
LGF函数库的下载地址如下:
网页链接
#PLC##电气自动化##电气工程#
编程的“大道”是什么?#编程#
初学者往往对函数处理数据是否有side-effect搞得晕头转向。什么pure-function, impure-function,又是什么inplace-mutate,或者非 inplace-mutate.
于是,不得不死记硬背很多东西,比如机械记忆 array.sort, array.reverse 将会直接修改原数组,而array.map, array.reduce则会复制新建数组。
深入学习的过程中更是充满疑惑,比如既然有了array.forEach,那有为什么多此一举又提供一个arry.map呢?而你只能看到似是而非的解释,比如forEach用在有side-effect的情景。
然而,看到这个有side-effect,那个没有side-effect,不仅完全享受不到思维的乐趣,更会对编程战战兢兢。
幸运的是,解决以上的问题,只须一句话,编程后面的“天道”,后面的“大道”是 FP(Functional Programming)#函数式编程#
逻辑函数
如和,或,不,以及这些东西的组合。
例如,NOT操作通过将所有的1都更改为0,0也会更改为1来影响累加器。
其他的逻辑功能则通过使用累加器的内容和某些内存位置来执行。
累加器的所有八位都受到影响,并且同时进行了更改。
如下图所示,与和操作需要两个输入。
一个输入是累加器的内容,另一个输入是存储器位置的内容;因此,8个累加器位与8个存储器位相匹配。
AND操作是逐位执行的。
例如,累加器的位0位(最右边的位)与内存位置的位0相连,位1位1位,2位位2位,以此类推。
换句话说,AND操作就像8个AND门与一个输入连接到累加器中的一个比特,并与另一个输入连接到存储器位置中的一个比特(在相同的位置)一样被执行。
得到的AND输出被存储回相应位位置的累加器中。
OR逻辑函数以与AND完全相同的方式执行,只是如果信号a或信号B是1,或者两者都是1(即使用OR逻辑),则在输出处产生1。
将与门输入切换到每个位位置,而是使用一种特殊类型的顺序逻辑操作,即移位,将位移动到与门输入。
移位操作使蓄能器中的每一位向右或向左移动一个位位置。
它可以是所谓的一个合乎逻辑的转变,也可以是一个循环的转变。
下图还显示了四种类型的位移方式(逻辑、循环、右、左)及其对累加器的影响。
在左移位中,位7(最左边的位)移到CC寄存器的携带位,6位移到位7,以此类推,直到每个位向左移一次为止。
位0(最右边的位)可以用携带位或零替换,这取决于所执行的移位类型。
根据微处理器的不同,可以转移其他寄存器和累加器。
编程和功能
程序员的任务是选择指令并组织它们,使计算机执行所需的任务。
要编程AND函数,其中一条指令是AND,表示“具有特定内存位置内容的累加器”,如下图所示。
由于AND会影响累加器和内存,所以这些值必须放入要进行ANDed的累加器中。
这需要负载累加器指令,LDA。
程序员必须首先知道数字缓冲区接口所占据的内存位置。
这个位置被识别出来,程序员在汇编程序中编写指令,这样缓冲区内存位置将被标签或名称座位引用。
座位比缓冲区的地址更容易记住和写入。
该程序的操作方式如下。
累加器上加载了内存位置SEAT的内容。
注意,在下图中,两个数字逻辑输入信号A和B,分别被门控为占用标记为存储器位置SEAT的缓冲器的0位和1位。
当有人坐在驾驶座上时,0位很高。
当系好驾驶员安全带时,第1位较高。
只有这两个位被放在一起;另外六个将被忽略。
但是有一个问题,因为两个位在相同的8位字节中,并且在同一个字节中没有一个位的指令。
然而,通过使用掩码可以有效地分离这两个位。
掩蔽是一种只允许选定的位参与所需操作的技术。
由于缓冲区内容已经被加载到累加器中,因此只有位0和位1具有意义,而这两位是唯一要保留在累加器中的重要位。
为此,累加器带有一个常量,除了要保存的位位置外,每个位位置都有一个零。
第2行中的二进制常数来选择位0,并在执行和指令时将所有其他位设置为0。
ANDing过程被称为掩蔽,因为在累加器上放置了一个掩蔽,只允许第0位通过不变。
如果位0是逻辑1,那么它在掩蔽后仍然是逻辑1。
如果位0是逻辑0,则它仍然是逻辑0。
累加器中的所有其他位现在都包含关于位0的正确位信息。
换档和换档
在我们的示例程序中,累加器仍然没有准备好执行最终的和操作。
请记住,SEAT包含缓冲器的内容以及信号A和信号B的条件。
累加器的内容必须与SEAT串联,以便将信号A和B串联在一起。
信号A的副本保存在0位的累加器中,但它在错误的位位置,信号B在1位的位置。
因此,信号A必须被移到位1的位置,为了做到这一点,使用了逻辑左移指令。
对于累加器的第1位中的信号A和SEAT的第位1中的信号B,可以对这两个位执行and操作。
如果A和B都为高,则and操作将使蓄能器的位1为高(1)。
如果其中一个较低,则累加器的第1位将较低(0)。
发个帖子,讲个BlockChain,Ergo Platform.
Ergo采用的模型叫做eUTXO,什么是eUTXO呢?和BTC里使用的UTXO很像,我们通常把UTXO翻译成币箱,或者理解成你钱包里的一张张5元,10元的钞票,当你要买15元的东西的时候,就需要使用这两个分别代表5元和10元的UTXO币箱。对Ergo而言,eUTXO把币箱的概念扩展了,可以认为Ergo的eUTXO模型就是数据集(data collection)和保护脚本(guarding script)的集合。保护脚本确保了只有符合特定条件的账号才能使用或者花费(spend)这个扩展币箱。基于这种模型设计,Ergo首先支持了智能合约和nft,而且更加安全可靠,再也不存在在使用dex时需要授权(approve)的风险,并且这种模型和编程里的函数式编程的概念暗合,天然支持高并发,tps的瓶颈将只存在于带宽和p2p通信的瓶颈,链上只对扩展币箱的花费条件做核验,而不对合约的具体执行过程做重放,合约的具体计算是由交易的发起人提前在链下计算好,而只把验证计算结果正确性的证据放到链上即可,大大降低链上计算的复杂性,好比合约在链下计算的是96÷3=32,链上只需要计算32×3=96,因为在计算机里,除法比乘法难算。除此之外,Ergo还有很多非常有远见的设计,比如币箱的存储费,超级区块等概念,无法一一细细讲解,感兴趣的可以去阅读官网提供的各类文档。特别需要提到的,就是Ergo的保护脚本语言,Ergoscript,这是它有别于Cardano和Nervos的地方,Ergoscript很灵活也很保守,不支持循环和跳转,但是你能用到的场景它都有考虑到,比如原生多签,环形签名,各种复杂的验证逻辑等,非常有前瞻性的设计。而且Ergo和BTC一样,永不增发,数量恒定,永远PoW,永远挺GPU miner,并且没有预挖,社区领导人Alex Ch一看就是个geek,说话逻辑不清,英语不太好,毕竟俄罗斯人,但是写代码审代码超一流,可能这也是Ergo不火的原因吧,嘴炮不厉害。不过现在社区有专职的嘴炮了,可以让Alex Ch只负责写代码审代码和露脸,剩下的交给营销团队。再说说生态,扩展币箱eUTXO原生支持nft,所以生态里nft贼多,发新币也是小case,dex嘛,目前就ErgoDEX最好用,项目质量非常高,UI也清爽,跨链桥进度慢点,叫做RosenBridge,罗森桥,知道点天体物理的人大概知道为啥取这个名字,和Wormhole虫洞有点接近,这个RosenBridge最大的特点就是去中心化,目标链的开发量小。此外还有ErgoPad,做launchpad的,还有Sigmaverse,卖土地的,还有Ergogames,做链游的,等等。
不错的教学
艾编程 艾编程官方账号15 种 JavaScript 速记技巧。强大且广受欢迎的编程语言 JavaScript 具有庞大的内置函数库,可用于执行各种任务。 本文涵盖了每个开发人员都应该知道的 15 个 JavaScript 特性。无论您是新手还是经验丰富的开发人员,这些功能都会派上用场。 那么,让我们来讨论一下这 15 个重要的 JavaScript 特性。 1.重复一个字符串; 2.数组的组合; 3.函数接受的参数; 4. JavaScript 中的循环; 5. 字符串转数组; 6. 数组中的最大值和最小值; 7.将字符串转换为数字; 8. 为多个变量赋值; 9.指数幂; 10.双位非运算符(~~); 11.函数参数的默认值; 12. 三元运算符 13.交换两个变量 14.检查多个条件 15. 删除属性 如果你正在学习JavaScript,如果你正在学习JS或者已经在我们的三十天计划中完成了4个综合项目实战,那不妨可以听下这个课程体系,三十天计划群里还提供了算法、数组等知识体系! 更多完整JavaScript课程体系在我们的系统班你有完整的呈现,包含了JavaScript基础篇、重点、算法、原理、面试题、实战案例讲解!同时也为你提供了前端高级工程师成长体系!(详细看下图内容) 如果需要深度学习的同学可以练习助理老师了解详细的课程以及课程的报名方式!(不定期会推出活动,有大额优惠券推出,活动详情联系助理老师了解即可!)如果你才开始学习前端,那么可以先学习我们的三十天计划(零基础的同学报名系统班同学可以和老师沟通制定学习计划,可以得到更快的成长!)#程序员 #JavaScript #跟着抖音学前端 #前端 #编程入门
你以为编程语言自己封装的函数有什么高明之处吗?其实不然!有时候编程语言自己封装的函数我看了源码之后都感觉有点敷衍!
比如说,我在使用CSharp写一段代码的时候遇到了一个需求,就是要比较获取两个数组之间不相等的部分。如果要我自己做,我可能就做两个循环,然后逐个比对两个数组之间的每一个元素。
但是,我感觉我的想法可能有点太Low了,于是我就想到了CSharp自带的两个函数,分别是IEnumerable.Intersect()和IEnumerable.Except()。前者是获取两个数组之间的共同部分,后者是获取A数组与B数组之间差异的部分。
但是,我感觉这两个函数用起来好像并不是太效率,于是,我就去看了下这两个函数的源码,最后得出一个结论:
IEnumerable.Intersect()的比对方式是先将A数组先转换成一个元素不可重复的数组(看不到源码,只是估计),然后使用A数组依次移除B数组里面的元素,如果移除成功了,就代表B数组的该元素是包含在A数组之内的。
IEnumerable.Except()的比对方式和IEnumerable.Intersect()恰恰相反,它是先将A数组先转换成一个元素不可重复的数组(看不到源码,只是估计),然后将B数组的元素插入这个不可重复的数组,如果插入成功了,则代表该元素是A和B之间的差异值!
但是,虽然源码看起来是高大上很多了,但是我却一点也不觉得这么处理有比我两层循环处理要效率!因为相比两层循环比对数组内容,使用Intersect和Except都需要经历一次数组转换(转换成元素不可重复的数组)、调用Remove函数或Add函数。
其中,Remove元素的函数我也看了源码,其实就是循环数组的每一个元素,如果遇到相等的元素,就将该元素移除出数组。Add元素的函数我看不到源码,但是考虑到Remove和Add函数都是操作不可重复数组的,因此,估计Add也是一样的,会先循环数组内容,如果查不到就插入。
如此一来,我觉得虽然函数让我的代码变简洁了,但是其实从效率上讲还不如我写两层循环来的快!
所以,“一行代码帮你搞定”这种话看似很霸气,但是,也要看它背后实现的逻辑是什么样的!
#程序员# #编程# #编程语言#
C语言字符串函数讲解
#知识分享# #大数据# #编程# #C语言#