Go语言:简介(一)
对Go语言了解前,我们先来补一些基本概念
基本概念
Program Errors
trapped errors。导致程序终止执行,如除0,Java中数组越界访问
untrapped errors。 出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址
Forbidden Behaviours
语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.Well behaved、ill behaved
well behaved: 如果程序执行不可能出现forbidden behaviors, 则为well behaved。
ill behaved: 否则为ill behaved…
强类型与弱类型
强类型(strongly typed): 一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors。
弱类型(weakly typed): 否则为weakly typed。(存在部分程序有可能出现forbidden behaviors)
动态与静态类型(Dynamically/Statically Typed Language)
静态类型(statically): 在编译时拒绝ill behaved程序。
动态类型(dynamiclly): 在运行时拒绝ill behaved程序。
注意:不能通过“变量类型是否明确声明”来判断是否是静态类型语言。
静态类型语言包括:explicitly typed显式类型 与 implicity typed隐式类型。
大家觉得C语言要写int a, int b之类的,Python不用写(可以直接写a, b),所以C
是静态,Python是动态。这么理解是不够准确的。譬如Ocaml是静态类型的,但是也可
以不用明确地写出来。
这里说的Ocaml是静态隐式类型。动态语言(Dynamic Programming Language)
又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函
数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个
动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于
动态语言。例子
无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell补充几个概念来理解
动态类型语言:意思就是类型的检查是在运行时做的。
静态类型语言:类型判断是在运行前判断。
强类型:一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。
弱类型:一个变量可以赋不同数据类型的值。。
注意:是不是动态类型语言与这门语言是不是类型安全的完全不相干的,不要将它们联系在一起!
前几节介绍的是学术界的一种相对“严格”的说法,在补充的概念中,是比较通俗的解释。
(个人理解:通过“类型判断”去拒绝(尝试)“ill behaved”,通过“指定数据类型”去
保证“well behaved”)。最后上图帮助理解
好累啊,来点轻松的~
GO起源与发展
这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非常深刻的见解.
Go 语言起源 2007 年,并于 2009 年正式对外发布。
Go 语言在 2010 年 1 月 8 日被 Tiobe(闻名于它的编程语言流行程度排名)宣布为 “2009 年年度语言”
- 为什么要创造一门编程语言?
对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。
在 Go 语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
- Go语言的发展目标
Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡.(GO语言是一门类型安全(强类型)和内存安全的编程语言。)
- Go语言的特性
1.构建速度
动态语言将快速编译作为自身的一大亮点,像 C++ 那样的静态语言一般都有非常漫长的
编译和链接工作。而同样作为静态语言的 Go 语言,通过自身优良的构建机制,成功地
去除了这个弊端,使得程序的构建过程变得微不足道,拥有了像脚本语言和动态语言那样
的高效开发的能力。
Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),
一般情况下构建一个程序的时间只需要数百毫秒到几秒。C 语言中“头文件”的概念却导
致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间,而Go 语
言采用包模型这个模型通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常
好的可量测性。
2.垃圾回收
由于内存问题(通常称为内存泄漏)长期以来一直伴随着 C++ 的开发者们,Go 语言的
设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管 Go 语言像其它
静态语言一样执行本地代码,但它依旧运行在某种意义上的虚拟机,以此来实现高效快速
的垃圾回收.
3.协程与通道
Go 语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大
量的分布式和多核的计算机,这一点对于谷歌内部的使用来说就非常重要了。设计者通过
goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个
goroutine 之间的通信。他们实现了**分段栈增长和 goroutine **在线程基础上多
路复用技术的自动化。