yaccpython
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