当前位置:首页 » 编程语言 » yaccpython

yaccpython

发布时间: 2022-11-22 16:52:35

㈠ 如何用Yacc实现一个python编译

1:python这种靠缩进的语言的文法其实是上下文有关的,EBNF是表达不出来的,我不知道yacc是不是有什么丧心病狂的扩展来给你做这个。
2:每一行前面的tab的数量你不要看成一堆tab,要把他的数量本身看成一个整体,也就是说再作语法分析的时候其实是:

[0]def fuck
[1]if true:
[2]fuck
[1]else:
[2]shit

[0]def shit
..

而不是原始的:
def fuck
if true:
fuck
else:
shit

def shit
..

3:根据python的标准,一个缩进要用多少个tab多少个space是可以在注释里面改的,也就是说你parse到一个地方,看到了那个注释,这个量就变了,后面呵呵呵。

㈡ 如何用Yacc实现一个Python的编译器

您可以先建一个Stack来存放每一层缩进块的Token,然后根据Lexer送来的Token中的行号、列号等信息来和Stack栈顶的数据进行对比,判断下来是该进入缩进的就push一个INDENT,并这个INDENT插入到输出的Token流中。
发现是Stack中旧的Token匹配的,就把之前的缩进块pop出来,并在输出的Token流中插入DEDENT。
然后在Paser层面处理语句块的时候可以这样处理(我只写大概意思的伪码,具体您自己看着办)
block ::= INDENT NLS statements NLS DEDENT
if ::= IF LPAREN expression RPAREN COLON block

㈢ Python 为什么不支持可嵌套的正则规则

因为一个支持了嵌套规则的正则表达式就不是一个正则表达式,它变成了yet another yacc。

㈣ 掌握C语言后学什么PythonC++JAVA

建议你可以学习C++,因为C语言和C++相似程度比较大,你学习的时候就会比较舒服一点,如果后学的语言差很多的话,会导致很长时间转换不过来,等你适应了后面学的语言,前面学的又会忘记得差不多。所以我推荐你学习和C语言类似的C++。
不过我不建议你换语言,毕竟怎么换都只是语法的问题,编程的精髓在于掌握算法,而不是掌握多的语言,你已经学会了C语言,那么就探索、学习算法吧。不过你纯爱好的话,也没有很大关系就是了,但是不同的语言,算法还是类似的,多种语言学习没有什么意思的。

㈤ tensorlab 支持python接口吗

这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护。内容包括:Web框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。

伯乐在线已在 GitHub 上发起“Python 资源大全中文版”的整理。欢迎扩散、欢迎加入。
GitHub - jobbole/awesome-python-cn: Python资源大全中文版
环境管理
管理 Python 版本和环境的工具
p – 非常简单的交互式 python 版本管理工具。
pyenv – 简单的 Python 版本管理工具。
Vex – 可以在虚拟环境中执行命令。
virtualenv – 创建独立 Python 环境的工具。
virtualenvwrapper- virtualenv 的一组扩展。
包管理
管理包和依赖的工具。
pip – Python 包和依赖关系管理工具。
pip-tools – 保证 Python 包依赖关系更新的一组工具。
conda – 跨平台,Python 二进制包管理工具。
Curdling – 管理 Python 包的命令行工具。
wheel – Python 分发的新标准,意在取代 eggs。
包仓库
本地 PyPI 仓库服务和代理。
warehouse – 下一代 PyPI。
Warehousebandersnatch – PyPA 提供的 PyPI 镜像工具。
devpi – PyPI 服务和打包/测试/分发工具。
localshop – 本地 PyPI 服务(自定义包并且自动对 PyPI 镜像)。
分发
打包为可执行文件以便分发。
PyInstaller – 将 Python 程序转换成独立的执行文件(跨平台)。
dh-virtualenv – 构建并将 virtualenv 虚拟环境作为一个 Debian 包来发布。
Nuitka – 将脚本、模块、包编译成可执行文件或扩展模块。
py2app – 将 Python 脚本变为独立软件包(Mac OS X)。
py2exe – 将 Python 脚本变为独立软件包(Windows)。
pynsist – 一个用来创建 Windows 安装程序的工具,可以在安装程序中打包 Python本身。
构建工具
源码编译成软件。
buildout – 一个构建系统,从多个组件来创建,组装和部署应用。
BitBake – 针对嵌入式 Linux 的类似 make 的构建工具。
fabricate – 对任何语言自动找到依赖关系的构建工具。
PlatformIO – 多平台命令行构建工具。
PyBuilder – 纯 Python 实现的持续化构建工具。
SCons – 软件构建工具。
交互式解析器
交互式 Python 解析器。
IPython – 功能丰富的工具,非常有效的使用交互式 Python。
bpython- 界面丰富的 Python 解析器。
ptpython – 高级交互式Python解析器, 构建于python-prompt-toolkit 之上。
文件
文件管理和 MIME(多用途的网际邮件扩充协议)类型检测。
imghdr – (Python 标准库)检测图片类型。
mimetypes – (Python 标准库)将文件名映射为 MIME 类型。
path.py – 对 os.path 进行封装的模块。
pathlib – (Python3.4+ 标准库)跨平台的、面向对象的路径操作库。
python-magic- 文件类型检测的第三方库 libmagic 的 Python 接口。
Unipath- 用面向对象的方式操作文件和目录
watchdog – 管理文件系统事件的 API 和 shell 工具
日期和时间
操作日期和时间的类库。
arrow- 更好的 Python 日期时间操作类库。
Chronyk – Python 3 的类库,用于解析手写格式的时间和日期。
dateutil – Python datetime 模块的扩展。
delorean- 解决 Python 中有关日期处理的棘手问题的库。
moment – 一个用来处理时间和日期的Python库。灵感来自于Moment.js。
PyTime – 一个简单易用的Python模块,用于通过字符串来操作日期/时间。
pytz – 现代以及历史版本的世界时区定义。将时区数据库引入Python。
when.py – 提供用户友好的函数来帮助用户进行常用的日期和时间操作。
文本处理
用于解析和操作文本的库。
通用
chardet – 字符编码检测器,兼容 Python2 和 Python3。
difflib – (Python 标准库)帮助我们进行差异化比较。
ftfy – 让Unicode文本更完整更连贯。
fuzzywuzzy – 模糊字符串匹配。
Levenshtein – 快速计算编辑距离以及字符串的相似度。
pangu.py – 在中日韩语字符和数字字母之间添加空格。
pyfiglet -figlet 的 Python实现。
shortuuid – 一个生成器库,用以生成简洁的,明白的,URL 安全的 UUID。
unidecode – Unicode 文本的 ASCII 转换形式 。
uniout – 打印可读的字符,而不是转义的字符串。
xpinyin – 一个用于把汉字转换为拼音的库。
Slug化
awesome-slugify – 一个 Python slug 化库,可以保持 Unicode。
python-slugify – Python slug 化库,可以把 unicode 转化为 ASCII。
unicode-slugify – 一个 slug 工具,可以生成 unicode slugs ,需要依赖 Django 。
解析器
phonenumbers – 解析,格式化,储存,验证电话号码。
PLY – lex 和 yacc 解析工具的 Python 实现。
Pygments – 通用语法高亮工具。
pyparsing – 生成通用解析器的框架。
python-nameparser – 把一个人名分解为几个独立的部分。
python-user-agents – 浏览器 user agent 解析器。
sqlparse – 一个无验证的 SQL 解析器。
特殊文本格式处理
一些用来解析和操作特殊文本格式的库。
通用
tablib – 一个用来处理中表格数据的模块。
Office
Marmir – 把输入的Python 数据结构转换为电子表单。
openpyxl – 一个用来读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的库。
python-docx – 读取,查询以及修改 Microsoft Word 2007/2008 docx 文件。
unoconv – 在 LibreOffice/OpenOffice 支持的任意文件格式之间进行转换。
XlsxWriter – 一个用于创建 Excel .xlsx 文件的 Python 模块。
xlwings – 一个使得在 Excel 中方便调用 Python 的库(反之亦然),基于 BSD 协议。
xlwt / xlrd – 读写 Excel 文件的数据和格式信息。
relatorio – 模板化OpenDocument 文件。
PDF
PDFMiner – 一个用于从PDF文档中抽取信息的工具。
PyPDF2 – 一个可以分割,合并和转换 PDF 页面的库。
ReportLab – 快速创建富文本 PDF 文档。
Markdown
Mistune – 快速并且功能齐全的纯 Python 实现的 Markdown 解析器。
Python-Markdown – John Gruber’s Markdown 的 Python 版实现。
YAML
PyYAML – Python 版本的 YAML 解析器。
CSV
csvkit – 用于转换和操作 CSV 的工具。
Archive
unp – 一个用来方便解包归档文件的命令行工具。
自然语言处理
用来处理人类语言的库。
NLTK – 一个先进的平台,用以构建处理人类语言数据的 Python 程序。
jieba – 中文分词工具。
langid.py – 独立的语言识别系统。
Pattern – Python 网络信息挖掘模块。
SnowNLP – 一个用来处理中文文本的库。
TextBlob – 为进行普通自然语言处理任务提供一致的 API。
TextGrocery – 一简单高效的短文本分类工具,基于 LibLinear 和 Jieba。
文档
用以生成项目文档的库。
Sphinx – Python 文档生成器。
awesome-sphinxdoc
MkDocs – 对 Markdown 友好的文档生成器。
pdoc – 一个可以替换Epydoc 的库,可以自动生成 Python 库的 API 文档。
Pycco – 文学编程(literate-programming)风格的文档生成器。
配置
用来保存和解析配置的库。
config – logging 模块作者写的分级配置模块。
ConfigObj – INI 文件解析器,带验证功能。
ConfigParser – (Python 标准库) INI 文件解析器。
profig – 通过多种格式进行配置,具有数值转换功能。
python-decouple – 将设置和代码完全隔离。
命令行工具
用于创建命令行程序的库。
命令行程序开发
cement – Python 的命令行程序框架。
click – 一个通过组合的方式来创建精美命令行界面的包。
cliff – 一个用于创建命令行程序的框架,可以创建具有多层命令的命令行程序。
clint – Python 命令行程序工具。
colorama – 跨平台彩色终端文本。
docopt – Python 风格的命令行参数解析器。
Gooey – 一条命令,将命令行程序变成一个 GUI 程序。
python-prompt-toolkit – 一个用于构建强大的交互式命令行程序的库。
生产力工具
aws-cli – Amazon Web Services 的通用命令行界面。
bashplotlib – 在终端中进行基本绘图。
caniusepython3 – 判断是哪个项目妨碍你你移植到 Python 3。
cookiecutter – 从 cookiecutters(项目模板)创建项目的一个命令行工具。

㈥ 元编程的使用示例

一个简单元编程的例子是使用bash脚本的产生式编程示例:
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do
echo echo $I >>program
done
chmod +x program
这个脚本(或程序)生成了一个新的993行程序来打印1至992。这只是演示用代码来写更多代码,并不是打印数字的最有效方法。然而,一个程序员可以几分钟内编写和执行元程序,却生成了近1000行代码。
==========
C++中也可以使用模板来进行元编程(以下代码在VC2008中编译通过):
#include<iostream>
using namespace std;
int Result;
//主模板
template<int N> //模板
class Fibonacci
{
public:
enum{Result = Fibonacci<N-1>::Result + Fibonacci<N-2>::Result };
//枚举,带有隐含计算
};
//完全特化模板
template<>
class Fibonacci<1> //带常参数1的构造函数
{
public:
enum { Result = 1 };
//给枚举赋初值1
};
//完全特化模板
template<>
class Fibonacci<0> //带参数0的模板
{
public:
enum { Result = 0 };
//给枚举赋初值0
};
int main()
{
std::cout << 第20项的Fibonacci数是: << Fibonacci<20>::Result << std::endl;
//隐含计算
system(pause);
return 1;
}
该示例定义了一个类模板,类中声明了一个枚举类型,该程序的奥秘就在枚举类型的构造上。从枚举类型的构造可以看出,他自身有一个样俺的迭代计算。两个构造函数为枚举类型初始化了数列的初始值,当调用“Fibonacci<20>::Reasult“时,就以这两个初始值为基础进行迭代。因此,程序在运行时并没有显示的计算,而是在编译时就由编译器计算了。
当编译器实例化Fibonacci<20>时,为了给其enum Result赋值,编译器需要对Fibonacci<19>和Fibonacci<18>进行实例化,之后同理······,当实例化到Fibonacci<1>和Fibonacci<0>的时候,完全特化模板被实例化,至此迭代结束。
所以,该程序编译的结果仅包含一个常量值,输出如下:
第20项的Fibonacci数是:6765
==========
不是所有的元编程都用产生式编程。如果程序可以在运行时改变(如Lisp、Ruby、Python、Smalltalk、Lua、Groovy和JavaScript),这种技术可以不实际生成源代码就使用元编程。
在Ruby中,最常用的就是attr系列方法,譬如attr、attr_reader、attr_writer、attr_accessor。attr_reader方法为一个实例变量产生一个用于读取其值的方法,attr_writer为其产生一个用于写入值的方法,attr_accessor则同时具有这两种功能。
class Foo
attr_reader :just_read
attr_writer :just_write
attr_accessor :both_read_and_write
def initialize
@just_read = 0
@just_write = 0
@both_read_and_write = 0
end
end
# 输出attr系列方法生成的方法
puts Foo.instance_methods - Foo.superclass.instance_methods
最常用的元编程工具是编译器,把高级语言转换为汇编语言或机器语言。更灵活的方法是在程序中嵌入解释器直接处理程序数据。有一些实现例如为Object Pascal编写的RemObject's Pascal Script。
另一个很常用的元编程例子是lex和yacc,用来生成词法分析器和语法分析器。Yacc通常用作编译器的编译器,生成一个把高级语言转换为机器语言的工具。
quine是一种源代码等于输出的特殊的元程序。
面向语言的程序设计是一种强烈关注元编程的编程风格,通过领域特定语言来实现。

㈦ 计算机有哪些编程语言

参考tiobe编程语言统计网站, 有以下编程语言:

(Visual) FoxPro: FoxPro, Fox Pro, VFP
4th Dimension/4D: 4D, 4th Dimension
ABAP
ABC: ABC (exceptions: -tv -channel)
ActionScript: ActionScript, AS1, AS2, AS3
Ada
Agilent VEE
Algol
Alice: Alice (confidence: 90%)
Angelscript
Apex
APL
Applescript
Arc
AspectJ
Assembly
ATLAS
AutoIt
AutoLISP
Automator
Avenue
Awk: Awk, Mawk, Gawk, Nawk
Bash
Basic: Basic (confidence: 0%)
bc
BCPL
BETA: BETA (confidence: 10%)
BlitzMax: BlitzMax, BlitzBasic, Blitz Basic
Boo
Bourne shell: Bourne shell, sh
C shell: Csh, C shell (confidence: 90%)
C#: C#, C-Sharp, C Sharp, CSharp, CSharp.NET, C#.NET
C++
C++/CLI
C-Omega
C: C (exceptions: -"Objective-C")
Caml
Ceylon
CFML: CFML, ColdFusion
cg: cg (confidence: 80%, exceptions: -"computer game" -"computer graphics")
Ch: Ch (exceptions: +ChScite)
CHILL
CIL
CL (OS/400): CL (exceptions: -Lisp), CLLE
Clarion
Clean: Clean (confidence: 43%)
Clipper
Clojure
CLU
COBOL
Cobra
CoffeeScript
COMAL
Common Lisp
cT
Curl
D: D (confidence: 90%, exceptions: -"3-D programming" -"DTrace"), dlang
Dart
DCL
Delphi/Object Pascal: Delphi, Delphi.NET, DwScript, Object Pascal, Pascal (confidence: 11%)
DiBOL: DBL, Synergy/DE, DIBOL
Dylan
E: E (exceptions: +specman)
ECMAScript
EGL
Eiffel
Elixir
Emacs Lisp: Emacs Lisp, Elips
Erlang
Etoys
Euphoria
EXEC
F#: F#, F-Sharp, FSharp, F Sharp
Factor
Falcon
Fantom
Felix: Felix (confidence: 86%)
Forth
Fortran
Fortress
Gambas
GNU Octave
Go: Go (exceptions: +Google), Golang
Gosu
Groovy: Groovy, GPATH, GSQL, Groovy++
Hack
Haskell
Haxe
Heron
HPL
HyperTalk
Icon: Icon (confidence: 90%)
IDL: IDL (exceptions: -corba -interface)
Inform
Informix-4GL
INTERCAL
Io
Ioke
J#
J: J (confidence: 50%)
JADE
Java
JavaFX Script
JavaScript: JavaScript, JS, SSJS
JScript
JScript.NET
Julia
Korn shell: Korn shell, ksh
LabVIEW
Ladder Logic
Lasso
Limbo
Lingo
Lisp
LiveCode: Revolution, LiveCode
Logo: Logo (confidence: 90%, exceptions: -tv)
LotusScript
LPC
Lua
Lustre
M4
MAD: MAD (confidence: 50%)
Magic: Magic (confidence: 50%)
Magik
Malbolge
MANTIS
Maple
Mathematica: Mathematica, Wolfram
MATLAB
Max/MSP
MAXScript
MDX
MEL
Mercury
Miva
ML
Mola-2
Mola-3
Monkey
MOO
Moto
MQL4: MQL4, MQL5
MS-DOS batch
MUMPS
NATURAL
Nemerle
NQC
NSIS
NXT-G
Oberon
Object Rexx
Objective-C: Objective-C, objc, obj-c
OCaml: Objective Caml, OCaml
Occam
OpenCL
OpenEdge ABL: Progress, Progress 4GL, ABL, Advanced Business Language, OpenEdge
OPL
Oxygene
Oz
Paradox
Pascal: Pascal (confidence: 89%)
Perl
PHP
Pike
PILOT: PILOT (confidence: 50%, exceptions: -"Palm Pilot programming")
PL/I: PL/1, PL/I
PL/SQL
Pliant
PostScript: PostScript, PS
POV-Ray
PowerBasic
PowerScript
PowerShell
Processing: Processing (exceptions: +"sketchbook")
Programming Without Coding Technology: Programming Without Coding Technology, PWCT
Prolog
Pure Data: Pure Data, PD
Python
Q
R: R (confidence: 90%, exceptions: +"statistical")
Racket
REBOL
REXX
RPG (OS/400): RPG (confidence: 80%, exceptions: -role), RPGLE, ILERPG, RPGIV, RPGIII, RPG400, RPGII, RPG4
Ruby
Rust
S-PLUS: S-PLUS (exceptions: +statistical)
S: S (exceptions: +statistical)
SAS
Sather
Scala
Scheme: Scheme (exceptions: -tv -channel)
Scratch
sed
Seed7
SIGNAL: SIGNAL (confidence: 10%)
Simula
Simulink
Slate: Slate (confidence: 57%)
Smalltalk
Smarty
SPARK
SPSS
SQR
Squeak
Squirrel
Standard ML: Standard ML, SML
Stata
Suneido
SuperCollider: SuperCollider (confidence: 80%)
Swift
TACL
Tcl: Tcl/Tk, Tcl
Tex
thinBasic
TOM: TOM (confidence: 50%)
Transact-SQL: T-SQL, Transact-SQL, TSQL
TypeScript
Vala/Genie: Vala, Genie
VBScript
Verilog
VHDL
Visual Basic .NET: Visual Basic .NET, VB.NET, Visual Basic.NET, Visual Basic (confidence: 50%), VB (confidence: 50%)
Visual Basic: Visual Basic (confidence: 50%), VB (confidence: 50%), VBA, VB6
WebDNA
Whitespace
X10
xBase
XBase++
Xen
Xojo: REALbasic, Xojo
XPL
XSLT
Xtend
yacc
Yorick
Z shell: Z shell, zsh

㈧ 怎么用Python设计一个双延迟状态机

简单的状态机就是一个行为状态矩阵,如果是语法级的状态机,你最好还是找个Yacc之类的工具自动生成吧。

㈨ UNIX编程艺术的序

Unix is not so much an operating system as an oral history.
与其说Unix是个操作系统,不如说是一部口述历史。
——Neal Stephenson
知识和专能差异巨大,凭借知识可以推断出该做什么,而专能让你甚至在无意之间,条件反射似的把事情做好。
这本书确实有关“知识”,但更着眼于“专能”。你将学到那些Unix专家们都不自知的Unix开发知识。少一点技术,多一些共享文化:显见和隐微的,直观和潜流的——这是本书和大多数Unix书籍不同的地方——不止于方法,更重乎理念。
理念于实用大有裨益,有太多设计不良的软件:体积臃肿,难于维护、移植和扩展——这些都是蹩脚设计的症候。我们希望本书的读者能品出什么是Unix所教示的良好设计。
本书分为四部分:场景、设计、工具和社群。第一部分(场景)涉及哲学和历史,为后续内容埋下伏笔。第二部分(设计)将Unix哲学的原理细分为有关设计与实现的、更专门的建议。第三部分(工具)着眼于Unix所提供的工具,可助你解决问题。第四部分(社群)则讲述人与人之间的事务与约定,而这正是Unix文化拥有高效能的原因。
这本书是关于共享文化的,我从未想象过独自完成它。你会发现正剧中包含数位Unix资深专家的客串演出,正是这些人塑造了Unix的习俗。本书曾有过公开大范围的审阅过程,这期间我邀请这些明星人士对书稿进行评审与研论。这些意见没有湮没在本书定稿中,而你可以在书中聆听到他们的真实声音:无论是为本书呐喊助阵、还是摇头反对。
本书中用到人称“我们”时,我并不是虚张声势,仅以此说明这是整个社群都清楚明了的事实。
因为本书着力传递文化,因此加入了很多野史和坊间传说,这在技术书中并不多见。希望你喜欢,这些东西其实是Unix程序员的教养。须弥不重,芥子不轻。我们希望以这种方式更好地讲述故事。了解Unix的由来和变迁,会培养你对Unix风格的直觉。
同样地,基于此,我们不打算使用回述历史的腔调。你会发现本书参考了众多时下信息。我们不希望给你一种错觉:书里说的都是亘古不变的终极真理。参考时下的信息这一做法,也提醒读者,三十年河东,三十年河西,眼前所见,也许过不了多久就会过时,而需要重新检省。
另外,本书不是C教程,不是Unix命令和API的手册,不是sed/yacc/Perl/Python的语言参考,也不是网络编程入门,更不是巨细靡遗的令人费解的X指南。本书也不打算带你巡游Unix内幕和体系。有很多其它的好书涵盖这些领域,本书会在适当的时候告诉你该看哪些。
在这些技术细节外,Unix文化有一个未见诸笔端的行工传统,以熟练工的考量,它已经有几百万人年的发展 。本书即立足于这样一个信念:领会此传统,并将它的设计手法应用到手边,你将成为更好的程序员和设计师。
构成文化的是人,一直以来,获知文化的方式大约是口口相传、潜移默化。本书不打算取代人际的文化传播,但可以促进这一过程,使你能俯耳倾听他人的心声。
谁应该看这本书
如果你是个Unix编程老手,经常教导菜鸟,或者与人进行操作系统论战时无法阐明使用Unix方案所带来的好处时,可以看看这本书。
如果你是个C、C++或者Java程序员,有其它操作系统的开发经验,现在轮到你开展一个Unix项目时,可以看看这本书。
如果你是个初级或者中级水平的Unix用户,但是没什么开发经验,想学习在Unix下如何高效地设计软件时,可以看看这本书。
如果你不在Unix下编程却发觉Unix的传统给你带来某种启迪,那你就对了,Unix哲学适用于其它的操作系统。因此我们会花比其它Unix书籍更多的篇幅关注非Unix环境(特别是微软的操作系统);当所用到工具或者案例可用于其它操作系统时,我们会告诉你。
如果你是一个系统架构师,正为通用市场或垂直应用准备平台方案或实现策略时可以看看这本书。本书将帮助你了解Unix作为开发平台的强大功能,以及开放源码这个Unix的传统所带来的开发方式。
如果你想学到C编程的细节或者想知道怎么用Unix内核API,本书可能不适合你。Advanced Programming in theUnix Environment [Stevens92]是探究Unix API的经典名着;The Practice of Programming [Kernighan-Pike99]是每个C程序员的必读书目(任何语言的程序员都该看看这本书)。
如何使用这本书
这本书既重实践,更富理念;既包含警世格言,又不忘检点Unix开发中的特殊案例。在每个警句前后,都有生动实例阐明其由来,这些例子绝不来自小儿科式的示例程序,而均出自真实世界满眼所见的运行代码。
我们着力避免以大量代码或者规范文件来胡乱凑数,当然这么做会让本书的写作轻松许多(某些地方或许读起来也更轻松)。绝大多数编程书籍只授你以鱼,而本书避免这种做法,力求培养读者“探求事情何以如此”的感知力。
正由于此,本书会时常请你阅读代码与规范文档,它们中极少量的内容会附在书中,其余部分我们会在举例时告诉你如何从网上获取。
从这些范例中汲取养分,将有助你将所学原则消化变为疱丁之技。如果你能就着一部跑在Unix系统上的网页浏览器来读书,是再理想不过的了。任何Unix系统都适合,但是我们将要研究的案例大多都会预装在、或者可以从Linux系统上获得,书中会提示请你浏览或亲身感受它们。这些提示通常是按部就班的,跑开玩一会儿并不会打散整个讲述过程的连续性。
注意:我们虽力求,但无法给你打保票,声称我们所引用的URLs稳定可用。如果你发现某个引用连接已陈旧过时,来点常识,用你喜爱的搜索引擎来个短语搜索。如有可能,我们会在所引用的URLs附近给出如何搜索的提示。
大多数缩写形式会在首次出现时伴随其全称。为方便起见,我们在附录中提供了名词对照表。
交叉索引通常以作者名字为主导词。带编号的脚注是那些可能会扰乱你阅读正文,或者是易变的URLs;也可能是旁征博引的战争故事或者笑话 。
为了使这本书不至于让非技术人员太过难读,我们邀请了一些非程序员试读,并指出一些晦涩但起贯穿作用的词汇。我们把那些编程老手不太会需要的名词解释也放在脚注中。
相关引文
一些Unix早期拓荒者的着名论文和书籍,比如Kernighan和Pike的《The Unix Programming Environment》[Kernighan-Pike84]就是其中佼佼者,被世人尊为圭臬。而今看来此书廉颇老矣,它没提到Internet、万维网以及诸如Perl、Tcl和Python这些解释型语言的新秀。
写作本书的中途我们借鉴了Mike Gancarz的《The Unix Philosophy》[Gancarz]。这本书在它的覆盖范围内极其优秀,但是我们觉得需要更多内容才能反映出事情的全貌。尽管如此我们仍对此书作者心存感激,他愈发使我们知道最简单的Unix设计手法就是最持久耐用的。
《The Pragmatic Programmer》[Hunt-Thomas]是一本关于良好设计的书,文风机智诙谐,它与本书相比,倾向于软件设计工艺的另一个层面(更注重编码,而少着墨于高层面的问题划分)。作者的哲学是其Unix领域耕耘的成果,也是本书内容极好的补充。
《The Practice of Programming》[Kernighan-Pike99]包含了一些与《The Pragmatic Programmer》共通的内容,但更钻入Unix传统的深处。
最后(明知道会激怒你),我们推荐《Zen Flesh, Zen Bones》[Reps-Senzaki],一部重要的佛教禅宗本源的合集。对禅的引用书目遍布全书。我们将这些书目包含进来,是因为禅为表达某种想法提供了丰富的语汇,而在软件设计中却很难烂熟于心。信奉宗教的读者,请您不要把禅当成宗教,它是一种心灵鸡汤似的东西,纯净而没有神灵的干扰——此即是禅。
本书的习俗约定
术语“UNIX”技术上和法律上讲,是The Open Group的商标,并且应该仅限于那些通过The Open Group严格的“符合标准”认证的操作系统。本书中我们使用其较宽松的定义,即大多数程序员所指的,Bell实验室Unix代码的后裔或旁支。在这个意义下,Linux(大多数例子都举自它)也算是一种Unix。
本书也使用了Unix手册页(manual page)的传统,即以括号括起来的手册节号来标记Unix设施。通常用于强调一个Unix命令首次出现。比如“munger(1)”可解读为“munger程序加入存在于你的系统中,其文档位于Unix手册页的第1节”。第2节是C的系统调用,第3节是C的库函数调用,第5节是文件格式与协议,第8节是系统管理工具。其它节号本书未曾用到,其定义在各个Unix系统各有不同。在你的Unix外壳提示符下输入man 1 man(老式的System VUnix系统可能要输入man -s 1 man)以获得更多信息。
有时我们会提及某个Unix程序(比如Emacs),后面没有手册节号而且首字母大写。这意味这个名字代表一族Unix程序,其基本功能相同,而我们将讨论其通用特性。比如Emacs,就包含了xemacs。
本书很多地方我们同时给出了老式(old school)和新式(new school)解法。new-school和rap音乐一样,开始于1990年前后。在这个含义下,我们往往把它与脚本语言、图形用户界面、开放源码的Unix和万维网联系起来。Old-school指代1990年以前(特别是1985年以前)的世界:昂贵的共用计算机、专属的Unix,shell脚本和无所不在的C。值得指出这些差异,机器越来越便宜,内存多了起来,这些有如暗流,渐渐影响着Unix编程的风格。
所用案例
很多编程书籍为证明某一观点而特地造出一个范例,你手中这本书不这么干。我们的案例研究均来自真实世界,在生产环境中工作已久。下面是一些主要案例:
cdrtools/xcdroast
这两个独立的项目通常被一并使用。cdrtools是一组刻盘工具(用关键字“cdrtools”可以在网上找到)。xcdroast是cdrtools的图型界面前端,其项目网站。
fetchmail
fetchmail用于从远程邮件服务器上收信,支持POP3和IMAP邮箱协议。其主页为,也可以用关键字“fetchmail”从网上找到。
GIMP
GIMP(GNU Image Manipulation Program,GNU图像处理程序)是一个全特性的绘画和图像处理程序,可对多种图像格式进行复杂处理。其源码可从GIMP主页获得(也可以通过关键字“GIMP”从网上搜到)。
mutt
mutt邮件客户端是目前各类基于文本的邮件客户端程序中的翘楚,提供对MIME(Multipurpose Internet Mail Extensions)、个人隐私辅助程序,如PGP(Pretty Good Privacy)和GPG(GNU Privacy Guard)等特性的绝佳支持。其源码和二进制可执行文件可以从Mutt项目主页获得。
xmlto
xmlto可将DocBook和其它XML文档以多种格式渲染输出,包括HTML、纯文本和PostScript。其源码和文档可在xmlto主页获得。
为了将读者理解本书例子所要阅读的代码量降低到最小程度,我们尽量挑选那些可重复使用、并能体现多种不同设计原理和设计实践的案例。出于同样原因,很多示例来自于我本人的项目。我没想说这些例子最为恰当,只是我觉得它们对阐述我的观点非常有用。
作者致谢
各位客串贡献者(Ken Arnold, Steven M. Bellovin, Stuart Feldman, Jim Gettys, Steve Johnson, Brian Kernighan, David Korn, Mike Lesk, Doug McIlroy, Marshall Kirk McKusick, Keith Packard, Henry Spencer, 和Ken Thompson)为本书增添极大价值。特别是Doug McIlroy,给予本书恪尽职责、鞭辟入里的评注的同时,也展现了他早在30年前管理最原始的Unix研究组时鞠躬尽瘁的高风亮节。
我要对Rob Landley和我的妻子Catherine Raymond致以特别感谢,他们都不厌其烦地逐行对本书手稿进行审阅。Rob的深富洞察力的细致评述激励我在最终稿中加入了一整章内容,他为本书的组织结构与取材范围奉献极多。如果把他所给予的改进意见落在笔端,那他无愧于本书的合着者。Cathy代表读者中非技术人员的一群,如果那些非程序员读者觉得本书并不难读,那全是她的功劳。
写作的五年间,本书从不少人的讨论意见中获益良多。Mark M. Miller使我对线程有了更深的认识。John Cowan教给我不少接口设计方式,并起草了wily和VM/CMS的学习案例。Jef Raskin告诉我Rule of Least Surprise的由来。UIUC System Architecture Group对前几章给出的反馈弥足珍贵,What Unix Gets Wrong和Flexibility in Depth两节是他们直接激励的结果。Russell J. Nelson提供了Bernstein chaining的素材。第3章中MVS学习案例大部分的材料来自Jay Maynard。Les Hatton对语言一章给出很多有益建议,并促使我写成第4章中Optimal Mole Size的部分内容。David A. Wheeler贡献了很多发人深省的批评,以及一些学习案例(特别是在设计部分中)的素材。Russ Cox帮助我进行了Plan 9的调查。Dennis Ritchie纠正了我的一些错误的C历史观念。
成百上千的Unix程序员,人数太多以至于无法在此列出他们的名字,在2003年1月到6月间的公开审阅过程间给了我建议和评论。开放的同级复审这一过程让我觉得紧张刺激而回报极多。当然,任何最终书稿中残留的错误都是我自己的责任。
“把事情说透”的风格,以及其它一些考虑因素,是受到了“设计模式运动”的影响;说实话,我对到处堆砌Unix设计模式这种做法深不以为然。我对此运动的中心教条不敢苟同,并且没觉得把设计模式严格付诸实用有什么必要,也不想背上这种思想的包袱。尽管如此,我的行事方法仍然受到Christopher Alexander成果 (特别是《Timeless Way of Building》和《A Pattern Language》两文)的影响。Gang of Four和他们的信徒为我展示了如何用Alexander的思想,站在较高层面上,抛去含混不清的对设计通则的空话,来谈论软件设计,这一点我心存感激,永志不忘。对设计模式有兴趣的读者可以看看这本书《Design Patterns: Elements of Reusable Object-Oriented Software [GangOfFour]》。
本书标题毫无疑问是借鉴了Donald Knuth的《The Art of Computer Programming》一书的书名。Knuth和Unix传统文化没什么联系,但他影响了我们每一个人。
有先见之明和丰富想象力的编辑并不多,好在Mark Taub就是一个,他从并不看好的项目中发现了闪光点,并极富技巧地促成了这本书的写作。文字编辑中,文笔好而又能帮助别人提高文笔的就更少了,所幸Mary Lou Nohr是其中之一。Jerry Votta的封面设计领会了我的意图,而且做得比我的想象还要漂亮。Addison-Wesley的编辑们让审稿和出版这一过程不再枯燥无味,我天生怕被人管,但是他们仍然极力配合我,使得文字、版面、图片和市场工作都达到极高水准。

㈩ 编程语言有多少种

不下200种 可以在维基网络搜索List_of_programming_languages
网络贴不了wiki的地址,大概是垄断吧

A+BAT
A+
A++
A# .NET
A# (Axiom)
A-0
ABAP
ABC
ABC ALGOL
ABLE
ABSET
ABSYS
ACC
Accent
ActionScript
Ace DASL
ACT-III
Ada
APL
AWK

B
BACI
Baja
BASIC
bc
bcompile
BCPL
BeanShell
BETA
Bigwig
Big Snake
Bistro
BLISS
Blitz Basic
Block And List Manipulation (BALM)
Blue - Rejected prototype for Ada
Blue
Boo
Bourne shell - a.k.a sh
Bourne-Again shell - see Bash
Boxx
BPEL - Business Process Execution Language
Brainfuck
BUGSYS
BuildProfessional
BYOND

C
C--
C-script
C++ - ISO/IEC 14882
C# - ISO/IEC 23270
C shell (csh)
Caché ObjectScript - See also Caché Basic
Caml
Cat
Cayenne
C-BOT
Cecil
Cesil
Cg
Ch interpreter (C/C++ interpreter Ch)
Chapel
CHAIN
Charity
Chef
Chey
CHILL
CHIP-8
chomski
Chrome
ChucK
Cilk
CICS
CL
Clarion
Clean
Clipper
CLIST - Programming language for online applications in the MVS TSO environment
CLU
CMS-2
COBOL - ISO/IEC 1989
CobolScript
Cobra
CODE
ColdFusion
COMAL
Common Intermediate Language (CIL)
Common Lisp
Component Pascal
COMIT - List or string processing language
Concurrent Clean
Constraint Handling Rules
CORAL66
Corn
CorVision
COWSEL
CPL
CSP
Csound
Cue
Curl
Curry
Cyclone

D
Dao
DASL - Distributed Application Specification Language
DASL - Datapoint's Advanced Systems Language
DarkBASIC
DarkBASIC Professional
Dataflex
Datalog
dBASE
dc
Deesel (formerly G)
Delphi
Dialect
DinkC
DCL
Dialog Manager
DIBOL
DL/I
Dream Maker
Dylan
Dynace

E
Ease
EASY
Easy PL/I
EASYTRIEVE PLUS
eC (Ecere C)
ECMAScript
eDeveloper
Edinburgh IMP
Einstein
Eiffel
Elan
elastiC
Elf
Emacs Lisp
EGL Programming Language (EGL)
Epigram
Erlang
Escapade - server-side programming
Esterel
Euclid
Euphoria
Euler
EXEC
EXEC2

F
F#
Factor
Fan
Felix
Ferite
F#
FL
FLOW-MATIC
FOCAL
FOCUS
FOIL
FORMAC
Formula language
Forth
Fortran - ISO/IEC 1539
Fortress
FoxPro
FP
Frag Script
Franz Lisp
Frink
Frontier
F-Script

Gambas
G-code
General Algebraic Modeling System
Generic Java
Gibiane
G (LabVIEW)
Gödel
Godiva
GOTRAN (see IBM 1620)
GOTO++
GPSS
GraphTalk
GRASS
Green
Groovy

H - Business processing language from NCR.
HAL/S - Real-time aerospace programming language
HAScript
Haskell - An advanced functional programming language
HaXe - Open Source language which can compile to four different platforms, including PHP and Flash
HyperTalk

IBM Basic assembly language
IBM RPG
ICI
Icon
IDL
IMP
Inform
Information Processing Language (IPL)
Informix-4GL
Io
IPTSCRAE
Interactive System Proctivity Facility

J
J#
J++
JADE
JAG
Jal
Janus
Java
JavaScript
Jim++
JCL
Join Java
JOSS
Joule
JOVIAL
Joy
JScript
JSP
J2EE
J2ME

K
KEE
Kiev
Korn Shell
KIF
Kite
Kogut
KRC
KRL
KRYPTON

L
LabVIEW
Lagoona
LANSA
Lasso
Lava
Leda
Lead
Leadwerks Script
Legoscript
Leopard
Lexico
Lfyre
Liberty BASIC
Limbo
Limnor
LINC
Lingo
Lisaac
Lisp - ISO/IEC 13816
Lite-C
Logo
LOLCODE
LPC
LSL
LSE
Lua
Lucid
Lush
Lustre
LYaPAS
LSL

M4
MAD
MADCAP
MAGIC - See eDeveloper
Magik
Magma
MapBasic
Maple
MAPPER (Unisys/Sperry) now part of BIS
M-A-R-E-K (Programming language)
MARK-IV (Sterling/Informatics) now VISION:BUILDER of CA
Mary
Mathematica
MATLAB
MATA
Maxima (see also Macsyma)
MaxScript internal language 3D Studio Max
Maya (MEL)
Multiprocessor C#
Mercury
Mesa
METAL
Michigan Algorithm Decoder see MAD programming language
Microcode
MicroScript
MillScript
MIMIC
Mindscript
Miranda
Miva
ML
Moby
MODCAP
Model 204 User Language
Mola
Mola-2
Mola-3
Mondrian
Mortran
Moto
MOUSE
MSIL - Deprecated name for Common Intermediate Language
MSL
MONO
MUMPS

Napier88
Natural
Nemerle
NESL
Net.Data
Neuralware
NewtonScript
NGL
Nial
NXT-G
Nice
Nickle
Nosica
NQC
Nu

o:XML
Oberon
Objective Mola-2
Object Lisp
ObjectLOGO
Object Pascal
Objective-C
Objective Caml
Obliq
Objectstar
ObjectView
Ocaml
occam
occam-π
Octave
OmniMark
Opal
Open programming language
OPS5
Organiser Programming Language (OPL) - cf. Psion Organiser
Oxygene
Oz

PARI/GP
Parser
Pascal - ISO 7185
Pawn
PBASIC
PCASTL
PEARL
Perl
Perl Data Language
PHP
Pico
Piet
Pike
PIKT
PILOT
Pizza
PL 11
PL/0
PL/8
PL/B
PL/C
PL/I - ISO 6160
PL/M
PL/P
PL/SQL
Plankalkül
PLD
PLEX
PLEXIL
Pliant
PNGlish
PPL
POP-11
Poplog
PORTRAN
PostScript
Ppc++
Processing
Prograph
Progress 4GL
Prolog
Turbo Prolog
Promela
Protheus
PRO-IV
Python

Q
Qi
QtScript
QuakeC
QPL
Quikcomp (for the Moonrobot XI)

R
R++ - Based on C++ and added semanteme description
Rascal
Ratfiv
Ratfor
RBScript
rc
REPL - Really Easy Programming Language
REBOL - Relative Expression Based Object Language
Red - Rejected prototype for Ada
Redcode
REDO
REFAL
Revolution
REXX
Rigal
Rlab
Robot Scripting Language (RSL)
RPG - Report Program Generator
RPL
RScript
Ruby
Russell Programming Language
REALBasic

S
S2
S-PLUS
S-Lang
SAIL
SAKO
SAM76
SAS
Sather
Scala
ScalPL
SCAR
SCATRAN
Scheme
Scilab
Script.NET
Sed
Seed7
Self
SETL
Shadow Programming Interface (Developing)
ShadowScript
Shift Script
SIGNAL
SiMPLE
SIMPOL
SIMSCRIPT
Simula
SISAL
Slate
SLIP
SMALL - SMALL Machine Algol Like Language
Small
Smalltalk
SNOBOL - String Oriented Symbolic Language
SPITBOL
Snowball
SPARK
Spice
SPIN
SP/k
SPL/1 - aka SPL/I
SPS (1620) - see IBM 1620
Squirrel
SR
SSL
Standard ML
StringLang
Subtext
SuperCollider
Suneido
SYMPL
SyncCharts
Synergy/DE
SystemVerilog

T
TACL
TACPOL
TagsMe
TADS
TIE
Transaction Application Language
Tcl
Transact-SQL
teco
TELCOMP
Telon
Tempo
thinBasic
Titanium
TI-Basic
Today
Tom
TOM
Topspeed - see Clarion
TorqueScript
tpu
Trac
Trine
TTCN
Turbo Pascal
Turing
TUTOR\
Tutorial D
TXL

Ubercode
Ultra 32
Unicon
Uniface
Unix shell
Unlambda
UnrealScript
Use

V
Vala
VDM++
VDM-SL
Verilog
VHDL
Visual Assembler
Visual Basic - Visual Beginners All-purpose Symbolic Instruction Code
Visual Basic .NET
Visual DataFlex
Visual DialogScript
Visual FoxPro
Visual J++
Visual Objects
VBScript
VX-REXX
Vvvv

Water
WATFOR - see WATFIV
WATFIV
WAXHTML
WebQL
Whitespace
Winbatch
WinDev
Windows PowerShell

X++
X10
Xbase++ 32Bit Windows language
XBL
xbScript - Also xBaseScript
xHarbour
XL
XOTcl
XPL
XPL0
XQuery
XSLT - See XPath

Y
YACC
YAFL
Yellow - Rejected prototype for Ada
Yorick
Y

Z++
Z notation - A program specification language, like UML.
Zonnon
ZOPL
ZPL

热点内容
汽车是哪个配置的怎么看 发布:2025-01-16 14:43:47 浏览:50
唱吧上传原唱 发布:2025-01-16 14:30:36 浏览:300
负载均衡后端服务器获取真实ip 发布:2025-01-16 14:30:26 浏览:655
linux系统centos如何配置网络 发布:2025-01-16 14:22:32 浏览:600
java培训浙江 发布:2025-01-16 14:13:40 浏览:934
配置型基金如何分配 发布:2025-01-16 14:08:06 浏览:563
adbandroid版本 发布:2025-01-16 13:53:14 浏览:388
直链云存储 发布:2025-01-16 13:19:30 浏览:727
电脑主机服务器多少钱 发布:2025-01-16 13:00:28 浏览:668
linuxoracle操作 发布:2025-01-16 12:40:50 浏览:48