首页 > 其他分享 >c语言编译器的分类

c语言编译器的分类

时间:2024-06-13 14:56:06浏览次数:9  
标签:GCC 语言 分类 Visual Clang 编译器 Studio

前言

在上节《C 语言编译和链接》中我们已经讲解了 C 语言编译器的概念,由于 C 语言的历史比较久,而且早期没有规范,整个计算机产业也都处于拓荒的年代,所以就涌现了很多款 C 语言编译器,它们各有特点,适用于不同的平台,本节就来给大家科普一下。

我们分两部分介绍 C 语言的编译器,分别是桌面操作系统和嵌入式操作系统


一、桌面操作系统

对于当前主流桌面操作系统而言,可使用 Visual C++、GCC以及 LLVM Clang 这三大编译器。

Visual C++ (简称 MSVC)是由微软开发的,只能用于 Windows 操作系统;GCC 和 LLVM Clang 除了可用于 Windows 操作系统之外,主要用于 Unix/Linux 操作系统。

像现在很多版本的 Linux 都默认使用 GCC 作为 C 语言编译器,而像 FreeBSD、macOS 等系统默认默使用 LLVM Clang 编译器。由于当前 LLVM 项目主要在 Apple 的主推下发展的,所以在 macOS 中,Clang 编译器又被称为 Apple LLVM 编译器。

MSVC 编译器主要用于 Windows 操作系统平台下的应用程序开发,它不开源。用户可以使用 Visaul Studo Community 版本来免使用它,但是如果要把通过 Visual Studio Community 工具生成出来的应用进行商用,那么就得好好阅读一下微软的许可证和说明书了。而使用 GCC 与 Clang 编译器构建出来的应用一般没有任何限制,程序员可以将应用程序随意发布和进行商用。

MSVC 编译器对 C99 标准的支持就十分有限,加之它压根不支持任何 C11 标准,所以本教程中设计 C11 代码例子不会针对 MSVC 进行描述。所幸的是,Visual Studio Community 2017 加入了对 Clang 编译器的支持,官方称之为——Clang with Microsoft CodeGan,当前版本基于的是 Clang 3.8。

也就是说,应用于 Visual Studio 集成开发环境中的 Clang 编译器前端可支持 Clang 编译器的所有语法特性,而后端生成的代码与 MSVC 效果一样,包括像 long 整数类型在 64 位编译模式下长度仍然为 4 个字节,所以各位使用的时候也需要注意。

为了方便描述,本教程后面涉及 Visual Studio 集成开发环境下的 Clang 编译器简称为 VS-Clang 编译器。


二、嵌入式系统

而在嵌入式系统方面,可用的 C 语言编译器就非常丰富了,比如:

  • 用于 Keil 公司 51 系列单片机的 Keil C51 编译器;
  • 当前大红大紫的 Arduino 板搭载的开发套件,可用针对 AVR 微控制器的 AVR GCC 编译器;
  • ARM 自己出的 ADS (ARM Development Suite)、RVDS(RealView Development Suite)和当前最新的 DS-5 Studio;
  • DSP 设计商 TI (Texas Instruments)的 CCS(Code Composer Studio);
  • DSP设计商 ADI (Analog Devices, Inc.)的 Visual DSP++ 编译器,等等。

通常,用于嵌入式系统开发的编译工具链都没有免费版本,而且一般需要通过国内代理进行购买。所以,这对于个人开发者或嵌入式系统爱好者而言是一道不低的门槛。不过 Arduio 的开发套件是可以免费下载使用的,并且用它开发连接调试也十分简单。Arduino 所采用的 C 编译器是 基于 GCC 的。还有像树莓派(Raspberry Pi)这种迷你电脑可以直接使用 GCC 和 Clang 编译器。此外,还有像 nVidia 公司推出的 Jetson Tk 系列开发板也可直接使用 GCC 和 Clang 编译器。树莓派与 Jetson Tk 都默认安装了 Linux 操作系统。

在嵌入式领域,一般比较低端的单片机,比如 8 位的 MCU 所对应的 C 编译器可能只支持 C90 标准, 有些甚至连 C90 标准的很多特性都不支持。因为它们一方面内存小,ROM 的容量也小;另一方面,本身处理器机能就十分有限,有些甚至无法支持函数指针,因为处理器本身不包含通过寄存器做间接过程调用的指令。而像 32 位处理器或 DSP,一般都至少能支持 C99 标准,它们本身的性能也十分强大。而像 ARM 出的 RVDS 编译器甚至可用 GNU 语法扩展。

下图展示了上述 C 语言编译器的分类。

在这里插入图片描述

标签:GCC,语言,分类,Visual,Clang,编译器,Studio
From: https://www.cnblogs.com/happyhorse72/p/18245865

相关文章

  • C语言题目:排序问题2
    题目描述将十个数进行从大到小的顺序进行排列输入格式十个整数输出格式以从大到小的顺序输出这个十个数样例输入12345678910样例输出10987654321代码解析1.引入头文件代码首先引入了stdio.h头文件,这是C语言标准输入输出库,用于处理输入输出......
  • 【C语言】文件操作
    1.为什么需要文件操作2.文件的打开与关闭3.文件指针4.文件的打开与关闭5.fopen6.函数声明7.文件的打开方式8.函数使用9.fclose10.函数声明11.函数使用12.文件的顺序读写13.fgetc与fputc14.函数声明15.函数使用16.fgets与fputs17.函数声明18.函数使用19.fscan......
  • Java——语言基础
    标识符标识符命名规则Java中标识符用来标记包、类、接口、对象、方法、变量等名称    1、字母、下划线(_)、美元符号($)开头,不能以数字开头;    2、Java对字母大小写敏感,大写和小写是完全不一样的;    3、不能和关键字相同;    4、不能含有空......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Py
    ......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA与朋友们的石头剪刀布游戏(100分
    ......
  • 10.C语言for循环和跳出循环的知识点
    C语言for循环、continue和break知识点3.13for循环3.14for的一些用法3.15continue和break的作用3.16嵌套的规律3.17—作业3.13for循环概述和while的对比#include<stdio.h>intmain(){ intdata; //for(条件附初值;判断临界点;条件改变)//判断、执行循......
  • 用于将字节进行base64编码或解码(C语言实现)
    V1.02024年6月13日发布于博客园目录base64.hbase64.c基本原理见代码注释!base64.h#ifndef_BASE64_H#define_BASE64_H/***@filename:base64.h*@brief:用于将字节进行base64编码或解码*@author:[email protected]*@date:2024年6......
  • zzulioj1042答案c语言
    ​(方法一:使用函数体)#include<stdio.h>#include<math.h>intt;//t输入这里的t是一个全局变量doubleturn(doublem,doublen,doublea,doublesum,doubleflag);intmain(){doublem,n,a,sum=0,flag=1;//m分子,n分母,a项数,sum和,flag变换符号scanf("%d",......
  • 动态内存管理<C语言>
    导言       在C语言学习阶段,指针、结构体和动态内存管理,是后期学习数据结构的最重要的三大知识模块,也是C语言比较难的知识模块,但是“天下无难事”,只要认真踏实的学习,也能解决,所以下文将介绍动态内存管理涉及到的一些函数以及概念。目录导言为什么存在动态内存管理......
  • shell语言
    shell既是应用程序,也是一种脚本语言。开头以bash为解释器:#!/bin/bash变量:系统变量、用户变量、环境变量系统变量:HOME:当前用户的主目录PATH:定义了Shell在查找命令时应该搜索的目录列表。USER或USERNAME(取决于系统):当前登录的用户名。PWD:当前工作目录的......