Heim  >  Artikel  >  Backend-Entwicklung  >  弱类型语言比强类型语言的优势、劣势、分别是什么?能用两种语言如 PHP 和 C# 举例论证吗?

弱类型语言比强类型语言的优势、劣势、分别是什么?能用两种语言如 PHP 和 C# 举例论证吗?

WBOY
WBOYOriginal
2016-06-17 08:31:273894Durchsuche

回复内容:

写JavaScript之前听人说不用理会变量的类型,直接用就好。然后各种进坑。。
明明是区分的好吧,只是语言上不明显表示出来,另外附带一些不太智能的类型自动转换。
弱类型语言确实比较好入门,但要想精通还是不能忽略变量类型的。
另外,问题如果能在运行时外解决,干嘛要带进去呢。 最近javascript写得多深有体会。本来我就知道弱类型语言就是很容易写出翔,于是我牺牲了一点性能到处assert,加载一个页面assert了两千多次,证明效果还是很不错的。然而,浏览器并不会像Visual Studio一样,可以在任何情况下都非常直接的告诉我,到底哪个assert中了。更可恶的是,像C++/C#这样的语言,exception被catch的时候是会保留throw的那一刻的debug信息的,javascript直接就先unwind stack了再catch,还得苦逼的展开error对象的内容,人肉看stack information,自己跳过去,然而此刻本地变量早就丢了……

特别怀念写ASP.NET的时候,可以用Visual Studio来调试浏览器里的代码的日子。

php估计也差不多。 弱类型不严谨,在对类型要求比较严格的情况下就需要注意异常情况:比如接收参数时需要判断是int型,但是php收到的全部都可以当成字符串,要自己用intval之类的函数转换;有时候判断需要“===”才能保证不出问题。c#是不用担心这些的,类型不匹配在写代码的时候就报错了。

弱类型的优势有一个很好的例子就是操作json,php用json_decode函数一下就变成了一个数组,数组在php中是万能结构,想怎么用就怎么用。c#解json就有点复杂了,每一个值都要转换成对应类型,就是说你解析之前就要明白里面是什么结构,每个值是什么类型。 我猜题主其实想问的是动态类型语言和静态类型语言 在“严谨”的语言中,通常是预先定义好一个值的类型,自始至终,变量的类型是固定的。

对比起强类型,弱类型的缺点大概如下:
(1)弱类型不符合“所见即所得”,定义的变量类型是不可预见并且可以改变的。
(2)为了兼容弱类型,语言执行引擎要做了大量的兼容工作,包括类型识别,内存管理,类型转换等,增加了语言内部处理的复杂度,会导致执行效率的降低。
(3)变量的类型是不可控的,因此执行过程中拥有大量的变量类型“隐形转换”,在开发同学不清楚隐性转换规则的情况下,容易产生不可预知的结果。这个特性也完全不符合所见即所得的简单性。

但是,它们之所以可以发展起来,脱颖而出,也是有原因的,存在就有它的道理。
弱类型等语言特性,降低了程序员编写语言的门槛。编程言语是人类和机器沟通的桥梁,终极追求其实是“降低人和机器的沟通成本”,追求“人人皆可编程”的境界。
例如,从机器语言的0和1开始,后来变成汇编语言,汇编语言发展出来C,后来再有现在的脚本语言。编程学习的门槛不断降低,程序员的数量也随着指数增长。
而且,我相信未来还会继续发展出更低学习门槛的语言,促进程序员数量的再一次指数增长。

弱类型的语言也有优点:
(1)屏蔽了语言的复杂性和容易导致错误的地方,例如:内存管理、指针、变量的类型等。虽然,它屏蔽了比较复杂的特性,但是,并不代表它们不存在,这样的做法是对人友好(编程更简单,考虑的东西更少),但是对机器不友好。
(2)项目开发效率高。
(3)学习门槛低。
它虽然带有不少的问题,但是,也包含了很明显的优点。
PHP比较大范围地用于Web开发,Javascript统治浏览器端的开发,这些都不是偶然现象,而是人用脚投票选择出来的。

当然,术业有专攻,不同的语言解决不同场景的问题,不能一概而论。 比如fastCSharp,无论是开发效率还是运行效率,随时欢迎各位PHPer挑战。
弱类型语言有两个优势:一是eval,其实我真的不知道这算不算优势;二是有弱类型需求的情况下,代码相对于强类型语言更优雅(一行少敲几下键盘)。
弱类型语言的劣势太多太多,可以说满身都是,只是很多人不愿意承认而已。 弱类型比较重要的好处主要在于给另一些语言特性的实现带来的便利性。比如闭包和回调函数。PHP我不懂,不过javascript大量依赖的回调函数和衍生出来的error first callback pattern等东西,在强类型语言里会不好实现。当然也有别的非弱类型实现,比如Ruby会用argument as hash之类的手段来回避函数签名不一致之类的问题。

之前很多人提到理想中的语言应该有optional static typing。其实放到strong/weak typing上或者也是一样,最理想的是optional weak typing。只是我认为除非必要,否则不在编译期检查类型,所以应该是dynamic typing为缺省,显式的声明static typing。而强弱这边则应该是缺省强类型,显式声明弱类型(即明确表示内容convertible)。

不过目前看来还没有人整这样一门语言,XD,现有的凑合着用吧。 PHP的优势在于
PHP 是最好的语言
好吧,我再说一遍等于我也有责任。

PHP是弱类型语言,容易出现什么问题呢?举个栗子。
<code class="language-php"><span class="cp"><?php </span>
<span class="cm">/*</span>
<span class="cm">strpos(string, find)</span>
<span class="cm">返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。</span>
<span class="cm">*/</span>

<span class="nv">$string</span> <span class="o">=</span> <span class="s1">'zhihu'</span><span class="p">;</span>

<span class="nv">$find</span> <span class="o">=</span> <span class="s1">'h'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">)</span> <span class="o">==</span> <span class="k">false</span><span class="p">)</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">))</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>

<span class="nv">$find</span> <span class="o">=</span> <span class="s1">'z'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">)</span> <span class="o">==</span> <span class="k">false</span><span class="p">)</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">))</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>
<span class="cp">?></span><span class="x"></span>
</span></code>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn