皮皮网
皮皮网

【tomcat源码核心】【神剑妖股买入主图公式源码】【云erp进销存手机版源码】源码内部交流资源

来源:猫眼影院小程序源码 发表时间:2024-12-24 09:58:39

1.phpwind和discuz哪个好
2.e酷站长网论坛版块介绍
3.什么叫开源代码,源码什么叫非开源代码
4.国精产品w灬源码1699在线:国产源码1699:高品质产品在线获取
5.TiDB 源码阅读系列文章(五)TiDB SQL Parser 的内部实现
6.GitHub上可以搞钱的项目大集合,源代码全部开放!交流赶紧收藏!资源

源码内部交流资源

phpwind和discuz哪个好

       discuz!(简称dz)和phpwind(简称pw)是国内最著名的两个PHP论坛系统,随着它们相继宣布开源以后,在各方面,不管技术上,还是功能上,还是界面上,都有了长足的发展,声威大振,远非国外那些功能简单的电子公告板系统可比了。其造成的一个副作用是大大带动了PHP在国内的普及(本人就是在寻找合适的论坛程序的时候,才开始关注PHP,进而不能自拔的 )。

       å®¢è§‚的说,目前的pw和dz各有短长,其互相之间的激烈竞争应该说提高了PHP论坛的水平,在功能上不仅赶上了以功能多和漏洞多而著称的动网论坛,而且因为它们的效率和速度远远超过动网,弄的动网市场大大萎缩,原来的一些动网论坛都纷纷转换成了dz或者pw,搞的动网都不得不开始弄PHP论坛了。

       è¦è¯´ä»–们哪个更好,是比较难的事情,毕竟各有短长,俺也不敢在这里妄下结论。不过从市场份额和网上的言论来看,目前dz还是略占上风的,而且去年国内好几个知名的大论坛都转换成了dz(比如凤凰网、牧文、tompda等),而pw在大网站方面收获甚小。

       ä½†æ˜¯æ¯•ç«Ÿå¯¹å¥½å¤šæ–°æ‰‹æ¥è¯´ï¼Œä»–们都要面临一个选择论坛程序的问题,因此,dz和pw哪个更好,也就成了经常被问的问题,这种没有答案的问题,自然要被反复问起。本文试图从比较深的层次来分析两个论坛的优劣,为新手提供选择的参考。如有错谬之处,欢迎批评指正。

       ä¸€ã€ç•Œé¢ç¯‡

       é¦–先,从界面上说,从整体上说,dz的界面比较美观,整体感好。

       pw的界面给人一种模仿dz的感觉。同时在界面的细节上,看起来pw还是没有dz完美。

       äºŒã€æŠ€æœ¯ç¯‡

       ä»ŽæŠ€æœ¯ä¸Šè¯´ï¼Œpw和dz都使用了文件方式的数据缓存技术,通过把常用的数据表,比如论坛版面设置参数、基本参数等,生成静态缓存文件(根据条件触发更新或者手动更新),来减少数据库读取次数,提高效率,在这个方面两者非常相似。

       1、模版技术

       ä»Žæ¨¡ç‰ˆæŠ€æœ¯ä¸Šè¯´ï¼Œdz从2.5f版就开始采用的这种静态模版技术,从俺个人角度上说,还是非常适合论坛这种频繁更新的网站程序使用的。它通过动态生成静态模版的方式,解决了模版解析效率的问题。

       åŒæ—¶ï¼Œdz的这种模版方式,使得修改界面也比较容易,很直观。

       è€Œpw使用echo语句的这种方式(姑且称其为模版),就寒碜多了,要增加了一个if判断条件,就要折腾半天。添加了混合PHP代码的模板,在 dreamweaver中也容易被误操作删除。特别是如果修改的时候稍有不慎,很可能会使网页成了白板(没有输出),让俺每次修改pw模版无不如履薄冰,战战兢兢。。。。恐怕这也是第三方模版中,dz远远多于pw的原因吧。

       ä¸è¿‡pw目前在模版上也在改进,现在看verycms 3.0就已经开始使用真正的模版技术,不过目前用的都还比较初级。。。

       2、速度问题

       ä»Žæ¨¡ç‰ˆä¸Šçœ‹ï¼Œä¸¤è€…的效率应该是差不多的,pw的模版其实就是直接包含的混合了PHP语句的一部分PHP文件,而dz的模版平时并不需要解析,所以效率应该是差不多的,但是网上总是有人声称网站使用dz的速度比pw慢,这方面本人没有测试过,不敢妄作评论。而且网站访问速度还是要受很多因素的影响,比如:本地网速、服务器带宽、心理。。。。。客观的评价还是很难的,除非使用专业技术手段。不过从官方网站的速度来看,明显还是pw占优啊,呵呵

       æœ€è¿‘看了一下dz的CSS文件,明显是用CSS用的有点过度了,在dz中大量使用了CSS,CSS文件高达KB左右(pw只有2KB左右),可能造成了IE渲染网页的时候,效率比较低。同时,由于dz的CSS文件过于庞大,只好采用了外置的方式(Link)。

       è¿™æ ·å¦‚果网速很慢,网页已经或者部分下载完,而CSS文件下载没完成(网速慢的时候,常常发生这种情况),那么网页根本就不能正常显示。

       åœ¨ç½‘速慢的时候,光dz的CSS文件,就要用好几秒,甚至十几秒的时间才能下载,而整个网页只能在CSS下载完成以后才能进行正确的显示,这就无怪乎在网速慢的时候,dz表现大大逊色于pw了。

       ç›¸åï¼Œpw在设计CSS的时候,明显是比较简洁,这对网页的渲染肯定是比较有利。同时,pw采用了把CSS文件嵌入的方式,尽管每次访问网页都造成了几K 个字节的流量,但是实际影响并不大,反而觉得网页打开速度比dz要快(这就是pw用了一个笨法子,却常常效果比dz强的典型案例)。

       è¿™æ–¹é¢ï¼Œå»ºè®®dz痛下决心简化过分臃肿的CSS文件,提高网页速度。

       ä¸‰ã€åŠŸèƒ½ç¯‡

       ä¸‹é¢ä¿ºå°±dz5.5和pw5.3的功能,做一个简单的,本人看来是比较深入,可能高手看来仍嫌浅显的分析,请大家指正:

       1、登录方式:

       pw的前台登录和后台登录采用了不同的Cookie方式,这样前后台分开的方式,个人感觉,有利于安全,也便于管理。后台帐号与前台帐号可以彻底分开。

       è€Œdz的前后台登录是用了一个帐号,尽管在进入后台的时候再次提示输入密码,不过还是不如pw方便。

       æ¯”较特别的是,dz在注册的时候,要求输入提示问题(选填),而且在登录界面中,也有提示输入的界面,个人感觉,绝对的画蛇添足,无聊。如果说使用提示问题来找回密码,还是有点道理的。用提示问题的方式,让新手看了无所适从,脑袋都晕了

       2、分栏显示:

       pw从5.0.1开始支持左右分栏显示了,然而功能太简单,不能树状显示子板块,此功能与其说有,不如说没有,弄的有点搞笑,属于半成品(倒是也符合pw的一贯特点--喜欢推出一些不完美的东西让大家修改)。

       çœ‹äº†dz5.5的分栏显示,做的还是比较完美的,感觉相当不错了。

       3、后台管理的效率:

       pw的横向操作非常不错,大大节省了管理的难度,特别是在根据用户组设置权限的时候,非常的那个方便啊,这方面dz需要改进。

       dz提供了一个方案的方式来解决后台重复操作问题,应该说也有一定道理,但是用起来不太容易上手,如果是设置一个单独的项目,就比较繁琐。

       4、个人空间(文集)功能:

       dz5.5内置了minispace个人空间功能,可以说自从discuz合并了supsite以后,在论坛功能的外展方面,占据了很大优势,吸引了很多个人网站的注意力。

       è¿™ä¸ªminispace用dz官方的话说,是这样的:

       â€œå®Œå…¨åˆ©ç”¨è®ºå›åŽŸæœ‰èµ„源,会员不必更多付出,即可拥有个性展示页面

       ä¸Ž X-Space 完美结合,可顺畅实现 MiniSpace 与 X-Space 自然过渡 ”

       å¤§ä½“看了一下,发现这个minispace做的很不错,利用它,用户可以把自己的优秀帖子整理出来,形成一个文集的方式,方便别人访问。以前在别的论坛见过这个功能,觉得很不错,没想到dz把它整合进去了。这个功能已经可以满足大部分论坛的功能要求了,如果要求更高,比如希望能让用户发布b0客文章,按照官方的说法,也可以迁移到X-space中去。但更重要的是,minispace是开源的,而X-space的源代码并不开放。

       è¯´åˆ°X-space,我们觉得,pw在功能上虽然足以和dz匹敌,但是在论坛的外延上,却比dz落后了好多。X-space能实现以论坛为中心的个人空间功能,而pwblog(已经改名为Lxblog,正式版未推出,本文仅以5.1.5版本为例)却和论坛貌合神离,帖子推送功能虽然从4.3.2就有了,然而却一直不好用,4.x推送以后,图片和附件都不正常,5.1.5虽然可以推送正常了,然而在论坛中更新的帖子,在b0客中却不再出现回帖,可以说推送功能在pwblog中只是一个无用的点缀而已。

       è¯´åˆ°åº•ï¼Œæˆ‘们常常希望的只是一个论坛帖子文集功能的方式,pwblog把论坛中的内容重复推送到b0客中,既浪费空间,又没有意义,这方面dz远远胜过了 pw,值得表扬。但minispace的功能还是略显简单了些,比如没有文集帖子的分类功能、没有首页推荐帖子等等(也许论坛帖子的分类意义不大,不过有总比没有强吧?)

       5、防灌水技术

       pw5.3终于接受了俺提出的新手注册第N贴以前发帖使用验证码的方式,这样既不影响老用户的使用,又通过验证码方式来限制恶意灌水机器人。dz未提供此功能,但是具有可以设定第N贴以后不用自定义问答的功能(dz的验证码很烂,根本看不清,用自定义问答似乎更好一些)。

       åœ¨é˜²æ­¢è‡ªåŠ¨æ³¨å†Œæ–¹é¢ï¼Œpw和dz都使用了自定义问答方式防止自动注册的办法,具体原理很简单,两者实现的都差不多。区别在于,dz要求设置个以上的问题才能生效,而pw只能设置一个问题。另外,还有一个区别,就是pw可以自定义问答中内部使用的form变量名,可能在防止恶意自动注册方面,会更加有效一些。pw的自定义问题只能用于注册,而dz的可以用在注册、发帖和短消息等方面。

       ä»Žç›®å‰çš„具体应用来看,用一个问题就基本上解决了自动注册的问题(长时间实践发现的结果),当然也不排除特大型网站,用一个问题容易被攻破的可能性,这方面dz可能就更有效一些。只是dz限制要求个以上才能生效的做法,令人费解。

       6、前台管理功能

       pw具备副版主功能,不过和一般的思路不同,副版主是由版主任命的,这样恐怕会导致权限混乱问题,所以也很少有人用这个功能。

       åœ¨å‰å°çš„管理功能中,pw更方便一些,不仅的主题列表中能进行管理,在帖子内容页面中的管理方式比dz用下拉方式更直观一些。而且在一个主题里面删除帖子,pw比dz直观多了。

       è´¹è§£çš„是,pw5.3版本中移动帖子,都会在帖子前面加入移动提示“本帖被 xxxx 从 xxxx 移动到本区(xxxxå¹´xx月xx日) ”,无法消除,真是难看极了(以前版本没有这个毛病)

       dz实现了“沉贴”的功能,可以把那些偶尔被人翻上来的无用垃圾贴沉下去,确实方便多了。。。。有次俺在pw中为了沉一个帖子,不得不提前了N个帖子。而且dz的版主管理功能,加亮、精华等操作都能一气呵成,比pw方便好多。

       7、所见即所得编辑器

       dz5.5和pw5.3开始,不约而同的把所见即所得编辑器换成了ubbcode(两个论坛名称不一样,这里用个通俗一点的名称,暂称为UBBCode)方式的编辑器,而放弃了原来的HTML可视化编辑器。

       è¯´èµ·æ¥ï¼Œè¿™ä¸ªubbcode可视化编辑器确实解决了以前采用代码方式,无法可视化,导致好多非IT人士发帖无法控制格式;而和动网一样使用HTML方式,又产生大量冗余代码和安全性隐患的问题。

       ä¸è¿‡é€ æˆçš„后果却是,在转贴的时候,以前可以直接从别人的网页上,连图片带文字一起转过来,却是非常方便,虽然有盗链之嫌。换成了这种编辑器,再也没法那么方便了,因此在换了编辑器以后,官方论坛中是怨声载道一片。。。。而且新的编辑器还有好多小BUG,更加是引起了广泛不满(另注:用了一段DZ后发现,dz 5.3的所见即所得编辑器好像存在很多问题,几乎无法用,这方面可能还不如pw的编辑器好用一些)

       8、附件上传和所见即所得功能:

       pw的附件还是只能提交帖子上传以后才能进行图文混排,这方面dz要好的多,可以上传前就进行混排,方便多了

       dz对不参与上传的图片附件还是显示太多信息,看起来影响美观(似乎是受vbb和phpbb的影响比较大)。而pw只是显示了“图片”字样和描述信息,但是更恶心的是,却把这些图片放到正文文字上方 ,真是屡教不改啊

       9、附件防盗链技术的分析:

       dz采用了隐藏图片地址,和检测访问来源(可选)的办法来防盗链,应该说服务器负担比较大,效果还行,但不能彻底解决问题。

       pw用的办法更简单,但更有效一些:就是定期或者自动修改附件目录名,应该说这是一个投资少见效快的好办法,技术上也很简单。不过最新的pw5.3版本也引入了隐藏附件地址的方式,后台也似乎无法关闭此项功能,似乎有点画蛇添足的味道了。。。。

       å‘现dz也可以在后台手工修改附件目录,也可以起到一定效果,只是没有自动修改的功能。

       ã€å¹¿å‘ŠåŠŸèƒ½ï¼š

       dz比pw要好一些,广告功能更完善一些。比如贴内广告,在帖子下面的位置类似动网的位置,看起来更整齐一些,而pw的位置就让帖子布局显得比较凌乱,不好看。dz的贴间广告可以插入大的Google Banner广告,或者其它图片形式的广告,展示效果很好。

       ç›¸æ¯”dz,pw广告的插入位置更少一些,效果也差一些。

       ã€å¤´åƒæ˜¾ç¤ºï¼š

       dz不能限制上传头像的长宽尺寸,只能限制总像素数,显得不够灵活,不如pw方便。而且超出了一定尺寸的头像,被自动缩放和拉伸了,看起来很难看。而且 dz还自动给头像加了一个边框,甚是恶心。可见dz把简单的事情给弄复杂化了,其实只要和pw一样,限制其尺寸,根本不需要拉伸。

       ã€é™„件尺寸限制:

       pw只能设定所有附件的尺寸,而dz可以对个别格式的附件设定上传尺寸,比较灵活一些,特别适合一些flash网站,或者技术型网站(比如上传大尺寸图纸等)。

       ã€è¯è¯­è¿‡æ»¤ï¼š

       pw只能使用普通方式过滤,不支持大小写(很简单的事情,官方就是不办,举手之劳啊)。

       è€Œdz不仅能识别大小写,而且具有了一定的模糊识别功能,相当不错了。当然,要是能直接支持正则表达式就更爽了。

       ã€è‡ªå®šä¹‰ä»£ç åŠŸèƒ½ï¼š

       pw至今不支持自定义wincode代码,比较僵化。要增加功能,就只能修改js文件,太过麻烦。。。。

       dz在这方面做的比较完美,要增加或者减少代码、修改播放界面尺寸都很容易,在后台设置一下就可以了

       ã€å›žæ”¶ç«™åŠŸèƒ½ï¼š

       dz可以设定自动清理,而pw不能

       ã€IP来源显示功能:

       dz的IP地址和来源显示类似动网,看起来不太方便,需要点击小电脑图标才行。还是pw的IP地址来源显示看起来比较舒服一些。

       ã€é˜²CC攻击:

       pw早在4.3.2就增加了抗CC攻击功能,而且设置起来比较简单,新手也能看懂。当初俺就是因为这个原因才用了pw。

       dz5.5虽然号称带有cc攻击防护,不过看起来比较难于理解,在后台找了半天也没找到,估计新手是操作不了的。当年某著名站长论坛(用dz)可就是被CC攻击搞的长期开不了张的,看起来dz的防CC攻击功能还有待改进。

       ã€å¤‡ä»½åŠŸèƒ½

       pw能支持对pw程序以外的数据表进行备份,而且判断标准不是根据表前缀。可以单独备份pw表以外的数据表,对于那些建立了新表的插件,备份数据超级容易,这方面比较人性化。

       dz只是根据表前缀来进行备份,比如你设置一个表,叫做cdb_test,那么它会把它认为是论坛数据表而进行备份。但是如果你设置一个表,叫做test,那就自己想办法去吧。。。。

       ä½†æ˜¯dz比pw强的是,备份可以压缩,压缩后下载和转存备份文件应该会节省巨大的空间和时间,对于超大型论坛应该是非常管用的。dz备份可以指定文件名,而且备份数据用十六进制表示(安全一些,但是占用空间会大一些),估计导入和恢复的中文内码问题就不会存在了。

       å¦å¤–,dz还可以备份MySQL Dump备份(不推荐使用)。

       ã€æ–‡ä»¶å’Œæ•°æ®åº“校验:

       dz内置了文件和数据库校验的功能,pw只是官方提供了一个文件校验工具,不过用起来有点莫明其妙,有时候提示使用的函数在php文件中根本不存在

       ã€ä¸»é¢˜æŽ¨èå’Œç›¸å…³è´´åŠŸèƒ½ï¼š

       dz通过qihoo实现了相关贴的功能,而且还可以支持主题推荐,这方面比pw强了很多。

       ã€æ¨¡ç‰ˆå’Œé£Žæ ¼è®¾ç½®

       phpwind可以在后台设置风格CSS文件,虽然新手不太容易上手,但确实还是比较方便的。

       dz更进一步,把css的内容给解释成了表单的形式,让新手也能操作,不过带来的缺点更加大了:如果你想在CSS中增加控制(比如调整行间距等),就不知道该怎么弄了,只好去修改模版。好在dz还提供了一个附加功能:在后台可以直接修改模版,而且编辑界面中还带搜索功能,总算是亡羊补牢了

       dz以较大优势在功能上超过pw,而且在dz有些胜过pw的功能上,好多都是以较大优势取胜。

       å››ã€æ€»ç»“

       æ€»ä½“来说,dz在功能上,界面上,技术上,论坛功能外延上,都胜过了pw。但pw也并非一无是处,其抗CC攻击功能,简洁快速的界面,强大的管理功能,独到的防盗链技术,都很有特色。所谓仁者见仁,智者见智,选择pw还是dz,仍然是一个个性化的问题,具体取决于你对他们的某项特点是否看重。

       å¦å¤–,感觉dz在浏览器兼容性上有点小问题,有时候会出现提示,什么从来路不明的什么东西提交信息,检查norton internet security配置之类的烦人问题,而且dz的验证码太恶心,根本看不明白,都赶上动网的烂验证码了,基本上没法用,只好关掉算完。

       éœ€è¦è¯´æ˜Žçš„是,如果是新手,需要选择论坛,还是建议选择dz,因为功能比较多,论坛的外延开发的比较好(supsite/X-space做的很不错),用起来方便一些,而且模版修改起来比较简单,容易上手。

       pw只是适合老手,和对论坛外延功能不太感兴趣的那些人使用,而且pw的模版修改起来相当困难,稍有不慎就容易出错,对新手不合适。

       PW适合娱乐站,速度快,功能多,官方集成各种插件,几乎不用维护

       pw现有的功能=dz+银行+多附件上传+在线会员统计+特殊用户组添加+节日送礼

       ä¸ªäººè®¤ä¸ºphpwind比较方便些,源码对于那些不想花时间装插件的人来说上手更容易

e酷站长网论坛版块介绍

       在e酷站长网中,论坛版块丰富多样,内部tomcat源码核心旨在满足不同需求的交流站长们。首先,资源交流区是源码站长们互相学习和分享经验的平台,这里是内部新手站长的入门基地,大家可以在其中提问和解答疑惑,交流共同探讨网站运营和管理的资源问题。

       如果你对网站源码和建设资源感兴趣,源码这里是内部你不可错过的区域。这里有海量的交流资源分享,无论是原创文章,还是各种实用工具和教程,都能帮助你提升网站技术能力。此外,对于网络赚钱和外链软文的策略,这里也有深入的讨论和交流。

       对于商业活动,交易区是一个活跃的平台。在这里,你可以交换友链,买卖网站,或者在站长交易室中寻找你需要的资源。如果你是联盟推广者,联盟区则是你的招商和广告联盟的好去处,SEO工具与教程同样一应俱全。

       而事务区则专注于版主的管理与讨论,版主商议区处理论坛内部事务,迷你小黑屋则是处理违规行为的地方,事务管理确保了论坛的正常运行秩序。

什么叫开源代码,什么叫非开源代码

       开源代码是指开放源代码,也称为源代码公开,指的是一种软件发布模式;反之,若不公开源代码则为非开源代码。

       一般的软件仅可取得已经过编译的二进制可执行档,通常只有软件的作者或著作权所有者等拥有程序的原始码。

       有些软件的作者会将原始码公开,此称之为“源代码公开”,但这并不一定符合“开放源代码”的定义及条件,因为作者可能会设定公开原始码的神剑妖股买入主图公式源码条件限制,例如限制可阅读原始码的对象、限制衍生品等。

       

扩展资料:

       开源代码的作用:

       1、软件成果独占权带来的弊端

       基于知识产权保护的独占权,就阻碍了他公司进入此类市场的“商业壁垒”,无相关产品接应,无市场竞争,从而形成了垄断。

       2、软件的源代码保密带来的危害

       由于知识产权保护,各个公司对软件源代码保密,只有公司内部流通交流,软件技术专家和学者无法进行学习和研究,造成了软件的重复开发和使用,浪费社会劳动力。并且,软件的安全性和改进完善受到了限制。

       由于软件行业的垄断,造成了学术界的强烈不满,因此开源运动和自由运动产生了。开放源代码软件源于自由软件运动。

百度百科-开放源代码

国精产品w灬源码在线:国产源码:高品质产品在线获取

       随着互联网技术的不断进步,越来越多的企业开始将业务模式转化为在线化,这其中,源码成为了不可或缺的一部分。而国产源码则是一个优质的在线获取平台,其中的国精产品w灬源码更是备受欢迎。

       国精产品的优势

       国精产品w灬源码在线采用了领先的技术方案,确保了其软件质量的优越性,能够满足不同客户的需求。其具体优势主要包括:

        高效稳定:采用先进的技术,在保证高效稳定性的前提下实现多种功能。

        易于使用:操作简单,用户可以快速上手,减少了培训成本。

        可定制化:支持定制化开发,能够为客户提供更贴近需求的软件。

        数据安全:具有完善的数据安全措施,客户数据得到充分的保障。

       在线获取的便利性

       传统的软件获取方式存在多种问题,如繁琐的安装流程、版本更新不及时等,而在线获取平台的出现则很好地解决了这些问题。国产源码作为一家优质的云erp进销存手机版源码在线获取平台,不仅提供了丰富的产品资源,为用户提供了更为便利的服务,还能够提供相关技术咨询、售后支持等服务,解决了用户在使用过程中可能会面临的各种问题。

       源码价值与开发前景

       源码的作用不仅是能够为企业提供一个高效、稳定、安全的软件平台,还能够为客户提供支持性服务,促进企业内部优秀技术的交流和传承。而在发展趋势上,源码的应用前景也十分广阔。随着互联网行业的不断发展,各行各业的企业也都开始建立自己的互联网企业,而源码的出现,则使得相关产品、业务的开发变得更为便捷和高效。

       结语

       作为国内领先的在线获取平台,国产源码致力于为用户提供更为便捷的在线获取服务,其中的国精产品w灬源码也成为了用户们的热门选择。希望未来国产源码在不断技术创新、服务升级的同时,不断提高客户体验,为用户提供持续优质的服务。

TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现

       本文是 TiDB 源码阅读系列文章的第五篇,主要内容围绕 SQL Parser 功能实现进行讲解。内容源自社区伙伴马震(GitHub ID:mz)的投稿。系列文章的目的是与数据库研究者及爱好者深入交流,收到了社区的积极反馈。后续,期待更多伙伴加入 TiDB 的探讨与分享。

       TiDB 的源码阅读系列文章,帮助读者系统性地学习 TiDB 内部实现。最近的《SQL 的一生》一文,全面阐述了 SQL 语句处理流程,从接收网络数据、MySQL 协议解析、SQL 语法解析、查询计划制定与优化、执行直至返回结果。

       其中,SQL Parser 的功能是将 SQL 语句按照 SQL 语法规则进行解析,将文本转换为抽象语法树(AST)。此功能需要一定背景知识,如何求解二进制的源码下文将尝试介绍相关知识,以帮助理解这部分代码。

       TiDB 使用 goyacc 根据预定义的 SQL 语法规则文件 parser.y 生成 SQL 语法解析器。这一过程可在 TiDB 的 Makefile 文件中看到,通过构建 goyacc 工具,使用 goyacc 依据 parser.y 生成解析器 parser.go。

       goyacc 是 yacc 的 Golang 版本,因此理解语法规则定义文件 parser.y 及解析器工作原理之前,需要对 Lex & Yacc 有所了解。Lex & Yacc 是用于生成词法分析器和语法分析器的工具,它们简化了编译器的编写。

       下文将详细介绍 Lex & Yacc 的工作流程,以及生成解析器的过程。我们将从 Lex 根据用户定义的 patterns 生成词法分析器,词法分析器读取源代码并转换为 tokens 输出,以及 Yacc 根据用户定义的语法规则生成语法分析器等角度进行阐述。

       生成词法分析器和语法分析器的过程,用户需为 Lex 提供 patterns 的定义,为 Yacc 提供语法规则文件。这两种配置都是文本文件,结构相同,分为三个部分。我们将关注中间规则定义部分,并通过一个简单的例子来解释。

       Lex 的输入文件中,规则定义部分使用正则表达式定义了变量、整数和操作符等 token 类型。例如整数 token 的定义,当输入字符串匹配正则表达式时,大括号内的动作会被执行,将整数值存储在变量yylval 中,并返回 token 类型 INTEGER 给 Yacc。

       而 Yacc 的语法规则定义文件中,第一部分定义了 token 类型和运算符的结合性。四种运算符都是左结合,同一行的运算符优先级相同,不同行的运算符,后定义的行具有更高的优先级。语法规则使用 BNF 表达,大部分现代编程语言都可以使用 BNF 表示。

       表达式解析是生成表达式的逆向操作,需要将语法树归约到一个非终结符。Yacc 生成的语法分析器使用自底向上的归约方式进行语法解析,同时使用堆栈保存中间状态。织梦响应式博客网站附源码通过一个表达式 x + y * z 的解析过程,我们可以理解这一过程。

       在这一过程中,读取的 token 压入堆栈,当发现堆栈中的内容匹配了某个产生式的右侧,则将匹配的项从堆栈中弹出,将该产生式左侧的非终结符压入堆栈。这个过程持续进行,直到读取完所有的 tokens,并且只有启始非终结符保留在堆栈中。

       产生式右侧的大括号中定义了该规则关联的动作,例如将三项从堆栈中弹出,两个表达式相加,结果再压回堆栈顶。这里可以使用 $position 的形式访问堆栈中的项,$1 引用第一项,$2 引用第二项,以此类推。$$ 代表归约操作执行后的堆栈顶。本例的动作是将三项从堆栈中弹出,两个表达式相加,结果再压回堆栈顶。

       在上述例子中,动作不仅完成了语法解析,还完成了表达式求值。一般希望语法解析的结果是一颗抽象语法树(AST),可以定义语法规则关联的动作。这样,解析完成时,我们就能得到由 nodeType 构成的抽象语法树,对这个语法树进行遍历访问,可以生成机器代码或解释执行。

       至此,我们对 Lex & Yacc 的原理有了大致了解,虽然还有许多细节,如如何消除语法的歧义,但这些概念对于理解 TiDB 的代码已经足够。

       下一部分,我们介绍 TiDB SQL Parser 的实现。有了前面的背景知识,对 TiDB 的 SQL Parser 模块的理解会更易上手。TiDB 使用手写的词法解析器(出于性能考虑),语法解析采用 goyacc。我们先来看 SQL 语法规则文件 parser.y,这是生成 SQL 语法解析器的基础。

       parser.y 文件包含 多行代码,初看可能令人感到复杂,但该文件仍然遵循我们之前介绍的结构。我们只需要关注第一部分 definitions 和第二部分 rules。

       第一部分定义了 token 类型、优先级、结合性等。注意 union 结构体,它定义了在语法解析过程中被压入堆栈的项的属性和类型。压入堆栈的项可能是终结符,也就是 token,它的类型可以是 item 或 ident;也可能是非终结符,即产生式的左侧,它的类型可以是 expr、statement、item 或 ident。

       goyacc 根据这个 union 在解析器中生成对应的 struct。在语法解析过程中,非终结符会被构造成抽象语法树(AST)的节点 ast.ExprNode 或 ast.StmtNode。抽象语法树相关的数据结构定义在 ast 包中,它们大都实现了 ast.Node 接口。

       ast.Node 接口有一个 Accept 方法,接受 Visitor 参数,后续对 AST 的处理主要依赖这个 Accept 方法,以 Visitor 模式遍历所有的节点以及对 AST 做结构转换。例如 plan.preprocess 是对 AST 做预处理,包括合法性检查以及名字绑定。

       union 后面是对 token 和非终结符按照类型分别定义。第一部分的最后是对优先级和结合性的定义。文件的第二部分是 SQL 语法的产生式和每个规则对应的 aciton。SQL 语法非常复杂,大部分内容都是产生式的定义。例如 SELECT 语法的定义,我们可以在 parser.y 中找到 SELECT 语句的产生式。

       完成语法规则文件 parser.y 的定义后,使用 goyacc 生成语法解析器。TiDB 对 lexer 和 parser.go 进行封装,对外提供 parser.yy_parser 进行 SQL 语句的解析。

       最后,我们通过一个简单的例子,使用 TiDB 的 SQL Parser 进行 SQL 语法解析,构建出抽象语法树,并通过 visitor 遍历 AST。我实现的 visitor 只输出节点的类型,运行结果依次输出遍历过程中遇到的节点类型。

       了解 TiDB SQL Parser 的实现后,我们有可能实现当前不支持的语法,如添加内置函数。这为我们学习查询计划以及优化打下了基础。希望这篇文章对读者有所帮助。

       作者介绍:马震,金蝶天燕架构师,负责中间件、大数据平台的研发,今年转向 NewSQL 领域,关注 OLTP/AP 融合,目前在推动金蝶下一代 ERP 引入 TiDB 作为数据库存储服务。

GitHub上可以搞钱的项目大集合,源代码全部开放!赶紧收藏!

       关注会变身的火娃,学Github实用高质量项目不迷路(持续更新中~)

       ==更多相关内容,请观看我主页《Github实用高质量项目》专栏==

       GitHub是宝藏,绝大多数开源项目按照开源协议可以自由商业化。

       赶紧收藏!

       人工智能

       1、只输入一句话的需求,它就能输出软件公司的整个流程,以及精心安排的标准作业程序

       2、 一个开源、免费的虚拟现实(VR)应用的网页开发框架

       3、 这个数字人开源项目太牛了,非常全面的项目解决方案(含源码)

       4、 AI换脸来了!一款实时直播和视频AI换脸程序

       低代码/零代码

       1、 一个开源低代码平台,是构建提高生产力的内部应用程序的最简单方法

       2、 一个开源的低代码平台

       3、 零代码平台开源!Motor Admin是一款在不到一分钟的时间内为任何应用程序部署无代码管理面板

       企业服务

       1、 一款单个键盘和鼠标来控制多台计算机的开源软件

       2、 一款简化 Web 应用程序身份验证的开源软件项目

       3、 Apache上的一个动态、实时、高性能的 API 网关

       4、 Apache最火的开源任务调度框架

       工业

       1、 一款设计十分灵活且超好用的中小型 ERP 系统

       2、 GitHub好项目:Idurar是一款开源的ERP-CRM系统,发票、库存、会计、人力资源等业务管理、二开可以赚钱

       3、 GitHub开放源代码项目:IDDM 工业缺陷扩散模型

       学习

       1、 免费、开源客户管理软件CRM,适用很多企业,拿来做项目赚钱!

       2、 一个内容管理系统(CMS),可让您构建网站和强大的在线应用程序

       3、 发现一款不错的开源报表工具,分享给大家,希望可以帮助您!

       工具

       1、 一款由文本生成图像的强大模型,可以智能地将文本集成到图像中

       2、 一个自托管的开源网络画廊,用于浏览个人照片和视频

       3、 一款开源、实用的数据集因果分析工具

       GitHub /GitPP

       GitHub 和 GitPP 都是全球知名的开源平台,它们为开发者、设计师、产品经理和其他专业人士提供了一个展示和合作的空间。在这些平台上,各种职业的人可以通过以下方式赚钱和提高自己:

       1.软件开发者:

       - 贡献开源项目:通过为开源项目贡献代码,开发者可以提高自己的技术水平,同时建立自己的声誉。有些开源项目会提供小额奖金或赞助给贡献者。

       - 创建个人项目:开发者可以创建自己的开源项目,并通过赞助、捐赠或提供付费增值服务来获得收入。

       - 提供专业服务:在GitHub/GitPP上,许多公司会寻找自由职业者来完成特定的开发任务,开发者可以通过这种方式获得工作机会。

       2.设计师:

       - 展示设计作品:设计师可以在GitHub/GitPP上展示他们的设计作品,吸引潜在的客户或雇主。

       - 参与设计竞赛:有些开源项目或公司会在GitHub/GitPP上举办设计竞赛,设计师可以通过参与这些竞赛来获得奖金和认可。

       3.产品经理:

       - 管理开源项目:产品经理可以参与或发起开源项目,通过社区合作开发产品,提升自己的产品管理能力。

       - 建立产品案例:通过在GitHub/GitPP上展示成功的产品案例,产品经理可以吸引潜在雇主或客户。

       4.教育者:

       - 提供教程和课程:教育者可以在GitHub/GitPP上提供编程教程、课程资料等,收取费用或通过广告获利。

       - 建立学术项目:教师和研究人员可以发起或参与开源的学术项目,推动知识的共享与传播。

       5.市场营销和销售专业人士:

       - 推广开源项目:通过为开源项目提供市场营销支持,这些专业人士可以帮助项目增加知名度,间接或直接从中获益。

       - 建立商业模型:围绕开源项目建立商业模型,例如提供相关的付费服务或产品。

       6.企业和组织:

       -开源企业项目:企业可以通过开源内部项目来吸引外部开发者,共同改进产品。

       - 招聘优秀人才:通过GitHub/GitPP上的个人项目和贡献,企业可以发现和招聘技术人才。

       开源平台不仅仅是一个技术交流的场所,也是一个职业发展的舞台。通过参与开源项目,个人和团队可以展示自己的能力,学习新知识,建立职业网络,并有可能获得经济上的回报。

       开源协议是规定开源软件使用、修改和分享的法律文件。它们为使用者提供了使用、复制、修改和分发软件的权利,同时保护了原作者的权益。开源协议有多种不同的类型,每种都有其独特的特点和适用场景。以下是一些常见的开源协议及其基本情况:

       1. GNU General Public License (GPL):

       - 特点:GPL 是最著名的开源协议之一,由自由软件基金会(FSF)制定。它要求任何基于GPL软件开发的衍生软件也必须以GPL协议开源。

       - 商业化:GPL协议的软件可以商业化,但商业化产品也必须遵循GPL协议,即必须开源。

       2. MIT License:

       - 特点:MIT License 是一种简单和灵活的开源协议,允许使用者在不影响软件的使用和分发的情况下,自由地修改和使用源代码。

       - 商业化:MIT License 允许其软件用于商业目的,无需公开修改后的代码。

       3. Apache License:

       - 特点:Apache License 是由Apache软件基金会制定的开源协议,它允许使用者自由地使用、修改、复制和分发软件,并保留原作者的版权信息。

       - 商业化:Apache License 允许将软件用于商业目的,且无需公开修改内容。

       4. BSD License:

       - 特点:BSD License 是由伯克利加州大学(UCB)制定的一种开源协议,它鼓励代码共享和创新。

       - 商业化:BSD License 允许使用、复制和分发软件,同时也允许将修改后的代码作为专有软件发布,因此对商业集成非常友好。

       5. Mozilla Public License (MPL):

       - 特点:MPL 是由Mozilla基金会制定的开源协议,它结合了GPL和BSD的特点,要求对源代码的修改必须公开,但对最终用户的使用和分发没有限制。

       - 商业化:MPL 允许将软件用于商业目的,但对修改后的代码有开源要求。

       6. Eclipse Public License (EPL):

       - 特点:EPL 是Eclipse基金会制定的开源协议,它类似于GPL,但更加注重于商业友好性。

       - 商业化:EPL 允许将软件用于商业目的,但对衍生软件有开源要求。

       开源协议的选择取决于软件的目的、开发者的意图以及预期的商业模式。一些协议如GPL更注重于保护软件的自由使用和分享,而其他如MIT、BSD和Apache License则更加商业友好,允许更多的灵活性和商业用途。在选择开源协议时,开发者应仔细考虑自己的需求和目标,以确保选择最合适的协议。

       关注我会变身的火娃,一起学习,一起成长。

相关栏目:休闲