在Windows统治PC端操作系统的今天,需要用Linux跑程序的时候,往往又不想配置庞大而缓慢的虚拟机。在这种情况下,WSL是一个非常好的替代方案。cool语言作为编译器设计实验中常用的程序设计语言,必须要在Debian系(如Ubuntu)的Linux系统中运行,本文介绍如何在WSL中配置cool语言的编译运行环境,帮助同学更好地完成实验。
一、 初步配置WSL
关于WSL的介绍和基础配置请见我的另一篇博客:WSL基础部署
二、 安装i386
WSL默认情况下不支持运行32位程序(但虚拟机/实机可以),由于cool年代久远,我们需要让我们的WSL支持32位程序才可以运行coolc等文件。
否则就会出现以下错误
1
cannot execute binary file: Exec format error
安装i386及其依赖的命令如下
1
2
3
4
5
6
7
8
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install g++-multilib
$ sudo apt-get install libncurses5:i386
$ sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.8-base:i386 libstdc++5:i386 libstdc++6:i386
$ sudo apt-get install lib32z1 lib32ncurses5 lib32ncursesw5 lib32ncursesw5-dev
之后执行命令
1
2
$ sudo apt install qemu-user-static
$ sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
在关机重启后会发现i386失效,这时需要重新运行命令使i386生效
1
$ sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
这是一条很冗长的命令,没人想手动运行它,我们可以将其写入脚本、加入开机自启项,具体方法请见底部相关链接
此外我们可以手动运行这个脚本
enablei386.sh
1
2
3
#!/bin/bash
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
保存后执行下面的命令即可启用i386
1
$ sh enablei386.sh
关于更多WSL32bit程序运行的讨论,请参见底部相关链接
三、 执行./coolc
等待所有命令执行完毕之后,再运行./coolc
,可以看到运行成功
小技巧:在目标文件夹中按住Shift
键后点击右键,选项框中会出现在此处打开Linux shell
,打开的命令行窗口会自动将工作文件夹切换至此
四、 将coolc所在文件夹加入环境变量
加入环境变量之前,我们需要把cool文件夹的位置确定下来,这里建议
- 放在windows系统可以访问到的位置,以便于使用windows的文本编辑器
- 路径避免中文字符,从而规避编码可能带来的问题
将cool文件夹安置好之后,就可以添加环境变量了
- 为了方便切换文件夹,我们添加环境变量
COOL_HOME
- 为了方便使用cool相关工具,我们将bin的目录加入到
PATH
加入环境变量的有效期限有临时和永久两种
下面以cool路径为/mnt/c/WorkSpace/cool/
为例:
1. 临时设置
可以直接使用命令
1
2
$ export PATH=$PATH:/mnt/c/WorkSpace/cool/bin/
$ export COOL_HOME=/mnt/c/WorkSpace/cool/
也可以写一个脚本
1
2
3
#!/bin/bash
export PATH=$PATH:/mnt/c/WorkSpace/cool/bin/
export COOL_HOME=/mnt/c/WorkSpace/cool/
2. 永久设置
可以修改profile
文件:编辑/etc/profile, 在末尾加入
1
2
export PATH=$PATH:/mnt/c/WorkSpace/cool/bin/
export COOL_HOME=/mnt/c/WorkSpace/cool/
保存退出后使用source使设置生效:
1
$ source /etc/profile
我们同样可以不修改profile
,修改~/.bashrc文件也可以达到相同的效果,在~/.bashrc文件末尾加入
1
2
export PATH=$PATH:/mnt/c/WorkSpace/cool/bin/
export COOL_HOME=/mnt/c/WorkSpace/cool/
保存退出后使用source使设置生效:
1
$ source ~/.bashrc
设置好环境变量后,我们就可以在任何文件夹,通过名字访问cool的工具、使用$COOL_HOME
代替冗长的路径字符串
五. 编译运行hello world程序
hello_world.cl
程序位于$COOL_HOME/examples/
下
首先是编译
1
$ coolc $COOL_HOME/examples/hello_world.cl
编译成功后会在当前文件夹中生成一个hello_world.s
文件,里面是MIPS汇编代码,需要在spim虚拟机中运行:
1
$ spim -trap_file $COOL_HOME/lib/trap.handler -file $COOL_HOME/examples/hello_world.s
按下回车后,如果看到下面这段内容,则表明运行成功
1
2
3
4
5
6
7
SPIM Version 6.5 of January 4, 2003
Copyright 1990-2003 by James R. Larus (larus@cs.wisc.edu).
All Rights Reserved.
See the file README for a full copyright notice.
Loaded: ../lib/trap.handler
Hello, World.
COOL program successfully executed
六、 安装flex和bison
flex的功能是词法分析,bison的功能是语法分析。在确保换源成功后,运行下列指令即可安装flex和bison
1
$ sudo apt-get install flex bison
安装结束后检查是否成功
1
2
$ flex --version
$ bison --verson
出现以下内容则说明安装成功