编程语言类型浅谈比较

前言

前些日子群里有人问说了这么一段话引起里我的好奇:

语言层选择上虽然没有什么好说的,不过不知道大家在学习语言的时候有没有像他一样的困惑。

他其实讲的是js对象和Java对象的区别,Java面向对象有继承,封装,多态三大特性,而js是基于对象的,继承等是通过原型链或其他方法进行实现。比如在上边的例子中Java对象可以这样实现:

// Java
Student stu = new Student();  //调用构造函数
stu.setName("Allen");  //调用成员方法
System.out.println(stu.name); //对象属性

js的话会这么写:构造函数+成员方法+对象属性

// JS
<script>
var student = {
    name: "Allen",
    fullName : function() 
	{
       return this.name;
    }
};
document.getElementById("demo").innerHTML = person.fullName();
</script>

这就涉及到js和Java的面向对象的不同,Java三大特性在js中都有不同的实现。而除了面向对象,我们可以更扩展地讨论下编程语言的类型系统,并把几个比较常用的语言拿出来对比总结一下。从语言类型的角度探究各种编程语言都有什么不同。

一,编程语言类型系统

强类型语言

强类型语言是一种总是强制类型定义的语言,要求变量的使用严格符合定义,所有变量都必须先定义后使用。Java、.Net和C++等一些语言都是强制类型定义的,也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。

弱类型语言

弱类型语言也称为弱类型定义语言,与强类型定义相反。像VB,PHP等一些语言就属于弱类型语言。简单理解就是一种变量类型可以被忽略的语言。比如弱类型定义的可以将字符串'12'和整数3进行连接得到字符串'123',然后可以把它看成整数123,而不用显示转换。但其实他们的类型没有改变,编译器只是在判断出一个表达式含有不同类型的变量之后,自动在这些变量前加了一个clong()或(int)()这样的转换函数而已。

静态类型

静态类型是编译期间做检查数据类型的语言,即写程序时要声明所有变量的数据类型,是固定的。使用数据之前,必须先声明数据类型(int ,float,double等)。相当于使用之前,首先要为它们分配好内存空间。

动态类型

动态类型是运行期间才做数据类型检查的语言,即动态类型语言编程时,永远不用给任何变量指定数据类型。该语言会在第一次赋值给变量时,在内部将数据类型记录下来。

各种语言类型比较

强类型语言在速度上可能略逊色于弱类型语言,但是强类型语言带来的严谨性可以有效地帮助避免许多错误。

静态语言可能结构完整更好调试,动态语言就不需要很多类型相关的代码

以下是各种热门语言的类型分布图:

二,Java

Java属于强类型,静态类型语言

Java语言支持的变量类型有:

类变量:独立于方法之外的变量,用 static 修饰。访问通过类名调用访问,以下例子省略
实例变量:独立于方法之外的变量,不过没有 static 修饰。
局部变量:类的方法中的变量。

它实现变量赋值是这样的:

//局部变量栈上分配,初始化之后才可以使用
int a = 1; 

/* 
   实例变量产生在类中
   对象实例化后变量值随之确定
*/
public class Student {
  public String name;

  //在构造器中对name赋值
   public Student (String stuName){
      name = stuName;
   }
}

Student stu = new Student("Allen");

类型转换是这样的:

基本类型互转以小转大可以直接转,以大转小需要强制类型转换/

short a = 0;

int b = a;

a = (short) b;

string需要包装类型转换

s = "111"

int i = Integer.parseInt( s );

包装类型和基本类型可以实现自动装箱拆箱

Integer i = 99;

int a = i;

三,Golang

golang的本质是一种静态类型的语言,但它在编写时又可以写成动态类型语言的声明。

它实现变量赋值是这样的:

var identifier type

甚至可以用:=直接声明初始化

四,Python

Python是强类型动态类型语言,它可以实现变量赋值是这样的:

Python允许你同时为多个变量赋值。例如:
a = b = c = 1
以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。
您也可以为多个对象指定多个变量。例如:
a, b, c = 1, 2, "john"
以上实例,两个整型对象 1 和 2 分别分配给变量 a 和 b,字符串对象 "john" 分配给变量 c。

五,C++

C++可以让程序员更细致地内存管理,

它实现变量赋值是这样的:

变量告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:

type variable_list;


在这里,type 必须是一个有效的 C++ 数据类型,可以是 char、wchar_t、int、float、double、bool 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。

如果接收值的变量想要的是一个整数,而赋给它的值是一个浮点数,那么当转换为 int 并存储在变量中时,浮点值将被截断。这意味着小数点后的所有内容都将被丢弃。示例如下:

int x;
double y = 3.75;
x = y; // x被赋值为3,y仍然保留3.75

六,JavaScript

Js是动态弱类型语言

它实现变量赋值是这样的:

var pi=3.14; var person="John Doe"; var answer='Yes I am!';

一条语句中声明的多个不可以赋同一个值:

var x,y,z=1;

x,y 为 undefined, z 为 1。

七,Scala

在 Scala 中,一个很经典的问题是区分val和var。scala使用关键词 "var" 声明变量,使用关键词 "val" 声明常量。

变量
声明变量实例如下:

var myVar : String = "Foo"
var myVar : String = "Too"

以上定义了变量 myVar,我们可以修改它。

常量

声明常量实例如下:

val myVal : String = "Foo"

以上定义了常量 myVal,它是不能修改的。如果程序尝试修改常量 myVal 的值,程序将会在编译时报错。

动态类型

在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错。

var myVar = 5;
val myVal = "Hello, Scala!";

以上实例中,myVar 会被推断为 Int 类型,myVal 会被推断为 String 类型。

参考:runoob 菜鸟教程

猜你喜欢

转载自blog.csdn.net/wannuoge4766/article/details/106165464