习惯上,源文件均为纯ASCII或其他某种字符集的文本,由程序员用文本编辑器创建。使用纯文本文件的好处是,只要是可处理文本文件的程序,程序员就可以用来操作源文件。例如,某程序若能对文本文件的行数进行统计,同样也就能计算源程序的行数。既然有几百种能处理文本文件的小程序可用,源文件是纯文本文件,维护起来就会很方便。这种格式有时也被称为单纯功能文本(plain vanilla text)。
有些语言处理系统,特别是解释器,在维护源文件时采用特殊的记号化的(tokenized)方式。记号式源文件通常使用专门的单字节记号(token)值来表示源程序中的保留字等语句元素。这种形式的文件一般比文本源文件小一些,因为它们把多字符的保留字和值压缩成单字节的记号。更重要的是,以记号形式维护源文件可以让解释器运行得更快,毕竟处理1个字节的记号远比识别保留字符串要高效得多—以记号形式工作的解释器通常要比其工作于纯文本的同类快一个数量级。
一般来说,解释器的记号化文件包含一个字节序列,该字节序列可与原始源文件中的if、print等字符串直接对应。如此一来,使用字符串表和一些额外的逻辑,就能将记号程序译解为原先的源文件—通常会丢弃我们在源文件中插入的空白区,但也仅此而已。早期PC系统上运行的许多BASIC解释器都是这么干的。在解释器中敲入一行BASIC源代码,解释器会立即对那一行进行记号化处理,将记号化处理后的形式放入内存。之后我们执行LIST命令时,解释器会将内存中的源代码去记号化(detokenize),从而产生程序清单。
然而,对源文件进行记号化处理时通常使用专有格式,因此无法利用能操作文本文件的一般工具,如wc(word count)、entab和detab。wc能够计算文本文件的行数、词数、字符数;entab将空格替换成制表符,而detab则将制表符替换成空格。
为了克服这一缺陷,多数以记号化文件工作的语言都提供“去记号化的”源文件,并能从记号化数据生成标准文本文件。这样的语言转换器也能够对给定的源文件(ASCII文本)进行记号化处理。对生成的标准文本文件运行某个过滤程序,对过滤程序的输出重新进行记号化处理,以得到新的记号化源文件。尽管这么做太烦琐,但确实能使语言转换器既工作于记号化文件,又能利用基于文本的工具程序。
有些编程语言,如Embarcadero的Delphi和Free Pascal的类似程序Lazarus,不用传统的文本文件格式。它们常常采用图形元素,例如流程图或表格,表示程序要完成的指令。另一个例子是Scratch编程语言,我们可用图形化元素在位图显示器上写出简单的程序。Microsoft的Visual Studio和Apple Xcode集成开发环境(IDE)让我们能够通过图形化操作来指定屏幕布局,而不是通过文本源文件进行。