精华内容
下载资源
问答
  • PYTHON是一门动态解释性的类型定义语言:编写时无需定义变量类型;...类型和弱类型主要是站在变量类型处理的角度进行分类的。 类型是指不允许隐式变量类型转换,类型则允许隐式类型转换。 所以,关
  • 类型和弱类型的语言有什么区别

    万次阅读 多人点赞 2019-09-11 17:20:50
    类型语言  类型语言也称为类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。  java、.NET、C++等都是... 与其相对应的是类型语言:数据类型...

    强类型语言

      强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。

      java、.NET、C++等都是强制类型定义的。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。

    例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。

      与其相对应的是弱类型语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

      强类型和弱类型的语言有什么区别

      弱类型语言

      弱类型语言也称为弱类型定义语言。与强类型定义相反。像vb,php等就属于弱类型语言·

      一种类型可以被忽略的语言,与强类型定义相反。VBScript是弱类型定义的。在VBScript中,可以将字符串‘12’和整数3进行连接得到字符串‘123’,然后可以把它看成整数123,而不需要显示转换。

      但其实它们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变量前加了一个clong()或(int)()这样的转换函数而已。能做到这一点其实是归功于VB的编译器的智能化而已,这并非是VB语言本身的长处或短处。

      强类型语言和弱类型语言的区别

      编译型和解释型

      我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时就会生成目标文件(Object file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了,但由于只是整个项目的一部分,所以我们还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,这个工作由另一个程序负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以又称为链接(Link),而负责链接的程序就叫……就叫链接程序(Linker)。链接程序除了链接目标文件外,可能还有各种资源,像图标文件啊、声音文件啊什么的,还要负责去除目标文件之间的冗余重复代码,等等,所以……也是挺累的。链接完成之后,一般就可以得到我们想要的可执行文件了。

      上面我们大概地介绍了编译型语言的特点,现在再看看解释型。噢,从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。

      两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断地解释、执行、解释、执行……所以,解释型程序是离不开解释程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC程序,就得进入BASIC环境,然后才能加载程序源文件、运行。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的Compiling…Linking…这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。

      编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。

      但既然编译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势,例如Java语言虽然比较接近解释型语言的特征,但在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。而像VB6(或者以前版本)、C#这样的语言,虽然表面上看生成的是.exe可执行程序文件,但VB6编译之后实际生成的也是一种中介码,只不过编译器在前面安插了一段自动调用某个外部解释器的代码(该解释程序独立于用户编写的程序,存放于系统的某个DLL文件中,所有以VB6编译生成的可执行程序都要用到它),以解释执行实际的程序体。C#(以及其它.net的语言编译器)则是生成.net目标代码,实际执行时则由.net解释系统(就像JVM一样,也是一个虚拟机平台)进行执行。当然.net目标代码已经相当“低级”,比较接近机器语言了,所以仍将其视为编译语言,而且其可移植程度也没有Java号称的这么强大,Java号称是“一次编译,到处执行”,而.net则是“一次编码,到处编译”。呵呵,当然这些都是题外话了。总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。

      动态语言和静态语言

      通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。

      (1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

      (2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

      对于动态语言与静态语言的区分,套用一句流行的话就是:StaTIc typing when possible, dynamictyping when needed。

      强类型定义语言和弱类型定义语言

      (1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

      (2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

      强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!

      例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言);JAVA是静态语言,是强类型定义语言(类型安全的语言)。

      静态类型定义语言

      一种在编译时,数据类型是固定的语言。大多数静态类型定义语言强制这一点,它要求你在使用所有变量之前要声明它们的数据类型。Java和C是静态类型定义语言。

      动态类型定义语言

      一种在执行期间才去发现数据类型的语言,与静态类型定义相反。VBScript和Python是动态类型定义的,因为它们是在第一次给一个变量赋值的时候找出它的类型的。

      强类型定义语言

      一种总是强制类型定义的语言。Java和Python是强制类型定义的。如果你有一个整数,如果不显示地进行转换,你不能将其视为一个字符串。

      弱类型定义语言

      一种类型可以被忽略的语言,与强类型定义相反。VBScript是弱类型定义的。在VBScript中,可以将字符串‘12’和整数3进行连接得到字符串‘123’,然后可以把它看成整数123,而不需要显示转换。但其实它们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变量前加了一个clong()或(int)()这样的转换函数而已。能做到这一点其实是归功于VB的编译器的智能化而已,这并非是VB语言本身的长处或短处。

      结论:

      静态是类型编译时判断;动态是类型运行时判断;强类型是类型独立,不轻易转化;弱类型是类型不严格区分,一般是只要大小放得下,就可以转化。这种是汇编级的观点。面向对象的观点并非这样的,对象并不是大小差不多就是类型兼容,而是关键的接口要相同才叫类型兼容。

      动态语言并非是弱类型,这是不等价的。恰好的,一般动态语言都是强类型语言,因为都是遵照面向对象的观点来设计对象的。

      动态语言的劣势很明显,就是缺少开发环境,运行效率差,当然语言设计上也不完美(静态语言何止千万,但c++也就一个)。

      优势也很明显,就是编写容易,层次高,接近自然语义。动态类型语言效率低下的原因,不在于变量的类型是动态的,而在于对象的方法是动态联编的,在这一点上动态类型语言和Java没什么不同。

      静态类型语言的优势究竟是什么?

      观点一:静态类型语言因为类型强制声明,所以IDE可以做到很好的代码感知能力,因为有IDE的撑腰,所以开发大型系统,复杂系统比较有保障。

      对于像Java来说,IDEA/Eclipse确实在代码感知能力上面已经非常强了,这无疑能够增加对大型系统复杂系统的掌控能力。但是除了Java拥有这么强的IDE武器之外,似乎其他语言从来没有这么强的IDE。C#的VisualStudio在GUI开发方面和Wizard方面很强,但是代码感知能力上和Eclipse差的不是一点半点。至于VisualC++根本就是一个编译器而已,羞于提及Visual这个字眼。更不要说那么多C/C++开发人员都是操起vi吭哧吭哧写了几十万行代码呢。特别是像LinuxKernel这种几百万行代码,也就是用vi写出来的阿,够复杂,够大型,够长生命周期的吧。

      观点二:静态语言相对比较封闭的特点,使得第三方开发包对代码的侵害性可以降到很低。动态语言在这点上表现的就比较差,我想大家都有过从网上下载某个JS包,然后放到项目代码里发生冲突的经历

      也就是说静态类型语言可以保障package的命名空间分割,从而避免命名冲突,代码的良好隔离性。但是这个观点也缺乏说服力。

      静态类型语言中C,VB都缺乏良好的命名空间分割,容易产生冲突,但是并没有影响他们做出来的系统就不够大,不够复杂。

      而Visual C++开发的DLL版本冲突也是臭名昭著的,似乎C++的命名空间没有给它带来很大的帮助。

      而动态类型语言中Ruby/Python/Perl都有比较好的命名空间,特别是Python和Perl,例如CPAN上面的第三方库成吨成吨的,也从来没有听说什么冲突的问题。

      诚然像PHP,JavaScript这样缺乏命名空间的动态语言很容易出现问题,但是这似乎是因为他们缺乏OO机制导致的,而不是因为他们动态类型导致的吧?

      说到大型系统,复杂业务逻辑系统,Google公司很多东西都是用python开发的,这也证明了动态类型语言并非不能做大型的复杂的系统。其实我个人认为:

      动态类型语言,特别是高级动态类型语言,反而能够让人们不需要分心去考虑程序编程问题,而集中精力思考业务逻辑实现,即思考过程即实现过程,用DSL描述问题的过程就是编程的过程,这方面像UnixShell,ruby,SQL,甚至PHP都是相应领域当之无愧的DSL语言。而显然静态类型语言基本都不满足这个要求。

      那静态类型语言的优势究竟是什么呢?我认为就是执行效率非常高。所以但凡需要关注执行性能的地方就得用静态类型语言。其他方面似乎没有什么特别的优势。

      给你来个例子把

      弱类型语言vbs:

      a=1

      b=a+“1”+“a” //结果是11a,这里 a 成了字符串

      c=a+1 //结果是2 ,这里a则是数字型

      强类型语言:c#

      int a=2

      string b=a.ToString()+“1”+“a”

      int c=a+1

      看到了吗?区分大小写,需要实现申明类型外,一个重要的区别是,弱类型的语言的东西没有明显的类型,他能随着环境的不同,自动变换类型

      而强类型则没这样的规定,不同类型间的操作有严格定义,只有相同类型的变量才能操作,虽然系统也有一定的默认转换,当绝没有弱类型那么随便

      ps:弱类型代码简单,但因为变量没有确定的类型,所以容易出错!强类型代码复杂(比如:转换日期显示格式 (convert.toDateTIme(“2007-1-1 08:08:08”)).ToString(“yyyy-MM-dd”),呵呵你可以看到这种写法相当麻烦),但因为有严格定义所以不容易出错

    展开全文
  • 人工智能和弱人工智能

    千次阅读 2020-05-20 13:09:34
    但人工智能研究者不一定同意人工智能,也不一定在乎或者了解人工智能和弱人工智能的内容与差别,对定义争论不休。 就当下的人工智能研究领域来看,研究者已大量造出“看起来”像是智能的机器,获取相当丰硕的...

    来源:人机与认知实验室

    人工智能的一个比较流行的定义,也是该领域较早的定义,是由当时麻省理工学院的约翰·麦卡锡在1956年的达特矛斯会议上提出的(对此有争议):人工智能就是要让机器的行为看起来就像是人所表现出的智能行为一样。但是这个定义似乎忽略了强人工智能的可能性。另一个定义指人工智能是人造机器所表现出来的智能。总体来讲,当前对人工智能的定义大多可划分为四类,即机器“像人一样思考”、“像人一样行动”、“理性地思考”和“理性地行动”。这里“行动”应广义地理解为采取行动,或制定行动的决策,而不是肢体动作。

    强人工智能

    强人工智能观点认为“有可能”制造出“真正”能推理和解决问题的智能机器,并且,这样的机器将被认为是具有知觉、有自我意识的。强人工智能可以有两类:

    • 人类的人工智能,即机器的思考和推理就像人的思维一样。

    • 非人类的人工智能,即机器产生了和人完全不一样的知觉和意识,使用和人完全不一样的推理方式。

    弱人工智能

    弱人工智能观点认为“不可能”制造出能“真正”地推理和解决问题的智能机器,这些机器只不过“看起来”像是智能的,但是并不真正拥有智能,也不会有自主意识。

    弱人工智能是对比强人工智能才出现的,因为人工智能的研究一度处于停滞不前的状态下,直到类神经网络有了强大的运算能力加以模拟后,才开始改变并大幅超前。但人工智能研究者不一定同意弱人工智能,也不一定在乎或者了解强人工智能和弱人工智能的内容与差别,对定义争论不休。

    就当下的人工智能研究领域来看,研究者已大量造出“看起来”像是智能的机器,获取相当丰硕的理论上和实质上的成果,如2009年康乃尔大学教授Hod Lipson 和其博士研究生Michael Schmidt 研发出的 Eureqa计算机程序,只要给予一些数据,这计算机程序自己只用几十个小时计算就推论出牛顿花费多年研究才发现的牛顿力学公式,等于只用几十个小时就自己重新发现牛顿力学公式,这计算机程序也能用来研究很多其他领域的科学问题上。这些所谓的弱人工智能在神经网络发展下已经有巨大进步,但对于要如何集成成强人工智能,现在还没有明确定论。

    对强人工智能的哲学争论

     

    “强人工智能”一词最初是约翰·罗杰斯·希尔勒针对计算机和其它信息处理机器创造的,其定义为:

    “强人工智能观点认为计算机不仅是用来研究人的思维的一种工具;相反,只要运行适当的程序,计算机本身就是有思维的。”(J Searle in Minds Brains and Programs. The Behavioral and Brain Sciences, vol. 3, 1980)

    关于强人工智能的争论,不同于更广义的一元论和二元论的争论。其争论要点是:如果一台机器的唯一工作原理就是转换编码数据,那么这台机器是不是有思维的?希尔勒认为这是不可能的。他举了个中文房间的例子来说明,如果机器仅仅是转换数据,而数据本身是对某些事情的一种编码表现,那么在不理解这一编码和这实际事情之间的对应关系的前提下,机器不可能对其处理的数据有任何理解。基于这一论点,希尔勒认为即使有机器通过了图灵测试,也不一定说明机器就真的像人一样有自我思维和自由意识。

    也有哲学家持不同的观点。丹尼尔·丹尼特在其著作《意识的解释(英语:Consciousness Explained)》(Consciousness Explained)里认为,人也不过是一台有灵魂的机器而已,为什么我们认为:“人可以有智能,而普通机器就不能”呢?他认为像上述的数据转换机器是有可能有思维和意识的。

    有的哲学家认为如果弱人工智能是可实现的,那么强人工智能也是可实现的。比如西蒙·布莱克本(英语:Simon Blackburn)(Simon Blackburn)在其哲学入门教材Think里说道,一个人的看起来是“智能”的行动并不能真正说明这个人就真的是智能的。我永远不可能知道另一个人是否真的像我一样是智能的,还是说她/他仅仅是“看起来”是智能的。基于这个论点,既然弱人工智能认为可以令机器“看起来”像是智能的,那就不能完全否定这机器是真的有智能的。布莱克本认为这是一个主观认定的问题。

    需要指出的是,弱人工智能并非和强人工智能完全对立,也就是说,即使强人工智能是可能的,弱人工智能仍然是有意义的。至少,今日的计算机能做的事,像算术运算等,在一百多年前是被认为很需要智能的。并且,即使强人工智能被证明为可能的,也不代表强人工智能必定能被研制出来。

    研究方法

    当前没有统一的原理或范式指导人工智能研究。许多问题上研究者都存在争论。 

    其中几个长久以来仍没有结论的问题是:是否应从心理或神经方面模拟人工智能?或者像鸟类生物学对于航空工程一样,人类生物学对于人工智能研究是没有关系的?智能行为能否用简单的原则(如逻辑或优化)来描述?还是必须解决大量完全无关的问题? 

    智能是否可以使用高级符号表达,如词和想法?还是需要“子符号”的处理?约翰·豪格兰德(John Haugeland)提出了GOFAI(出色的老式人工智能)的概念,也提议人工智能应归类为synthetic intelligence(英语:synthetic intelligence),这个概念后来被某些非GOFAI研究者采纳。 

    控制论与大脑模拟

    20世纪40年代到50年代,许多研究者探索神经学、信息理论及控制论之间的联系。其中还造出一些使用电子网络构造的初步智能,如格雷·华特(W. Grey Walter)的乌龟(turtle)和约翰霍普金斯野兽。

    这些研究者还经常在普林斯顿大学和英国的Ratio Club举行技术协会会议。直到1960,大部分人已经放弃这个方法,尽管在80年代再次提出这些原理。

    符号处理

    当20世纪50年代,数字计算机研制成功,研究者开始探索人类智能是否能简化成符号处理。研究主要集中在卡内基梅隆大学,斯坦福大学和麻省理工学院,而各自有独立的研究风格。约翰·豪格兰德(John Haugeland)称这些方法为GOFAI(出色的老式人工智能)。60年代,符号方法在小型证明程序上模拟高级思考有很大的成就。基于控制论或神经网络的方法则置于次要。60-70年代的研究者确信符号方法最终可以成功创造强人工智能的机器,同时这也是他们的目标。

    • 认知模拟:经济学家赫伯特·西蒙和艾伦·纽厄尔研究人类问题解决能力和尝试将其形式化,同时他们为人工智能的基本原理打下基础,如认知科学、运筹学和经营科学。他们的研究团队使用心理学实验的结果开发模拟人类解决问题方法的程序。这方法一直在卡内基梅隆大学沿袭下来,并在80年代于Soar发展到高峰。

    • 基于逻辑:不像艾伦·纽厄尔和赫伯特·西蒙,约翰·麦卡锡认为机器不需要模拟人类的思想,而应尝试找到抽象推理和解决问题的本质,不管人们是否使用同样的算法。他在斯坦福大学的实验室致力于使用形式化逻辑解决多种问题,包括知识表示,智能规划和机器学习。致力于逻辑方法的还有爱丁堡大学,而促成欧洲的其他地方开发编程语言Prolog和逻辑编程科学。

    • “反逻辑”: 斯坦福大学的研究者 (如马文·闵斯基和西摩尔·派普特)发现要解决计算机视觉和自然语言处理的困难问题,需要专门的方案:他们主张不存在简单和通用原理(如逻辑)能够达到所有的智能行为。罗杰·单克(Roger Schank)描述他们的“反逻辑”方法为“scruffy”。常识知识库(如道格拉斯·莱纳特的Cyc)就是“scruffy”AI的例子,因为他们必须人工一次编写一个复杂的概念。

    • 基于知识:大约在1970年出现大容量内存计算机,研究者分别以三个方法开始把知识构造成应用软件。这场“知识革命”促成专家系统的开发与计划,这是第一个成功的人工智能软件形式。“知识革命”同时让人们意识到许多简单的人工智能软件可能需要大量的知识。

    子符号方法

    1980年代符号人工智能停滞不前,很多人认为符号系统永远不可能模仿人类所有的认知过程,特别是感知、机器人、机器学习和模式识别。很多研究者开始关注子符号方法解决特定的人工智能问题。

    • 自下而上、接口agent、嵌入环境(机器人)、行为主义、新式AI:机器人领域相关的研究者,如罗德尼·布鲁克斯(Rodney Brooks),否定符号人工智能而专注于机器人移动和求生等基本的工程问题。他们的工作再次关注早期控制论研究者的观点,同时提出了在人工智能中使用控制理论。这与认知科学领域中的表征感知论点是一致的:更高的智能需要个体的表征(如移动,感知和形象)。

    • 计算智能:1980年代中大卫·鲁姆哈特(David E. Rumelhart)等再次提出神经网络和联结主义。这和其他的子符号方法,如模糊控制和进化计算,都属于计算智能学科研究范畴。

    统计学方法

    1990年代,人工智能研究发展出复杂的数学工具来解决特定的分支问题。这些工具是真正的科学方法,即这些方法的结果是可测量的和可验证的,同时也是近期人工智能成功的原因。共享的数学语言也允许已有学科的合作(如数学,经济或运筹学)。Stuart J. Russell和Peter Norvig指出这些进步不亚于“革命”和“neats的成功”。有人批评这些技术太专注于特定的问题,而没有考虑长远的强人工智能目标。

    集成方法

    • 智能agent范式:智能agent是一个会感知环境并作出行动以达致目标的系统。最简单的智能agent是那些可以解决特定问题的程序。更复杂的agent包括人类和人类组织(如公司)。这些范式可以让研究者研究单独的问题和找出有用且可验证的方案,而不需考虑单一的方法。一个解决特定问题的agent可以使用任何可行的方法-一些agent用符号方法和逻辑方法,一些则是子符号神经网络或其他新的方法。范式同时也给研究者提供一个与其他领域沟通的共同语言--如决策论和经济学(也使用abstract agents的概念)。1990年代智能agent范式被广泛接受。

    • 代理架构和认知架构:研究者设计出一些系统来处理多agent系统中智能agent之间的相互作用。一个系统中包含符号和子符号部分的系统称为混合智能系统,而对这种系统的研究则是人工智能系统集成。分级控制系统则给反应级别的子符号AI和最高级别的传统符号AI提供桥梁,同时放宽了规划和世界建模的时间。

    基本应用

    人工智能基本的应用可分为四大部分:

    感知能力(Perception)

    指的是人类透过感官所收到环境的刺激,察觉消息的能力,简单的说就是人类五官的看、听、说、读、写等能力,学习人类的感知能力是AI当前主要的焦点之一,包括:

    • “看”:电脑视觉(Computer Vision)、图像识别(Image Recognition)、人脸识别(Face Recognition)、对象侦测(Object Detection)。

    • “听”:语音识别(Sound Recognition)。

    • “读”:自然语言处理(Natural Language Processing,NLP)、语音转换文本(Speech-to-Text)。

    • “写”:机器翻译(Machine Translation)。

    • “说”:语音生成(Sound Generation)、文本转换语音(Text-to-Speech)。

    认知能力(Cognition)

    指的是人类透过学习、判断、分析等等心理活动来了解消息、获取知识的过程与能力,对人类认知的模仿与学习也是当前AI第二个焦点领域,主要包括:

    • 分析识别能力:例如医学图像分析、产品推荐、垃圾邮件识别、法律案件分析、犯罪侦测、信用风险分析、消费行为分析等。

    • 预测能力:例如AI运行的预防性维修(Predictive Maintenance)、智能天然灾害预测与防治。

    • 判断能力:例如AI下围棋、自动驾驶车、健保诈欺判断、癌症判断等。

    • 学习能力:例如机器学习、深度学习、增强式学习等等各种学习方法。

    创造力(Creativity)

    指的是人类产生新思想,新发现,新方法,新理论,新设计,创造新事物的能力,它是结合知识、智力、能力、个性及潜意识等各种因素优化而成,这个领域当前人类仍遥遥领先AI,但AI也试着急起直追,主要领域包括:AI作曲、AI作诗、AI小说、AI绘画、AI设计等。

    智能(Wisdom)

    指的是人类深刻了解人、事、物的真相,能探求真实真理、明辨是非,指导人类可以过着有意义生活的一种能力,这个领域牵涉人类自我意识、自我认知与价值观,是ˋ当前AI尚未触及的一部分,也是人类最难以模仿的一个领域。 

    未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱,为提升企业,行业与城市的智能水平服务。

      如果您对实验室的研究感兴趣,欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”

    展开全文
  • cache 缓存与缓存区别

    千次阅读 2019-03-08 09:04:27
    以上两个过程分别称为缓存协商缓存。 缓存 缓存即直接从本地读取缓存副本,不需要发起请求 。这种方式是最快的。 缓存通过HTTP 首部:cache-control管理 cache-control首部 cache-control首部...

    Caches作用
    Web缓存可以保存常见文档副本,当发起Web请求时,如果本地有 “已缓存的" 的副本,就可以直接从本地存储中提取这个文档,而不是去从原始服务器中拿。

    减少冗余数据传输

    当很多客户端访问原始服务器页面时,服务器会多次传输同一份文档,相同的数据在网络中一遍遍的传输。这些冗余数据会耗尽昂贵的网络带宽,降低传输速度。

    使用缓存之后,浏览器只要保留第一条服务器响应的副本,后续对这个资源的访问都可以从缓存副本中得到了,减少了重复流量。

    缓解带宽瓶颈

    网络为本地网络客户端提供的带宽比服务器提供的带宽大很多。客户端会以路径上最慢的速度访问服务器。如果客户端从本地或者局域网的缓存中得到了一份副本,那么缓存就可以提高性能,尤其在传输大文件时。

    降低原始服务器负载

    当很多人去访问原始服务器时,会产生巨大流量,从而可能导致服务器崩溃

    降低距离时延

    将缓存放在本地或者局域网内可以大幅度降低传输距离,加快传输速度。

    浏览器缓存过程
    Web缓存服务器的基本工作原理很简单,对一条HTTP GET请求的缓存过程如下:

    · 接收:缓存从网络中读取抵达的请求报文

    · 解析:解析报文,提取首部

    · 查询:查询本地是否有副本,如果没有,就发起请求获取副本

    · 新鲜度检测:查看本地缓存是否足够新鲜,如果不是,则查询服务器是否有更新

    · 创建响应:返回缓存副本

    · 发送:将响应发回给客户端

    对于浏览器而言,整个过程又可以简化:

    · 查询本地副本,如果有且足够新鲜,则直接使用本地副本

    · 否则发起请求,验证本地副本是否足够新鲜

    以上两个过程分别称为强缓存和协商缓存。

    强缓存
    强缓存即直接从本地读取缓存副本,不需要发起请求。这种方式是最快的。

    强缓存通过HTTP 首部:cache-control管理

    cache-control首部

    cache-control首部用来指定缓存策略,例如是否能缓存,谁可以缓存,缓存多久

    no-cache与no-store:

    no-cache:表示必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。如果资源未被更改,可以避免下载。

    no-store:禁止浏览器 (和所有中继缓存)存储返回的 任何版本的响应,每次用户请求该资源时,都会向服务器发送一个请求,每次都会下载完整的响应

    public 与 private:

    public:即使有关联的 HTTP 认证,甚至响应状态码无法正常缓存,响应也可以被缓存

    private:不允许任何中继缓存对其进行缓存

    max-age指令

    指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒)。

    通过cache-control的max-age,设置好缓存时间,单位是秒,例如缓存一年:

    cache-control: public, max-age=31536000
    当使用本地强缓存时,浏览器发回的响应信息是 200 from cache 或者 200 from memory cache,所耗费的时间在几毫秒之间,可以忽略不计。

    强缓存的更新问题:如果资源有更新,则希望浏览器使用新的资源。但是在现如今情况下,除了修改资源名称,没有别的办法更新资源。所以现在通常使用的办法是更新资源名称,例如资源名称一般是:

    [name]-[hash].ext
    在原始文件名之后加入文件哈希值,这样当文件内容修改之后,哈希值就会改变。再修改html文件的引用地址,这样就可以做到资源更新时,自动下载新资源;否则会一直使用本地缓存。

    expires首部

    expires是HTTP/1.0时期用于强缓存的首部字段。它会指定一个绝对的过期日期,如果日期已经过了,说明本地副本不再新鲜了。例如:

    Expires: Fri, 09 Dec 2016, 05:00:00 GMT
    Expires也是精确到秒的。

    由于expires使用的是绝对日期,如果服务器与客户端时间不一致,则会出现缓存不成功或者缓存不更新的问题。所以现在都建议cache-control做强缓存。

    协商缓存
    当本地缓存过期的时候,浏览器就会尝试协商缓存。协商缓存会发起请求,以验证本地副本是否可以使用。也称为再验证的过程。

    · 如果验证后显示文档内容变化,浏览器会获取一份新的副本,替代旧副本,缓存在本地

    · 如果验证后显示文档内容无变化,浏览器只用获取新的首部和新的过期日期

    根据响应中的状态码来指明文档没有变化。304 Not Modified
    验证文档内容是否变化有两种方式,统称为条件GET方法

    Last-Modified 与 If-Modified-Since首部

    这一对首部通过资源修改日期判断是否有变化,主要过程为:

    · 首次获取资源:服务器响应中添加首部Last-Modified,说明资源最近一次修改时间。浏览器保存下来这个时间

    · 验证资源:浏览器带上If-Modified-Since首部,值就是Last-Modified返回的时间;服务器比较If-Modified-Since的时间与资源最近一次修改时间:

    o 如果最近一次修改时间小于If-Modified-Since的时间,则返回304响应,响应中也会有cache-control、expires、Date首部;

    o 如果最近一次修改时间大于If-Modified-Since的时间,则返回新资源,并且更新所对应的全部首部,包括cache-control、expires、Date

    ETag与If-None-Match首部

    ETag是服务器为资源生成的唯一标识字符串。只有当文件内容变化时,ETag才会变化。使用过程与Last-Modified类似。

    · 首次获取资源:浏览器得到响应首部ETag对应的值

    · 验证资源:带上If-None-Match首部,值就是浏览器从服务器获得的ETag值,这样服务器可以比较ETag值来确定客户端缓存是否是最新,如果不是最新,则返回新文档;如果是,直接返回304Not Modified,包括cache-control、expires、Date首部

    ETag对比Last-Modified优势

    在有些情况下,Last-Modified会出现难以解决的问题:

    · 有些文档可能会被周期性的重写,但实际内容并没有变化。而此时Last-Modified会变化,ETag则不会

    · 有些文档被修改了,但是修改的内容并不重要,比如注释,不需要更新缓存

    · 有些服务器无法准确判断页面最后修改日期

    · 有些服务器的文档可能在1秒钟之内就产生变化了,而Last-Modified只能精确到秒,在某些场合下不够精准

    如果同时使用ETag和Last-Modified两种验证方式,服务器会优先验证ETag对应的If-None-Match请求首部,如果ETag相同,才会去验证Last-Modified

    项目中遇到问题的解释:

    如果设置的是no-store,浏览器每次都会请求新的;如果是no-cache,浏览器会优先走304协商缓存;如果这两个都没设置,而是设置了max-age,那在过期时间之内,浏览器不会发送请求到服务器,直接使用本地的。当然如果是cmd+r刷新,是会请求新资源的。

    如果不向服务器请求,浏览器就拿不到新资源的。form请求能拿到返回code,但是返回值我们是拿不到的;ajax可以拿到。(所以那个上传文件的组件,form请求失败,需要前端重定向)所以form没有跨域问题,而ajax有跨域问题。而跨域是说请求发送到了服务器,而我们拿不到返回值而已。浏览器觉得跨域拿返回值是危险的。window.open和输入url是一样的。

    如果后端正确设置了index.html的cache-control规则,是不需要强刷的。后端对index.html设置cache-control: no-cache,no-store,浏览器每次都请求新的html资源,这样用户就会请求新的js和css了(上次是这个规则没设置,所以要强刷)。如果强缓存未过期,在最近一段时间内加载过这个文件,就会from memory,否则就是from disk;from cache也是从缓存里读取。最终都是强缓存,没有请求服务器。304是向服务器做了协商缓存验证,如果没更新才会使用本地资源。

    (上次那个没权限用户总是走缓存的问题,meta头,后端没设置。所以后面自己设置了,并且在登录回调那里把index.html加上时间戳。)

    作者:快乐的程序媛
    来源:CSDN
    原文:https://blog.csdn.net/qianqianstd/article/details/75907082
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 类型语言和弱类型语言

    万次阅读 多人点赞 2014-11-03 16:30:01
    编译型和解释型 我们先看看编译型,其实它汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序...

    编译型和解释型


    我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时就会生成目标文件(Object file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了,但由于只是整个项目的一部分,所以我们还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,这个工作由另一个程序负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以又称为链接(Link),而负责链接的程序就叫……就叫链接程序(Linker)。链接程序除了链接目标文件外,可能还有各种资源,像图标文件啊、声音文件啊什么的,还要负责去除目标文件之间的冗余重复代码,等等,所以……也是挺累的。链接完成之后,一般就可以得到我们想要的可执行文件了。 

    上面我们大概地介绍了编译型语言的特点,现在再看看解释型。噢,从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。 

    两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断地解释、执行、解释、执行……所以,解释型程序是离不开解释程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC程序,就得进入BASIC环境,然后才能加载程序源文件、运行。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的Compiling…Linking…这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。 

    编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。 

    但既然编译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势,例如Java语言虽然比较接近解释型语言的特征,但在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。而像VB6(或者以前版本)、C#这样的语言,虽然表面上看生成的是.exe可执行程序文件,但VB6编译之后实际生成的也是一种中介码,只不过编译器在前面安插了一段自动调用某个外部解释器的代码(该解释程序独立于用户编写的程序,存放于系统的某个DLL文件中,所有以VB6编译生成的可执行程序都要用到它),以解释执行实际的程序体。C#(以及其它.net的语言编译器)则是生成.net目标代码,实际执行时则由.net解释系统(就像JVM一样,也是一个虚拟机平台)进行执行。当然.net目标代码已经相当“低级”,比较接近机器语言了,所以仍将其视为编译语言,而且其可移植程度也没有Java号称的这么强大,Java号称是“一次编译,到处执行”,而.net则是“一次编码,到处编译”。呵呵,当然这些都是题外话了。总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。

    动态语言和静态语言
      通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。

    (1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

    (2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

    对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamictyping when needed。

    强类型定义语言和弱类型定义语言

    (1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

    (2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

    强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
    例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言);JAVA是静态语言,是强类型定义语言(类型安全的语言)。

     

    静态类型定义语言

    一种在编译时,数据类型是固定的语言。大多数静态类型定义语言强制这一点,它要求你在使用所有变量之前要声明它们的数据类型。Java和C是静态类型定义语言。

    动态类型定义语言

    一种在执行期间才去发现数据类型的语言,与静态类型定义相反。VBScript和Python是动态类型定义的,因为它们是在第一次给一个变量赋值的时候找出它的类型的。

    强类型定义语言

    一种总是强制类型定义的语言。Java和Python是强制类型定义的。如果你有一个整数,如果不显示地进行转换,你不能将其视为一个字符串。

    弱类型定义语言

    一种类型可以被忽略的语言,与强类型定义相反。VBScript是弱类型定义的。在VBScript中,可以将字符串'12'和整数3进行连接得到字符串'123',然后可以把它看成整数123,而不需要显示转换。但其实它们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变量前加了一个clong()或(int)()这样的转换函数而已.能做到这一点其实是归功于VB的编译器的智能化而已,这并非是VB语言本身的长处或短处.

    结论:

    静态是类型编译时判断;动态是类型运行时判断;强类型是类型独立,不轻易转化;弱类型是类型不严格区分,一般是只要大小放得下,就可以转化。这种是汇编级的观点。面向对象的观点并非这样的,对象并不是大小差不多就是类型兼容,而是关键的接口要相同才叫类型兼容。

    动态语言并非是弱类型,这是不等价的。恰好的,一般动态语言都是强类型语言,因为都是遵照面向对象的观点来设计对象的。

    动态语言的劣势很明显,就是缺少开发环境,运行效率差,当然语言设计上也不完美(静态语言何止千万,但c++也就一个)。

    优势也很明显,就是编写容易,层次高,接近自然语义。动态类型语言效率低下的原因,不在于变量的类型是动态的,而在于对象的方法是动态联编的,在这一点上动态类型语言和Java没什么不同。

    静态类型语言的优势究竟是什么?

    观点一:静态类型语言因为类型强制声明,所以IDE可以做到很好的代码感知能力,因为有IDE的撑腰,所以开发大型系统,复杂系统比较有保障。

    对于像Java来说,IDEA/Eclipse确实在代码感知能力上面已经非常强了,这无疑能够增加对大型系统复杂系统的掌控能力。但是除了Java拥有这么强的IDE武器之外,似乎其他语言从来没有这么强的IDE。C#的VisualStudio在GUI开发方面和Wizard方面很强,但是代码感知能力上和Eclipse差的不是一点半点。至于VisualC++根本就是一个编译器而已,羞于提及Visual这个字眼。更不要说那么多C/C++开发人员都是操起vi吭哧吭哧写了几十万行代码呢。特别是像LinuxKernel这种几百万行代码,也就是用vi写出来的阿,够复杂,够大型,够长生命周期的吧。

    观点二:静态语言相对比较封闭的特点,使得第三方开发包对代码的侵害性可以降到很低。动态语言在这点上表现的就比较差,我想大家都有过从网上下载某个JS包,然后放到项目代码里发生冲突的经历

    也就是说静态类型语言可以保障package的命名空间分割,从而避免命名冲突,代码的良好隔离性。但是这个观点也缺乏说服力。

    静态类型语言中C,VB都缺乏良好的命名空间分割,容易产生冲突,但是并没有影响他们做出来的系统就不够大,不够复杂。

    而Visual C++开发的DLL版本冲突也是臭名昭著的,似乎C++的命名空间没有给它带来很大的帮助。

    而动态类型语言中Ruby/Python/Perl都有比较好的命名空间,特别是Python和Perl,例如CPAN上面的第三方库成吨成吨的,也从来没有听说什么冲突的问题。

    诚然像PHP,JavaScript这样缺乏命名空间的动态语言很容易出现问题,但是这似乎是因为他们缺乏OO机制导致的,而不是因为他们动态类型导致的吧?

    说到大型系统,复杂业务逻辑系统,Google公司很多东西都是用python开发的,这也证明了动态类型语言并非不能做大型的复杂的系统。其实我个人认为:

    动态类型语言,特别是高级动态类型语言,反而能够让人们不需要分心去考虑程序编程问题,而集中精力思考业务逻辑实现,即思考过程即实现过程,用DSL描述问题的过程就是编程的过程,这方面像UnixShell,ruby,SQL,甚至PHP都是相应领域当之无愧的DSL语言。而显然静态类型语言基本都不满足这个要求。

    那静态类型语言的优势究竟是什么呢?我认为就是执行效率非常高。所以但凡需要关注执行性能的地方就得用静态类型语言。其他方面似乎没有什么特别的优势。

     

    给你来个例子把
    
    弱类型语言vbs:
     a=1
     b=a+"1"+"a" //结果是11a,这里 a 成了字符串
     c=a+1 //结果是2 ,这里a则是数字型
    
    强类型语言:c#
    int a=2
    string b=a.ToString()+"1"+"a"
    int c=a+1
    
    看到了吗?区分大小写,需要实现申明类型外,一个重要的区别是,弱类型的语言的东西没有明显的类型,他能随着环境的不同,自动变换类型
    而强类型则没这样的规定,不同类型间的操作有严格定义,只有相同类型的变量才能操作,虽然系统也有一定的默认转换,当绝没有弱类型那么随便
    
    ps:弱类型代码简单,但因为变量没有确定的类型,所以容易出错!强类型代码复杂(比如:转换日期显示格式 (convert.toDatetime("2007-1-1 08:08:08")).ToString("yyyy-MM-dd"),呵呵你可以看到这种写法相当麻烦),但因为有严格定义所以不容易出错
    
    展开全文
  • python是一门动态解释性的类型定义语言 编译型vs解释型 编译型 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立...
  • 译型和解释型。  我们先看看编译型,其实它汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序...
  • 那到底什么是解释和编译呢。另外编程语言除了编译型和解释型,还有静态语言、动态语言、类型语言、类型语言。那么每种语言类型是什么样子的呢,下面让我们来看看吧。  但是在此之前,我们需要先了解一下计算机...
  • 社交网络的关系和弱关系

    千次阅读 2014-07-29 14:04:19
    社交关系按用户之间联系及互动频率分关系和弱关系。  一:关系  关系以QQ空间为代表。关系社交网络中的关系以维系为主,特点是:  1:圈子小: 原因有二。一是因为关系是双方的,所以存在匹配的...
  • c# 中的泛型以及类型与类型

    千次阅读 2015-05-04 15:40:17
    类型的变量类型,必须在源代码中明确定义,称之为“变量声明”,类型的变量类型则是无需声明的,由解释解释。但是,这并不意味着,类型的变量就没有类型这一概念了,举例来说,PHP的GetType就是返回该变量...
  • 这个转化的方式就分为两种:编译和解释。区别在于转化的时机不同。 用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言翻译成
  • 实体百度百科中的解释《数据库系统课程》中的解释总结起来 写在最前 数据库设计是困难的,其原因之一就在于我们很难去完全把握实体的定义。是不是实体、该不该定义实体是一直困扰数据库初学者的问题,实体、...
  • Java引用最精彩的解释

    千次阅读 2019-03-26 11:54:35
    原文出自:...这个解释是关于引用最精彩的 public class EmployeeVal { public EmployeeVal(String ...
  • 类型语言与类型语言

    千次阅读 2018-02-01 22:57:19
     类型语言允许将一块内存看做多种类型。比如直接将整型变量与字符变量相加...Java、C# Python 等都是类型语言。 使用哪种语言还是要按需而定。编写简单小应用,使用类型语言可节省很多代码量,有更高
  • 本文主要探讨优化问题中强、对偶性以及KKT条件的证明。
  • 今天小熙突然想到一个问题,那就是Java到底是动态语言还是静态语言,是类型还是类型呢?虽然知道但是还是不够深入,接下来就一起探讨下吧。 二. 图释 小熙碰巧看到一张,完美的区分了以上的问题 如图所示,...
  • 因子分析在SPSS中的操作过程及结果解读

    万次阅读 多人点赞 2019-01-14 16:28:27
    因子分析在SPSS中的操作...因子分析模型中,假定每个原始变量由两部分组成:共同因子唯一因子。共同因子是各个原始变量所共有的因子,解释变量之间的相关关系。唯一因子顾名思义是每个原始变量所特有的因子,表...
  • 连通图、连通图、连通图

    千次阅读 2021-03-12 09:28:40
    考研复试复习到离散数学的时候一道选择题判断给出的图是连通图还是强弱连通图,虽然在数据结构中学习过这方面的知识,不过当时感觉知识点太小,就没有...这里我们直接看百度百科怎么解释连通图 3、连通图 ...
  • 推挽、开漏、上拉、上拉、下拉、下拉输出 推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止 开漏输出:输出端相当于...
  • 编译型语言要先编译再运行,而解释性语言直接“运行”源代码。 Python是种类型的语言。 有人可能会问,在python中,可以这样写而不报错,所以是类型的: i=1 print(i) i="hello world" print(i) 实际...
  • 概念区别 【编译型语言与解释型语言、动态类型语言与静态类型语言、类型语言与类型语言】 文章目录一、编译型语言与解释型语言二、动态类型语言与静态类型语言三、类型语言与类型语言总结 一、编译型语言与...
  • 如果是法律本身有问题(造成了解释歧义矛盾,或者该废弃),那就应该修改法律,保证它的确定性(要么是类型,要么是类型)。 (3)为什么说 Javascript 是类型? 因为它的隐式类型转换非常多、非常复杂、...
  • 联网与联网之间的区别

    千次阅读 2017-10-13 20:31:56
    联网游戏是游戏行业给出的一个特定称呼,指代的是那种联网仅仅只为了数据存盘、计费功能,而核心玩法(包括主要逻辑)大多通过客户端完成的游戏,这是从技术上定义的。这个类型的游戏最优表现为离开网络一样可以玩...
  • 看到一篇介绍C语言符号与符号的文章非常好,转载过来加深印象。 原文地址:http://blog.csdn.net/astrotycoon/article/details/8008629 ===================================================================...
  • 你也可以查看我的其他同类文章,也会让你有一定的收货! ...内存泄露:已经没有使用的对象,GC Root 还对其保持引用,导致GC无法回收。 内存抖动:频繁的创建对象,导致 GC 频率较高,导致应
  • 1.JS概述 1)概念 js全程:JavaScript(一门客户端脚本语言) a.js可以直接嵌入在html页面中,由浏览器解释执行,不进行预编译 ...1.解释执行:不需要预编译,逐行执行 2.基于对象:内置了大量的现成对象 ...
  • 编译型和解释型的区别 先来看看编译型语言定义: 编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码 (二进制)。 再来看看解释型语言的定义: 解释型语言的源代码不是直接翻译成机器指令,而是...
  • 作者:winterSunshine链接:...1.概念解释强引用是使用最普遍的引用:Object o=new Object(); 特点:不会被GC将对象的引用显示地置为null:o=null; // 帮助垃...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,183
精华内容 30,473
关键字:

强解释和弱解释