自制组态软件(64)lua编译器之关键字or
本文将讲解关键字"or"在lua编译器中的应用。"or"是源码自制一个二元运算符,其逻辑规则为:当左侧值(a)为真时,源码自制返回a;当a为假时,源码自制返回b。源码自制小优传奇源码在lua中,源码自制除了null和false为假,源码自制其他值如0都被视为真。源码自制为了支持or运算,源码自制我们需对表达式解析函数parseExp进行调整,源码自制确保左侧表达式的源码自制优先级高于右侧。
实现词法分析后,源码自制我们在parseExp中实现了对or表达式的源码自制解析。接下来,源码自制处理binOpExp部分,首先计算左侧表达式的值。若左侧值为假,则计算右侧表达式的值,并执行move指令;若左侧值为真,婚庆大气网站源码则跳转至move指令的下一条语句。在emitTestSet函数中,我们支持了OP_TESTSET虚拟机指令。如果右侧表达式(b)为真,则将b的值复制至a对应的寄存器;若b为假,则跳过jmp语句。
在lua中,只有null和false视为假值。为了支持lua文件中的true、false、nil关键字,我们需在表达式解析阶段处理这些关键字。现有访问表达式的处理逻辑上,我们将添加对true、false、nil的处理。具体实现如下:
本文结束,通过本篇介绍,希望读者对lua编译器中的c udp 点对点源码关键字"or"及其应用有了一定的了解。项目源代码可访问GitHub仓库:GitHub - zhzhz/iscada
小白自制Linux开发板 :Linux内核与文件系统移植
Linux内核
若要移植F1CS/F1CS至Linux,可直接利用官方源码对licheepi nano的支援。首先,访问kernel.org下载最新长支版本内核源码(建议使用5..),若使用特定版本,如5.7.1,则可直接下载对应链接。解压后,将内核源码复制至Ubuntu虚拟机。
配置编译
在Linux内核代码中找到Makefile文件,修改ARCH和CROSS_COMPILE配置为Arm,使用编译工具交叉编译。完成内核配置后,下载licheepi_nano的配置文件,放置于arch/arm/configs目录下。使用图形化配置界面完成内核与开发板soc的对应配置。
配置TF卡设备树信息
在arch/arm/boot/dts目录下修改suniv-f1cs.dtsi和suniv-f1cs-licheepi-nano.dts文件,添加相应的头文件与配置选项。确保内核编译成功,网站模版 源码之家生成zImage和dtb文件。
TF分区配置
通过Gparted软件分区,将TF卡分为两个分区,一个用于存放zImage、dtb文件,另一个用于根文件系统。格式化为fat和ext4,确保正确分配分区大小并保存配置。
内核复制与执行
将内核文件复制至TF卡的BOOT分区,插入开发板后,通过u-boot启动并自动进入内核启动环节。确保TF卡根文件系统正确挂载。
文件系统移植
使用Buildroot制作根文件系统,选择目标选项、编译选项、工具链与系统配置,确保文件系统兼容并能正常挂载。构建完成的根文件系统镜像解压至TF卡第二分区。
执行与升级
登录自制Linux系统,mfc封装库源码通过修改/etc/profile文件调整命令行显示。运行GPIO实验,利用Linux GPIO子系统实现LED灯的点灯功能,探索Linux内核的驱动实现。
总结
完成了Linux内核与文件系统的移植,从内核配置到文件系统挂载,再到驱动实验,逐步实现自制Linux开发板的操作系统。后续将升级硬件设备并进行更有意义的项目开发,期待你的进步。
自制编程语言,六个令你迷惑的问题
深入探讨自制编程语言和虚拟机,这个技术领域虽然看似复杂,却吸引了众多技术爱好者的关注。《自制编程语言》一书循序渐进地介绍了基础概念,包括编译原理的入门知识,作者的独特见解让读者受益匪浅。即使缺乏编译原理基础,也能踏上编程语言的创作之路,因为实践才是理解的关键。
编译型和脚本程序的区别在于它们的运行方式和目标。编译型程序生成的是二进制机器码,直接由硬件CPU执行,而脚本语言如JavaScript,是文本形式,通过解释器解析和执行。脚本代码看似按逻辑运行,实际是解释器动态解析和响应。
脚本语言的执行涉及解释器的两种类型,边解释边执行和先解析后执行。后者如PHP,通过解释器逐行解析和执行,而复杂的操作可能需要虚拟机来提升效率。虚拟机可以跨平台模拟,处理不同体系架构的指令。
脚本语言的慢速常常被误解为性能问题,但其实影响系统性能的关键在于IO操作,而非语言本身。尽管脚本语言解释器可能比IO设备慢,但其速度依然比IO快,所以在系统中不会成为主要瓶颈。
脚本语言的优势在于开发效率高,如Python的简洁语法,使得许多繁琐任务只需一行代码就能完成。编译器工作原理中,词法分析、语法分析和语义分析并非线性过程,而是并行进行,以提高效率。
最后,了解符号表和编译器的前后端设计对理解编程语言至关重要。符号表用于存储和索引程序中的符号,帮助生成统一的指令格式。编译器通过前后端处理,将源代码转化为中间代码和目标代码,实现跨平台和优化。
无论是自制编程语言的学习,还是理解操作系统,关键在于实践和理解底层原理。如果你对这些主题有兴趣,不妨选择《自制编程语言》或《操作系统真象还原》深入探索,亲手实践,感受技术的魅力。
用C语言撸了个DBProxy
在深入研究了大量源码后,我萌生了自制数据库代理(DBProxy,基于MySQL协议)的想法。该项目以C语言为主要开发语言,项目名称为Hero。选择C语言是基于我对C语言的深厚情缘和在学习Linux Kernel和MySQL源码后,希望重拾C语言的初衷。同时,纯C语言开发意味着需要自建基础工具,这符合当时的心境。
在开发过程中,我构建了一系列基础组件,如网络模型采用Reactor模式,包括多线程模型和epoll的水平触发机制。多线程模型简化了代码编写,epoll水平触发则避免了边缘触发需要的大量读取操作,提高效率。Reactor模型的构建包括accept处理和worker线程处理。
内存池的引入是为了优化内存管理,避免频繁的malloc和free操作带来的性能损耗。设计上,内存池允许批量分配和释放,简化了内存管理逻辑,减少内存碎片问题。此外,考虑到内存对齐,内存池使用特定大小进行分配以优化性能。
Hero DBProxy的核心原理是伪装成MySQL服务器,接收应用的SQL请求并转发到后端数据库。通过解析SQL,Hero能够动态调整连接状态,如事务控制,实现主从分离和分库分表操作,提高数据库性能和灵活性。
在性能对比测试中,Hero DBProxy在CPU和内存消耗方面展现出优势,但在TPS(每秒事务处理量)上并未显著提升。与成熟框架Netty相比,投入产出比似乎不如预期,但这并未减少我造轮子的成就感。
总结来说,造轮子的过程不仅考验了编程技巧和问题解决能力,更激发了深入理解和优化底层逻辑的热情。尽管实际应用中,成熟框架的性能通常优于自制轮子,但自制过程中的学习和探索价值不可忽视。对于那些追求技术深度和实现定制化需求的开发人员而言,自制轮子仍然是一条值得探索的路径。
èªå¶è¡¨ç½ä»£ç
追女å©æéè¦çæ¯ä»ä¹ï¼
ç¸è²å¹³å¹³ï¼è¿½å¥³çï¼éè¦çæ¯ä»ä¹ï¼æ¯åæï¼è®°å¾ä»¥åæè¿æ ·ä¸ä»¶äºï¼ç·çå欢ä¸ä¸ªå¥³å©ï¼åæ追äºå¤©ï¼å°ç¬¬å¤©çæ¶åï¼ç·å©æ²¡æååå¾å¸¸é£æ ·åºç°ï¼ä¹æ£æ¯è¿å¤©ï¼å¥³å©å¿éæ³ï¼å¦æä»å¤©è¿æ¥äºï¼æå°±ççä»ï¼å°±è¿æ ·ï¼éè¿å°æ¯éè¿ï¼å½ç¶å¨æç±ä¸ä¹ä¼æå¾å¤å ç´ ï¼å¦æ没æ让女çå追çèµæ¬ï¼
å¨è¿ä¸ªäººäººé½å¨ç§æ åçæ¶åï¼å为ç¨åºåæ们ä¹è¦æä½èµ·æ¥ï¼æ£åæ们çè·å°èï¼ä»å¤©å°±å¤§å®¶å¥ç®ä¸æ强表ç½ç¨åºï¼æ¤ç¨åºç»åæ°æ®æå + 微信èªå¨åæ¶æ¯ + å®æ¶ä»»å¡ï¼å®ç°ä¸ä¸ªè½æ¯å¤©èªå¨å®æ¶ç»ä½ å¿ç±ç ta åéï¼ä½ 们ç¸è¯ç¸æå¤©æ° + æ è¯ + æç±ä½ çå¾çãå ·ä½çæ¶æ¯å¦ä¸ã
æ¯å¤©è¦åéç»å¥¹çä¿¡æ¯å¦ä¸ï¼
è¿ééè¦å¡«åç第ä¸ä¸ªåæ®µæ¯ ta ç称å¼ï¼inLoveDays ä¸ºä½ ä»¬ç¸è¯ç¸æç天æ°ã
love_word æ¯æ¯å¤©ä¸º ta ç²¾å¿åå¤æ è¯å 容ï¼å½ç¶å¦æä½ çæç¬å¥½ä¹å¯ä»¥èªå·±å
æåä¹æ¯æéè¦çï¼æ¯å¤©ä¸å°½ç¸åãæç±ä½ ãçå¾çï¼
å®ç°æè·¯
æ¬æ¬¡ç¨åºè¿è¡çç¯å¢æ¯ windows + Python 3.6ï¼æ¤æ¬¡ä¸»è¦ç¨å°çåºæ seleniumãitchatãrequestãç¨åºä¸»è¦å为两é¨å第ä¸æ°æ®çæåï¼ä¸äºæ è¯ä¿¡æ¯åå¾çä¿¡æ¯ãå¦ä¸é¨å°±æ¯å©ç¨ itchat èªå¨åéæ¶æ¯ç»ä½ ç好åã
æ è¯ä¿¡æ¯
å¦æå¯¹ä½ çæç¬æä¿¡å¿ï¼å¯ä»¥èªå·±åæ¯å¤©çæ è¯ãå½ç¶å¤§é¨å人çæç¬è·æä¸æ ·çï¼é£æ们就å©ç¨ç½ç»ä¸çæ è¯å¦ï¼
表ç½å¾çèµæº
为äºé åæ¤æ¬¡è¡¨ç½ç¨åºï¼æä¸é¨å»æ¾äºäºå¸¦æãæç±ä½ ãçå¾çèµæºãéè¿ä¸äºè´´å§çè´´åï¼æ们就å¯ä»¥è·åå°å¤§éçè¿æ ·èµæºã
ç¨åºæºç
æ¤æ¬¡è¡¨ç½ç¨åºä¸»è¦æ 5 个å½æ°
crawl_Love_words()
æ¤å½æ°éè¿ selenium + xpath æ¥æåæ è¯ç½ç«çèµæºï¼å¹¶åå ¥å°å½åç®å½ä¸çãlove_word.txtãæ件ã
crawl_love_image()
æ¤å½æ°ç¨æ¥ç¬åè´´å§å¸¦æãæç±ä½ ãçå¾çèµæºï¼éè¿ request + re æ¥å®ç°ã代ç 并ä¸å¤æï¼å¨æ£å表达å¼é£ä¹ç®åçåäºä¸ä¸ªï¼ç¨æ¥å¹é å½åä¹ææçå¾çèµæºã
mkdir(path)
æ¤å½æ°ç¨æ¥å¨å½åç®å½ä¸å建ä¸ä¸ªæ°çæ件夹ï¼ä»¥ä¾¿åå¨ç¸åºçæ°æ®ã
send_new()
æ¤å½æ°éè¿å©ç¨ itchat åºï¼å®ç°ç»ä½ ç微信好åèªå¨åéæ¶æ¯ãå¨è¿ä¸ªå½æ°ä¸æå©ç¨ datetime æ¥è®¡ç®ä½ 们ä¹é´ç¸è¯ç¸æçæ¶é´ã并ä¸å¨ç»å½çæ¶åæ·»å äºä¸ä¸ªãhotReload=Trueãï¼è¿æ ·ä½ å°±å¯ä»¥ä¸ç¨æ¯æ¬¡è¿è¡ç¨åºçæ¶åé½è¦ç»å½ãå ³äº itchat æ´å¤çæä½ï¼å¤§å®¶å¯ä»¥å»ç½ä¸æ¥æ¾ç¸åºçèµæã
main()
main() å½æ°å°±æ¯æ们主é»è¾å½æ°ï¼ç¨åºè¿è¡çé»è¾é¡ºåºå°±æ¯å¨è¿ä¸ªå½æ°éè§å®çãå¨ main() éæé¦å å¤æä¸å½åè·¯å¾ä¸æ¯å¦æãlove_word.txtãæ件ï¼å¦ææåæ示ç¸åºçä¿¡æ¯ï¼æ²¡æçè¯æå»æ§ crawl_Love_words() å½æ°ï¼å»ç½ä¸æåä¸äºæ è¯æ°æ®ã
å ¶æ¬¡åå¤æä¸å½åç®å½ä¸æ¯å¦æãimgãæ件夹ï¼ç¨æ¥å¤ææ们æ¯å¦æå¾çèµæºï¼æ²¡æåæ§è¡ crawl_love_image() æ¥æåè´´å§ä¸çå¾çèµæºã
æåæ们æéçæ°æ®é½å·²åå¤å®åï¼åè°ç¨ send_news() å½æ°ï¼æ´çä¸è¦åéçæ°æ®æ ¼å¼ï¼ç¶åèªå¨ç»ä½ ç ta åéæ¶æ¯ã
å®æ¶ä»»å¡
æ¯å¤©å®æ¶åéæ主è¦æ¯ç¨ while True ç®åçå®ç°ï¼éè¿å¤æå½åçæ¶é´æ¯å¦æ¯ä½ æéè¦åéçæ¶é´ï¼æ¥è¾¾å°æ¯å¤©å®æ¶åéã
表ç½ç¨åºä½¿ç¨æç¨
é¦å ä½ æç¸åºçæºç ä¸è½½ä¸æ¥ï¼åå°åå¤ã表ç½ãå³å¯è·åãå ¶æ¬¡æç¸åºçåºå äºå å®è£ 好ï¼éåè¿è¡ç¨åºåä¼æ¾ç¤ºä¸ä¸ªå¾®ä¿¡ç½é¡µç»å½çäºç»´ç ï¼æ«æç»å½å³å¯ã
2024-11-18 21:13
2024-11-18 20:29
2024-11-18 20:07
2024-11-18 19:46
2024-11-18 19:18