当前位置:首页 » 编程软件 » 动态弱类型编译为静态强类型

动态弱类型编译为静态强类型

发布时间: 2022-06-30 05:12:57

Ⅰ 类型系统的类型检查

类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查)。静态类型检查是在编译器所进行语义分析中进行的。如果一个语言强制实行类型规则(即通常只允许以不丢失信息为前提的自动类型转换)就称此处理为强类型,反之称为弱类型。 如果一个编程语言的类型检查,可在不测试运行时期表达式的等价性的情况下进行,该语言即为静态类型的。一个静态类型的编程语言,是在运行时期和编译时期之间的处理阶段下重视这些区别的。如果程序的独立模块,可进行各自的类型检查(独立编译),而无须所有会在运行时出现的模块的那些信息,该语言即具有一个编译时期阶段。如果一个编程语言支持运行时期(动态)调度已标记的数据,该语言即为动态类型的。如果一个编程语言破坏了阶段的区别,因而类型检查需要测试运行时期的表达式的等价性,该语言即为依存类型的。
在动态类型中,经常在运行时期进行类型标记的检查,因为变量所约束的值,可经由运行路径获得不同的标记。在静态类型编程语言中,类型标记使用辨识联合类型表示。
动态类型经常出现于脚本语言和RAD语言中。动态类型在解译语言中极为普遍,编译语言则偏好无须运行时期标记的静态类型。对于类型和隐式类型语言较完整的列表参见类型和隐式类型语言。
术语推断类型(鸭子类型,ck typing)指的是动态类型在语言中的应用方式,它会“推断”一个数值的类型。
某些静态语言有一个“后门”,在这些编程语言中,能够编写一些不被静态类型所检查的代码。例如,Java 和 C-风格的语言有“转型”可用。在静态类型的编程语言中,不必然意味着缺乏动态类型机制。例如 Java 使用静态类型,但某些运算需要支持运行时期的类型测试,这就是动态类型的一种形式。更多静态和动态类型的讨论,请参阅编程语言。 对静态类型和动态类型两者之间的权衡也是必要的。
静态类型在编译时期时,就能可靠地发现类型错误。因此通常能增进最终程序的可靠性。然而,有多少的类型错误发生,以及有多少比例的错误能被静态类型所捕捉,仍有争论。静态类型的拥护者认为,当程序通过类型检查时,它才有更高的可靠性。虽然动态类型的拥护者指出,实际流通的软件证明,两者在可靠性上并没有多大差别。可以认为静态类型的价值,在于增进类型系统的强化。强类型语言(如 ML 和 Haskell)的拥护者提出,几乎所有的臭虫都可以看作是类型错误,如果编写者以足够恰当的方式,或者由编译器推断来声明一个类型。
静态类型通常可以编译出速度较快的代码。当编译器清楚知道所要使用的数据类型,就可以产生优化过后的机器码。更进一步,静态类型语言中的编译器,可以更轻易地发现较佳捷径。某些动态语言(如 Common Lisp)允许任意类型的声明,以便于优化。以上理由使静态类型更为普及。参阅优化。
相较之下,动态类型允许编译器和解译器更快速的运作。因为源代码在动态类型语言中,变更为减少进行检查,并减少解析代码。这也可减少编辑-编译-测试-除错的周期。
静态类型语言缺少类型推断(如 Java),而需要编写者声明所要使用的方法或函数的类型。编译器将不允许编写者忽略,这可为程序起附加性说明文件的作用。但静态类型语言也可以无须类型声明,所以与其说是静态类型的代价,倒不如说是类型声明的报酬。
静态类型允许构造函数库,它们的用户不太可能意外的误用。这可作为传达库开发者意图的额外机制。
动态类型允许建构一些静态类型系统所做不出来的东西。例如,eval 函数,它使得运行任意数据作为代码成为可能(不过其代码的类型仍是静态的)。此外,动态类型容纳过渡代码和原型设计,如允许使用字符串代替数据结构。静态类型语言最近的增强(如 Haskell 一般化代数数据类型)允许 eval 函数以类型安全的方式撰写。
动态类型使元程序设计更为强大,且更易于使用。例如 C++ 模板的写法,比起等价的 Ruby 或 python 写法要来的麻烦。更高度的运行时期构成物,如元类型(metaclass)和内观(Introspection),对静态类型语言而言通常更为困难。

Ⅱ c#变量声明

首先,你得先了解一下动态变量与变量之间的区别!
所谓的变量这里当然可以的——但千万别加动态二字!
.net是静态编译语言,但.net 4.0之后是支持动态的,其实也算是一种运行时绑定!可以换成动态变量吗?答案是可以的!只要你不怕例外或崩溃!
在C#中变量就是变量,比如 int a = 5; a 就是变量!
var a = 5l;a就是一个long型变量!很多人认为var就是动态变量!其实它是静态变量!也有人叫推断变量——这种说法也是相当牵强!没有推断变量一说的!var的做用是程序员可以不指明变量,而是由编译器推断(严格来说其中智能感知就可以推断出来了!)所以var定义的变量由于编译器在编译时直接推断出变量类型!智能感知推断出来只是防止你犯错而已!
所以var在编译时可能会影响一点性能(很微小,甚至可以忽略),在运行时因为是编译的IL文件,所以根据变量命名没有任何区别!
两种观点:一种是大量使用var,理由是给了这么一个方便当然要使用了!另一种观点,少使用var方式,影响代码可读性!我个人的观点是,如果程序员是在源码上交流(直至看到你的源码,建议不要过多使用var,影响阅读性,我当然知道使用var写起来方便,但你写的方便是方便了,但你在源码上读的就没有那么方便了!),如果程序在在模块上交流,无所谓的,用多一点也没什么,反正交流时用不到你的源码,即使是想看源码,也可以使用IL反射工具,反射出来的时候就不再是var了,而是直接的类型!
推断类型只能做一个动词,做为名词来说明var定义的变量是不对了!所以不存在推断类型。
但是确实存在一个叫动态类型的东西!dynamic来声明的类型!要说C#做为一个静态编译,他本身是不支持动态类型的,这个所谓的动态类型其实是躲过了IDE和编译器的检查而已!换句话来说,他不再检查这个类型到底是int还是自定义对象什么的(多数用在定义类上)。允许其直接使用不再对该对象进行检查。运行时当然也不检查,只是按照这种类式的调用而已,如果不存在的话,就会报错!所以呢静态编译其实是在编译时已经确定了类型,而动态类型(也是后期绑定一种)在编译时不检查,在运行时直接使用(有人说是运行时确定类型)!如果说动态变量是运行时确定类型确定是非常有助于理解,但事实上运行时并没有确定类型,只是直接使用而已!
这里有一个概念还是要澄清,弱变量与强变量!强变量表示变量与类型固定,比如int a;a的变量在幅值或使用时都必须是int类型的!如果 a = "15";铁定会错,因为这是强变量,而弱变量则表示声明一个变量,至于存什么类型,无所谓!比如js中var a = 5;转过头你a = "sdfsd",这没有任何问题!【注:有时弱变量与强变量被称为弱类型与强类型】
你可能会说,既然没有动态不再进行检查,那么dynamic声明的变量是不是可以达到弱变量的行式呢?!不可以!所以他实现的原因并不是将C#变量弱类型的语言!只是不再检查该变量类型而已,但还是强变量(强类型)的本质!
那么动态变量的实现的本质是什么?
假定 dynamic instance = new Person();是声明了一个动态变量,如果你使用instance.Age变量有没有问题?你可能会说这没有问题,只要Person有Age的属性!是的,然而它没有——如果你var或Person声明,你编译器都通不过(不能编译),但是如果使用dynamic声明的话却是可以通过的!运行时会报错吗?会的——空引用错误!这样做岂不是无用?第一,你在实际部署时,后来的Person可能有这个属性呢?或者说你的instance可能不是一个person,而是一个具体有Age属性的对象呢?比如Animal与Person都有Age属性,但你运行时不知道他是Aninal类还是Person类(两者没有共同的接口或基类),而这个对象可能是一个程序选择的结果!这时你就知道动态变量的好处了!所以运行时确定类型的说法就来源于此,因为在编译之前你都不知道这个变量到底是Aninal还是Person,唯一知道你要引用的类中的Age属性!只有在运行时才知道这个类到底是哪个!
你可能会注意到了,我说是运行时确定类型有助于理解,但说法不完全正确!为什么?因为如果这个类没有名字怎么办?.net在lambda表达式或其他类似处理时可以生成一个匿名类——注意,没有名字的类可以有助于理解,但是他有类名,是由运行时直接动态给的!在编译时你根本不知道类的名称!这么说了,其实匿名类的处理才是真正引用动态类的真正用途!
嗯,动态变量说完了,根据匿名类的说法,我们是不是可以说其为动态类?不可以!匿名类与动态类是两码事!C#静态语言,不可能支持动态类!上边“动态”的是变量!不是类!比如脚本语言js中,你声明一个person类,然后在运行时可以直接使用person.Age = 15;类声明时并没有声明Age,而这些却是可以直接使用该属性,为什么呢?动态类,比如Python语言就是动态编译类语言。你可以简单地声明一个类,连个属性没有,但使用时(运行时)可以增加(也可以减少)其类的任何属性或方法!这就是动态类——它是反映随着运行时,类可以有属性(不是属性值)和方法等变化!C#并不能!这就是静态语言与动态语言的区别!
几个概念下来,动态变量可不能乱说,如果11换成int等变量是没有问题的,但换成动态变量是有问题的!因为动态变量运行时你根本无法推知其体的类型,运行时若是int类型,不是出错,但若是不同类型,你这比较运行未必支持!
变量就是变量——它是一个值可变的符号来做为占位,这个占位就是变量!
动态变量——那个符号只有运行时才被具体的类(匿名类在运行时有类名的)代替。
强类型/强变量——变量类型一旦声明,不可再更改其使用类型!
动态类——运行时类的属性或方法会发生变量(增加类的属性或方法)

Ⅲ 什么是强类型和弱类型

静态类型定义语言

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

动态类型定义语言

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

强类型定义语言

一种总是强制类型定义的语言。Java和Python是强制类型定义的。如果你有一个整数,如果不显示地进行转换,你不能将其视为一个字符串(在本章后面会有更多如何去做的内容)。

弱类型定义语言

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

Ⅳ 动态编译和静态编译有何主要区别

静态编译与动态编译的区别
1、动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
2、静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。

Ⅳ 什么是静态语言和动态语言,强类型和弱类型分别举下例子,详细点

静态类型: C, Pascal, Ada, C++, Java, C# 动态类型: Lisp, Small Talk, VBScript, Python, Ruby, Lua 强类型: Pascal, Ada, Java, C# 弱类型: C, C++ 无类型: BCPL, Forth 唯字符串型: sh

Ⅵ 静态类型语言和动态类型语言有什么区别

这个问题比较大,不太好回答,简单说下我的理解,想了解更多可移步知乎上对该问题的讨论

对于静态类型语言,变量类型都是在编译期即确定的,可以进行比较完备的类型检查,避免运行时的类型错误。

对于动态类型语言,变量类型是可以动态改变的,无法在编译期确定,因此编译期的类型检查比较弱,这将导致很多类型错误直到运行期才能发现。

Java,C,C++等属于静态类型语言;JS,Python等属于动态类型语言。

动态类型语言特点是灵活,缺点是牺牲了部分性能。

Ⅶ 什么是动、静态语言 和 什么是强、弱类型语言

1 动态语言和静态语言 通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。 1 动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。 2 静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。 对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。 2 强类型定义语言和弱类型定义语言 1 强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。 举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。 2 弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。 强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!

Ⅷ python是什么样的编程语言

编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,我们一起来看一下。

2.1 编译型与解释型。

编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;

而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.

这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)

编译型

优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。

缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编

解释型

优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。

缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

2.2动态语言和静态语言

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

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

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

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

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

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

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

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

通过上面这些介绍,我们可以得出,python是一门动态解释性的强类型定义语言。

Ⅸ 什么是静态语言和动态语言

基本概念
静态语言(强类型语言)
静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。
例如:C++、Java、Delphi、C#等。
动态语言(弱类型语言)
动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。
例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。
强类型定义语言
强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
弱类型定义语言
数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
两者区别
特性
强类型语言是一旦变量的类型被确定,就不能转化的语言。
弱类型语言则反之,一个变量的类型是由其应用上下文确定的。
静态语言的优势
由于类型的强制声明,使得IDE有很强的代码感知能力,故,在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中,依托IDE对系统的开发很有保障;
由于静态语言相对比较封闭,使得第三方开发包对代码的侵害性可以降到最低;
动态语言的优势
思维不受束缚,可以任意发挥,把更多的精力放在产品本身上;
集中思考业务逻辑实现,思考过程即实现过程;

Ⅹ 弱类型、强类型、动态类型、静态类型语言的区别是什么

弱类型:
>"1"+2'12'强类型:
>>>"1"+2Traceback(mostrecentcalllast):File"",line1,intype(a)type(a)leta="123"::Int:2:9:Couldn'tmatchexpectedtype`Int'withactualtype`[Char]'Intheexpression:"123"::IntInanequationfor`a':a="123"::Int

热点内容
脚本故事梗 发布:2024-05-18 18:29:02 浏览:822
安卓和csharp哪个发展好 发布:2024-05-18 18:09:30 浏览:527
换编程题库 发布:2024-05-18 18:00:58 浏览:562
如何使用服务器ip直连网站 发布:2024-05-18 18:00:49 浏览:432
三星n7100哪个安卓版本好用 发布:2024-05-18 17:55:41 浏览:490
万国觉醒采集脚本源码 发布:2024-05-18 17:55:39 浏览:947
sqlserver加字段 发布:2024-05-18 17:54:53 浏览:928
安卓手机如何清除应用记录 发布:2024-05-18 17:31:37 浏览:640
查看存储过程权限 发布:2024-05-18 17:18:33 浏览:192
php类self 发布:2024-05-18 17:15:03 浏览:895