编程语言 - 强弱/动静态类型 - 整理

 1.应用场景

了解编程语言的分类及显著的区别, 帮助理解编程语言的本质,和帮助快速学习一门新的语言.

2.学习/操作

1. 文档阅读

12 | 栈空间和堆空间:数据是如何存储的?-极客时间

2. 整理输出

2.1 动态与静态类型

要理解一门语言是静态类型还是动态类型,最本质的判断方法是看在什么时间段对类型进行检测

静态类型的语言会在编译阶段就行检测,动态类型的语言会在运行时做类型检测!

比如C/C++/Go是静态语言,会在编译阶段对类型就行检测,如果检测到不合法的语言,编译阶段就会报错!

而JavaScript,PHP就是动态语言,编译阶段不会做太多类型检测,而是等到运行时再检测变量的具体类型,这是动态语言性能低于静态语言的一个关键的地方。V8对这种动态性做了大量的优化!

2.2 强类型与弱类型语言

要理解一门语言是弱类型还是强类型,看变量在运行时,是否能够改变类型。

比如C / C++ / JavaScript 都可以在运行时将一种类型的变量,改成另外一种类型的,所以他们是弱类型,

而Java就不能运行过程中修改变量类型,所以是静态语言!

对于各种语言的类型,你可以参考下图

举例

```
a = 1
a = 1.1
a = ''
a = []
a = {}
```

这段代码在JS和Python都是可以执行的,但Python并不是一门弱类型的语言。

```
1 + '1'
```

这代码在JS执行结果是'11',但在Python执行却是报错的,因为Python不理解一个整数和字符串相加的逻辑。
在JS中,任何两个类型都是可以相加的,但是结果却不是一定是我们想要的。

补充

Go 和 Java 类似,它是一门静态的、强类型的、编译型编程语言,为并发而生,所以天生适用于并发编程(网络编程)

2.3 特点[优劣势]

1). 动态语言 VS 静态语言

优点:

动态语言:不需要进行编译,开发效率比较高,适合快速开发迭代项目,就学习曲线,可能平缓一些,实际上个人感觉也是差不多。

静态语言: 会做类型检查,质量方面会更好一下,性能方面会更好一些,更适合开发大型项目。

缺点:

动态语言:性能方面差一些。

静态语言: 需要每次执行前,进行编译,开发效率低一些。

2). 强类型语言 VS 弱类型语言

强类型语言和弱类型语言是计算机编程中常用的两个概念,其主要区别在于:

  1. 强类型语言(Strongly Typed Language)在编译和执行程序时总是要求变量和表达式的数据类型匹配,若类型不匹配则会报错。强类型语言一般需要变量在使用前显式地声明其类型,例如Java、C++、C#等。

  2. 弱类型语言(Weakly Typed Language)允许变量在使用前不需要显式声明数据类型,而是在运行时自动匹配数据类型。弱类型语言在转换数据类型时更加灵活,但程序中可能出现难以察觉的错误,例如PHP、JavaScript、Python等。

强类型语言的优点是具有更好的类型检查和代码安全性,弱类型语言则更灵活方便,更容易实现复杂的数据操作和类型转换。因此,在选择编程语言时需要根据实际情况和需求来选择适合的类型。

图表对比

后续补充

...

3. 问题/补充

1. Go 与 Python/PHP的对比

Python/PHP 都是动态语言,而 Go 是静态语言,会做类型检查,可靠性更高。

开发 Web 应用时,Python/PHP 通常躲在 Nginx/Apache 后面作为后台进程,Go 则提供了内置的 Web 服务器,完全可以直接在生产环境使用。

-w498

Python/PHP 之所以要借助额外的 Web 服务器是因为对并发请求的处理,Python 有一个全局锁同时只允许运行一个线程,PHP 本身就没有多线程多进程机制,一次请求从头到位都是一个独立的进程,为了让基于 Python/PHP 的 Web 应用支持并发请求,必须借助外部 Web 服务器。

而 Go 内置的 Web 服务器充分利用了 goroutine,对并发连接有很好的支持。此外,由于协程的本质是在在同一个进程中调度不同线程,所以还支持共享资源。

另外就是 Python/PHP 作为动态语言,性能不如 Go,如果要提升 Python/PHP 性能,必须通过 C 语言编写扩展,复杂度和学习成本太高。

2. 命令式语言一般是指哪些语言呢?

作者回复:

1. 所谓“命令式语言”是英文imperative languages的一种翻译。

命令式的语言的一个特点就是程序员要完成是一件事,需要自己一步一步告诉 机器如何做,即把执行步骤用编程语言的语法罗列出来。

如今主流的编程语言,如c, c++, java, go, python, ruby,无论是否是静态语言还是动态语言,无论是否支持面向对象编程,本质上都是命令式语言。

那什么不是命令式语言呢?

与命令式语言相对的是声明式语言,最常见的就是SQL,它的特点是你只要输入你想要的结果「就是SQL语句」,语言引擎知道该执行什么步骤。

历史上还有一种叫prolog的逻辑编程语言也是声明式的,如果对prolog感兴趣,可以看看我参与翻译的《七周七语言》一书。

3. 变量的静态类型动态类型

20|控制结构:Go中的switch语句有哪些变化?-极客时间

func main() {
    var x interface{} = 13
    switch x.(type) {
    case nil:
        println("x is nil")
    case int:
        println("the type of x is int")
    case string:
        println("the type of x is string")
    case bool:
        println("the type of x is string")
    default:
        println("don't support the type")
    }
}

switch 关键字后面跟着的表达式为x.(type),这种表达式形式是 switch 语句专有的,而且也只能在 switch 语句中使用。

这个表达式中的 x 必须是一个接口类型变量,表达式的求值结果是这个接口类型变量对应的动态类型。

什么是一个接口类型的动态类型呢?

我们简单解释一下。

以上面的代码var x interface{} = 13为例,x 是一个接口类型变量,它的静态类型为interface{},如果我们将整型值 13 赋值给 x,x 这个接口变量的动态类型就为 int。

关于接口类型变量的动态类型,我们后面还会详细讲,这里先简单了解一下就可以了。

个人想法,所以,静态类型与动态类型是可以出现在同一个编程语言中的,同一个变量中的。

4.参考

参见当阅读列表

后续补充

...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值