课程结构
01.课程概览与 shell
02.Shell 工具和脚本
03.编辑器 (Vim)
04.数据整理
05.命令行环境
06.版本控制(Git)
07.调试及性能分析
08.元编程
09.安全和密码学
10.大杂烩
11.提问&回答
本文档修改自这里,补充了一些视频中展示但配套文档中未提供的代码,以及一些注释,另外,本节中涉及的相关文件可在百度云链接中获取。
元编程
我们这里说的 “元编程(metaprogramming)” 是什么意思呢?好吧,对于本文要介绍的这些内容,这是我们能够想到的最能概括它们的词。因为我们今天要讲的东西,更多是关于 流程 ,而不是写代码或更高效的工作。
本节课我们会学习构建系统、代码测试以及依赖管理。在您还是学生的时候,这些东西看上去似乎对您来说没那么重要,不过当您开始实习或走进社会的时候,您将会接触到大型的代码库,本节课讲授的这些东西也会变得随处可见。
必须要指出的是,“元编程” 也有用于操作程序的程序之含义,这和我们今天讲座所介绍的概念是完全不同的。
构建系统
如果您使用 LaTeX 来编写论文,您需要执行哪些命令才能编译出您想要的论文呢?执行基准测试、绘制图表然后将其插入论文的命令又有哪些?或者,如何编译本课程提供的代码并执行测试呢?
有很多工具可以帮助我们完成这些操作,这些工具通常被称为 “构建系统”。您需要定义依赖、目标和规则。您必须告诉构建系统您具体的构建目标,系统的任务则是找到构建这些目标所需要的依赖,并根据规则构建所需的中间产物,直到最终目标被构建出来。
make
是最常用的构建系统之一,您会发现它通常被安装到了几乎所有基于UNIX的系统中。make
并不完美,但是对于中小型项目来说,它已经足够好了。当您执行 make
时,它会去参考当前目录下名为 Makefile
的文件。所有构建目标、相关依赖和规则都需要在该文件中定义,它看上去是这样的:
~ $ vim makefile
~ $ cat makefile
paper.pdf: paper.tex plot-data.png
pdflatex paper.tex
plot-%.png: %.dat plot.py
./plot.py -i $*.dat -o $@
- 这个文件中的指令,即如何使用右侧文件构建左侧文件的规则
- 冒号左侧的是构建目标,冒号右侧的是构建它所需的依赖
- 缩进的部分是从依赖构建目标时需要用到的一段程序
- 规则中的
%
是一种模式,它会匹配其左右两侧相同的字符串- 如果目标是
plot-foo.png
,make
会去寻找foo.dat
和plot.py
作为依赖
- 如果目标是
在 make
中,第一条指令还指明了构建的目的,如果您使用不带参数的 make
,这便是我们最终的构建结果。或者,您可以使用这样的命令来构建其他目标:make plot-data.png
。
现在,让我们看看如果在一个空的源码目录中执行make
会发生什么?
$ make
make: *** No rule to make target 'paper.tex', needed by 'paper.pdf'. Stop.
make
会告诉我们,为了构建出paper.pdf
,它需要 paper.tex
,但是并没有一条规则能够告诉它如何构建该文件。让我们构建它吧!
$ touch paper.tex
$ make
make: *** No rule to make target 'plot-data.png', needed by 'paper.pdf'. Stop.
哟,有意思,我们是有构建 plot-data.png
的规则的,但是这是一条模式规则。因为源文件data.dat
并不存在,因此 make
就会告诉您它不能构建 plot-data.png
,让我们创建这些文件:
$ cat paper.tex
\documentclass{
article}
\usepackage{
graphicx}
\begin{
document}