📄 freebsd 开发手册.html
字号:
<p> 这种方式的优点就是可以马上看见命令的执行结果,并且迅速的改正错误。如果你想和别人分享自己的程序,最大的坏处就显现出来了。别人需要和你一样的解释器,或者你必须把解释器给他们,而且他们还要知道怎么使用这个解释器。用户也不希望在按错一个键的情况下就被扔到调试环境中。从程序执行效率来看,解释器会使用很多内存,而且通常情况下生成的代码也不如编译器生成的有效率。</p><p> 我觉得,如果你从未编过程序,最好从解释类语言开始。Lisp,Smalltalk, Perl 和 Basic语言就提供了这样的环境。<span class="TRADEMARK">UNIX</span> 中的 shell (<ttclass="COMMAND">sh</tt>, <tt class="COMMAND">csh</tt>) 自身就是一个解释器。实际情况中,很多人都在他们自己的机器上写 shell “scripts” 来做很多 “维护”工作。的确,<spanclass="TRADEMARK">UNIX</span> 的哲学中有一部分就是提供很多小工具, 并使用 shell scripts把这些工具组合起来去做有用的工作。</p></div><div class="SECT2"><hr /><h3 class="SECT2"><a id="AEN259" name="AEN259">2.3.2 FreeBSD 提供的解释器</a></h3><p> 在 FreeBSD Ports Collection 中,有一个列表列出了提供的解释器。同时还简单讨论了一些更受欢迎的解释类语言。</p><p> 从 Ports Collection 中如何取得并安装应用程序的教程可以从手册的 <ahref="../../../../doc/en_US.ISO8859-1/books/handbook/ports-using.html"target="_top">Ports section</a> 中找到。</p><div class="VARIABLELIST"><dl><dt><acronym class="ACRONYM">BASIC</acronym></dt><dd><p>Beginner's All-purpose Symbollic Instruction Code 的缩写。20世纪50年代被开发出来给大学生学习编程。在20世纪80年代生产的个人电脑中包含了这种语言。<acronym class="ACRONYM">BASIC</acronym> 语言是很多程序员学习的第一个编程语言。同时,它也是 Visual Basic 的基础。</p><p>Bywater 的 Basic 解释器能在 Ports Collection 中的 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/bwbasic/pkg-descr"><ttclass="FILENAME">lang/bwbasic</tt></a> 找到。Phil Cockroft 的 Basic 解释器 (以前叫 RabbitBasic) 在 <a href="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/pbasic/pkg-descr"><ttclass="FILENAME">lang/pbasic</tt></a> 中。</p></dd><dt>Lisp</dt><dd><p>20世纪50年代开发的一种语言,作为当时那些“基于数字”的语言的补充。Lisp不是基于数字的,而是基于列表;实际上这个语 言的名字就是 “ListProcessing”的缩写。在 <acronym class="ACRONYM">AI</acronym> (Artificial Intelligence)圈子中非常受欢迎。</p><p>Lisp 是一种非常强大而复杂的语言。但也可能变得异常庞大而臃肿。</p><p>在 FreeBSD 中的 Ports Collection 里面有各种可以在 <span class="TRADEMARK">UNIX</span>系统上运 行的 Lisp 实现。GNU Common Lisp 在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/gcl/pkg-descr"><ttclass="FILENAME">lang/gcl</tt></a> 里可以找到。Bruno Haible 和 Michael Stoll 的 CLISP 在<a href="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/clisp/pkg-descr"><ttclass="FILENAME">lang/clisp</tt></a> 中可以找到。而像包含一个可以高 度优化代码的编译器的CMUCL,或者像比较简单的 Lisp 的实现的 SLisp 则 用几百行 C 代码实现了大部分 Common Lisp的功能。两个语言分别在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/cmucl/pkg-descr"><ttclass="FILENAME">lang/cmucl</tt></a> 和 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/slisp/pkg-descr"><ttclass="FILENAME">lang/slisp</tt></a> 中可以找到。</p></dd><dt>Perl</dt><dd><p>对于系统管理员来说非常受欢迎的脚本语言;同时也经常被用来写万维 网服务器的 <acronymclass="ACRONYM">CGI</acronym> 脚本。</p><p>Perl 在 Ports Collection 中的 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/perl5/pkg-descr"><ttclass="FILENAME">lang/perl5</tt></a> 可以找到,适合所有 FreeBSD 版本。 而且在 4.X版本中是作为基本系统的 <tt class="COMMAND">/usr/bin/perl</tt> 来安装的。</p></dd><dt>Scheme</dt><dd><p>Lisp 的一个变种。比 Common Lisp 更加紧凑而清晰。在大学里面相当流行因为足够简单。往往当作第一门语言教给大学生,而且在研究领域也有一 定程度的吸引力。</p><p>Scheme 在 Ports Collection 中的 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/elk/pkg-descr"><ttclass="FILENAME">lang/elk</tt></a> 可以找到 Elk Scheme 解释器。 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/mit-scheme/pkg-descr"><ttclass="FILENAME">lang/mit-scheme</tt></a> 中的是 MIT 的 Scheme 解释器。在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/scm/pkg-descr"><ttclass="FILENAME">lang/scm</tt></a> 中是 SCM Scheme 解释器。</p></dd><dt>Icon</dt><dd><p>Icon 是一种高级语言,在很多方面适合处理字符和结构。FreeBSD 中的 Icon 版本在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/icon/pkg-descr"><ttclass="FILENAME">lang/icon</tt></a> 中可以找到。</p></dd><dt>Logo</dt><dd><p>Logo 是一种容易学习的语言,并且在许多课程里面都作为一个介绍性的编程语言存在。如果给小孩子上编程课程,Logo 是一个非常棒的开始。因为,即使对小孩子来说,要用 Logo 画图形也是很容易的事情。</p><p>FreeBSD 中的 Logo 最新版本可以在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/logo/pkg-descr"><ttclass="FILENAME">lang/logo</tt></a> 中找到。</p></dd><dt>Python</dt><dd><p>Python 是种面向对象的解释类语言。拥护的人都说 Python 是开始学习编程的最佳语言。因为相对来说比较容易起步,而且与那些流行的能开发庞大而复杂的解释类语言来比(Perl 和 Tcl 在这个方面很流行)一点也不差。</p><p>最新版本的 Python 可以在 Ports Collection 的 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/python/pkg-descr"><ttclass="FILENAME">lang/python</tt></a> 中找到。</p></dd><dt>Ruby</dt><dd><p>Ruby 是一个解释类语言,并且是纯面向对象的。因为其语法容易理解而变化多端并且适合开发以及维护庞大而复杂的程序而广泛流行。</p><p>Ruby 可以在 Ports Collection 中的 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/ruby18/pkg-descr"><ttclass="FILENAME">lang/ruby18</tt></a> 中找到。</p></dd><dt>Tcl 和 Tk</dt><dd><p>Tcl 是一个嵌入式的解释类语言,能够被移植到很多平台上面。因此变得非常流行。它既可以快速地写出小的应用程序,也可以(和 Tk 一起使用,一种图形工具)写出功能繁多的程序。</p><p>FreeBSD 中不同版本的 Tcl 都在 ports 里面。最新版本,Tcl 8.4,可以 在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/tcl84/pkg-descr"><ttclass="FILENAME">lang/tcl84</tt></a> 中找到。</p></dd></dl></div><br /><br /></div><div class="SECT2"><hr /><h3 class="SECT2"><a id="AEN333" name="AEN333">2.3.3 编译器</a></h3><p> 编译器则非常不同。首先,代码可以使用编辑器写到一个或多个文件里面。然后再使用编译器来编译代码,看这些代码是否能被接受。如果编译不能通过,咬紧牙关您再打开编辑器重新修改吧;如果编译通过,并且编译器给了你一个程序。您可以在命令行下执行或者到调试环境中执行以便查看代码有没有被正确执行。 <a id="AEN336"name="AEN336" href="#FTN.AEN336"><span class="footnote">[1]</span></a></p><p> 很明显,这种方式并不如解释器直接。但却可以让你做很多解释类语言无法做的困难的甚至无法完成的工作。例如直接与操作系统交互──或者,你甚至可以写自己的操作系统。如果你要写非常有效率的代码,编译器也很有用。编译器可以花一些时间来优化代码,而解释器是无法完成的。另外,分享你写的编译类程序比解释类语言要直接得多。只要把编译好的程序给别人就行,当然我们假定别人和你都有同一类操作系统。</p><p> 编译类语言包括 Pascal,C 和 C++。C 和 C++ 很严格,适合那些有更多经验 的程序员;而Pascal,从另一方面来说,被设计成为一个教学语言,适合初学者。 FreeBSD 在基本系统中没有提供Pascal。但是在 Ports Collection 中有 GNU Pascal Compiler (GPC) 和 Free PascalCompiler,分别在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/gpc/pkg-descr"><ttclass="FILENAME">lang/gpc</tt></a> 和 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/lang/fpc/pkg-descr"><ttclass="FILENAME">lang/fpc</tt></a> 中可以找到。</p><p> 如果你使用不同的程序来写编译类语言,编辑-编译-运行-调试 这个循环会变得很烦人。很多商业编译器开发了 Integrated Development Environments (缩写为 <acronymclass="ACRONYM">IDE</acronym>)。FreeBSD 在基本系统中没有包含 IDE,但是在 <ahref="http://www.FreeBSD.org/cgi/url.cgi?ports/devel/kdevelop/pkg-descr"><ttclass="FILENAME">devel/kdevelop</tt></a> 提供了一个例子。你也可 以使用 <bclass="APPLICATION">Emacs</b> 当作 IDE。把 <b class="APPLICATION">Emacs</b> 当作 IDE 在<a href="#EMACS">第 2.7 节</a> 中有讨 论。</p></div></div><div class="SECT1"><hr /><h2 class="SECT1"><a id="TOOLS-COMPILING" name="TOOLS-COMPILING">2.4 用 <ttclass="COMMAND">cc</tt> 编译</a></h2><p> 这一章我们只讨论 GNU 的 C 和 C++ 编译器,因为在 FreeBSD 的基本系统中就包含了。直接运行 <tt class="COMMAND">cc</tt> 或 <tt class="COMMAND">gcc</tt> 就可以。而用解释器写程序的细节对于不同的解释器都很不相同,通常可以在特定的解释器文档或者在线帮助中找到。</p><p> 一旦你写完你的杰作,下一步就是把你的杰作转换成可以在 FreeBSD 上运行(希望可以!)的东西。通常这包含几个步骤,不同的步骤由不同的程序来完成。</p><div class="PROCEDURE"><ol type="1"><li class="STEP"><p>预处理你的源代码,去掉注释,以及其他技巧性的工作就像在 C 中展开宏。</p></li><li class="STEP"><p>检查代码的语法看你是否遵守了这个语言的规则。如果没有,编译器会给出 警告。</p></li><li class="STEP"><p>把源代码转换为汇编语言 ── 和机器代码很相似, 但是在一定情况下我们仍然可以理解。 <aid="AEN362" name="AEN362" href="#FTN.AEN362"><span class="footnote">[2]</span></a></p></li><li class="STEP"><p>把汇编语言转换为机器语言──是的,我们在说位元和字节,就是1和0。</p></li><li class="STEP"><p>检查你是否准确地使用了函数和全局变量类似的东西。例如,如果你调用了一个不存在的函数,编译器就会给出警告。</p></li><li class="STEP"><p>如果你是从多个源代码文件编译,就要学会如何把这些文件组合到一起。</p></li><li class="STEP"><p>把产生出来的东西用系统的运行装载器装入内存并运行。</p></li><li class="STEP"><p>最后,把可执行文件写入文件系统。</p></li></ol></div><p> <i class="FIRSTTERM">编译</i> 这个词的意思通常指 1 到 4 步──其他的 步骤叫做 <iclass="FIRSTTERM">连接</i>。有时侯第一步叫做 <i class="FIRSTTERM">预处理</i>。第三和第四步叫做 <i class="FIRSTTERM">汇编</i> 。</p><p> 幸运的是,几乎所有这些细节都是隐藏的,因为 <tt class="COMMAND">cc</tt> 只是一个前端。它根据正确的参数调用程序来处理代码。只要输入</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc foobar.c</kbd></pre><p> 就会把 <tt class="FILENAME">foobar.c</tt> 通过以上的步骤编译出来。如果你有多个文件要编译,只要输入</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc foo.c bar.c</kbd></pre><p> 注意,语法检查就是──纯粹的检查语法。而不会检测你可能犯的任何逻辑错误。比如无限循环,或者是你想用一元排序却使用了冒泡排序。 <a id="AEN392" name="AEN392"href="#FTN.AEN392"><span class="footnote">[3]</span></a></p><p> <tt class="COMMAND">cc</tt> 有很多选项,在帮助手册中都可以找到。这里列出了一些最重要的选项,并且有例子。</p><div class="VARIABLELIST"><dl><dt><code class="OPTION">-o <tt class="REPLACEABLE"><i>filename</i></tt></code></dt><dd><p>输出的文件名。如果你不使用这个选项,<tt class="COMMAND">cc</tt>为产生 出一个叫 <ttclass="FILENAME">a.out</tt> 的执行文件。 <a id="AEN405" name="AEN405"href="#FTN.AEN405"><span class="footnote">[4]</span></a></p><div class="INFORMALEXAMPLE"><a id="AEN407" name="AEN407"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc foobar.c</kbd>可执行文件是 <tt class="FILENAME">a.out</tt><samp class="PROMPT">%</samp> <kbdclass="USERINPUT">cc -o foobar foobar.c</kbd> 可执行文件是 <ttclass="FILENAME">foobar</tt> </pre></div></dd><dt><code class="OPTION">-c</code></dt><dd><p>仅仅编译文件,不会连接。如果你只想检查你写的测试程序的语法的话,这个选项非常有用。或者你会使用 <tt class="FILENAME">Makefile</tt>。</p><div class="INFORMALEXAMPLE"><a id="AEN423" name="AEN423"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc -c foobar.c</kbd> </pre></div><p>这会产生一个 <i class="FIRSTTERM">目标文件</i> (不可执行) 叫做 <ttclass="FILENAME">foobar.o</tt>。这个文件可以和其他的目标文件连接在一起构成一个可执行文件。</p></dd><dt><code class="OPTION">-g</code></dt><dd><p>产生一个可调试的可执行文件。编译器会在可执行文件中植入一些信息,这些信息能够把源文件中的行数和被调用的函数联系起来。在你一步一步调试程序的时候,调试器能够使用这些信息来显示源代码。这是 <span class="emphasis"><bclass="EMPHASIS">非常</b></span>有用的;缺点就是被植入的信息让程序变得更大。通常情况下,开 发一个程序的时候我们经常使用<code class="OPTION">-g</code>,但是我们在编译一个 “release 版本”的程序的时候,如果程序工作得让人满意了,我 们就不使用 <code class="OPTION">-g</code>编译。</p><div class="INFORMALEXAMPLE"><a id="AEN439" name="AEN439"></a><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">cc -g foobar.c</kbd> </pre></div><p>这会产生一个可调试版本的程序。 <a id="AEN444" name="AEN444" href="#FTN.AEN444"><spanclass="footnote">[5]</span></a></p></dd><dt><code class="OPTION">-O</code></dt><dd><p>产生一个优化版本的可执行文件。编译器会使用一些聪明的技巧产生出比普通编译产生的文件执行更快的可执行文件。可以在 <code class="OPTION">-O</code> 加上数字来使用更高级的优化。但是这样做经常会暴露出编译器的优化器中的一些 错误。例如,2.1.0版本的 FreeBSD 中的 <tt class="COMMAND">cc</tt> 在某些情况 下使用了 <codeclass="OPTION">-O2</code> 的话,会产生出错误的代码。</p><p>优化通常只在编译一个 release 版本的时候才被打开。</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -