`
freesoftman
  • 浏览: 318783 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C++编程杂谈之一:编译器

阅读更多
C++编程杂谈之一:编译器
作者/xulion


    网上有很多各种编译器的优劣比较的东西,我写这些东西并不是想支持或否定某些东西,因为我始终认为在编程的领域中,我只是一个初学者,并没有资格来评判什么(况且我也不想去评判),我只是想讲述一下个人学习道路上的感受。
    学编程的一个必备的条件是你要有一个实践的平台--一个相应的编译器,没有这个条件,一切都是空谈。选择编译器之前,首先选择的是语言(这个我想不必更多的解释了),这里我假设你选择了C或C++。
    现在最流行的编译器恐怕应该是微软的VC了,在继续之前,我想再提一下一个重点:VC是一个编译器,只是一个用来把C++的代码生成为可执行文件的工具而已(当然我说的有一些简化,但是认识这一点很重要,虽然你可以在很多地方看到类似的话,但我还是要提,我希望每一个学习编程的人最好从一开始就知道它,而不是走了很多弯路以后再来醒悟)。另外一种强大的编译器就是Borland C++ Builder(后面我都将以BCB来代替)。
    如果你在使用VC,我想问一下,你为什么用它?我想很多人根本无法回答这个问题,大多无法回答的原因很明显:1)听说的,VC是最好的;2)微软的产品;3)只知道这个。当然更有甚者是一开始就把VC作为一门语言来学,呵呵,我相信一定有这样的人的!每当谈及这些问题的时候,我会觉得很多时候,软件行业中技术并不是优秀软件的全部,VC一定是最好的么?VC为什么会这么成功?我不得不佩服微软的商业策略。关于VC是如何成功的,我强烈推荐一篇文章--《C/C++圣战》,作者李维,《程序员》杂志2001.10月。
    一个编译器究竟带给我们什么?在早期,编译器其实就是一个简单的文本编辑器+库(头)文件+编译程序,很多早期的程序员会使用一些其他的编辑器来书写自己的程序,然后再使用编译器来编译。现在我们使用的编译器通常称为集成开发环境(IDE),这一类型的开发环境为我们提供了很多东西:方便的开发方式、完善的帮助系统、丰富的库和一些特有的特性。
在某个特定的平台下编程你需要关心的主要有两件事情:1.是否支持你所使用的语言;2.平台特性(WINDOWS下platform sdk为我们提供了一切)。在WINDOWS平台下,我们可以使用C++来编程,剩下的就是平台特性了。WINDOWS为我们提供了一系列丰富的API函数,而且这些函数在不同的WINDOWS版本上会略有不同。早期的WIDNOWS编译器就是在单纯的C/C++编译器中对平台特性提供支持,并没有提供更多的东西,如果你只打算使用WINDOWS API的话,编译器的选择可能只是编译优化程度的选择而已(也许你该选择BCB,据说要比VC优化的好一些,我没有真实的数据来对比,但BORLAND公司的编译器优化一向被认为是优秀的)。真正产生变化的是类库封装的开始。微软提供了MFC类库,BORLAND提供了OWL类库。所谓类库就是提供了对WINDOWS API的一种封装,相信每个写过WINDOWS API程序的人都有一个体会,一个最简单的WINDOWS窗口程序都需要几十行代码,这足以令初学者望而却步,相比之下DOS下的经典例程"hello world"却只需要短短的一行代码(所以DOS时代才令我怀念--简单,明了。呵呵)。类库的出现正是为了解决这个问题,WINDOWS类库主要是对WINDOWS下的API函数进行封装,来达到这样的目的:1)简化我们编程过程中的重复的简单工作(只创建窗口、建立消息环这样的单调工作);2)使我们的工作更符合面向对象的风格。如一个MFC中的窗口:
CWnd MyWindow;
MyWindow.Create(…);//这里省略了参数
    我们只需要创建一个窗口对象,通过对象的Create方法来创建窗口就可以了,完全不必再去关心底层的一些东西,整个过程就象工厂的一个生产过程--这也正是面向对象的精神所在(如果你现在不能体会这一点,不用着急,以后慢慢的自然会明白的)。
    VC和BCB采用了各自不同的方式(MFC和OWL)来封装,大家采用的手段各有所长,很难说哪个更好,唯一让MFC占优的应该是操作系统的优势了。相比之下,我个人认为起码在程序生成的环节上,BCB要好一些(其实BCB我个人也是浏览过一下,总共时间不过2-3天,只是做一次了解而已),在VC中,如果你为一个通用控件如CListCtrl关联一个变量,写过程序的人应该知道,编译器会作为一个类成员变量生成,而在BCB中,这个变量是以类成员指针的方式存在的,有什么区别呢?大量的局部变量会造成堆栈的溢出,这也是为什么你无法创建一个char largestr[100000000]的原因了。如果你在VC的程序中使用了很多这样的变量的话,天知道会怎么样(虽然堆栈中的变量存取更有效率)。
    在一段时间以前,我也具有很多非常糟糕而幼稚的想法,直到某一天,我明白了很多。其实许多学计算机的人都会有相同的感受,以下的一段摘自候捷先生的散文:
南宗与北宗,顿悟与渐悟
   佛法有顿悟,学问可没有。如果有人说,我突然在某一天对Java开悟了,对OO开悟了,对MFC开悟了...,我想那是他刻意(为了炫耀)或非刻意(因为遗忘)地忽略了他所谓的「悟」那一天之前的所有努力。是的,那叫渐悟,不是顿悟。
Inside OLE 一书作者 Kraig Brockschmidt 在他的序里面有这段话:
1993年一月的某个周日下午,当我正做着与OLE全然无关的事情时,我突然获得了所谓的 OLE 涅磐状态。所有关於OLE的支支节节突然全都归定位。在六个月的模糊心智之後,我突然看清楚了OLE。
    Essential COM一书作者Don Box在他的序里面亦有一段类似的话:
幸运的是有一天(1998年八月八日),突然像神迹一般,COM对我变得再明白不过,我终於了解了COM的动机。如何把这个programming model应用在每天遇到的程式设计问题中,也因此显得再明白不过。
    听起来都是顿悟的例子。难道学习COM/OLE特别需要宗教信仰吗?我想是因为这些技术特别需要高度抽象思考,使得霍然开朗後的喜悦巨大到令人觉得是一种「突然的神迹降临」。其实你我都明白不过,知识点的突破,是靠知识面的累积。
    很多时候,当你回头去想以前的不明白问题的时候,你是否有这样的感觉?我相信答案是肯定的。我想问题的关键就在上面一段话的结尾:知识点的突破,是靠知识面的累积 对我来讲,当我接触了BCB之后的一段时间,我突然就明白了,它和VC仅仅是提供了一个封装了不同类库的编译器而已,真正关键的问题是C++呀!也正是在这以后,我才真正开始入门,而这都是我学习编程一年多以后的事情了。如果没有那个偶然的机会,我接触过一次BCB,也许到现在我还无法分清楚那些是VC提供的、那些是标准C++提供的。与C++相比,MFC和OWL变得微不足道了(我没有小看它们的意思)。
    我希望所有的人都不要重复我走过的学习之路,我的路是曲折的,至少在学习的过程中我浪费了很多时间(我曾经幼稚的认为现在的编程只是进行功能的扩充而已,如WINDOWS SDK等,完全忽略了面向对象的思想存在)。我一直认为VC是一个优秀的编译器,但是当你构建一个MFC程序的时候,很多书籍介绍的入门方式显得相对松散,给你的感觉是在使用一个庞大的WINDOWS函数库而不是一个类库,许多教科书忽略了MFC中面向对象概念的加强,而仅仅是一些功能上的实现,而在BCB中,面向对象的思想相对要强化一些。
    我写这些并不是想说明什么样的编译器好和什么样的编译器不好,最终的选择权可能不在你我的手中,很多时候是平台或其他因素的限制而导致你必须使用某种编译器。我只是想说明一些思想,因为我无法把我想说明的这些问题提炼出来,所以松散的写了很多,最终我想说的就是不要因为一些不必要的原因去拒绝--Never!
以上内容仅代表个人观点,如有不当,欢迎讨论。

文章来自于(http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls/vctips_32/1232001.htm)
分享到:
评论

相关推荐

    推荐 10 款 C++ 在线编译器1

    在现代编程环境中,C++在线编译器已经成为开发者和学习者的宝贵工具,它们提供了方便快捷的平台,可以在无需本地安装编译环境的情况下编写、测试和运行C++代码。以下是一些推荐的C++在线编译器及其特点: 1. **...

    简单的编译器(c++实现)

    本项目“简单的编译器(C++实现)”旨在通过C++编程语言来构建一个基本的编译器,使初学者能理解编译器的工作原理,并具备实际编写编译器的能力。下面我们将深入探讨编译器的基本概念、结构和实现过程。 一、编译器...

    c/c++编译器c-free适合初学者

    C-Free 是一款专为初学者设计的C语言和C++编译器,它融合了这两种编程语言的编译功能,提供了一个易于上手、功能全面的开发环境。这款软件的出现,使得初学者在学习编程的过程中可以更专注于代码本身,而不用过于...

    C++高效编程:内存与性能优化(pdf版)

    《C++高效编程:内存与性能优化》是一本专注于C++编程语言内存管理和性能调优的书籍。本书深入探讨了如何在C++编程中高效地使用内存资源,以及如何进行性能优化,以编写出既高效又优雅的代码。 书籍作者Rene ...

    Turbo C++ 编译器

    Turbo C++ 编译器是历史悠久的C和C++编程语言的开发环境,尤其适合初学者入门学习。这个编译器以其简洁的命令行界面和丰富的内置教程而著名,为初学者提供了便捷的学习路径。 首先,我们要理解C和C++语言的基础。...

    C++制作的C0编译器

    1. **编译器的基本结构**:一个编译器通常由词法分析器、语法分析器、语义分析器和代码生成器组成。词法分析器处理输入源代码,将其拆分成一个个称为“记号”的小单元;语法分析器则根据语法规则检查这些记号的排列...

    C++编写的小型编译器

    在本项目中,我们讨论的是一个使用C++编程语言实现的小型文本编译器。这个编译器的设计灵感来源于经典的vi编辑器,它具备基本的文本编辑功能,如字符的修改、添加、替换和删除等。同时,它还能够生成.txt格式的文件...

    C++编程实例100篇

    《C++编程实例100篇》是一本深入浅出的C++编程教程,它以实践为主导,通过丰富的实例帮助学习者掌握C++语言的基础和核心概念。这本书的每个实例都精心设计,旨在帮助初学者和有经验的开发者巩固和提升C++编程技能。 ...

    鸡啄米:C++编程入门系列

    鸡啄米:C++编程入门系列之一(进制数) 鸡啄米:C++编程入门系列之二(原码、反码与补码) 第二部分:C++简单程序设计 鸡啄米:C++编程入门系列之三(VS2010的使用介绍) 鸡啄米:C++编程入门系列之四(数据...

    c++最新编译器,用起来很方便的哦!

    C++是一种强大的、通用的编程语言,被广泛应用于系统软件、应用软件、游戏开发、设备驱动程序等各个领域。最新版的C++编译器在原有基础上进行了许多优化和改进,旨在提供更高效、更易用的开发环境,使得开发者能够...

    2024年“深圳杯”数学建模挑战赛C题-C题:编译器版本的识别问题.docx

    研究使用附件1、2原代码编译结果之一都能区分GCC中不同版本的C++编译器的判别函数。 **解决方案**: 1. **新数据集准备**:准备第二个源代码数据集。 2. **编译与特征提取**:重复问题1中的步骤,使用不同的源代码...

    devc++ c++编程工具

    Dev-C++是一款经典的C++集成开发环境(IDE),它为C++编程提供了便捷的平台,尤其适合初学者和需要在DOS环境下运行程序的开发者。这个软件集合了编译器、调试器和其他辅助工具,使得代码编写、编译、链接和执行过程...

    c++编译器简介

    1. **GCC (GNU Compiler Collection)**:GCC 是最常用的开源C++编译器之一,支持多种操作系统,如Linux、macOS等。 2. **Clang**:Clang 是 LLVM 项目的一部分,以其高效的编译速度和高质量的诊断信息而闻名。 3. **...

    编译器 c++版

    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的编程语言。C++编译器的重要性在于它允许开发者利用C++的强大特性,如类、模板、异常处理和多态性,来编写高效且可...

    C++实现简单编译器

    "C++实现简单编译器"是一个项目,旨在通过C++编程语言构建一个基础版本的编译器,能够处理类似C++的源代码。在这个过程中,我们需要理解编译器的基本组成部分和工作流程,以及如何利用C++来实现这些功能。 1. **...

    编译原理,C++编程,实现对C-的语法编译器

    内容:编译原理大作业,对C--(C语言的子集)的语法编译器,包括词法分析和语法分析,使用C++编程。 适用人群:计算机本科大学生 使用场景及目标:本科阶段编译原理大作业,提供解决的一种思路 其他说明:本代码的...

    C++编程练习题大全(带答案).pdf

    - C++是一种静态类型、编译式、通用的编程语言,支持过程化编程、面向对象编程和泛型编程。 - 基本语法包括变量定义、数据类型、控制流(如循环和条件语句)以及函数定义。 - 示例代码展示了如何在C++中定义一个...

    C++编程思想:C++编程思想

    《C++编程思想》这本书是C++编程领域的一部经典之作,由Bjarne Stroustrup所著,它深入探讨了C++语言的核心概念和技术,旨在帮助程序员掌握C++的高级特性和设计哲学。以下是对C++编程思想的详细解析: 1. **面向...

    C C++编译器的比较和综合

    - **Code::Blocks**:一个开源的C++ IDE,支持多种插件和工具链,适用于复杂的项目开发。 #### 关键特性与考量因素 在选择C或C++编译器时,以下几点是重要的考量因素: 1. **标准支持**:确保编译器支持最新的C/...

Global site tag (gtag.js) - Google Analytics