范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

木兰重生木兰代码格式化之自动调整缩进的150倍性能优化

  本项目旨在重现「木兰」编程语言的语法和功能,已开源在码云。所有例程演示的语法可以用原始的木兰可执行文件 ulang-0.2.2.exe 检验。如发现有异烦请告知,定将礼谢。
  本文介绍的是个临时起意的副线任务,但也是木兰编程语言生态建设的一步。缘由
  前两天为了做井字棋游戏,中文化了一个例程,并从中截取了绘制棋盘的部分代码,改写成了木兰代码,打算在此基础上进一步开发。
  代码很短,三十多行,也抛出了预期效果如下:
  问题是,由于是随手拷贝自 Python 源码,也没有特别注意保留行头空格(当然也仗着木兰对缩进量不敏感),导致代码缩进非常参差不齐,见下图左侧:
  虽然手工调整缩进不用几分钟,但因为马上就想到可以用木兰交互环境获取未配对的括号数的机制来实现自动缩进,忍不住在自制编辑器中集成了这个功能,实现挺方便(因为有之前的高亮部分打底),格式化效果也如预期见上图右侧。原始方案
  基本思路请看十五行木兰源码:func 格式化(源码) {   缩进单位 = "  "   所有行 = 源码.splitlines()   部分源码 = ""   格式源码 = ""   // TODO: 每行的缩进量由当前行之前的代码决定, 复杂度为 N^2 (N 为代码行数)   for 行号 in 1..len(所有行) {     当前行 = 所有行[行号 - 1]     部分源码 += 当前行     各代码段 = 解析(部分源码)     缩进数 = 未配对括号数(各代码段)     格式源码 += 缩进数 * 缩进单位 + 当前行.strip() + " "     部分源码 += " "   }   return 格式源码 }
  但这个 N^2 的复杂度如鲠在喉。起初由于那个棋盘代码只有 34 行,运行格式化还能接受(后测大约 240 毫秒),就有先放着不管的打算,但手贱跑了一下至今项目内最长的木兰源码文件——318 行的"儿歌.ul",结果跑了 12 秒多才完成不说还报个神奇的警告:2020-10-04 11:48:03.095 Python[40873:15785576] IMKClient Stall detected, *please Report* your user scenario attaching a spindump (or sysdiagnose) that captures the problem - (imkxpc_bundleIdentifierWithReply:) block performed very slowly (8.90 secs).
  是可忍孰不可忍。于是着手改为 N 复杂度。结果,之前留的一个雷还是踩上了。雷在词法分析
  一个简单木兰例程:func a {   //前面有空格 }
  原始木兰可执行文件的 --dump-tokens 选项只能看到词名,不能看到行列号,但在逆向工程添加行列号输出后可以看到如下分词信息:Token("FUNC", "func")=1:0 Token("IDENTIFIER", "a")=1:5 Token("LBRACE", "{ ")=1:7 Token("RBRACE", " }")=2:9 <------
  后大括号(RBRACE)的行号是 2,列号是 9。为啥不是行号 3,列号 0 呢?
  原因在分词规则的正则表达式包含了前置的所有换行:lg.add("LBRACE", "{r*n*", flags=(re.DOTALL)) lg.add("RBRACE", "r*n*}", flags=(re.DOTALL))
  不仅是后大括号,像 elif、else 也是如此:lg.add("ELIF", "r*n*s*elifs*r*n*", flags=(re.DOTALL)) lg.add("ELSE", "r*n*s*elses*r*n*", flags=(re.DOTALL))
  在实现高亮不久后,就发现了这个雷。由于这个分词规则,之前采用的简陋的判断注释算法会导致假注释段,比如这样的 else 就被误认为注释:
  为了尽快搞定复杂度 N,暂时采取了对分词结果中的后大括号作处理、根据换行数量调整行号的方法,这样就可以准确地计算每行未匹配的大括号数量(原始方案不存在这个问题是因为每次新加的"当前行"都不包含行末换行符),并对部分假注释段作了清理,但其他类似雷还未清。小结
  现在测试格式化(仅基于大括号位置自动调整缩进)性能,34 行的井字棋界面在 20 毫秒内,318 行的"儿歌.ul"在 80 毫秒以内(150 倍,不算标题党吧),效果如预期。
  虽然仍在雏形阶段,但似乎离用木兰实现的编辑器编写木兰代码又近了一步。下面打算先搁置之前的"井字棋",先将完成一个最简易的木兰代码编辑器作为短期目标,并为此复现需要的木兰编程语言功能。暂时想到的功能有:保存当前文件根据输入内容更新高亮
  这样就可以在建设木兰生态的同时检验木兰编程语言的功能和实用性。附录:代码量统计
  主要部分的代码行数统计,格式为:上次->现在。木兰代码量(总木兰代码量超越 Python 代码量 lol)编辑器,实现与测试都是木兰代码:184 -> 333木兰测试用例,包括部分使用小程序:2074 -> 2160
  Python 代码量(包括测试部分):2379 -> 2396分析器/语法分析器.py:953 -> 958分析器/词法分析器.py:198测试/运行所有.py,检验所有木兰测试代码片段:185环境.py,定义全局方法:156 -> 157分析器/语法成分.py,从语法分析器中提取出来的枚举常量:79未变分析器/语法树.py:178交互.py,交互环境(REPL):138功用/反馈信息.py:49中.py,主程序:41分析器/错误.py:17测试/unittest/语法树.py,确保生成的语法树与原始版本一致:67测试/unittest/交互.py,交互环境相关测试:28

比亚迪e平台升级3。0四位一体,全方位满足客户需求金秋9月,比亚迪全力打造的e平台3。0终于与各位车粉们见面。在e平台3。0发布之时,比亚迪集团的董事长王传福就在会上对这一平台的未来发展进行了展望。他认为这一平台是比亚迪从新能源汽钜惠来袭!华为智慧屏V75Super以极致音画引领电视新体验全场景的智慧生活体验是每个人都向往的,尤其是将家中智能家居产品全部联动起来的感受,绝对能够让生活品质提升一大截。在全场景智慧生活解决方案中,华为做得非常不错,尤其是前不久上市的华为40dB深度降噪无线充电南卡A2真无线蓝牙耳机好用的高品质耳机伴随苹果AirPods的推出,各类TWS真无线蓝牙耳机很快进入我们的生活中,之所以会选择TWS耳机,主要是其体积小巧,无线使用方便,而且这些年国产TWS耳机品牌样式层出不穷,价位也参加内存升级服务,华为旧手机也能有新体验相信大家都发现了这样一个问题,我们刚购买新手机回家的时候手机是一般不会出现卡顿这样的问题的,只有等到使用过一段时间之后,手机的卡顿情况才会变得越来越明显,甚至还会出现存储空间不足的须眉剃须刀R2潮玩家一个实力与颜值并存的帮手前一段出差,男友说要陪我一起去,然后我便帮他收拾了一下行李,从来没有关注过他的剃须刀,收拾的时候,一个黑色的块头很大又很沉的不知道什么牌子的剃须刀就被他随手扔进了行李箱。我当时就在京东方董事长的内部信原文记录用心改变生活是重点10月12日,BOE(京东方)宣布了品牌定位的升级,以全新面貌出现在大众面前,发布了新的品牌使命品牌原则,以及品牌承诺,迎来阶段性跃升。其中,用心改变生活的品牌使命代表京东方揭开了宅家也能享受专业指导FITMORE智能健身镜一面神奇的魔镜每个人都有健身运动的需求,不论是小哥哥们的增肌强体,还是小姐姐们的塑造身形,或是老人们的舒筋展骨,或是小朋友们的成长打闹。规范且适量的运动,不仅能够让我们实现前面的愿望,更能让我们我的枕头会唱歌安静不打扰的助眠好物南卡Zzzz骨传导蓝牙音箱体验享受婴儿般的睡眠,是我们多数人的梦想。但现实是由于工作生活身心状况居住环境等诸多因素的影响,睡眠时间短,质量不佳,成了常态。另外,短视频,网络游戏等还在不断蚕食我们的睡眠时长。有调来自东方的设计美学!ColorOS12提出降噪理念,布白设计极具美感时隔一年,在9月16号的OPPO秋季新品发布会上,全新的ColorOS12终于和我们见面了。上一代的ColorOS11就凭借其精致美观的UI设计优秀的系统流畅度人性化功能等方面赢得打破千篇一律时尚侧滑设计努比亚新音T1真无线耳机好音质低延迟如今的无线蓝牙耳机市场,可谓是五花八门,纷乱繁杂,对于一般用户而言,要选择一款适合自己又有些个性的耳机,还是有一定困难的。虽然各家出品的TWS在品牌价格上各有差异,但在耳机主体设计爱了爱了!这又好看又舒缓的咕咚熊猫款运动舒缓拖鞋每个人都买过拖鞋,也拥有过很多双拖鞋,但这看似平常无奇的小物件,其实对于我们生活品质的提高还是很有帮助的。鞋子不仅仅是大小合适,耐穿耐磨,更要贴合脚型,缓压舒适。拖鞋的使用场合多为
被判退一赔三后,特斯拉将胜诉车主告上法庭索赔505万元!车主称银行卡被冻结9月26日,特斯拉退一赔三案胜诉车主韩某表示,特斯拉方面近期以自己侵犯其名誉权为由,将自己告上法庭,并要求公开赔礼道歉,合计索赔505万元。据韩某发布的起诉书显示,原告(特斯拉)表拆解iPhone13核心元件,基本都是美国的,中国供应商要加油众所周知,在苹果的Top200供应链中,中国厂商的数量是越来越多,2020年甚至占到了57,高达114家。但有一个比较客观的事实,大家也要承认,那就是中国供应链再多,提供的其实也是焦点访谈丨人工智能云计算聚焦互联网最新发展趋势乌镇见证中国数字经济蓬勃发展2021年世界互联网大会乌镇峰会9月26日开幕。国家主席习近平向峰会致贺信。今年大会的主题为迈向数字文明新时代携手构建网络空间命运共同体。近2000名来自80多个国家和地区的代表通iPhone13mini真实续航体验,提升明显,日常完全够用从6S一直到12mini,一直钟爱小屏手机,一手掌握的感觉真的是太好了。毕竟对于玩游戏电脑和主机更好玩,看视频电视和平板屏幕更大体验更好。对于非手机重度用户,小屏手机这种轻便顺手才杨浦区的发展现状和前景怎么样,适合投资吗?个人感觉杨浦区可以的,尤其是东外滩板块,12号线,18号线投资可以选择近地铁一些的,出租便利,出手方便杨浦这边拥有大学城,数一数二的教育和医疗资源,现在杨浦大力发展五角场,整个杨浦国产手机中,华为小米魅族哪个更好?感谢邀请。客观的说,三个手机品牌并没有绝对的好与坏,可以说各有千秋,也有个自的优势和短板,我个人比较喜欢小米,对华为和魅族也不排斥。小米手机,创办于2010年,2011年8月16日高通华为都没有全部5G专利,为什么总听说要向高通交专利费,高通需要向华为交吗?极客谈科技局,全新视角全新思路,伴你遨游神奇的科技世界。高通与华为之间均具有部分5G网络的专利,并且华为专利数量领先于高通。为何华为需要向高通交纳5G专利费,反之高通不需要向华为交俄罗斯为什么不担心芯片和光刻机的问题?众所周知,如今的汽车,飞机等交通工具手机,电脑,基站等通讯工具,都离不开芯片。当然,芯片也可以称为广义的CPU。也就是说,芯片已经涉及我们生活中的方方面面。不仅如此,芯片也成为一条什么是隐私计算技术?在数字化浪潮推动下,数据领域的技术创新场景应用与管理服务日益成为各个行业领域数字化转型发展的重要驱动力。同时,数据流通与数据安全间的矛盾也日益升级,成为影响数字化发展的制约因素。安如何干掉阿里巴巴?只有不希望国家好的人才希望干掉阿里巴巴为啥要干掉阿里巴巴?阿里是外资控股80的互联网巨头,它的财富是8亿消费者创造的!为什么这样说呢?今天是流量为王,如果消费者的手机不下载他们的A财经金融企业负面舆情监测怎么做?做法一构建舆情监测系统当前,网上的财经金融数据信息多且杂,又是实时在更新,依靠传统的方式监测行不通。因此,可以通过构建一套专业的网络舆情监测系统辅助监测。如鹰眼速读网系统就支持全网