这应该是一个传统,作为之后的语言,对之前的语言的一种致敬。
首先按照程序运行的机制,一个程序的执行必然是由另一个更之前的程序去启动的 最原始的就到了操作系统。
首先说下汇编的执行。
汇编的代码 要由与操作系统配合的编译器,连接器进行处理,处理成当前操作系统可以识别的可执行文件,然后在由操作系统将这些数据读到内存中进行执行. 单是有一点,汇编的代码里面的数据也是分很多种,简单点可以分为两类数据存放区,实际执行区. 但是操作系统怎么找到这些东西,并把他们放在合适的地方进行使用。
在汇编指令里面 我们知道有一部分指令 叫伪指令,这部分指令是给编译器看的,不会进入最终的二进制文件,我们就是用这些指令 将汇编指令 进行处理,处理完后,操作系统就可以知道哪些是存放数据的,哪些是实际运行的(其实就是具体的内存的起始值,放到合适的寄存器里面),这样的话操作系统就可以运行这段处理好的文件了。
同样的对于c来说,也采用类似的做法,不过对c来说要比汇编高级一点,它声明的是main方法,同样 的在编译连接处理之后,main方法的指针就成为了代码执行的逻辑入口,说到这里就应该明白,所谓的main其实同样是作为一个标记而已,就好比汇编的伪指令,这里一定要写成main方法 是因为编译器默认会去把他作为程序执行的入口,这是约定俗成的一件事,当然你要是有能力 也可以找到编译器的源码,找到这个标记 把他改成你自己的。
最后说到java,java不仅是main还是static,同样的我们知道jvm是c写的,这个方法叫main而不叫其他也是因为写java这帮人是c的老用户吧。你去看jdk的源码就知道 也是main方法起的。我这里想说下为什么是static。我们知道jvm的内存模型运行时的数据区 有三大块 常量池,堆,栈。常量池存放所有已加载类的元数据(数据表的表名),堆里面存放的是类实例(表记录)。在java里面,static修饰的方法和属性是可以在不需要实例化的时候就可以去访问的,并且我们知道static方法内部只可以使用
该类static属性,而相对的实例属性 必须要在类实例化以后才可以访问,因为只有在实例化以后,对应的类才可以在堆上有自己可以访问的数据(表里面有了记录,不在是空表),说的在朴实点就是,元数据的所对应的指针不为空(这也是为什么static方法不能访问非static属性的原因,因为指针为空,没有对应的数据)。所以static修饰的方法或者属性,天生自带关联的内存区域,而实例的没有,所以java在启动的时候直接去找对应的内存就可以了,不然还要重新申请内存,初始化。
所以,
java的class文件说到底,其实也就是jvm的一堆数据而已 这堆数据比较复杂,有一些繁琐的处理流程
不只是单纯的数据 还包含过程就好比 lamble之于 集合.lambel中的函数 (专业点叫算子)在集合的stream过程中也只是一个变量 一个参数数据而已,但是它又是一个过程。所谓的函数编程。其实说到根上,也就是把参数的范围扩大了一下,从之前的值或者引用,扩大到了可以包含一个过程,不过为什么不能呢,毕竟我们使用的虚拟机 一直就是这么干的啊,我们只不过是,拓展延伸了一下而已。