代码改变世界

学习一门新语言需要了解的基础-00 学习基础技能树意义

2017-10-12 09:08 by 李永京, ... 阅读, ... 评论, 收藏, 编辑

00 学习基础技能树意义

本节内容

  • 到底什么是基础
  • 为什么选择Go作为基础语言
  • 安装学习环境
  • 演示:反汇编、函数内联优化[付费阅读]

推荐阅读时间:30分钟

推荐学习时间:2小时

到底什么是基础

学会逆向手段去推导语言提供的某种句法、某种范式、某种原理。

这里的基础是指我们怎么样用一种方式学习一门新的语言,我们学习一门语言怎么样去看官方文档很抽象的文法或者很抽象的理念,把它们还原。比如说接口调用,文档上说是运行期的动态绑定,那么什么叫运行期的动态绑定我得用一种方式去了解这件事。接口调用的性能到底有什么影响,什么时候适合使用什么时候不适合使用?除了设计模式上使用接口以外,性能对接口有多大影响。我们需要有种手段去测量这些事情,很多时候这个过程叫做逆向工程。如果我们从官方文档去学习一门语言如果是正向的话,那么通过汇编来反推,用实现反推原理的时候就是逆向的。

关于基础,说白了,你现在就基于一句话,我们是学会一种逆向手段来推导比如说go语言提供的某种句法某种范式某种原理,我们怎么样从汇编的角度站在CPU的角度来推导这件事,把这件事搞明白,它这句话是对的还是错的。我们知道经常有这样的问题,我们有些时候看文档,看了以后云山雾罩的不知道什么意思,好像理解了但又好像不明白,这东西对于我们开发中很大的麻烦,两种不同的数据结构,文档中说了某种数据结构占用内存小,复制的时候数据小,但是我们可能就会想这可能不对,既然一种比另外一种好,干嘛不把两种合并了。如果不合并,他们肯定有不同的适用场景,很多文档不会提这种事情。所以我们在这里学一门技术的时候光看文档是没有用的,我们根本没有办法深入到细节里面,我们得有一个手段去逆向推导这件事情,你说的一句话到底是什么意思,哪些东西是你没有表达清楚的,有哪些东西是我自己需要注意的,你得有种手段去测量这件事。这个非常重要否则你就不能说你把这东西学好了。我们很多时候觉得很奇怪,我和某个人同时学习一样东西,结果我写的代码可能不比别人写的好,别人写的那种代码我甚至都没有见过。你得搞清楚很多技巧跟语言无关和原理有关,你了解这个原理的话不管用什么语言都可以实现。因为现在多种语言混合编程是很正常的一件事。

为什么选择Go作为基础语言

go语言其实有很多优点,也有很多缺点。我们不是学习一门语言的,我们学习技巧,用这种技巧反向的逆向的推导一些原理,跟学习某种语言无关,只是选择了go语言作为案例,学的不是某种技巧学习是某种思路和方法。

学习这块很大的误区是会扎到单个点上面,比如说看计算机系统,一看的时候就扎到某个细节上面去了,然后那个细节折腾死去活来的,两三天以后实在没兴趣再看了,然后就放弃了这件事,很多人看书都是这个样子。但是得明白,那样看的话你永远看几页放弃看几页放弃,几年下来什么长进没有。

我们的明白,我们先得学习某种技巧或者说学习某种方法,然后再去利用这种方法去推导某种细节,高大上的说法就是所谓的方法论,方法论还是很重要的,你做一件事用什么样的方法还是很重要的。学习这个事本身就很复杂,你不觉得学习比你工作时候更复杂,你学习没学好,开发时候写的代码很不好看,然后自己瞅的都头疼。问题是很长时间下来对自己的代码感觉没啥长进。然后慢慢对于编程这件事就失去兴趣了。

安装学习环境

我们这个系列选择Linux Ubuntu作为学习环境。

$ sudo passwd root #修改root密码
$ su #以root账户登录
$ sudo apt install openssh-server #安装open ssh
$ vim /etc/ssh/sshd_config #修改PermitRootLogin without-password为PermitRootLogin yes
$ sudo service ssh restart #重启ssh服务
$ ifconfig #查看网络

如果是桌面版本可能需要做下面设置

$ chmod -R 777 /etc/hosts #修改host
$ /etc/default/grub #修改分辨率1920×1080
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1920×1080"
$ sudo update-grub

安装gcc、gdb、binutils、make、git等工具,以后会使用到。

$ sudo apt install gcc gdb binutils make git dstat sysstat htop curl wget upx

验证这些工具看看是否安装正确

$ lsb_release -d
$ uname -a
$ gcc --version
$ gdb --version
$ make
$ objdump
$ readelf
$ htop
$ dstat
$ pidstat -w

Compile Go 1.4

1.4以前版本编译器和运行时使用c语言编写,使用gcc可以编译。

wget https://dl.gocn.io/golang/1.4.3/go1.4.3.src.tar.gz
wget https://dl.gocn.io/golang/1.9/go1.9.src.tar.gz
$ tar -C /usr/local -xzf go1.4.3.src.tar.gz #解压缩
$ pushd /usr/local
$ ls
$ mv go go1.4 #修改目录名为1.4
$ cd go1.4
$ cd src
$ CGO_ENABLED=0 ./make.bash #关掉一些指令,并编译
$ ../bin/go version #测试go环境
$ popd

Bootstrap Go 1.9

1.5以后版本使用go编译go,比如go1.4编译go1.9

$ tar -C /usr/local -xzf go1.9.src.tar.gz #解压缩
$ cd /usr/local/go
$ cd src
$ GOROOT_BOOTSTRAP=/usr/local/go1.4 ./make.bash #使用1.4版本编译1.9
$ ../bin/go version #测试go环境
$ cd
$ vim .bashrc #设置基本环境变量

最下面新增go环境变量配置

export GOPATH=$HOME/work
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
$ source .bashrc #让配置生效
$ go version
$ go env

演示:反汇编、函数内联优化[付费阅读]

这个系列的每篇文章有大半篇幅内容属于付费阅读。提供微信支付支付宝支付打赏50元备注留言手动提供付费文章访问密码。

这部分内容介绍如何通过反汇编对c语言和go语言函数内联优化对比和gdb调试。