Java
大约 3 分钟
Java
目录
编译详解
多文件编译
通过依赖自动编译关联文件
- Java的javac编译器:如果熟悉UNIX的“make”工具(或者是Windows中的“nmake”等工具),可以认为Java编译器内置了“make”功能
- C++:一般是使用makefile,即qmake (QT) 或 cmake (通用) 来辅助变异
- js-es6、python:这种动态语言不需要编译,都是实时import模块的
项目工程层级
与其他语言比较:
忽略掉 .vscode、.husky、.gitignore、.clang-format、LICENSE、README.md 这一类任意语言及完全可选的文件。
Java
- 最普通的java单文件简单,准备主类和main函数即可,java.exe生成字节码
- SE 有复杂固定的项目结构,多种不同格式的文件。可以通过IDE直接创建对应结构的Project
- EE 类似SE,但我不是很熟
C++
- C/C++:简单一些,小型项目结构几乎只有头文件和源码,只要准备main函数。gcc / g++ 加一些编译参数即可实现单文件/多文件编译
- 大型一点增加了.sln / CMakeList.txt / makefile 这种编译及链接辅助文件
- Qt:也有多种不同格式的文件,但感觉没 Java 繁琐。可以通过IDE直接创建对应结构的Project
JavaScript、Python
- 也简单,只有一个 package.json 或 requirement.txt 的依赖库文件,甚至main函数不是必须的 (因为这两不需要构建,是纯解释型的)
- Vue这种框架项目复杂一些。可以借助脚手架来创建项目
Go
- 单文件编译很简单,go build test.go。准备main包和main函数即可。大项目也有一些需要遵循的结构规则 (如每个文件都要有所属的包)
Rust:的……
编译生成产物
跨平台策略
当然,比较影响这方面的是语言的编译跨平台策略
- 一次编写,随处编译 (Write Once, Compile Everywhere, WOCE)
- C/C++、Rust
- 一次编写,随处运行 (Write Once, Run Anywhere, WORA)
- Java (字节码形式):需要目标机器安装Java虚拟机 (JVM),JVM将字节码转化为机器代码
- Python (脚本形式):需要目标机器安装Python解释器
- 其他跨平台策略
- HTML/JavaScript/CSS
- .NET Framework/.NET Core:需要目标机器安装.NET运行时环境
- Kotlin/Scala (字节码/js形式)
- GO:可以同时 WOCE 和 WORA 的
生成windows可执行文件
某些语言要生成exe还要做其他工作的。而且有些语言并不以总是在使用环境中被以可执行文件运行 (见跨平台策略)
WOCE型的语言,更容易实现exe的生成 (本来就是要使用可执行文件的)
WOCE
- c/c++:配置工具链,mingw/msvc等,选择好编译环境,然后编译即可
WORA
- python:python要额外使用pyinstaller等打包工具
- java:忘了,好像要 Launch4j 和 JSmooth 等打包工具
其他
C# .NET:windows似乎要对面另外安 .NET 5、.NET 6 环境这样,就不会另外再打包环境了
Go:
go build test.go
,在windows环境直接就能生成小体积的test.exe,在linux环境估计也是直接生成可执行文件。可以说非常方便了Go 似乎是可以同时 WOCE 和 WORA 的。因为Go 语言的运行时(runtime)相对轻量