Learn Cpp-第0章

 LearnCpp中文版 | LearnCpp中文版 (learncpp-cn.github.io)

一、编程语言

种类

机器语言(二进制

CPU可以直接理解的有限指令集称为机器代码(或机器语言或指令集

例: 10110000 01100001

不同的CPU具有不同的指令集

==> 不能在不共享相同指令集的CPU上使用为一种CPU类型编写的指令

==> 程序通常不可移植(除非大返工)

==> 用于不同类型的系统,并且必须重新编写

汇编语言(需翻译称机器码)

用汇编语言编写的程序往往非常快,而如今,在速度至关重要的情况下,还是会有人使用汇编语言

例:mov al, 061h (和上述机器码的意思一致)

缺点:

汇编语言仍需要大量指令来完成简单的任务。虽然单个指令本身在某种程度上是人类可读的,但了解整个程序正在做什么就比较难了(这有点像试图通过单独查看每个字母来理解句子)

汇编语言的可移植性仍然不够 – 使用汇编语言为一种CPU类型编写的程序不能在使用不同指令集的其他硬件上运行。并且必须重写或进行大量修改

高级语言(需翻译成机器码)

允许程序员编写程序而无需关心程序将运行在何种类型的计算机上

例:a = 97(和上述汇编的意思一致)

高级语言有许多可取的特性

  • 高级语言更容易读写和理解,因为命令更接近我们每天使用的自然语言。
  • 高级语言的指令更简洁
    • 在C++中,您可以a = b * 2 + 5;在一行中执行某些操作。在汇编语言中,这将需要5或6个不同的指令。
  • 高级语言写的程序可以在很多不同的平台被编译/解释,你不需要通过修改程序来让它运行在不同的PUC(你只需要为那个Cpu重新编译)

可移植性有两个常见的例外

  • 首先,许多操作系统(如Microsoft Windows)提供很多平台特有代码(platform-specific functions)供你在你的代码中使用
    • 这些平台特有代码可以使编写特定操作系统的程序变得更加容易,但代价是可移植性。在这些教程中,我们将避免使用任何平台特有代码
  • 其次,某些编译器还支持特定于编译器的扩展 - 如果您使用这些扩展,您的程序将无法由其他不支持相同扩展的编译器编译。

有些编译器支持特定编译器拓展 – 如果你使用了它,你的程序就不能被其他编译器编译,除非其他编译器支持同样的编辑器拓展,我们会在之后教你安装编译器的时候再来讨论这一点。

编译器和解释器

解释器( interpreter ) 与 编译器( compiler ) 的对比 - Captain_Li - 博客园 (cnblogs.com)

编译器

是一个程序(如 gcc编译器)

  • 用于读取源代码,并生成一个独立的可执行程序
  • 形成可执行文件后,您无需编译器即可运行该程序
  • 具有优化功能——生成快速、经过优化的代码,并且在某些情况下可以比人类在汇编语言方面做得更好

简化过程:

解释器

是直接执行在源代码中的指令(如 命令行中输入python,输入一行就执行一行)

  • 不需要让源代码编译成可执行程序
  • 每次运行程序时都需要解释器

解释器简化过程:

 高级语言的进一步细分

  • 需要编译的:传统语言,如 C,C++和Pascal
  • 需要被解释的:Perl和Javascript这样的“脚本”语言
  • 混合使用了两种方法:比如Java

编译器、链接器和库

程序开发过程:

 我们来讨论步骤4、5

第4步:编译源代码

C++编译器按顺序遍历程序中的每个源代码(.cpp)文件,并执行两项重要任务:

  1. 检查您的代码,确保它遵循C++语言的规则——如果没有,编译器会给你一个错误(和相应的行号),以帮助确定需要修复的内容。编译过程也将中止,直到错误得到修复。
  2. 将您的C++源代码转换为机器语言文件(称为:目标文件)——目标文件通常名为name.o或name.obj,其中name与生成它的.cpp文件的名称相同。

如果您的程序有3个.cpp文件,编译器将生成3个目标文件:

 第5步:链接目标文件和库

编译器创建目标文件(一个或多个)完成,另一个称为“链接器”的程序启动

链接器的工作有三个:

  1. 获取编译器生成的所有目标文件,并将它们组合成一个可执行程序
  2. 除了能够链接目标文件之外,链接器还能够链接库文件
  3. 确保正确解析所有跨文件依赖关系
    1. 例如,如果您在一个.cpp文件中定义某个内容,然后在另一个.cpp文件中使用它,则链接器会将两者连接在一起
    2. 如果链接器无法使用该事物的定义连接对事物的引用,则会出现链接器错误,并且链接过程将中止

 关于“库”:

一个库文件是预编译代码的集合,它已经“打包”在其他程序中重新使用

C++核心语言实际上相当小而简洁。但是,C++还附带了一个名为C++标准库(通常缩写为标准库)的扩展库

  • 它提供了可在程序中使用的其他功能
  • C++标准库中最常用的部分之一是iostream库,包含在显示器上打印文本和从用户获取键盘输入的功能
  • 几乎所有编写的C++程序都以某种形式使用标准库,因此将标准库链接到程序中非常常见——一旦你使用它的任何部分,大多数链接器将自动链接到标准库中,所以这通常不是你需要担心的事情。

您也可以选择在其他库中链接,例如,如果您要编写一个播放声音的程序,您可能会——

  • 不希望编写自己的代码来读取磁盘中的声音文件
  • 检查以确保它们有效
  • 弄清楚如何路由声音数据通过扬声器播放操作系统或硬件

——这将是很多工作!相反,你可能会下载一个已经知道如何做这些事情的库,并使用它。我们将在附录中讨论如何在库中链接、如何创建自己的库

对于高级读者

对于复杂项目,某些开发环境使用makefile

  • 该文件描述了如何构建程序(例如,要编译和链接的文件,或以其他方式处理)
  • 已经有了关于如何编写和维护makefile的全书,它们可以成为一个非常强大的工具
  • 但是,因为makefile不是C++核心语言的一部分,也不需要使用它们来继续,所以我们不会将它们作为本教程系列的一部分进行讨论。

C++简介

 “如何正确使用C++” 和 “不该怎么用C++编程” 两者同等重要

是一种面向对象的语言

C和C++的基本设计理念可以概括为“信任程序员” - 既美妙又危险。如果没有意识到这一点,新程序员可能会陷入相当多的陷阱

  • C++旨在让程序员可以高度自由地完成他们想要的任务
  • 然而,这也意味着语言通常不会阻止你做一些没有意义的事情

C++在需要高性能和精确控制内存和其他资源的情况下表现出色。以下是一些常见的应用程序类型,最有可能用C++编写:

  • 视频游戏
  • 实时系统(例如运输,制造等……)
  • 高性能金融应用(例如高频交易)
  • 图形应用程序和模拟
  • 生产力/办公应用
  • 嵌入式软件
  • 音视频处理

编写第一个程序

Q:什么是预编译头,我们为什么要关闭它们?

A:

在大型项目中,预编译头文件可以通过避免容易出现的冗余编译来提高编译速度。

但是,使用预编译标头需要额外的工作,对于小型项目(例如您将在我们的教程中创建的项目),编译时间几乎没有差异。 出于这个原因,我们建议一开始就关闭预编译头文件,只有在您发现编译时间不佳时才启用它们。

#include <iostream>

int main(){

    std::cout << "hello world";

    return 0;
}

编译:g++ -o HelloWorld HelloWorld.cpp

运行:HelloWorld (or possibly ./HelloWorld),

常见问题:0.8 — A few common C++ problems – Learn C++ (learncpp.com)

名词解释

Rule:Rules are instructions that you must do, as required by the language. Failure to abide by a rule will generally result in your program not working.

Best practice:Best practices are things that you should do, because that way of doing things is generally considered a standard or highly recommended. That is, either everybody does it that way (and if you do otherwise, you’ll be doing something people don’t expect), or it is superior to the alternatives

Warning: Warnings are things that you should not do, because they will generally lead to unexpected results.

最佳实践

将您的代码文件命名为name.cpp(其中name是您选择的名称),而不是什么.cc

为您编写的每个新程序创建一个新项目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值