先用B和汇编语言编写一个C语言的部分必须功能的编译器,大学C语言课程不用Linux的gcc编译器,大学C语言课程不用Linux的gcc编译器,这些语言编译器、解释器都是c语言,语言自举性一个语言能否自己编写自己实现自己编译,详细过程如下:1、先编写一个只有C语言最基本功能编译器C0语言,完成完整的C语言编译器,c语言的自举过程和交叉编译我在以前的回答中。
为什么大学C语言课不用linux的gcc编译器上,而是用vs呢
答主有幸,大学正好学过C语言,现在从事的也正好是C语言相关的工作。我来回答你这个问题。
我认为,大学C语言课程不用Linux的gcc编译器,主要原因有以下几个方面。
可以快速上手,无需理解编译原理
我上学那会儿,使用的还是vc6.0+,一款很古老的IDE,一个框写代码,上面点一下是调试,再点一下是运行,非常傻瓜的操作,简单明了,上手十分简单。
一切都是以图形化的界面操作,直观清晰。无需去记gcc的复杂编译命令,不必了解从代码编译成为二进制字节码经历了哪四个阶段。更不用去掌握Makefile如何去编写。可以把更多的注意力集中在C语言本身。而不必花更多的精力去学习C语言以外的东西(如果是Linux+gcc的话,至少需要掌握简单的Linux操作命令,以及gcc编译,gdb调试等,这些东西学习成本不比学习C语言低,在大学有限的课程里,没有那么多的时间去学习这些)。-c编译器
考试机试的环境是VC(VS),与考试环境统一
我们学C语言考试时,期末考试直接是省二级C语言考试,后面又自己考了国家级C语言二级。不管是省二级还是国家二级,机试部分的编程环境,就是VC(当时的环境,现在不知道有没有改)。
因此,在平时教授课程的过程中,就让学生习惯这种开发环境,在考试的时候,就无需有重新熟悉开发环境的成本,可以快速进入状态。试想一下,如果平时上课使用VS,结果到了考试甩给你一套Linux环境,估计直接就懵逼了。-c编译器
历史原因,长期以来的传统
大学里教C语言的老师大部分都是一些年龄比较大的(年轻人比较少),在他们执教数十年的生涯里,用的一直是VS系,很多老师甚至都很少接触Linux。在他们脑海中,根深蒂固的就是认为C语言就是应该这么学的。
我之前曾经看过侯捷大神(就是翻译《Effectice C++》的那位大佬)出的一个讲C++STL源码的视频,用的居然也是VC6.0,实在是有些不可思议。
因此,大学C语言课程不用Linux的gcc编译器,主要是出于以上三个方便的考虑。希望我的回答能帮到你。
C语言是用什么编出的
首先答案是c语言是用c语言编写。
语言自举性
一个语言能否自己编写自己实现自己编译,这叫自编译,自举性。目前能实现自举性的语言没有几个,而自举性也就成了一个语言能否真实强大的标志。
一般来说图灵完备的语言,编译型语言,虚拟机语言可以实现自举。而解释型语言基本上很难。
现代很多语言都没实现自举,Java(jvm),Javascript, python,ruby,lua,php,perl……一堆。这些语言编译器、解释器都是c语言。
一个语言能自举是他们社区和开发一直梦寐以求的事情,也是他们情怀和追求所在。有一个语言为了实现自举成功,花了近20年,前年圣诞节才正式推出了第一个正式版本。它就是perl6,perl的下一代语言。perl6支持过程、OO、函数式三种程模式,支持虚拟机的语言(自己的虚拟机和jvm)。为了做好perl6,社区搞了一个功能启示录,把要实现的功能好点子都录进去。后来一个日本人参考这个启示录自己实现了一个语言,这就有了ruby语言,但是ruby没有自举。-c编译器
c语言的自举过程和交叉编译
我在以前的回答中,曾说过c语言的来历:
上世纪70年代,为了实现unix,教主Tomphson和Ritchie开发了B语言,但是b语言性能不行,编写也较繁琐,所以又在B语言的基础上开发出了现在的C语言。
第一个C语言编译器的原型是用B语言或者混合B和汇编语言编写的。采用部分实现功能,交叉编译方式实现。
先用B和汇编语言编写一个C语言的部分必须功能的编译器,再通过这个编译器,完成完整的C语言编译器。详细过程如下:
1、先编写一个只有C语言最基本功能编译器C0语言,用汇编语言编写出C0的编译器。
2、接着用C0实现比C0复杂,功能不完整的C语言子集C1语言,用C0编译出C1语言的编译器。
3、在C1-〉c2……如此循环直到Cn,Cn功能已经强大到可以实现C。
4、用Cn编译实现了第一个c语言器,即C实现了自举。
为什么说c,c++不能跨平台,编译器是在计算机操作系统上的吗,难道说编译器不在c,c++程序里吗
首先我们纠正一下题目中一个小小的误区,不是C和C++不能跨平台,应该是说是C/C++源代码在编译后生成的 .exe
想要搞明白这个问题,我们先得了解一下源代码是怎么变成程序的。
四个过程:预处理——编译——汇编——可执行文件
当我们编写完代码后,源代码会经过上述的四个环节,最终变成常见的可执行文件。
预处理阶段(hello.i):在源代码中会有头文件,一些宏,注释等。预处理的目的就是将头文件展开,宏文件代换,去掉注释等,对代码进行一些初步的处理
编译阶段(hello.s):这一阶段主要是检查语法上的错误,比如内存有没有溢出,指针有没有指错对象,然后生成可汇编文件。
汇编阶段(hello.o):计算机是不认识代码的,所以需要将汇编代码转换成0和1组成的机器码
链接(a.out):链接有两种情况:静态和动态。静态库和应用程序编译在一起,在任何情况下都能运行;而动态库是动态链接,文件生效时才会调用。最终生成一个可执行文件。
编译器的作用
我们不要把编译器想的太厉害,觉得编译器是万能的。实际上编译器就像是一个翻译,负责把高级语言转变成机器能看懂的低级语言,翻译过程就是上述的四个过程。但是其中有一点需要格外注意。那就是不同的公司使用的指令集不同。输出程序的格式和CPU使用的指令集有关,比如X86,arm,还有MIPS等等, 由于设计思路的差异,所以不同平台上编译生成后的可执行文件格式是不一样的,可能在ubantu里能运行的C程序,放到windows下就会报错。-c编译器
类比一下java,为什么说java可以跨平台,是因为java内置了一个虚拟机,程序都从虚拟机中跑的,所以有人说“java不仅是一种语言,更是一个平台”。
综上所述,C/C++的一些基础性代码是可以跨平台的(可能会受API影响),是生成的可执行文件不能跨平台,C/C++不自带编译器,不同平台下的编译器存在差异。
(都看到最后了,麻烦点个赞和关注吧,谢谢~)