C语言:可以说是也不是
计算机识别0和1,有些代表指令(有固定含义和编码),是芯片能识别的;另一些是数据,不同程序数据不同。
汇编的由来:比如“+”,是cpu的可识别的固定编码(比如0xa90dff,随便写的),为了方便书写和记忆,用助记符add表示,这就是汇编的由来。
高级语言:随着程序规模变大,汇编台式太复杂,于是有了高级语言,比如C。
编译过程:高级语言->汇编语言->二进制。
指令集:那些类似add之类的助记符,以及汇编的语法格式,称之为指令集。
关键所在:不同公司生产的cpu,指令集不同。没有统一的标准。甚至像intel所代表的复杂指令集,和arm为代表的精简指令集,它们指令集的设计思路就是不一样的。
所以:
1.C是源码可移植性的。因为操作系统就是C写的,C的语义通常能靠硬件及操作系统直接支持的功能实现。前提是必须使用C标准库函数。而且C中有许多东西与平台相关,最简单的比如表示int有的用16位,有的用32位。所以要针对不同平台做不同处理,比如条件编译。
2.C编译结果不可夸平台。因不同平台编译的二进制文件都不同。
java:
平台无关性:java源文件编译成.class文件,可以在任何平台的jvm上运行。
语言无关性:其他语言也可以开发对应的编译器,编译成.class文件,跑在jvm上。
像Clojure、Groovy、JRuby、Jython、Scala等语言都可以。
.net:CLR有点类似于jvm,#、F#、VB.NET、C++、Python等几十种语言也可以运行在CLR上。