精华内容
下载资源
问答
  • 主要介绍了动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍,需要的朋友可以参考下
  • 静态语言: 变量的类型在编译之前就需要确定,在编译的时候需要先编译,将源码转换成目标代码,然后...动态语言:不需要直接指定变量类型,在解释的时候,转换为目标代码和运行程序一步到位,比如python。 比较: ...

    静态语言
      变量的类型在编译之前就需要确定,在编译的时候需要先编译,将源码转换成目标代码,然后需要运行目标代码程序才能运行,比如C++、Java、Delphi、C#。

    动态语言
      不需要直接指定变量类型,在解释的时候,转换为目标代码和运行程序一步到位,比如Python、Ruby、Perl。可以在运行时改变结构,这个小白想不懂,但是也写上。我的理解是在程序运行的时候可以改变程序的代码,程序不用停止。

    比较
      静态语言运行时因为只需运行目标程序,所以运行速度快,但是因为要注意变量的类型,需要多注意一些东西,而动态语言比较自由,可以将思想更多的集中在我们所开发的东西上。同时也因为动态语言的灵活性太高,当代码数量太大时,很多东西将变得不可控,不如静态语言稳定,所以当开发大型项目时,要优先选用静态语言。

    展开全文
  • 动态类型语言和静态类型语言

    千次阅读 2018-05-24 15:54:33
    https://www.cnblogs.com/liuning8023/p/4286044.html  动态类型语言和静态类型语言本文主要说明动态类型语言和静态类型语言。类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行...

    https://www.cnblogs.com/liuning8023/p/4286044.html   动态类型语言和静态类型语言


    本文主要说明动态类型语言和静态类型语言。

    类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查)。静态类型检查是在编译器所进行语义分析中进行的。如果一个语言强制实行类型规则就称此处理为强类型(或静态类型),反之称为弱类型(或动态类型)。另外,严格意义上,强类型与静态类型不是一回事,同理,弱类型与动态类型。

    强类型是指某门语言检查两种类型是否兼容,如果不兼容就抛出一个错误或强制类型转换,尽管这个说法并不是很严格。静态类型强迫在类型结构的基础上执行多态。判断是否是一只鸭子的依据,是其基因蓝图(静态),还是因其叫声和走路的姿态像一只鸭子(动态)。静态语言的好处在于编译器和工具等对你的代码更加了解,可以用于捕捉错误,突出显示代码以及便于重构代码。付出的代价是你不得不做更多的工作,并且会受到一些限制。

    动态类型语言(Dynamically Typed Language)


    所谓动态类型语言,就是类型的检查是在运行时才做。

    类型对于变量,属性,方法以及方法的返回类型都是可有可无的,在给变量赋值时才决定它的类型, 之后,还可以赋值不同类型的值,即使是基本类型,比如 C# 装箱(boxing)和拆箱(unboxing),可以把值类型转换成引用类型,引用类型转换成值类型。当需要时,很多类型之间都会发生自动转换,可以把不同的基本类型添加到同一数组(collections)中。

    动态类型在解释语言中极为普遍,如 JavaScript、Perl、Python、Ruby 等等。

    静态类型语言(Statically Typed Language)


    静态类型语言的类型检查是在运行前的编译阶段,比如 C#、Java 等都是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,所以,一般动态语言都会采用 dynamic typing。静态类型语言常出现于编译语言中,比如,Java,实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。

    “多态性”是指,代码(尤其是函数和类)对各种类型的值能够动作,或是相同数据结构的不同实体能够控制不同类型的元素。在具有多态性的语言中,只需实现如列表或词典的数据结构一次,而不是对使用到它的元素的每一个类型都规划一次。基于这个原因,电脑学家也称使用了一定的多态性的方法为泛型程序设计。

    推断类型(鸭子类型,Duck typing),这个技术之所以常被称作“鸭子类型”,是基于这句格言:“如果它摇摇摆摆的走法很像鸭子,而且它的嘎嘎叫声也像鸭子,那它就是一只鸭子!(If it waddles like a duck, and quacks like a duck, it's a duck!)”最初是由 Dave Thomas 在 Ruby 社区中提出的,推断类型用了这个论证法“如果它像什么,而且其它地方也像什么,那么它就是什么。”,比如,C++在迭代器和指针之间的双重性,两者以不同的机制实现并提供一个* 运算;C# 可以用 var 关键字声明变量,还有委托推断。

    比较


    静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是需要写更多的类型相关代码(如声明变量),不便阅读(特别是,当你看别人代码时,会连变量定义也看吗?想必不会,看结构,看方法的含义想必才是本质)。

    动态类型语言的优点在于方便阅读,不需要写非常多的类型相关代码;缺点自然是不便调试,命名不规范时会造成读不懂,不利于理解等。

    在强类型、静态类型语言的支持者,与动态类型、自由形式的支持者之间,经常发生争执。前者主张,在编译的时候就可以较早发现错误,而且还可增进运行时期的性能。后者主张,使用更加动态的类型系統,分析代码更为简单,减少出错机会,才能更加轻松快速的编写程序。


    展开全文
  • 动态类型语言&动态语言

    千次阅读 2017-11-18 18:56:34
    动态语言 动态类型语言首先,这是两个不同的概念动态语言 dynamic programming language程序运行时,允许改变程序结构(例如引进新函数、删除旧函数)或变量类型。 从这个观点来看,Perl、Python、Ruby是动态语言,...

    首先,这是两个不同的概念

    动态语言 dynamic programming language

    程序运行时,允许改变程序结构(例如引进新函数、删除旧函数)或变量类型。
    从这个观点来看,Perl、Python、Ruby是动态语言,C++、Java、C#不是动态语言

    动态类型语言 dynamically typed language

    在运行期检查变量类型的语言,也就是在编写代码的时候可以不指定变量的数据类型,例如Python、Ruby。动态类型语言中,变量没有类型,而值有类型

    静态类型语言 statically typed language

    变量的数据类型在编译期声明以后,不能再改变其数据类型,即变量在使用前必须先声明类型。检查在编译期进行,好处是编译期提前检查可能出现的错误,例如C++、Java

    展开全文
  • java虚拟机动态类型语言支持

    千次阅读 2017-08-30 18:59:34
    这篇博客是根据《深入理解java虚拟机》的讲解和本人对动态类型语言的一些认识,来深度剖析一下java虚拟机对动态类型语言的支持!

    这篇博客是根据《深入理解java虚拟机》的讲解和本人对动态类型语言的一些认识,来深度剖析一下java虚拟机对动态类型语言的支持!

    什么是动态类型语言

    在讲解java虚拟机对动态类型语言支持之前,我们首先要弄明白动态类型语言是什么?它与java语言、java虚拟机有什么关系?那么接下来先回答第一个问题,什么是动态类型语言:动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译器,满足这个特征的语言有很多,常用的包括: APL、JavaScript、python、Ruby、Groovy等。相对的在编译期就进行类型检查过程的语言(C++和Java等)就是最常用的静态类型语言。大家可能对上面定义过于概念化,那我们不妨通过几个例子以最浅显的方式说明什么是“在编译器/运行期进行”和什么是“类型检查”。首先看下面这段简单的Java代码:它是否能正常编译和运行呢?

    public static void main(String[] args) {
    		
    		int i = 10;
    		int j = 0;
    		int v = i/j;
    	}

    这段代码相信大家再熟悉不过了,它可以正常编译,但是会运行时会报ArithmeticException异常。在Java虚拟机中规范中明确规定了ArithmeticException是一个运行异常,通俗一点说,运行时异常只要代码不运行到这一行就不会有问题。与运行异常相对应的是编译时异常,接下来看一下编译时异常的例子:

    public static void main(String[] args) {
    		 FileInputStream fis = null;  
    	     fis = new FileInputStream("test.txt");     
    	}

    上面这个例子中 fis = new FileInputStream("test.txt")会抛出IOException异常,这是一个编译时异常,如果不做try-catch处理,编译都通不过。通过上面两个例子就是想说明有些检查是在运行期进行的,有些检查是在编译器进行的。接下来再举一个例子来解释“类型检查”,例如下面这一句非常简单的代码:

          obj = Demo();
          obj.function();

    上面代码中假设Demo是一个类,且里面有function方法,这两行对于Java说,相信大家都知道是无法编译的更别提执行了。但是类似的代码在JavaScript或者Python中情况则不一样,是可以编译并且可以执行的。这种差别产生的原因在于动态类型语言中,变量obj本身是没有类型的,变量obj的值才具有类型,这是因为动态类型语言在运行期确定类型的,而Java或者静态类型语言是编译器确定类型的。孰好孰坏不知道,应该是各有所长吧。

     

    JDK1.7与动态类型

    在介绍完动态类型,回到Java语言、虚拟机和动态类型语言之间的关系。其实Java虚拟机层面对动态类型语言的支持一直都有所欠缺,主要表现在方法调用方面:JDK1.7以前的字节码指令集中,4条方法调用指令(invokevirtual , invokespecial , invokestatic ,invokeinterface)的第一条参数都是被调用的方法的符号引用,前面已经提到过,方法的符号引用在编译时产生,而动态类型语言是在动态运行期才能确定接受者的类型。因此这也就是JDK1.7中invokedynamic指令以及java.lang.invoke包出现要解决的问题。

    java.lang.invoke包

    JDK1.7中新加入的java.lang.invoke包的主要目的就是在之前单纯依靠符号引用来确定的目标方法这种方式以外,提供一种新的动态确定目标方法的机制,称之为MethodHandle。其实MethodHandle就是类似C/C++中的函数指针,或者C#中的委托。举个例子,如果我们要实现一个带有函数参数的排序函数,用函数指针的方如下:
    void sort(int list[], const int size , int (*compare)(int, int)) int (*compare)(int, int))
    但Java语言就做不到这点,即没有办法把一个函数作为参数进行传递。普遍的做法是设计一个带有compare()方法的Comparator接口,以实现了这个接口的对象作为参数。不过,在拥有Method Handle之后,Java语言也可以拥有类似于函数指针或者委托的方法别名的工具了。如下代码演示了MethodHandle的基本用法,无论obj是何种类型,都可以正确的调用到println()方法。
    package demo;
    
    import java.lang.invoke.MethodHandle;
    import java.lang.invoke.MethodType;
    import static java.lang.invoke.MethodHandles.lookup;
    
    public class MethodHandleTest {
    
    	static class ClassA{
    		public void println(String s){
    			System.out.println(s);
    		}
    	}
    	public static void main(String[] args) throws Throwable {
    		Object obj = System.currentTimeMillis() % 2 == 0 ? System.out : new ClassA();
    		
    		//无论obj最终是哪个实现类,下面这句都能正确调用到println方法
    		getPrintlnMH(obj).invokeExact("test");
    	}
    	private static MethodHandle getPrintlnMH(Object reveiver) throws Throwable{
    		//MethodType: 代表"方法类型",包含了方法的返回值(methodType()的第一个参数)和具体参数(methodType()第二个及以后的参数)
    		MethodType mt = MethodType.methodType(void.class,String.class);
    		//lookup()方法来自于MethodHandles.lookup,这句的作用是在指定类中查找符合给定的方法名称、方法类型、并且符合调用权限的方法语柄
    		/*因为这里调用的是一个虚方法,按照Java语言的规则,方法第一个参数是隐式的,代表该方法的接受者,也即是this指向的对象,这个参数以前是放在
    		 参数列表中进行传递的,而现在提供了bindTo方法来完成这件事情*/
    		return lookup().findVirtual(reveiver.getClass(),"println",mt).bindTo(reveiver);
    		
    	}
    }
    
    实际上,方法getPrintlnMH()中模拟了invokevirtual指令的执行过程,只不过它的分派逻辑并非固化在Class字节码上,而是通过一个具体方法来实现。在这里本人仅仅举了MethodHandle来实现java对动态类型的支持。但是还有其他的方法,比如反射、invokedynamic指令,在这里就不再一一细说,这篇博客主要介绍了什么叫做动态类型语言,以及Java对动态类型支持所做的努力。希望能让大家有一个总体印象!
    展开全文
  • 编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块...
  • Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标。
  • 关于如题这几个概念,大部分人应该比较熟悉,但是我昏了好久,所以写下来加深印象。 1. 动态语言 ...除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。 而其实我们平时说
  • 概念区别 【编译型语言与解释型语言、动态类型语言与静态类型语言、强类型语言与弱类型语言】 文章目录一、编译型语言与解释型语言二、动态类型语言与静态类型语言三、强类型语言与弱类型语言总结 一、编译型语言与...
  • 今天来说说编程语言中的动态类型语言与鸭子类型。 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他...
  • Java虚拟机的字节码指令集的数量自从Sun公司的第一款Java虚拟机问世至JDK 7来临...这条新增加的指令是JDK 7实现“动态类型语言(Dynamically Typed Language)”支持而进行的改进之一,也是为JDK 8可以顺利实现Lambd
  • 动态类型语言&静态类型语言

    千次阅读 2017-04-14 16:41:56
    1.动态类型语言概念:意思就是类型的检查是在运行时做的表现:使用变量前不需要声明变量举例:JavaScript、Ruby、Python这些都属于动态类型语言2.静态类型语言概念:意思就是类型判断是在运行前做的(如编译阶段)...
  • 另外编程语言除了编译型和解释型,还有静态语言、动态语言、强类型语言、弱类型语言。那么每种语言类型是什么样子的呢,下面让我们来看看吧。  但是在此之前,我们需要先了解一下计算机原因的发展史,从低级语言到...
  • 通常我们所说的动态语言、静态语言指 动态类型语言(Dynamically Typed Language)和 静态类型语言Statically Typed Language)。 还有一个 Dynamic Programming Language (动态编程语言),静态编程语言。 动态...
  • python是一门动态解释性的强类型定义语言 编译型vs解释型 编译型 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立...
  • 我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器...
  • JavaScript是一种动态类型的脚本语言

    千次阅读 2018-11-25 04:16:01
    JavaScript是一种动态类型的脚本语言;在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。 ...
  • 介绍JDK 动态类型语言支持

    千次阅读 2012-02-10 11:48:02
    注 转自infoq  Java虚拟机的字节码指令集的数量自从Sun公司的第一款Java虚拟机问世至JDK 7来临之前的十余年时间里,一直... 7实现“动态类型语言(Dynamically Typed Language)”支持而进行的改进之一,也是为JDK 8
  • 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言...
  • 下面的语言中哪些语言是动态语言(B ) A.C ...动态语言(弱类型语言动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 例如PHP...
  • 如图所示,Java是强类型语言,静态类型。下面解释下为什么。 三. 解释 静态类型语言:变量定义时有类型声明的语言。 (1)变量的类型在编译的时候确定 (2)变量的类型在运行时不能修改 这...
  • 将知识点分门别类可以更好的记忆,编程语言也是,同类型语言之间也可以相互印证,更全面的理解。 下面转自知乎。 基础概念 Program Errorstrapped errors。解释器或编译器不能处理的错误。导致程序终止执行,如除...
  • 关于编程语言的静态类型、动态类型、编译型以及解释型的区别目录用 [TOC]来生成目录:关于编程语言的静态类型动态类型编译型以及解释型的区别目录 静态类型和动态类型的区别 编译型和解释性的区别 Java语言是静态...
  • 首先要清楚静态类型语言和动态类型语言的判别的标准 定义:如果类型检查发生在编译阶段(compile time),那么是静态类型语言(statically typed languages)中,相反的,如果类型检查发生在运行阶段(run time),那么是...
  • 先来看看编译型语言定义: 编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码 (二进制)。 再来看看解释型语言的定义: 解释型语言的源代码不是直接翻译成机器指令,而是先翻译成中间代码,再由...
  • 类型语言与弱类型语言

    千次阅读 2018-02-01 22:57:19
    Perl and PHP 是动态语言,但也是弱类型语言。 强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。Java、C# 和 Python 等都是强类型语言。 使用哪种语言还是要按需而定。编写简单小应用,...
  •  1 动态类型语言动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。...
  • 类型语言和弱类型语言

    万次阅读 多人点赞 2014-11-03 16:30:01
    我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器...
  • 类型(strong typed、Explicit typed)与弱类型(weakly typed或loosely typed或Implicit typed )的区别可以简单的概括为是否支持隐式转换。 例如:"1" + 2 = "12"这种隐式转换JavaScript、...
  • 类型和弱类型语言有什么区别

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 581,721
精华内容 232,688
关键字:

动态类型语言