软件、程序、编程语言
在日常生活中我们时常会听说下载某个“软件”、安装或使用某个“程序”,或者是学习某种“计算机语言”。那什么是软件?什么是程序?什么又是计算机语言?之前所学习的 HTML、CSS 可以被算作编程语言吗?
软件通常可以分为多种类型,像常见的办公软件、杀毒软件、游戏软件甚至是聊天交友的社交软件,都是属于软件。我们安装的、打开使用的,就是一个拥有完整功能的软件成品。
使用软件,实际上就是在操作数据。无论是登录信息、聊天、更换游戏皮肤、游戏练级,都是属于在操作数据。所以软件就是由程序和数据构成。开发人员们通过编写程序,用户提供信息,将数据展现在软件中。
所以总结起来就是:
- 软件 = 程序 + 数据
- 程序是用来处理数据的计算机指令的集合
- 编程语言则是由开发人员书写计算机指令的语言
编程语言的发展
同人类的工作内容一样,计算机的工作同样需要接收指令。但对于计算机而言,只能识别电子元器件,通过二进制的数码去识别指令。所有的信息都被转化为由 0 和 1 组成的代码来进行存储和传输。计算机中的二进制则是一个非常微小的开关,使用 1 来表示 “高频(开)”,使用 0 来表示“低频(关)”。
最初,老科学家们,使用一条纸带,通过打孔的形式模拟通电或不通电,来给予计算机指令模拟出 0101 的效果。
但显然,0 和 1 对于机器而言能轻松拿捏,但对于编写指令的开发人员来说就显得不便于编写和记忆了,所以编程语言发展到汇编语言阶段,使用了“助记符”,即帮助记忆的符号,使代码具有了一定的可读性。
mov AX, a; // 将数据量 a 移动到寄存器 AX
add AX, b; // 将数据量 b 添加到寄存器 AX
move c, AX; // 将 AX 移动到 c
/* 实际上做的事就是将 a 和 b 的值放进到 c 里 */
再到后来,编程语言发展到了高级语言阶段,独立于机器硬件,就更加贴近人类的自然语言了。现在市面上学习到的编程语言都是属于高级语言。
像上述的“把 a 放进容器 AX,把 b 放进容器 AX,再将 AX 里的值全部移动到 c” 是不是就是在做 “a + b = c” 的事儿?那如果使用高级语言我们会怎么书写呢? c = a + b 就很显然表示了值的来源和结果。所以高级语言就是按照人类日常会话的方式所设计的编程语言,更加贴合自然语言,所以基于某些场景、商业行为、语言的设计思想等原因发展出了多种编程语言。
编译与解释
刚刚我们提到了计算机能够识别的语言叫计算机语言,人类使用的自然语言,那高级语言与计算机之间进行对话。可机器怎么能够理解人类语言呢?这就要涉及到了语言(人类)和语言(机器)之间的“翻译”。
这个“翻译”的过程又可以被分为“编译”和“解释”:
- 像 java 、C 、C++ 则是属于编译型语言,开发人员在书写完源码后,需要经过编译器的编译,得到一个二进制文件的目标代码 .bin 文件,计算机执行这个二进制代码才得到了最终的结果
- 编译的过程跟书籍翻译很像,假设当前 JK罗琳写完了英文原版《Harry potter》那么只有懂英文的读者才能看懂故事,但如果经过译者去翻译成其他语言,受众群体就可以更多了
- 所以对于编译语言而言,一次编译得到目标代码后可以被多次执行
- 像 javascript 就是属于解释型的语言,也就是说我们所书写的 js 源码经过解释器的解析,可以直接运行得到结果,期间不会产生新的二进制文件,翻译一句执行一句
- 浏览器其实就是 HTML 的解释器
- 如同是在国际会议上,演讲者和听众语言不通,就需要一个同声翻译,演讲者说一句,翻译官就翻译一句
两者特点:
- 编译型语言的特点是运行速度快,效率高,只需要翻译一次,以后的每次执行就无须重新翻译
- 缺点在于每一次修改后都需要重新翻译一遍
- 解释型语言则是直接以源代码的形式出现,运行的时候才实时解析为机器码并执行,或者说每一次执行都会翻译一遍。
早在 1991 年,美国 Sun 公司承接了一个叫作 Green 的智能家电项目,为家用消费电子产品开发一个分布式代码系统做物联,想把 E-mail 分发给电冰箱、电视机、微波炉等家用电器,对它们进行集中控制和信息交流,有点类似于现在的小米家电、华为家电。原本准备采用成熟技术 C++ 来进行开发,但在开发过程当中遇见了问题。
刚才我们提到,开发者通过指令也就是代码,来操作计算机,而代码中所能包含的除了数字字母以外,还会有一些符号等,所以需要指令集来代表各种符号字母。但无法确保一个家庭所使用的家电都是同一品牌,各品牌的家用电器所用的电子芯片又不同,导致了跨平台的不便利性,那么一个指令集就无法应用到所有的家用电器电子芯片当中了。所以现在就急需一个“一次编译,处处执行”的语言。于是由 詹姆斯高斯林 带头设计出了 java。
回想一下你曾经是否给自己的宠物取过名字?从哪里来的灵感?食物?颜色?物品?动漫角色?
在 1995 年 java 诞生之初,高斯林的办公室外有一棵橡树,于是他想将这门语言命名为橡树(oak),后来,他猛然发现自己手里端着咖啡,那爪哇岛最著名的就是咖啡了,所以最终重命名为 java,语言 logo 也被设计为了一个热气腾腾的咖啡杯,语言精灵 Duke。
从整个发展变迁的时间轴可以看见 java 的发展历史,自 1995 年从 Sun 公司由詹姆斯高斯林设计问世,发展至今已经 20 多年了。
在这个时间轴中:
- JDK 全称 java development kit 表示 java 开发工具包,顾名思义它是提供 java 程序编译和运行的环境,目前的最高版本为 JDK17
- 从时间轴上还能看出一个新的名称叫作 “Oracle 公司” 。在 2009 年 Sun 公司被 Oracle 公司收购,所以当前 java 也就跟着新东家了
这里还要提到一个词叫 javaSE 全称 java standard edition 表示 java 标准版本,在标准版的基础之上又增加了两个版本:
- javaSE 标准版,作为 java 整体的语言语法规范
- javaME 针对桌面应用精简出的版本,主要应用在个人手机、pad、手表上
- javaEE 一个针对企业级服务器上的扩展版
- 无论是哪个版本,我们在实际开发中,都会选择使用带有 “LTS” 即 long Term support 长期支持版,在论坛社区会有尽可能多的问题解决方案,及官方的更新维护
IDEA 的安装与配置
一个老话叫“工欲善其事必先利其器”,代码既然要书写和运行,就肯定需要一个工具能够书写和编译代码。目前市场上主流的编辑器会选择使用 IntelliJ IDEA ,它是一个 java 编程语言开发的集成环境。下载安装编辑器 IntelliJ IDEA
JDK 的安装与配置
JDK 作用:提供 java 的编译和运行环境,使用内置的工具类。
JDK 下载:
- Oracle 官网(收费)
- OpenJDK(IBM 国际商业机器公司、Twitter、亚马逊的open JDK 下载地址、阿里、华为等)Sun 公司卖掉 java 之前开源代码在 java 社区,避免了 Oracle 一家独大。open JDK 跟官方 JDK 有 97% 的相似度,不同之处仅在于官方的 JDK 对于 Oracle 自家产品的支持更好
- 推荐大家使用亚马逊的 open JDK 一方面是因为免费,另一方面也有情怀因素——高斯林就职于亚马逊
java 的执行流程
- 编写源代码 .java 文件
- 通过 java 编译器
- 得到 .class 字节码文件
- 字节码文件会
- 自动装载进类加载器
- 经过字节码校验器去检测环境、代码的正确性
- 再经过解释器
- 最终在操作系统平台得到结果。解释器是 java 实现跨平台的真正原因,所以 JDK 针对不同的操作系统平台有不同版本
区分几个概念:
- JDK:java 开发工具包,其中包含了提供 java 开发人员所需要的开发命令工具
- JRE:java 运行环境。其中又包含了
- 运行代码所需的核心库
- JVM:java 虚拟机,提供 java 程序运行的环境
以上的内容都是基于操作系统的。
所以在我们开发时需要安装完整的 JDK,包含开发所需的核心库和运行环境。未来在给用户安装使用时,不需要开发环境,只需要运行环境,即给用户安装 JVM。
Windows 下的 JDK 环境变量配置目的:为了提升 JDK 中的命令级别。升级为 windows 系统下的全局命令,可在任意目录下直接运行编译和命令,不用必须指定到 JDK 安装目录。
第一段 java 代码
打开编辑器
类名首字母大写,类名与文件名同名。假设当前创建了一个叫做 Project.java 文件:
// Project.java 文件名同 class 名
public class Project {
// 主函数 入口函数
public static void main(String[] args){
System.out.println("123"); // // sout 快捷键
}
}
print()
和 println()
的区别就仅是换行。
System.out.print("123");
System.out.println("123");