更新时间:2025 09 06 16:16:32 作者 :庆美网 围观 : 38次
C是一种非常低级的语言,在许多方面类似于汇编语言。在《Intel 32位汇编语言程序设计》的书中,它甚至引入了手动将简单C语言翻译成汇编的方法。对于编译器之类的系统软件,很自然地写入C。即使是像Python这样的高级语言仍然依靠C位于底部的C(例如,Intel Hackers试图使Python运行——没有操作系统,这实际上消除了BIOS上的一次性C代码)。如今,在了解了编译原则之后,只要您具有一些编程技能,就可以实现具有简单功能的类似C的编译器。
但是问题是,我想知道您是否曾经以为每个人都使用C语言或C语言来编写编译器,那么世界上第一个C语言编译器是如何编写的?这不是“鸡肉和鸡蛋”问题.
让我们回顾C语言的历史:1970年,汤姆夫森(Tomphson)和里奇(Ritchie)基于BCPL(一种解释的语言)开发了B语言,并于1973年成功地基于B语言开发了当前的C语言。在用C用作系统编程语言之前,汤姆夫森还在B中撰写了操作系统。可以看出,在实施C语言之前,B语言已经可以实用。因此,完全有可能用B语言或混合B语言和PDP汇编语言编写的第一个C语言编译器的原型。我们都知道,B语言的执行效率相对较低,但是如果它是用汇编语言编写的,它不仅是一个漫长的开发周期且难以维护,而且更令人恐惧的是,它会失去高级编程语言的必要便携性。因此,早期的C语言编译器采用了一个技巧:首先用汇编语言编写C语言编译器的子集,然后使用此子集来重述完整的C语言编译器。详细过程如下:
首先创建一个仅具有C语言最基本函数的子集,并将其记住为C0语言。 C0语言足够简单,可以直接用汇编语言编写C0编译器。依靠C0的现有功能,设计比C0更复杂,但仍然不完整。 C1语言,C0属于C1,C1属于C. C0用于开发C1语言的编译器。根据C1设计C语言C2的另一个子集。 C2比C1更复杂,但它仍然不是完整的C语言。 C2语言编译器是开发的.因此,在CN之前,CN已经足够强大,这足以开发完整的C语言编译器实现。至于n是什么,这取决于您的目标语言的复杂性(此处的C)和程序员的编程能力。简而言之,如果您达到特定子集阶段并可以轻松地使用现有功能实现C,则您会发现N。下图说明了此抽象过程:
那么,如何实现这种简化子集的大胆方法?有什么理论基础?让我首先介绍一个概念。自编译,这意味着对于具有明显的自举属性的某些强类型(所谓的强类型类型是,程序中的每个变量都必须在使用之前声明类型,例如C,而某些脚本语言根本没有术语类型)。编程语言可以使用有限的一小部分通过有限的递归来实现自己的表达。此类语言包括C,Pascal,Ada等。至于为什么可以进行自我编译,您可以参考Tsinghua University Press 《编译原理》,该出版社在书中实现了Pascal子集的编译器。简而言之,计算机科学家已经证明,C语言理论上可以通过上面提到的CVM方法从理论上实现完整的编译器,那么如何实际上可以简化它呢?这张照片有点熟悉吗?顺便说一句,我在谈论虚拟机时看到了它。但是,这是CVM(C语言虚拟机)。每种语言都可以在每个虚拟层独立编译。除C外,每一层的输出还将用作下一层的输入(最后一层的输出是应用程序),这与雪球相同。用您的手(装配语言)将一小部分积雪结合在一起,一点一点地滚动,形成一个大雪球。这可能是所谓的0生产1、1来产生C,C,生产所有事物,对吗?
这是C99的关键字:
如果仔细观察,实际上有许多关键字可以帮助编译器优化,有些则用于定义变量和功能的范围,可连接性或生存周期(该函数没有)。这些不需要在编译器实施的早期阶段中添加,因此自动,限制,外部,挥发性,const,sizeof,static,静态,内联,寄存器,typeDEF,可以删除,从而形成C。C3和C3的关键字的子集:
再次考虑一下,我发现C3中实际上有许多类型和类型的修饰符,而不是一次添加它们。例如,刚刚实现了三种类型的整数。因此,我们进一步删除了这些关键字,这些关键字是:无符号,浮动,短,char(char is int),签名,_bool,_complex,_ imaginary,long,因此形成了我们的C2语言。 C2语言关键字如下:
继续思考,即使只有18个关键字的C2语言仍然具有许多高级方面,例如基于基本数据类型的复合数据结构。此外,我们的关键字表中没有写过操作员。在C语言中,可以完全删除复杂的分配运算符- 操作员++和- 。因此,可以删除的关键字包括:枚举,结构,联合,因此我们可以以C1语言获得关键字:
它接近完美,但最后一步自然要大一点。目前,必须删除阵列和指针。此外,C1语言仍然具有很大的复杂性。例如,有许多用于控制循环和分支的表达方法,可以将其简化为一个。具体而言,循环语句具有循环时,循环和循环时。您只需要保留循环;分支语句也有if . {},如果. {} . else,如果. {} . else if .switch。如果. {},这四种形式都可以通过两个以上的两个表格实现,因此您只需要保留, {}。但是,再想一想,所谓的分支和循环只是有条件的跳跃语句,函数调用语句只是堆栈和跳跃语句,因此仅需要goto(无限制的goto)。因此,您大胆地删除了所有结构化关键字,甚至没有函数。获得的C0语言关键字如下:
只有5个关键字,可以快速以汇编语言实现。通过反向分析,我们恢复了第一个C语言编译器的写作过程,并感受到了高级科学家的智慧和辛勤工作!我们都是巨人肩上的灰尘! 0生下1、1生了C,C,C生下了所有事物,这真的很聪明!
活动建议:AWS Summit AWS技术峰会2015(上海)
(编辑/王新海)
订阅“ AWS中国技术社区”的微信官方帐户,以实时掌握AWS技术和产品信息!
AWS中国技术社区为开发人员提供了一个亚马逊网络服务技术交换平台,推动了AWS的最新新闻,技术视频,技术文档,激动人心的技术博客文章和其他相关的令人兴奋的内容,AWS社区专家也直接与您进行交流!快速加入AWS中国技术社区,并更快,更好地了解AWS云计算技术。
第9届中国大数据技术会议将于2015年12月10日至12日在北京举行。除了主要会议外,会议还设立了16个主要子宫,包括6个主要技术论坛,例如数据库,深度学习,推荐系统和安全性,7个主要的应用程序,例如金融,交通,运输,交通和旅游,医疗,医疗,医疗和教育和教育和教育和教育,以及3个大满贯的论坛等主要应用程序。预订以折扣很快。
Xiao Xiao来自Aofei Temple Qubits |官方帐户QBITAI
它可以编写C代码生成模型,该模型可以编写比Codex的C语言,现在是开源的!
在此期间,可以说使用AI编写代码很受欢迎,最著名的是Openai的法典和DeepMind的字母。
基于法典
但是,这两个AI模型都不是开源的:
其中,字母仅给出一些测试样本,而法典仅打开API。
为此,来自CMU的一些研究人员使用GPT-2创建了一个名为PolyCoder的AI代码生成模型,为开源的。
根据研究人员的说法,尽管多编码器最多只有27亿个参数(与法典相比为120亿个参数),但它以010-59,000编写的代码甚至比Codex更好。
这里的秘密是什么?
首先,让我们看一下训练C语言,这也是PolyCoder的最大功能之一。
以前,包括Codex和Codeparrot在内的AI代码生成模型主要根据语言数据集的代码进行了培训。
例如,Codex评估数据集之一HumaneVal评估生成Python代码的效果。
相比之下,Python使用PolyCoder代码进行训练,总共有12种类型:
C,C,C ++,GO,Java,JavaScript,PHP,Python,Ruby,Ruby,Rust,Scala和打字稿。
其中,C语言的代码数量最多,达到221GB。而Python代码的数据少于Codex和Codeparrot。
在这里,PolyCoder在GitHub上使用公共代码,主要选择更多流行的库中的各种编程语言,每个库至少有50星。
根据研究人员的说法,每个编程语言库中的恒星总数不超过25K,以避免模型生成的代码效应太过偏向最受欢迎的编程语言(通常是越受欢迎的编程语言,库中的恒星越多)。
在图书馆中提取文件并简单地处理(包括消除重复代码)后,总共过滤了约010-59,000个数据进行培训。
然后是多种编程语言方法。
通常有三种用于语言模型的预训练方法。
第一个是从左到右的语言模型。根据上述预测,它更适合254GB和其他任务;第二个是蒙版语言模型,它更适合基于上下文预测的预训练和其他任务。第三是编解码器模型,它更适合代码生成和其他任务。
在这里,聚合物主要使用第一种预训练方法。
与也接受过GPT-2训练的Codeparrot和Codex相比,Polycoder具有略有不同的高参数设置:
PolyCoder提供了三种不同的模型,分别具有27亿个参数,4亿个参数和1.6亿个参数。研究人员可以根据自己的需求和不同的培训能力选择适当的模型。
那么,最终训练的AI模型的代码生成效应的有效性如何?
研究人员将多码器与现有的AI代码生成模型进行了比较。
由于字母不容易比较(未打开接口),研究人员主要分析了以下模型,包括GPT-Neo,Codeparrot和Codex。
蓝色是开源的,而橙色不是开源的:
就参数量而言,多编码器不是顶部,最大的27亿参数模型仅小于法典的四分之一。
研究人员首先使用常用的语言模型评估比较了一系列模型,通常使用的是代码分类。
困惑,用于测量语言模型(LM)的质量。混淆越低,面对代码时的混淆程度越低,模型产生效果就越好。
从该图来看,多码器意外地取得了代码注释的最佳结果(最低的混乱程度)。
使用大量C语言的训练多头化器的结果表明,即使模型的总体原理保持不变(基于GPT-2),简单地更改用于培训的代码集也可以训练擅长于不同语言样式的AI代码生成模型。
不幸的是,从其他语言来看,生成的效果与法典完全无与伦比:
例如,在主要用于评估Python代码的HumaneVal上,PolyCoder的功能远不如Codex:
根据论文分析,这可能是由Python代码数据和模型参数不足引起的。
此外,作者还提到,制作多编码器的目的主要是开源AI代码生成模型,以便更多的人可以参与研究和使用。
该代码当前是开源的,无论是直接使用还是试图基于它开发新模型。
有兴趣的朋友可以尝试一下
目前正在CMU博士学位的博士学位的Frank Xu在NLP,Information Traction等方面进行了研究,并发表了许多顶级论文,包括ICLR,ACL和EMNLP。毕业于上海Jiaotong大学,学士学位,并在Zhu Qili教授的领导下学习。
在CMU工作博士后工作的Uri Alon正在编程语言处理(PLP),NLP和深度学习。
CMU助理教授Graham Neubig正在NLP,基于机器学习和基于机器学习的自然语言理解。
CMU计算机助理教授Vincent J. Hellendoorn主要是研究方向是软件工程和机器学习,并致力于使用智能方法来帮助软件开发人员减少繁琐工作的时间,例如代码调试和程序优化。
我不知道作者是否已经使用此AI来代码(手动狗头)
项目地址:https://github.com/vhellendoorn/code-lms
纸张地址:https://arxiv.org/abs/2202.13169
- 超过-
正交qbitai·toutiao标志
这些动作都涉及到一个概念:进程间通信;Android中的每个应用都是独立的进程,都有自己虚拟内存,两个进程之间不能互相访问数据;所以在Android中,应用进程
电脑没有声音解决方法:步骤1:检查耳机还是扬声器是首先损坏的,然后尝试将耳机或扬声器放在另一台计算机上。步骤2:耳机或扬声器很好,然后在控制面板中输入设备管理,
C是一种非常低级的语言,在许多方面类似于汇编语言。在《Intel32位汇编语言程序设计》的书中,它甚至引入了手动将简单C语言翻译成汇编的方法。对于编译器之类的系
1。保存动态图片:首先,确保您找到了要在其他地方发送的动态图片(例如网页,其他应用程序等),然后将其保存到移动专辑中。2。打开微信聊天窗口:选择要发送动态图片的
用户评论
这个C程序设计语言PDF真的太棒了!我一直在想学习C语言,这本书讲得非常清楚易懂,而且例子很贴近实际应用。简直是我的入门必备教材!
有13位网友表示赞同!
刚开始接触C语言,翻阅了许多书籍和教程,还是觉得这份PDF实用有效。代码讲解详细,重点突出,帮助我快速理解C语言的基础语法和基本操作。
有18位网友表示赞同!
作为一个程序员,我一直认为学习C语言是必不可少的。这份PDF的结构清晰,内容全面,从基础概念到高级用法都有涉及,对于提高编程能力非常有帮助。
有5位网友表示赞同!
以前学过Java和Python,现在打算挑战一下C语言,感觉难度确实挺大。不过这篇PDF讲解得比较到位,把抽象的概念解释得很通俗易懂,让我对C 语言有了初步的了解。
有16位网友表示赞同!
我需要学习C语言来完成一些嵌入式程序开发。这份PDF真是我的救星!内容非常实用,涵盖我目前需要的知识点,方便我快速掌握C语言的应用技巧。
有10位网友表示赞同!
我觉得C语言的语法有些难以理解。这份PDF虽然讲得比较详细,但对于初学者来说还是有点难度,希望可以有更多直观化的解释和示例。
有17位网友表示赞同!
C 语言确实是一个伟大的编程语言,能够直接控制硬件资源,实现更高效的程序运行。这份PDF让我重新认识到C语言的强大之处!
有8位网友表示赞同!
学习C语言的过程比较枯燥乏味,但这份PDF确实能把我提振士气。里面的案例很有启发性,让我对编程有了更深入的理解。
有7位网友表示赞同!
虽然这份PDF讲解得很好,但我个人觉得缺少了一些实际工程项目案例,能够将理论知识与实践应用相结合,效果会更加显著。
有15位网友表示赞同!
我之前学过一些C语言的基础知识,这份PDF补充了我许多遗漏的部分,让我对C语言有了更系统化的认识。
有14位网友表示赞同!
这份PDF的内容非常丰富,涵盖了C语言的大部分语法和库函数。但学习过程中需要自己查阅其他资料进行巩固和实践练习。
有19位网友表示赞同!
说实话,我一直不太欣赏C语言的编程风格,觉得太复杂且不够直观。这份PDF虽然讲得很详细,但我依然没有完全接受C语言。
有15位网友表示赞同!
我希望能看到更多关于C语言高级编程技巧的讲解,比如内存管理、指针操作等方面的内容,以帮助我们更深入地掌握C语言的使用方法。
有12位网友表示赞同!
作为一名学生,这份PDF对我的学习起到很大帮助。清晰的语法解释和丰富的案例分析让我更容易理解C语言的运作原理。希望将来能有更多针对不同难度的版本更新。
有10位网友表示赞同!
总而言之,这份C程序设计语言 PDF 提供了一个全面的入门指南,适合想要学习 C 语言的新手阅读。
有7位网友表示赞同!
我期待未来能够看到关于C++和面向对象编程的介绍,因为我相信这两种技术与C语言互补且互为补充。
有15位网友表示赞同!
这份PDF的确是一个好工具,特别是对想深入了解C语言架构和底层实现的人来说非常有价值。
有14位网友表示赞同!
学习C语言是一个挑战,但这份PDF提供的资源可以让我逐步克服困难,我相信只要坚持练习就能掌握这门宝贵的技术。
有17位网友表示赞同!