尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

在VS Code中配置现代化Fortran开发环境:从编译器到调试全攻略

在VS Code中配置现代化Fortran开发环境:从编译器到调试全攻略 简介本资源是面向科学计算学习者、VNOI编程竞赛参赛者及Fortran初学者的VSCode集成开发环境实战包解决在现代编辑器中高效编写、编译与调试Fortran程序的核心需求。压缩包共99个文件总计20.6MB涵盖9个Fortran源码.for、9个Visual Studio项目配置.vfproj/.sln、10个可执行文件.exe及配套调试符号.pdb、HTML文档说明、PDF教程含《Fortran 90编程》《格式化输入输出》《IOIBIN赛题解析》等以及多个经典算法实现如FLOYD最短路径、QBSEQ子序列、SPSEQ序列处理。已有365人下载学习内容聚焦VNOI常见题型的Fortran解法实践提供开箱即用的项目结构、完整编译链配置参考和典型算法源码便于读者快速搭建本地环境、理解Fortran工程组织方式并复现竞赛级数值计算与算法逻辑。1. 为什么要在VS Code里写Fortran如果你是一个还在用Fortran的开发者不管是做数值天气预报、计算流体力学还是搞物理、化学、天文模拟你大概率已经习惯了某种“古典”的编程环境。可能是老牌的Intel Visual FortranIVF配合Visual Studio也可能是开源的gfortran配个简单的文本编辑器比如Notepad或者Sublime Text甚至直接上Vi/Vim。这些组合都能干活但体验上总感觉差了点什么——要么是编辑器功能太弱代码高亮、跳转、补全聊胜于无要么是Visual Studio这种庞然大物启动慢、吃资源只为写个Fortran感觉杀鸡用牛刀。这几年VS Code几乎成了轻量级、现代化开发的代名词。它免费、开源、跨平台通过丰富的插件市场几乎能变成任何语言的IDE。对于Fortran这种“老当益壮”的科学计算语言在VS Code里获得现代化的开发体验——智能感知、语法高亮、代码格式化、调试支持——无疑能极大提升生产力尤其是当你需要同时处理Fortran、Python、C混编项目时一个统一的编辑器环境优势明显。我最初也是抱着试试看的心态把几个遗留的Fortran项目迁移到VS Code。过程比预想的要顺利但也踩了不少坑从编译器配置、插件选择到调试器设置每一步都有需要注意的细节。这篇文章我就把自己从零开始在Windows和Linux系统上配置VS Code Fortran开发环境的完整过程、核心原理以及避坑经验分享出来。无论你是Fortran新手还是想给老项目换个新“房子”的资深用户这份指南都能帮你少走弯路。2. 环境基石编译器的选择与安装在VS Code里写任何编译型语言第一步永远不是装编辑器而是先把编译器搞定。VS Code本身只是个高级编辑器它负责提供友好的编写界面而编译、链接、运行代码的脏活累活都得交给背后的编译器工具链。对于Fortran主流选择有两个开源的GNU Fortrangfortran和商业的Intel Fortranifort。2.1 GNU Fortran (gfortran)开源首选对于大多数个人开发者、学生和科研人员gfortran是入门和日常使用的首选。它是GNU编译器集合GCC的一部分完全免费、跨平台且功能强大支持到最新的Fortran标准如Fortran 2018。在Windows上安装gfortranWindows系统没有自带gfortran最省心的方式是安装一个集成的发行版。我强烈推荐MSYS2。下载安装MSYS2访问MSYS2官网下载安装程序。安装路径建议保持默认如C:\msys64避免中文和空格。更新包数据库安装完成后从开始菜单打开MSYS2 UCRT64或MSYS2 MINGW64终端。这个终端环境提供了类Unix的工具链和包管理器pacman。首先更新软件包列表pacman -Syu这个命令可能会提示你关闭终端重新打开后再运行一次pacman -Su以确保完全更新。安装gfortran在UCRT64终端中执行以下命令pacman -S mingw-w64-ucrt-x86_64-gcc-fortran这个包会同时安装gcc、gfortran以及相关的运行时库。验证安装安装完成后在同一个终端里输入gfortran --version如果看到类似GNU Fortran (GCC) 13.2.0的输出说明安装成功。添加环境变量关键步骤为了让VS Code和系统命令行能找到gfortran需要将MSYS2的bin目录添加到系统的PATH环境变量中。具体路径取决于你安装的子系统对于UCRT64通常是C:\msys64\ucrt64\bin。右键点击“此电脑” - “属性” - “高级系统设置” - “环境变量”。在“系统变量”中找到Path点击“编辑”。点击“新建”将上述bin目录的路径添加进去。重要确保新添加的路径位于那些可能包含旧版本或冲突编译器路径的前面。添加后重启VS Code和所有命令行窗口使环境变量生效。为什么选MSYS2而不是单独下载MinGW-w64MSYS2提供了一个更完整、更易于维护的软件包生态系统。它的包管理器pacman可以让你轻松安装、更新或卸载包括gfortran在内的成千上万个工具避免了手动下载、解压、配置环境变量的繁琐也减少了版本冲突和依赖缺失的问题。在Linux/macOS上安装gfortran在大多数Linux发行版和macOS通过Homebrew上安装gfortran更为简单。Ubuntu/Debian:sudo apt update sudo apt install gfortranFedora/RHEL/CentOS:sudo dnf install gcc-gfortranmacOS (使用Homebrew):brew install gccHomebrew安装的gcc套件会包含gfortran可执行文件可能被命名为gfortran-13版本号你可以通过ln -s创建一个gfortran的软链接或者后续在VS Code配置中指定完整的路径。2.2 Intel Fortran (ifort)高性能与商业支持如果你的项目严重依赖Intel数学核心函数库MKL或者需要针对Intel处理器进行极致优化那么Intel Fortran编译器是更好的选择。它通常能生成比gfortran更高效的代码特别是在Intel CPU上。ifort是Intel oneAPI HPC Toolkit或Intel Parallel Studio XE的一部分。安装要点从Intel官网下载oneAPI Base Toolkit或HPC Toolkit安装包。安装过程是图形化的按照指引即可。安装完成后最关键的一步是运行环境变量设置脚本。对于Windows你需要在开始菜单中找到类似“Intel oneAPI Command Prompt for Intel 64 for Visual Studio 2022”的快捷方式从这个命令行启动的环境已经配置好了所有路径。如果你想让普通命令行或VS Code也能用需要手动执行安装目录下的setvars.batWindows或setvars.shLinux/macOS或者将其配置到系统环境变量中这个过程比gfortran复杂一些。验证在配置好环境变量的终端中运行ifort --version。个人建议除非项目有明确要求否则初学者和大多数应用场景从gfortran开始会更简单。它的社区支持广泛遇到问题更容易搜索到解决方案。等熟悉了Fortran开发和VS Code环境后再根据需求评估是否迁移到ifort。3. VS Code核心插件Fortran语言支持的灵魂安装好编译器只是让机器能读懂你的代码。要让VS Code“理解”Fortran提供智能提示、跳转、高亮等功能必须安装专门的插件。在VS Code的扩展市场CtrlShiftX中搜索“Fortran”你会看到好几个结果。经过多次尝试和对比我确定了以下核心组合。3.1 Modern Fortran主力语言服务插件Modern Fortran是当前VS Code上Fortran支持最全面、最活跃的插件。它由Gavin Gray等人维护提供了语法高亮对Fortran 77/90/95/2003/2008/2018标准的关键字、内置函数、模块等提供精准着色。智能感知代码自动补全变量、模块、函数名、函数签名提示、快速查看定义/引用。代码导航跳转到定义、查找所有引用、大纲视图。代码片段输入关键字缩写如progfuncmod快速生成程序、函数、模块的代码框架。实时语法检查无需编译实时标记出语法错误如缺少end语句、类型不匹配。安装与基础配置 安装后插件基本可以开箱即用。但为了获得最佳体验我建议进行以下设置打开VS Code设置搜索fortran指定Fortran可执行路径如果你安装了多个Fortran编译器如gfortran和ifort并存或者编译器不在标准PATH里可以在这里明确指定路径。例如fortran.linter.executablePath: C:\\msys64\\ucrt64\\bin\\gfortran.exe。设置默认标准fortran.linter.compilerOptions: [-stdf2018]。这告诉语言服务器按哪个Fortran标准进行语法检查。对于新项目建议使用f2008或f2018。启用更多功能确保fortran.formatting.enabled和fortran.linter.enabled为true。这个插件是你在VS Code中高效编写Fortran代码的基石它提供的语言服务是其他功能如调试、构建的前提。3.2 Fortran Breakpoint Support调试必备这是一个小巧但至关重要的插件Fortran Breakpoint Support。它的功能很单一就是让VS Code的调试器能识别Fortran源代码文件.f,.f90,.f95等中的断点。为什么需要它VS Code的调试器原生支持的语言如C, Python, JavaScript是有限的。对于Fortran如果没有这个插件你即使在代码行号旁边点击设置了断点显示为灰色的圆点在启动调试时这些断点也不会被真正激活不会变成红色调试器会直接忽略它们。安装此插件后无需任何配置VS Code的调试界面就能正确地在Fortran文件中绑定断点。这是连接VS Code前端调试界面与后端GDB/LLDB调试器的桥梁。3.3 辅助类插件提升体验除了上述两个核心还有一些插件能极大提升舒适度Code Runner一个万能插件。安装后在Fortran代码编辑区右键会出现“Run Code”选项。点击它会自动编译并运行当前文件。你可以通过配置code-runner.executorMap来定制Fortran文件的运行命令例如将其映射为cd $dir gfortran $fileName -o $fileNameWithoutExt $dir$fileNameWithoutExt。这对于快速测试单个小程序非常方便。Even Better TOML/YAML如果你的项目使用tasks.json,launch.json进行配置后面会讲到这些文件分别是JSON格式。安装对应的插件可以获得语法高亮和验证写配置时更轻松。GitLens如果你用Git进行版本控制这个插件提供的代码作者、历史追溯功能非常强大。至此你的VS Code已经“认识”Fortran了可以愉快地编写和进行基本语法检查。接下来我们要解决如何高效地编译、运行和调试。4. 构建与调试配置项目的“大脑”与“眼睛”单个文件可以用Code Runner快速运行但真正的项目往往由多个源文件、模块和外部库组成需要复杂的编译指令。此外调试是定位复杂逻辑错误不可或缺的手段。VS Code通过tasks.json和launch.json这两个配置文件来管理构建和调试任务它们位于项目根目录的.vscode文件夹下。4.1 配置构建任务 (tasks.json)tasks.json定义了如何编译你的项目。我们可以配置一个“构建”任务按需编译。创建配置文件在VS Code中打开你的Fortran项目文件夹。按下CtrlShiftP打开命令面板输入Tasks: Configure Task然后选择Create tasks.json file from template-Others。这会在.vscode文件夹下创建一个初始的tasks.json文件。编写Fortran构建任务将tasks.json内容替换为如下示例。这个例子展示了如何编译一个由多个文件组成的项目。{ version: 2.0.0, tasks: [ { label: build_fortran_project, type: shell, command: gfortran, args: [ -g, // 生成调试信息这是调试必备的 -fcheckall, // 启用所有运行时检查数组越界、未初始化变量等调试神器 -Wall, // 显示所有警告 -Wextra, // 显示额外的警告 -stdf2008, // 指定Fortran标准 -o, // 指定输出文件名 ${workspaceFolder}/bin/my_program.exe, // 输出路径Windows用.exe ${workspaceFolder}/src/main.f90, ${workspaceFolder}/src/module_math.f90, ${workspaceFolder}/src/utils.f90 // 在这里列出所有需要编译的源文件 ], group: { kind: build, isDefault: true }, presentation: { echo: true, reveal: always, // 编译时在终端显示输出 focus: false, panel: shared // 复用同一个终端面板 }, problemMatcher: [$gcc] // 使用GCC问题匹配器可以将编译错误链接到源代码 } ] }关键参数解析label: 任务的名字在命令面板中显示。command: 编译命令这里用的是gfortran。如果你用ifort就改成ifort。args: 编译参数列表。-g至关重要。它会在可执行文件中嵌入源代码和符号信息没有它调试器无法将机器指令映射回你的Fortran代码行。-fcheckall强烈建议在开发调试阶段加上。它能捕获很多常见的运行时错误如数组索引越界、子程序参数不匹配等能帮你快速定位问题。-Wall -Wextra打开警告帮助发现潜在代码问题。-o ...指定输出可执行文件的路径。我习惯在项目根目录创建一个bin文件夹来存放生成的可执行文件保持源码目录整洁。group: 将任务归到“build”组并设为默认。这样你可以直接按CtrlShiftB来执行这个构建任务。problemMatcher:$gcc可以解析gfortran输出的错误信息并直接在VS Code的“问题”面板和源代码编辑器中标记出来点击错误就能跳转到对应行。运行构建任务编辑好tasks.json后保存。然后按CtrlShiftBVS Code会调用你配置的命令进行编译。编译输出和错误信息会显示在终端面板。如果编译成功你会在bin目录下看到my_program.exe。4.2 配置调试任务 (launch.json)编译出带调试信息的可执行文件后就可以配置调试了。创建调试配置点击VS Code侧边栏的“运行和调试”图标或按CtrlShiftD然后点击“创建一个 launch.json 文件”选择C (GDB/LLDB)。注意虽然我们是Fortran项目但GDB调试器同样支持调试Fortran只要编译时加了-g所以选择C模板是通用的做法。编写Fortran调试配置生成的launch.json初始内容是为C准备的我们需要修改它以适配Fortran。{ version: 0.2.0, configurations: [ { name: (gdb) Launch Fortran Program, // 配置名称在调试下拉菜单中显示 type: cppdbg, // 调试器类型使用GDB request: launch, // 启动调试 program: ${workspaceFolder}/bin/my_program.exe, // 要调试的可执行程序路径必须与tasks.json中的输出路径一致 args: [], // 程序命令行参数如果有的话在这里填入如 [input.txt, output.txt] stopAtEntry: false, // 是否在程序入口main处自动暂停一般设为false cwd: ${workspaceFolder}, // 程序运行的工作目录 environment: [], // 环境变量一般不需要 externalConsole: false, // 是否使用外部控制台。在Windows上如果程序需要交互式输入设为true可能更稳定。但集成终端体验更好。 MIMode: gdb, // 指定使用GDB miDebuggerPath: gdb, // GDB的路径。如果gdb不在PATH中需要指定完整路径如 C:\\msys2\\ucrt64\\bin\\gdb.exe setupCommands: [ { description: Enable pretty-printing for gdb, text: -enable-pretty-printing, ignoreFailures: true } ], preLaunchTask: build_fortran_project // 调试前自动执行的任务这里指向我们之前定义的构建任务标签 } ] }核心配置解析program必须指向你编译生成的、包含调试信息的可执行文件。路径要与tasks.json中的-o参数一致。preLaunchTask这是实现“一键调试”的关键。设置此项后每次你启动调试F5VS Code会先自动运行build_fortran_project这个构建任务确保你调试的是最新编译的代码。如果编译失败调试不会启动。miDebuggerPath指定GDB的路径。如果你用的是MSYS2的gfortran配套的GDB通常也在同一个bin目录下。如果直接输入gdb找不到就需要像示例注释里那样给出完整路径。externalConsole一个常见的坑。对于简单的Fortran程序使用VS Code的集成终端设为false通常没问题。但如果你的程序有复杂的终端交互或者遇到输入/输出显示异常可以尝试设为true使用系统原生控制台。开始调试配置保存后在“运行和调试”视图中选择(gdb) Launch Fortran Program配置。在源代码中你想停下的行号左侧点击设置断点红色圆点。然后按F5或点击绿色三角按钮。VS Code会先执行构建任务成功后自动启动调试器程序会在断点处暂停。此时你可以使用调试工具栏继续、单步跳过、单步进入、查看变量、监视表达式等来排查问题。调试心得Fortran调试中最有用的窗口是“变量”和“监视”。你可以查看数组的全部内容这对于检查数值计算中间结果是否正确至关重要。对于大型数组可以右键选择“将值复制为表达式”然后粘贴到监视窗口方便持续观察。5. 多文件项目与模块化开发实战现代Fortran项目基本都是模块化的。主程序program通过use语句来引用模块module中定义的变量、类型和子程序。这种结构对构建系统提出了要求需要正确处理模块文件.mod的生成和依赖。5.1 理解.mod文件与编译顺序当你编译一个包含module math_mod ... end module math_mod的文件如math.f90时编译器会做两件事生成目标文件math.o或math.obj。生成模块接口文件math_mod.mod。其他源文件如main.f90如果写了use math_mod在编译时编译器需要先找到math_mod.mod文件才能知道模块里有什么。这意味着编译顺序很重要必须先编译模块文件再编译使用该模块的文件。5.2 配置VS Code任务处理模块依赖对于小型项目我们可以在tasks.json的args中手动列出所有源文件gfortran会智能地处理依赖关系尽管它可能因为找不到.mod文件而报错但按顺序列出通常可行。更可靠的方式是分步编译{ version: 2.0.0, tasks: [ { label: compile_modules, type: shell, command: gfortran, args: [ -g, -fcheckall, -Wall, -Wextra, -stdf2008, -c, // 只编译不链接 -J${workspaceFolder}/mod, // 指定.mod文件的输出目录 ${workspaceFolder}/src/math.f90, ${workspaceFolder}/src/utils.f90 ], group: build, presentation: { echo: true, reveal: always, panel: shared }, problemMatcher: [$gcc] }, { label: compile_main, type: shell, command: gfortran, args: [ -g, -fcheckall, -Wall, -Wextra, -stdf2008, -c, -I${workspaceFolder}/mod, // 指定查找.mod文件的目录 ${workspaceFolder}/src/main.f90 ], group: build, dependsOn: compile_modules, // 依赖模块编译任务 presentation: { echo: true, reveal: always, panel: shared }, problemMatcher: [$gcc] }, { label: link_program, type: shell, command: gfortran, args: [ -o, ${workspaceFolder}/bin/my_program.exe, ${workspaceFolder}/src/main.o, // 链接目标文件 ${workspaceFolder}/src/math.o, ${workspaceFolder}/src/utils.o ], group: build, dependsOn: compile_main, // 依赖主程序编译任务 presentation: { echo: true, reveal: always, panel: shared } }, { label: build_fortran_project, dependsOn: [link_program], // 总构建任务依赖链接任务 group: { kind: build, isDefault: true } } ] }这个配置定义了一个任务链compile_modules-compile_main-link_program。关键参数是-J和-I-Jdir告诉编译器将生成的.mod文件输出到dir目录。我习惯创建一个mod文件夹来集中管理保持源码目录清洁。-Idir告诉编译器在dir目录中寻找.mod文件。通过dependsOn字段VS Code可以确保任务按顺序执行。最后一个名为build_fortran_project的聚合任务被设为默认构建任务CtrlShiftB它会触发整个链。5.3 使用Makefile或CMake管理大型项目对于源文件数量众多、依赖关系复杂的大型项目手动维护tasks.json的编译列表会变得非常痛苦。这时应该引入专业的构建工具。Makefile经典选择。在项目根目录创建一个Makefile定义编译规则和依赖。然后在tasks.json中将构建任务的command改为makeargs设为空或特定的target如alldebug。# 一个简单的Makefile示例 FC gfortran FFLAGS -g -fcheckall -Wall -Wextra -stdf2008 -J./mod -I./mod SRC src/main.f90 src/math.f90 src/utils.f90 OBJ $(SRC:.f90.o) EXE bin/my_program.exe all: $(EXE) $(EXE): $(OBJ) $(FC) $(FFLAGS) -o $ $^ %.o: %.f90 $(FC) $(FFLAGS) -c -o $ $ clean: rm -f $(OBJ) ./mod/*.mod $(EXE)对应的tasks.json任务可以简化为{ label: build_with_make, type: shell, command: make, args: [], group: { kind: build, isDefault: true }, problemMatcher: [$gcc] }CMake更现代、跨平台的选择。CMake可以生成适用于不同平台和编译器的构建文件如Makefile, Ninja, Visual Studio项目。编写一个CMakeLists.txt文件然后使用VS Code的CMake插件来配置和构建。# CMakeLists.txt 示例 cmake_minimum_required(VERSION 3.10) project(MyFortranProject) # 设置Fortran编译器选项 set(CMAKE_Fortran_FLAGS ${CMAKE_Fortran_FLAGS} -fcheckall -Wall -Wextra -stdf2008) # 指定.mod文件输出目录 set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/mod) # 添加可执行文件 add_executable(my_program src/main.f90 src/math.f90 src/utils.f90) # 指定可执行文件输出目录 set_target_properties(my_program PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)在VS Code中安装CMake Tools插件后它可以自动检测CMakeLists.txt提供配置、构建、调试等一系列集成命令管理大型项目非常方便。6. 常见问题排查与性能调优即使按照上述步骤配置在实际操作中仍可能遇到各种问题。这里总结几个我踩过的坑及其解决方案。6.1 插件或调试器不工作症状Modern Fortran插件没有提供代码补全或高亮或者调试时断点不生效断点显示为灰色空心圆。排查步骤检查编译器路径确认fortran.linter.executablePath设置正确且该路径下的gfortran可以正常运行。在VS Code集成终端里手动输入gfortran --version测试。重启语言服务器在VS Code命令面板中运行Fortran: Restart Language Server。有时插件状态会卡住。检查文件关联确保你的Fortran源文件后缀.f90.f95等被正确关联到Fortran语言模式。在文件右下角查看如果不是点击选择“Fortran (Modern Fortran)”。调试断点问题首先确认编译时是否包含了-g参数。然后检查是否安装了Fortran Breakpoint Support插件。最后在launch.json中尝试将externalConsole从false改为true有时集成终端与GDB的交互会有问题。6.2 编译错误找不到.mod文件错误信息Fatal Error: Cant open module file ‘xxx.mod’ for reading at (1): No such file or directory原因与解决编译器在编译use xxx的源文件时找不到对应的.mod文件。确保编译顺序如果你在tasks.json中一次性编译所有文件尝试调整源文件在args列表中的顺序把定义模块的文件放在使用它的文件前面。使用-I参数如果你分步编译或将.mod文件输出到特定目录如-J ./mod那么在编译使用模块的文件时必须用-I ./mod告诉编译器去那里找。清理旧文件有时旧的、失效的.mod文件会引发冲突。在构建前执行一个清理任务删除所有.o.mod和可执行文件。6.3 运行时错误或调试信息缺失症状程序运行时崩溃但调试器无法在源代码级别定位到具体行或者变量查看窗口显示optimized out。原因与解决确保-g参数存在这是生成调试信息的唯一途径。检查tasks.json和Makefile/CMakeLists.txt中的编译选项。禁用编译器优化高等级的优化如-O2-O3会改变代码执行顺序和内联函数导致调试信息错乱甚至失效。在开发调试阶段建议使用-O0禁用优化或-Og为调试体验优化的级别。启用运行时检查-fcheckall是Fortran开发者的好朋友。它虽然会降低程序运行速度但能精准定位数组越界、子程序参数不匹配等许多隐蔽错误。在发布最终版本前再移除这个选项。6.4 性能调优建议当项目配置稳定后可以考虑一些提升体验的优化使用编译数据库Modern Fortran插件可以利用compile_commands.json来提供更精准的代码分析。如果你使用CMake可以通过设置set(CMAKE_EXPORT_COMPILE_COMMANDS ON)来生成这个文件。对于Makefile项目也有工具如bear可以生成。配置代码格式化虽然Fortran的格式化工具不如其他语言丰富但可以尝试配置findent等工具通过VS Code的保存时格式化功能保持代码风格统一。利用多核编译对于大型项目在tasks.json的构建命令中可以添加-j4假设4核参数给make或者在CMake中配置以加速编译过程。分离开发与发布配置可以在.vscode下创建tasks-dev.json和tasks-release.json分别对应带调试信息和运行时检查的开发配置以及开启高级优化-O3-marchnative的发布配置。通过VS Code的“选择默认构建任务”功能来切换。从古老的终端编辑器切换到VS Code对于Fortran开发而言不仅仅是换了个好看的皮肤而是获得了一整套现代化的开发工具链。它降低了代码导航和理解的成本提升了调试效率并通过插件系统与主流开发生态无缝衔接。这个过程初期需要一些配置投入但一旦完成其带来的长期生产力提升是巨大的。我个人最大的体会是良好的环境配置让开发者能更专注于问题本身而不是与工具搏斗。希望这份详细的指南能帮助你顺利搭建起属于自己的Fortran开发环境。本文还有配套的精品资源点击获取
返回列表