跳到主要内容
  1. Skills/
  2. 后端编程/

常见编程语言 -- 如何在命令行编译并运行

··字数 1930·4 分钟
howto rosetta code

有时通过 jetbrains、vscode 这些 ide 的界面操作来运行项目,反而不懂简单的命令。绝大部分编程语言都有在命令行编译并运行方式的功能,有悟收集当前一些主流开发语言(java、go、c/c++、javascript/typescript、rust)的命令行编译并运行的命令。

java open jdk 有非常多的版本,可通过 jabba 安装,版本非常全。 windows 用户安装了 scoop 的,可以使用 scoop 来安装,使用 scoop search jdk 会提示相应的步骤 macos/linux 用户还可以使用 jenv 来管理多版本。

  • hello world 程序:
//  hello.java
class Hello {
  public static void main(String[] args){
    System.out.println("I'm a Simple Program");
  }
}

编译与运行(命令 javac hello.java && java Hello):

~/Projects/go/examples/firstprogram
➜  javac hello.java && java Hello
youwu.today say hi.

javac hello.java 会编译并在当前生成一个字节码文件 Hello.class。使用 java Hello 启动 java 程序,Hello 是 main 类的名称。

常见的以 java 为开发语言的项目,使用 gradle、maven 等构建工具来完成构建,并不会直接手动在命令行执行 javac

  • 环境准备

到官方网站 下载页 下载 sdk,按照官方 安装说明 进行安装。如果下载的是 zip 压缩包版本,需要将 go 可执行程序所在程序配置到环境变量 path。

windows 用户可以使用 scoop 来安装 go sdk。 macos/linux 用户可以使用 brew 安装。

  • hello world 程序:
// hello.go
package main

import "fmt"

func main() {

    fmt.Println("youwu.today say hi.")
}

使用 go run hello.go 运行或者 go build -o hello_go hello.go && ./hello_go 编译生成可执行程序后运行:

~/Projects/go/examples/firstprogram
➜  go run hello.go
youwu.today say hi.

~/Projects/go/examples/firstprogram
➜  go build -o hello_go  hello.go && ./hello_go
youwu.today say hi.
  • 安装 c 编译环境 gcc

linux 用户安装 gcc环境,通过所用操作系统的包管理器安装。 windows 用户,安装 mingw ,如果是 windows 10用户,可以启用 wls 来获得一个 linux 操作系统环境。 macos 用户安装 xcode ,当然也你可以选择安装 gcc,不过如果你以后可能会在 macos 上搞程序开发工作,那么还是安装 xcode。

还有一些定制的c编译器,如 tinyc,作用新手的话,不建议去玩。

  • hello world 程序:
// hello.c
#include <stdio.h>
int main() {
   printf("youwu.today say hi.\n");
   return 0;
}

使用命令 gcc hello.c -o hello_c && hello_c 编译并生成可执行程序 hello_c

~/Projects/go/examples/firstprogram
➜  gcc hello.c -o hello_c && ./hello_c
youwu.today say hi.

~/Projects/go/examples/firstprogram
➜  clang hello.c -o hello_c && ./hello_c

~/Projects/go/examples/firstprogram
➜  g++ hello.c -o hello_c && ./hello_c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
youwu.today say hi.

即使使用 c++ 编译器,也可以编译上面的示例程序,当然会有一些警告信息。

  • 安装 c++ 编译环境

gcc 环境中包含有 c++ 编译器。

  • hello world 程序:
// hello.cpp
#include <iostream>

using namespace std;

int main ()
{
    cout << "youwu.today say hi." << endl; 
   return 0;
}

使用命令 g++c++ 编译并生成可执行程序 hello_cpp

~/Projects/go/examples/firstprogram
➜  g++ hello.cpp -o hello_cpp && ./hello_cpp
youwu.today say hi.

~/Projects/go/examples/firstprogram
➜  c++ hello.cpp -o hello_cpp && ./hello_cpp
youwu.today say hi.

typescript 是用来开发 javascript 的,不是用来直接运行的。不过,还是可以在命令行运行。

如果使用 nodejs 作为 js 运行环境,那么需要安装 typescript 编译器。通过使用 typescript 编译得到 js 脚本后再用 nodejs 来运行。

除 nodejs 外,javascript 还有一个不错的服务端运行时环境, deno ,它可以直接运行 typescript,可按 官方说明 安装。

有需要安装nodejs的,可到 官方网站 下载。或者使用 scoop/brew 安装,还可以使用 nodejs 多版本管理器 nvm (如 windows 版本 / macos、linux版本 )安装。

typescript, 官方下载页 中有说明,通过 npmyarn等 js 工程的包管理器来安装。

  • hello world 程序:
// hello.ts
function main() {
    console.log("youwu.today say hi.")
}

main()

使用 typescript + node 运行的方式:

~/Projects/go/examples/firstprogram
➜  tsc hello.ts && node hello.js
youwu.today say hi.

tsc 是 typescript 的命令行 cli,通过它将 hello.ts 编译成 hello.js,然后使用 node 运行 hello.js 脚本。

使用 deno 直接运行 typescript 脚本文件:

~/Projects/go/examples/firstprogram
➜  deno run hello.ts
Check file:///Users/youwu.today/Projects/go/examples/firstprogram/hello.ts
youwu.today say hi.

~/Projects/go/examples/firstprogram
➜  deno run hello.ts
youwu.today say hi.

第一次运行会出现 Check file:///...,这是 deno 编译 typescript 文件。

  • 环境准备

建议通过 rustup 来安装 rust 环境,rustup 是由官方提供的安装、更新工具。安装后需要将相关的路径配置到 PATH 环境变量中。详见 官方的 安装说明 。当然,还是可以通过 scoop、brew 来安装。

  • hello world 程序:
// hello.rs
fn main() {
    println!("youwu.today say hi.");
}

使用 rustc 来编译代码,会在当前目录下生成一个可执行文件,通过 -o 名称 来指定个可执行程序的名称:

~/Projects/go/examples/firstprogram
➜  rustc hello.rs -o hello_rs && ./hello_rs
youwu.today say hi.

通常,我们见到的使用 rust 所开发的项目,都是通过 cargo 来启动编译,而不会直接启动 rustc 编译。

cargo 之于 rust,如同 gradle/maven 之于 java,npm/yarn 之于 js。

顺便看看编译后可执行文件的大小(好奇) #

~/Projects/go/examples/firstprogram
➜  ls -lrS
total 4792
-rw-r--r--  1 zhangying  staff       51  8 24 11:07 hello.rs
-rw-r--r--  1 zhangying  staff       77  8 24 10:56 hello.ts
-rw-r--r--  1 zhangying  staff       80  8 24 10:53 hello.js
-rw-r--r--  1 zhangying  staff       81  8 24 10:02 hello.go
-rw-r--r--  1 zhangying  staff       83  8 24 10:18 hello.c
-rw-r--r--  1 zhangying  staff      122  8 24 09:58 hello.java
-rw-r--r--  1 zhangying  staff      129  8 24 10:30 hello.cpp
-rw-r--r--  1 zhangying  staff      423  9 15 10:36 Hello.class
-rwxr-xr-x  1 zhangying  staff    49424  9 15 10:44 hello_c
-rwxr-xr-x  1 zhangying  staff    56120  9 15 10:59 hello_cpp
-rwxr-xr-x  1 zhangying  staff   437816  9 15 10:58 hello_rs
-rwxr-xr-x  1 zhangying  staff  1869456  9 15 10:42 hello_go

以上所列可执行程序(hello_c、hello_cpp、hello_go、hello_rs),是在 macos 11.5.1 上编译得到的。

当然,编译过程都是编译器默认的优化参数。

hello world 的各个可执行程序中,c版本的体积最小。(java 的 class 文件不算,它不是可执行程序,而只是字节码,需要在 java 虚拟机中运行。)

~/Projects/go/examples/firstprogram
➜  go version
go version go1.17 darwin/amd64

~/Projects/go/examples/firstprogram
➜  rustc --version
rustc 1.55.0 (c8dfcfe04 2021-09-06)

~/Projects/go/examples/firstprogram
➜  gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

~/Projects/go/examples/firstprogram
➜  clang --version
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
语言 编译器 可执行程序大小
c apple clang 12.0.5 48 kb
cpp apple clang 12.0.5 55 kb
rust 1.55.0 408 kb
go 1.17 1.8 mb