跳至主要內容

Java

LincZero大约 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)相对轻量