电脑解决问题处理
发布网友
发布时间:2022-04-21 04:01
我来回答
共4个回答
懂视网
时间:2022-04-19 05:47
没有接触过meta programming, 感觉"manipulate other programs (or themselves) as their data"这个说法有点虚, 能否给一些确切的例子说明其妙用之处?
另外, 为什么说LISP与Ruby在meta programming上比Python做得要好?
回复内容:
如果把元编程定义为对程序进行操作的编程,那么,似乎没有理由把eval排除于元编程之外。
至于到底是应该编译期还是运行期,我觉得还真是无所谓的。
元编程显然是多提供了一个抽象层次,相当于让你不仅可以通过一个层次去抽象问题,还能通过另一个层次对你的问题模型进行抽象。如果用的好,这似乎提供了巨大的能量。不过,这也似乎超出了大多数人的脑部运作规则,不太适合大面积推广。
至于monad,如果专注于它可以重定义;也就是定义运算序列的能力的话,也勉强可以算是元编程吧。
说个题外话:
上面有人提到REBOL,说它的元编程不好,我的感觉明显不同。由于REBOL采用最简语法作为它的form,这就导致了自定义dialect可以做到非常自然和直观,因而其元编程更自然,更漂亮。
Ruby元编程这本书的引言就讲的其实挺清楚的。
我到是建议你看完这本书,相信你能够理解的,里面例子还不错,这本书我还没看完。我现在手边就是。
顺便说说Lisp,大家都知道“代码及数据”这回事,其实就是这样子一回事。元编程的定义就是写出编写代码的代码,lisp里面quote可以阻止求值,到需要使用的时候用eval就行了。然后在运行的时候操作自己的代码也是他另一个含义。可以call 它叫动态元编程,以此区分代码生成器以及编译器方式的静态元编程。
批量生成各种代码(类,方法,测试等等),减少编程时的重复操作。各种DSL,code generator,scalfolding,project bootstraping都受益于meta programming。
编程(programming)是对于某类问题解决方法的抽象。
而元编程(meta programming)则是对于某类解决方法的抽象。
也就是说,元编程是对于编程的抽象。
至于说到DSL这部分我不敢苟同,诚然,ruby圈的DSL有泛滥的趋势,为了DSL而创造DSL、为了炫技而DSL,但是这些不是重点。DSL的出现是高度抽象的必然结果,脱离了抽象的DSL自然会死亡。
举几个栗子:
ORM我有现在有N个实体类,我需要把这些实体类持久化储存。所以我写了N个DAO。后来发现,DAO这些东西好像很无聊嘛,无非就是那么几步,根据实体类名称创建表,根据属性创建数据库字段,然后增删改查。(ORM)
为了解决这些“相似的重复劳动”,我们需要某种机制,能够将我的一个"meta program"转化成具体的某个program。这就是抽象层次的差别。
ORM的基本步骤:根据实体类类名确定数据库表名,根据实体类属性确定数据库字段,统一的insertdeletefindupdate 方法,根据属性与数据库字段的对应关系完成数据恢复与保存。在java中,我们通过反射拿到类名和数据库字段,利用泛型+集成得到insertdeletefindupdate以及各种公共方法。结果就是你只需要简单继承一个父类,就可以完成DAO的操作。 (GitHub - satyan/sugar: Insanely easy way to work with Android Database.
这里有一个例子)
语法分析与词法分析语法分析与词法也是一类具有很大相似性但是又有区别的事情。一个典型的例子就是lex&yacc(flex&bison), lex是一个词法分析器,yacc是一个语法的分析器(“分析器”的措辞可能有些不严谨)。对于词法/语法分析而言所以,lex接受一个.l文件,yacc接受一个.y文件,他们的结果是生成.c代码。通过DSL来生成代码,这是编译型语言做的事情(对于c++了解不多,尤其是c++新标准引入了许多新特性,
据说可以达到动态语言一样的便捷程度)分析器的本质是一个有限状态机,状态机的核心工作应该是划分状态,通过meta programming,我们可以避免编写状态机的“重复劳动”(严格来讲应该是相似劳动)
《Ruby元编程》中的一个例子:擦屁股专员的重复代码你是一个擦屁股专员,你接手一个老旧的设备信息系统,它维护者每台计算机的的设备信息与价格。这些数据来自一个古老的数据源(DataSource)。所以你有一堆类似:
ds=DataSource.new
ds.get_mouse_info(workstation_id)
ds.get_mouse_price(workstation_id)
ds.get_keyboard_info(workstation_id)
ds.get_keyboard_price(workstation_id)
这样的函数还有一打,计算机的每一个零部件都有这样的一个函数。
为了配合新的报表系统,你需要返回一个封装好的对象,这个对象针对每一个部件都有一个独立的方法返回一个包含描述和价格的字符串。很显而易见,如果不想想什么办法的,未来的很长一段时间你都在拷贝、粘贴代码的泥潭中挣扎。
每个方法都类似,每一个名为xxx的方法,首先通过ds.get_xxx_info获得信息,然后ds.get_xxx_price获得价格,然后拼接字符串...
解决方案:对于ruby,利用动态派发(send)动态创建方法,甚至我们可以通过获取内省来获取datasource有哪些方法,得知有哪些部件,然后为这些部件创建方法。作为回报,你根本无需去创建维护一个部件列表,如果有人在DS类中增加了一个新部件,你的Computer类将会自动的支持它。
---------------------------------------------------探讨------------------------------------------------------
对于javascript程序员而言 ,依旧可以采用同样的模式,内省+动态添加函数。
py这方面用的不多,就不说了,理论讲应该是类似的。
java比较麻烦的是你不能动态添加方法,所以只能退而求其次,提供一个部件列表和一个String get_info(String component)函数。通过反射来获取部件列表和调用函数。
c语言除了生成代码以外,似乎别无他路。
ActiveRecord用过的人都说好。它里面的许多花样与魔法都是利用元编程实现的。
原则上说,目前能看到的 Meta Programming 有两种,第一种专注于重新构成语法,即 DSL,Lisp/Scheme 属于此类,这几年的新科状元 Ruby 也属于这一派,甚至还有走得更远但相对小众的 REBOL Language
;第二种专注于在编译期进行计算和分派以达到针对特定场景的自动代码选择优化,C++ 的模板属于此类。C 的宏则兼有两者,但能力都比较弱。据我见过的情况,学院派的比较认可前一种,后一种则借 C++ 的东风用得更广泛。
问题引言里的那句话,我认为是在说 C++,因为它强调了 do part of the work at compile time。但 Python 的 Meta-programming,我闻所未闻。Python 1.2 开始用到现在,我确实没有听说 Python 有什么构建 DSL 的能力,更遑论所谓 Meta-programming。Python 社区的文化,也向来没有在语法上玩花样的传统。于是大略查了查,它说的是应该是第三项东西:类结构动态调整,本质来说,就是反射(reflection)。参照 DeveloperWorks 上的这一篇:Metaclass programming in Python
,以及这一篇:Metaprogramming
。不难看出,这两篇文章谈的是完全另一个话题。因此谈所谓 Lisp 和 Ruby 在 Meta-programming 上为什么比 Python 做得好,在我看来是一个伪命题,因为两者说的 Meta-programming 的内涵和外延都不一样。
在实际工作中,无论哪一种 Meta-programming,我都持否定态度。但理由和前面朋友的观点不同。我认为 Meta-programming 破坏了交流中的一项基本原则:同样的编程语言,应当有同样的交流习惯。过于随意地构造 DSL,让程序员之间的交流变得更加困难。这一方面的典型例子是 REBOL,几种 DSL 语法差异明显,重新学习的成本过高,也实际上助长了社区的分裂倾向。闲来无事,自己玩玩也就算了;放在工作里,害人害己。
至于 Lisp/Scheme 家族的 Meta Programming,与其说是做得更好,倒不如说是语法结构过于简单导致其怎么变换都是长得一个样子。关于这一点,不妨对比一下 REBOL,它构造出来的几个 DSL 语法上没有多少相似之处。不过,对我来说,Lisp/Scheme 这种语法简单其实才是我喜欢的 Scheme:编译器的设计者可以把更多的精力花在运行时和优化上。
还是那句话,我们写程序是为了解决问题。抽象和表达方式是手段,不是目的。汲汲于语法上的花头,是耍滑头。
我平时也不怎么用这个东西,主要是我喜欢的语言meta programming的能力也不大。为什么说LISP和Ruby的meta programming比Python好是因为,他们拥有“在编译时或者运行时重新读取自己的代码然后修改重新编译的能力”,譬如说LISP的宏,譬如说Ruby的DSL的写法,譬如说F#的computation expression,譬如说C#的linq和Expression
,譬如说C++的模板(这个就比较牵强了),譬如说Haskell的monad。Python毛都没有。
不过我觉得这个功能用处不大,没事还是不要凑合了。
不清楚元编程要解决什么问题,但是可以说说Ruby元编程的应用:
1,Rails完全是成就于Ruby的元编程能力之上。
2,Ruby社区涌现出的各种优秀工具,无不借了元编程之力。
3,在Ruby中,元编程不特殊,它就是编程。
以上所说只是针对于说元编程没大用的那些答案。
Lisp的程序和数据都是基于List,所以只要能够生成list结构,就能相当于能够生成代码,而Lisp的真正强大的宏机制,就是运行时的代码展开与求值。
几乎任何一个稍微大一点的Lisp程序多少都会有一些用来定义宏或者用宏编写的代码。
Ruby的元编程继承自Lisp和Smalltalk,一方面可以通过eval来动态执行代码,另外可以通过构造的语言闭包来打开和关闭作用域。而且有非常简洁和内省/反射机制来对程序的运行时状态判断,进而辅助代码的生成。
C++的模板元编程的作用机制在于编译期,通过模板对类型和数据的计算来进行展开生成代码,所以才会有十分强大和通用的STL(标准模板库)的出现。
Python在某种程度上还是可以进行元编程的(修改元类/数据?),只是灵活程度不够高,所以少有人用,Python 的哲学态度决定了这个社区会尽量选择远离元编程这东西。
确切的例子比如Ruby的ActiveRecord,参见Active Record Query Interface和rails/activerecord。
绝大多数的Ruby DSL都应用了Metaprogramming技巧的,另有书籍:Ruby元编程 。
如果深入研究,元编程的作用还是很大的。抽象能力比之于简单的代码提升了不止一个层级。
这样来说吧:
工业时代初期,是这样的情况:
人生产机器,机器生产产品。
到了后期:
人生产机器,机器生产机器,机器生产产品。
显然,机器生产机器是一个了不起的进步,这大大的解放了劳动力。
元编程就类似于机器生产机器,简单说就是程序可以自己改变自己或者生成新的程序。这样的当然大大的解放了程序员。
当然,事实上在元编程之前,程序员就发明了大量的辅助工具来帮助自己编程,例如IDE什么的。只是后来程序员觉得IDE啥的还是太弱了,就能查找替换跳到引用套用模板啥的,要是程序可以自己生产自己该多好。
====================科普完毕,下面是不负责任的畅想=====================
事实上meta-programming一直都不是一个定义良好的概念,主要是meta(元)这个词本身的含义就很模糊。
元一般被理解为更基本的,更基础的。元编程就是比程序更基础的的编程,也就是程序生成程序。从这个角度上来说,无论是C++的模板、C的宏、.NET的Emit和Compiler Provider、JavaScript的字符串拼接和eval,甚至于什么动网代码生成器,都是程序生成程序。
但是一般而言,要称得上元编程还是要满足一定的条件,当然,由于元编程这个概念并非是定义良好,这些条件也只能算得上是什么共识。这个语言的特性被A当作是元编程,而B不这么认为是很正常的事情,下面列举的这些条件,仅仅只是站在我的角度认为的:
1、具备元编程能力的语言,必须是可以产生同一程序设计语言代码的语言,而不能是用一种语言产生另一种语言的程序。这就把代码生成器排除在外了。
2、具备元编程能力的语言,元编程产生的程序代码,必须能够通过词法分析。这一条把C的宏排除在外和JavaScript的eval排除在外了。
……
可以看出来,到底算得上元编程,采用不同的限制条件可以得到不同的结果。当我们讨论一个程序设计语言是不是可以元编程时,条件1基本是可以达成共识,条件2就各有各的看法。
话说元编程最初产生的时候,单纯只是为了减轻程序员的负担,C++的模板最初只是重载的一个延伸。由于强类型的缘故,C语言必须针对不同的类型编写一大堆重复的代码,重载解决了这些重复代码的名称污染,而泛型则开始解决这些代码的重复。但C++标委会那群家伙显然不会像Anders那样止步于泛型,高端大气上档次一直是C++努力不懈的追求,所以泛型就被搞成了模板,更进一步的,程序员也一起来Happy,就玩出了C++模板元编程。
先写到这里吧,
元编程就是写出可以产生代码的代码。有了这样一层抽象,会让你的程序更有扩展性,适应更多的未知的场合。java里的反射,c++里的STL的模板,还是ruby里各种神奇的转发代理,这些都是元编程的应用。rails的成功构建于ruby强大的元编程,这也是rails为什么没有选择其他语言的原因。
热心网友
时间:2022-04-19 02:55
在这里普及一下电脑常见问题和解决方法,以便大家在以后遇到问题是不至于手忙脚乱,让大家在电脑出现问题时你的文件不会遗失,尽可能在问题出现后将损失最小化,希望能带你你帮助
电脑出现问题先考虑软件问题,再思考硬件问题,如果电脑在保修期内大家可以去售后维修,但是小编从来不是找售后的,因为售后也会坑人,所以我都是自己动手的,相信自己,你学一点基础的,在出现问题的时候就自己搞定了,想学习修电脑,后期会推出一系列维修电脑的知识,有兴趣的可以关心!
一、Win Update问题9
这种问题常见到的是Win7系统,在开机时候一直显示“正在更新,请勿切断电源”,如果这个时候急用电脑又不知道该如何操作,很是抓狂。这种问题在Win8以上的系统里常见的是一直自动更新。
搞定方式如下:进入控制面板,找到Win update,设置从不更新。如果是Win7上述情况,可以强制关机,开机进入安全模式设置后重新启动。
电脑常见问题的解决方如果Win系统出现了一些问题,我们可以运行Win Update系统更新,将所有补丁打好,或是尝试下载新的驱动程序。这个功能相当于用安全管家等软件更新漏洞,打补丁。
二、电脑运行太慢问题
这个可以看往期文章,里面有搞定方案,欢迎收藏
三、网速太慢问题
如果你网速慢,可以登录Speedtest.net这样的测速网站来测验一下网络速度,如果速度的确缓慢,再检查路由器,如果都正常的话,就可以带电话给宽带供应商咨询一下是否网络服务出现问题。如果始终无法连接有线或是WIFI,可能是硬件出现问题,先尝试下载安装最新驱动,再测验硬件是否正常,如果需要测验方式可以百度运用网友的方式。
四、电脑不断重新启动问题
电脑不断重新启动通常是两个方面造成的,一是感染了病毒,可以进入安全模式进行病毒查杀。如果情况依旧,则有可能是硬件散热不佳导致,所以在所有硬件都得到正常的驱动更新之后,可以对电脑进行清理。
五、无线网络无法连接
有时候,Win始终无法连接WIFI无线网络,或是一直显示受限,我们可以先通过系统内的“疑难解答”和“自动检测修复”功能寻找问题根源搞定问题。如果问题依旧,则逐步检查路由器或是PC硬件。
“此网站的安全证书有问题”
此类网络问题可以选择360或者电脑管家等软件进行网络修复,电脑上尽可能下载一款安全软件,以防木马或者病毒侵入,保护文件安全!
热心网友
时间:2022-04-19 04:13
计算机解决问题的过程是:分析问题、设计算法、编写程序、调试运行、检测结果。
计算机解决问题的过程也是程序设计的过程。程序设计是运用计算机解决问题的一种方式,有些问题,如:数值、逻辑等问题适合于通过程序的方式解决。通过实例问题的分析、设计算法、把所要解决的问题转化成的程序输入到计算机、经调试后让计算机执行这个程序,最终达到利用计算机解决问题的过程。
编写程序是以下步骤的一个往复过程:编写新的源代码,测试、分析和提高编写的代码以找出语法和语义错误。从事这种工作的人叫做程序设计员,由此产生了不同种类的程序设计员,每一种都有更细致的分工和任务。软件工程师和系统分析员就是两个例子。编程的长时间过程被称之为“软件开发”或者软件工程。后者也由于这一学科的日益成熟而逐渐流行。计算机程序数据可以被定义为被程序处理的信息。当我们考虑到整个计算机系统时,有时程序和数据的区别就不是那么明显了。*处理器有时有一组微指令控制硬件,数据可以是一个有待执行的程序,程序可以编写成去编写其它的程序;所有这些例子都使程序和数据的比较成为一种视角的选择。有人甚至断言程序和数据没有区别。
编写一个程序去生成另外一个程序的过程被称之为原编程(Metaprogramming)。它可以被应用于让程序根据给定数据生成代码。单一一个程序可能不足以表示给定数据的所有方面。让一个程序去分析这个数据并生成新的程序去处理数据所有的方面可能会容易一些。Lisp就是一例支持这种编程模式的程序语言。
在神经网络里储存的权重是一种数据。正是这些权重数据,跟网路的拓扑结构一起,定义了网络的行为。人们通常很难界定这些数据到底表示什么或者它们是否可以由程序来代替。这个例子以及跟人工智能相关的其它一些问题进一步考验程序和数据的区别。
热心网友
时间:2022-04-19 05:47
电脑常见问题解决!各种疑难杂症的处理方案!今天就来帮帮你!
最近在私信和评论区受到很多朋友关于电脑方面的问题,由于一个一个回复工作量有点大,于是就在这里对几个比较常见的问题单独拿出来讲一下,希望能够帮到大家,当然,有时间的话我还是会尽量给大家一个一个回复的。
问题一,我的电脑更新驱动之后老是蓝屏死机,咋整啊?
回答:其实这是一种很常见的问题,也不是一个单独的问题,这是一个系列的问题。比如我安装了什么软件,或者更新了驱动,打了补丁然后电脑就开始蓝屏了。这种问题一般都是你最后的一波操作导致的,一般来说软件增面上的问题重装系统能解决90% 的问题。
再就是有朋友直接找我,我问:你最近对电脑做了啥? 他回答:我啥也没干啊?
我再问:啥也没干就蓝屏死机了? 他回答说:对啊!
你这不在这扯犊子么?好好的电脑啥也没干,隔了一天蓝屏死机了?肯定还是你最后做了点什么!
我也经常远程帮助小白解决问题,有时候跟我说电脑开不了机了,按电源键一点反应没有,我让他发照片。
你这电源开都没打开,那他电脑能亮啊,真就用爱发电?
所以遇到这类问题不要急着说:我没干!我没弄! 那你自己的电脑,你啥也不*自己就坏了,那电脑是不是被你气坏的?
问题二:这个散热压不压得住我这个处理器?我这个机箱需不需要加装风扇?
回答:首先是散热器,我这里给朋友搭配主机,一般9400以下都是双铜管散热,但是有很多朋友就会问我,这个散热器会不会压不住啊?要不要换个好点的四通管的啊?
其实这都是没什么必要的,我这装机或者其他地方装机也好,他给你上玄冰400也好,暴雪T400i 这一类的也好,其实就是能让CPU的满载温度更低。但是吧,你日常使用是根本用不到AIDA64 这种专业软件双烤的压力,所以,双铜管完全可以满足,你也不用担心CPU温度太高会烧坏,他和人一样,温度太高受不了了,他也会自动降频给自己降温的。
然后就是机箱需不需要安装格外的排气扇,排气扇到底应该怎么安装。
基本上吧,你去买机箱,都会看到商家给你很详细的标注这个机箱的风道以及风扇到底是该进风还是出风。基本都会给你想下边这张图一样标注出来,很详细。
简单概括就是:前进、后出、下进、上出。不要担心下边进风会变成吸尘器,不会啊,没那么夸张啊,实在不行你下边就别安呗。
再就是需不需要额外加装风扇,这个都是因人而异的。有的人安装不是为了散热,就是为了炫!什么神光同步,光污染这一类对自己机箱的颜值要求比较高的朋友,他们安装风扇的目的是这个。
当然,也有朋友确实是担心散热不行,可能是住在南方的兄弟 ,夏天温度比较高,那你也可以适当加装几个排风扇辅助散热。
问题三:我以前装了一根内存,最近又想加装一个,结果买回来同一个型号同一个系列插上电脑不亮了?
回答:这种问题其实也很好解决,因为内存这种东西不是同一批次的内存 ,就算型号相同可能用的颗粒也不相同。就像我前不久帮别人组装了一套机器,用的都是十铨的套条,但是一个是镁光的颗粒,另一个则是海力士的。你如果买单条就更容易出现这种情况,既然核心的颗粒都不相同,那你插上去肯定是点不亮了。
所以你可能会觉得,我去,这刚买的内存就是坏的?但是你把老内存拔了,只插新的,我估计他也能亮,这时候千万别怀疑是主板坏了,去用专业软件查一下内存颗粒看看是不是一样的,再做决定。