首页 > 其他分享 >语言类型详解

语言类型详解

时间:2023-08-28 10:24:34浏览次数:33  
标签:Java 语言 C# 编译 详解 类型 动态

1、编译型语言

需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。

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

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

代表语言:C、C++、Pascal、Object-C 以及最近很火的苹果新语言 swift

2、解释型语言

解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。

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

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

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

3、混合型语言

既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如 C#,C# 在编译的时候不是直接编译成机器码而是中间码,.NET 平台提供了中间语言运行库运行中间码,中间语言运行库类似于 Java 虚拟机。.net 在编译成 IL 代码后,保存在 dll 中,首次运行时由 JIT 在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。我个人认为抛开一切的偏见 C# 是这个星球上最好的编程语言。可惜微软的政策限制了 C# 的推广。

Java 先生成字节码再在 Java 虚拟机中解释执行。

严格来说混合型语言属于解释型语言。C# 更接近编译型语言。

动态语言和静态语言

1、动态语言

是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。

主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。

2、静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。如 Java、C、C++。

3、注意:

很多人认为解释型语言都是动态语言,这个观点是错的!Java 是解释型语言但是不是动态语言,Java 不能在运行的时候改变自己结构。反之成立吗?动态语言都是解释型语言。也是错的!Object-C 是编译型语言,但是他是动态语言。得益于特有的 run time 机制(准确说 run time 不是语法特性是运行时环境,这里不展开)OC 代码是可以在运行的时候插入、替换方法的。

C# 也是动态语言,通过 C# 的反射机制可以动态的插入一段代码执行。所以我说 C# 是这个星球最好的编程语言。

动态类型语言和静态类型语言

1、动态类型语言

很多网上资料把动态类型语言和动态语言混为一谈,简直是误人子弟。动态类型语言和动态语言是完全不同的两个概念。动态类型语言是指在运行期间才去做数据类型检查的语言,说的是数据类型,动态语言说的是运行是改变结构,说的是代码结构。

动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段。

主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

2、静态类型语言

静态语言的数据类型是在编译其间确定的或者说运行之前确定的,编写代码的时候要明确确定变量的数据类型。

主要语言:C、C++、C#、Java、Object-C。

3、注意:

相当一部分程序员,也包括曾经的我,认为解释型语言都是动态类型语言,编译型语言都是静态类型语言。这个也是错的。swift 是编译型语言但是它也是动态类型语言。C# 和 Java 是解释型语言也是静态类型语言。

强类型语言和弱类型语言

1、强类型语言:

强类型语言,一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型。你不能把一个整形变量当成一个字符串来处理。

主要语言:Java、C#、Python、Object-C、Ruby

2、弱类型语言:

数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量 a 赋一个字符串值,那么 a 就变成字符类型。

主要语言:JavaScript、PHP、C、C++(C 和 C++ 有争议,但是确实可以给一个字符变量赋整形值,可能初衷是强类型,形态上接近弱类型)

3、注意:

一个语言是不是强类型语言和是不是动态类型语言也没有必然联系。Python 是动态类型语言,是强类型语言。JavaScript 是动态类型语言,是弱类型语言。Java 是静态类型语言,是强类型语言。

标签:Java,语言,C#,编译,详解,类型,动态
From: https://www.cnblogs.com/cps666/p/17661547.html

相关文章

  • MySQLSTMT函数详解及使用方法(mysql_stmt())
    MySQL_STMT函数详解及使用方法 MySQL_STMT是MySQL提供的一个CAPI,用于执行预处理语句(Preparedstatements)。相比于直接执行SQL,预处理语句具有更高的运行效率和更好的安全性。本文将详细介绍MySQL_STMT函数的使用方法。 1.创建预处理语句 使用MySQL_STMT,需要先创建一个预......
  • 类型别名TypeAlias
    fromcollections.abcimportIterablefromtypingimportTypeAliasFromTo=tuple[str,str]#3.10之前FromTo:TypeAlias=tuple[str,str]#3.10之后推荐使用TypeAliasdefzip_replace(text:str,changes:Iterable[FromTo])->str:forfrom_,toinchange......
  • AtomicInteger详解
    AtomicInteger定义AtomicInteger类是系统底层保护的int类型,通过对int类型的数据进行封装,提供执行方法的控制进行值的原子操作,但AtomicInteger≠Integer。AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。AtomicInteger使用场景AtomicInteger提供原子操作......
  • G5、Pix2Pix详解
    ......
  • C++11——5.9 强类型枚举
    详细介绍请见:★★★原文链接★★★:https://subingwen.cn/cpp/enum/ 枚举语法(C++98):关键字enum 枚举名字(可以不写,不写就是匿名枚举) {枚举值};#include<iostream>usingnamespacestd;//枚举在相同作用域内全局范围内可见(定义在类内就类内全局可见;定义在全局就全......
  • 依赖倒转原则详解
    依赖倒转原则基本介绍依赖倒转原则(DependenceInversionPrinciple):1.高层模块,不要依赖底层模块,二者都应该依赖其抽象。2.抽象不应该依赖细节,细节应该依赖抽象。3.依赖倒转的核心思想是面向接口编程。4.依赖倒转原则基于这样的设计理念:相对于细节的多变,抽象的东西就稳定......
  • 最完整的 generatorConfig.xml 配置详解
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEgeneratorConfigurationPUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">&......
  • 19 迭代器模式 -- go语言设计模式
    迭代器模式是一种行为型设计模式,它允许我们在不暴露聚合对象内部结构的情况下,遍历其中的元素。在这种模式下,我们使用迭代器对象来遍历聚合对象中的元素。迭代器模式的实现代码packagemainimport("fmt")//定义一个迭代器接口typeIteratorinterface{HasNext......
  • GO语言中的闭包
    GO语言中的闭包在Go语言中,闭包(Closure)是指一个函数值(函数变量)捕获并绑定了其所在的词法环境(LexicalEnvironment)。换句话说,闭包是一个函数以及其相关的引用环境的组合体。一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的参数,或者外层函数中直接定......
  • JVM调优工具详解及调优实战
    前置启动程序事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用 Jmap此命令可以用来查看内存信息,实例个数以及占用内存大小 jmap-histo14660#查看历史生成的实例jmap-histo:live14660#查看当前存活的实例,执行过程中可能会触发一次full......