当前位置: 首页 > news >正文

编译原理/软件工程核心概念-问题理解

目录

1.程序的编译执行过程

2.指针和引用的区别

3.堆和栈的区别

4.最熟悉的编程语言- Python:介绍PyTorch和TensorFlow框架

5.C与C++的区别

6.软件工程是什么?

7.简述瀑布模型

8.敏捷开发方法是什么?它与瀑布模型相比有哪些优势和劣势

1.程序的编译执行过程

1. 编译:对源程序进行语法检查,在检查无误后,把代码翻译为二进制目标代码
2. 链接:将源程序与其它库函数及相关程序链接起来,生成可执行文件
3. 执行:执行生成的可执行文件。

2.指针和引用的区别

在编程语言中,指针和引用是两种不同的机制,用于访问和操作内存中的数据。

指针(Pointer):
指针是一种变量,它存储了另一个变量的内存地址。
指针可以被创建、修改和重新指向其他地址。
指针可以直接进行算术运算,比如增加或减少指针的值来移动到数组的不同位置。
使用指针时,需要显式地进行解引用操作来访问它所指向的值。
引用(Reference):
引用是一种变量的别名,它为已存在的变量提供了另一个名字。
引用一旦被初始化,就不能被重新绑定到另一个变量上。
引用没有单独的内存地址,它与原始变量共享同一个地址。
引用的使用更接近于原始变量,不需要解引用操作即可访问值。
通俗易懂的解释
想象你有一个邮箱,邮箱里放着一封信。

指针:
指针就像一个邮箱地址。你拿着这个地址,可以找到对应的邮箱,然后拿到信。如果你拿到了另一个邮箱的地址,你可以改变主意,去那个邮箱拿信。指针可以改变,指向不同的内存地址,就像你可以改变主意去不同的邮箱拿信一样。
引用:
引用就像你给这封信起了一个别名。不管你怎么称呼这封信,它始终是原来那封信。你不能因为给信起了别名,就把它变成另一封不同的信。引用一旦指向了一个变量,就不能再指向另一个变量,就像信的别名不会改变信的内容一样。
在实际编程中,指针提供了更多的灵活性,但也更容易出错,因为你可以让它指向任何地方。而引用则更安全,因为你不用担心它会不小心指向错误的内存地址,但它的灵活性较低,一旦绑定就无法更改。

在某些编程语言中,如C和C++,指针和引用都是重要的概念,而在其他语言中,如Java和C#,引用被广泛使用,而指针的使用则受到更多限制或以不同形式存在(比如C#中的unsafe代码块中的指针操作)。

3.堆和栈的区别

堆(Heap)和栈(Stack)是编程中两种不同的内存分配方式,它们在内存管理、使用方式和性能特性上有所区别。以下是堆和栈的主要区别:

内存分配方式:
栈:由操作系统自动管理,用于存储局部变量和函数调用的上下文。当一个函数被调用时,一个新的栈帧(Stack Frame)会被创建并压入栈中,函数执行完毕后,栈帧会被弹出。
堆:由程序员手动管理,用于存储动态分配的内存。程序员需要使用new(或在其他语言中的类似操作)来分配内存,并使用delete(或类似操作)来释放内存。
内存访问速度:
栈:访问速度通常比堆快,因为它位于连续的内存区域,并且CPU缓存对连续内存的访问有优化。
堆:访问速度可能较慢,因为内存分配可能不是连续的,且受碎片化影响。

内存大小:
栈:通常有大小限制,因为每个线程都有自己的栈,且操作系统为每个栈分配的内存有限。
堆:理论上可以更大,受限于操作系统对进程的内存管理以及可用的虚拟内存。

生命周期:
栈:存储在栈上的数据具有自动的生命周期,当函数返回时,其栈帧中的数据会被自动销毁。
堆:存储在堆上的数据需要程序员手动管理生命周期,如果程序员忘记释放,可能会导致内存泄漏。
内存碎片:
栈:由于栈的后进先出(LIFO)特性,通常不会产生内存碎片。
堆:由于频繁的分配和释放,可能会产生内存碎片。
使用场景:
栈:适用于存储生命周期明确、大小固定的数据,如函数的局部变量。
堆:适用于存储生命周期不明确、大小可变的数据,如动态数组、对象等。
安全性:
栈:由于自动管理,通常更不容易出错,但也更容易受到缓冲区溢出攻击。
堆:由于手动管理,如果程序员不正确地释放内存或访问已释放的内存,可能会导致内存泄漏或程序崩溃。

4.最熟悉的编程语言- Python:介绍PyTorch和TensorFlow框架

PyTorch 结构:

torch 模块:这是PyTorch的核心,提供了张量(Tensor)的操作和各种数学函数。
torch.nn:包含了构建神经网络所需的类和方法,如层(Layer)、损失函数(Loss Function)和优化器(Optimizer)。
torch.optim:提供了多种优化算法,用于训练过程中更新网络参数。
torch.autograd:支持自动求导,是PyTorch进行反向传播的核心。
torch.utils:提供了一些实用的工具,如数据加载器(DataLoader)和模型检查点(Model Checkpoint)。
TensorFlow 结构:

tf.Module:基础类,用于构建神经网络模型。
tf.keras:TensorFlow的高级API,提供了类似于PyTorch的简洁接口,用于构建和训练模型。
tf.Variable:用于创建可训练的变量,通常用于模型参数。
tf.placeholder:(在TensorFlow 1.x中使用)用于创建输入数据的占位符。
tf.Session:(在TensorFlow 1.x中使用)用于执行计算图。
tf.data:提供了构建复杂输入数据流水线的API。
使用感受(基于用户反馈):

PyTorch:
用户通常认为PyTorch的动态计算图非常直观,因为它允许在运行时修改图,这对于调试和实验非常有帮助。
PyTorch的API设计简洁,更接近于一般的Python编程体验,易于上手。
研究社区倾向于使用PyTorch,因为它更适合快速迭代和原型设计。
TensorFlow:
TensorFlow的静态计算图在性能优化方面表现出色,适合大规模部署和生产环境。
TensorFlow的生态系统非常成熟,提供了大量的工具和库,如TensorBoard和TensorFlow Lite,这些工具在实际应用中非常有用。
TensorFlow的API在早期版本中可能显得有些复杂,但随着Keras的集成和TensorFlow 2.x的发布,用户体验得到了显著改善。

5.C与C++的区别

C和C++是两种不同的编程语言,它们之间有着紧密的联系,但也存在显著的差异。以下是C语言和C++语言之间的一些主要区别:

语言起源:
C语言:由Dennis Ritchie在1972年开发,主要用于系统编程和操作系统开发。
C++:由Bjarne Stroustrup在1980年代开发,作为C语言的超集,增加了面向对象编程的特性。
编程范式:
C语言:是一种过程式编程语言,侧重于函数和过程。
C++:支持多种编程范式,包括面向对象编程(OOP)、泛型编程和过程式编程。
面向对象编程:
C语言:不支持面向对象编程,没有类(class)和对象(object)的概念。
C++:引入了类和对象,支持封装、继承和多态等面向对象的特性。
类和对象:
C语言:没有类和对象的概念,但可以通过结构体(struct)模拟面向对象的行为。
C++:有类和对象,支持构造函数、析构函数、方法和数据成员。
模板:
C语言:不支持模板,无法实现泛型编程。
C++:支持模板,可以创建泛型函数和泛型类。
异常处理:
C语言:没有内置的异常处理机制,通常使用错误码或全局变量来处理错误。
C++:有完整的异常处理机制,包括try、catch和throw关键字。
标准库:
C语言:标准库(如C标准库)主要包括基本的输入输出、字符串处理和数学函数。
C++:标准库(如C++标准模板库STL)更加丰富,包括容器(如向量、列表、映射)、迭代器、算法和函数对象。
内存管理:
C语言:主要通过malloc、calloc、realloc和free函数手动管理内存。
C++:除了手动内存管理,还可以通过构造函数和析构函数自动管理内存。
多重继承:
C语言:不支持多重继承。
C++:支持多重继承,允许一个类继承多个父类。
命名空间:
C语言:没有命名空间的概念。
C++:支持命名空间(namespace),用于避免名称冲突。
代码可移植性:
C语言:由于其简单性和广泛的支持,C代码通常具有很高的可移植性。
C++:虽然C++也设计为可移植,但由于其复杂性和一些与平台相关的功能,C++代码的可移植性可能不如C语言。

6.软件工程是什么?

软件工程不仅包括编写代码的行为,还包括随着时间的推移构建和维护该代码的所有工具和组织。

软件工程可以被描述为“随着时间的推移而集成的编程”。这就是我对软件工程的理解。

软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。

7.简述瀑布模型

瀑布模型(Waterfall Model)是一种经典的软件开发过程模型,它将软件开发过程分解为一系列阶段性的活动,每个阶段完成后才能进入下一个阶段,这些阶段像瀑布一样顺序流动,每个阶段的输出是下一个阶段的输入。瀑布模型的主要特点包括:

顺序性:开发过程被划分为一系列固定的阶段,每个阶段都必须在下一个阶段开始之前完成。
阶段性:通常包括需求分析、设计、实现、测试、部署和维护等阶段。
文档驱动:在每个阶段结束时,会产出相应的文档,这些文档是进入下一阶段的前提。
返工困难:由于瀑布模型的线性特性,一旦进入后续阶段,对前一阶段的修改会比较困难和昂贵。
适合需求明确的场景:当项目需求明确且在开发过程中变化不大时,瀑布模型能够保证项目的有序进行。
通俗易懂的解释
想象一下,你正在制作一个蛋糕。在开始混合原料之前,你需要先确定食谱(需求分析),然后准备所有的原料和工具(设计),接着按照食谱步骤混合原料并烘烤(实现),烤完后检查蛋糕是否符合预期(测试),最后将蛋糕装饰并端上桌(部署)。如果在蛋糕烤好之后,你发现食谱错了,想要改变蛋糕的味道,那就很困难了,因为你需要重新来过。

在软件开发中,瀑布模型也是这样一步步进行的。首先,你需要弄清楚客户想要什么(需求分析),然后设计软件的架构和界面(设计),接着编写代码实现这个设计(实现),写完代码后要进行测试确保软件没有错误(测试),测试通过后将软件部署给用户使用(部署),最后在软件使用过程中进行维护和更新(维护)。

如果在使用过程中发现软件需要做一些大的改动,就像烤好的蛋糕要改食谱一样,你不得不回到最初的设计阶段,重新开始这个过程,这会非常耗时且成本高昂。

瀑布模型适合那些需求非常明确,且在开发过程中不会有太大变化的项目。对于需求不断变化的项目,瀑布模型就显得不够灵活,因此现在更流行使用迭代和敏捷的开发方法。

8.敏捷开发方法是什么?它与瀑布模型相比有哪些优势和劣势

敏捷开发方法 是一种以人为核心、迭代、循序渐进的软件开发方法。在敏捷开发中,项目被分解为多个小的部分,这些部分在一个称为“迭代”的短周期内进行开发。这种方法强调团队协作、客户反馈以及对变化的快速响应

与瀑布模型相比,敏捷开发方法具有以下优势和劣势:

优势:

更快的交付周期:通过短迭代周期快速交付可工作的软件。
更高的灵活性:容易适应需求变化,拥抱而不是抵制变化。
更好的客户满意度:通过持续的客户合作和反馈,确保产品符合客户需求。

更强的团队合作:团队成员之间以及与客户的沟通更加频繁和紧密。
劣势:

规划困难:由于需求的不断变化,长期规划变得复杂。
可能的返工:频繁的变更可能导致一些已完成工作需要重新做。
对团队要求高:需要团队成员具备较强的自我管理能力和跨职能技能。
通俗易懂的解释
想象一下,你要装修一套房子。在瀑布模型中,你会先做详尽的计划,包括设计图纸、预算、施工时间表等,然后按照计划一步步来,一旦开始施工,即使发现设计有问题,更改起来也很麻烦,因为每一步都是基于前一步的成果。

而敏捷开发就像你决定一边装修一边调整。你先完成一部分,比如铺好地板,然后看看效果,问问家人朋友的意见,如果觉得不满意或者有新的想法,可以立即调整。这样,你可以在装修过程中不断改进,最终得到一个更符合自己需求和口味的房子。

敏捷开发方法的优势在于它允许你在开发过程中不断调整和改进,这就像是一边装修一边调整,而不是一开始就决定一切。这种方法更适合需求不断变化的项目,因为它可以快速适应变化。不过,这也意味着你可能需要更频繁地与团队和客户沟通,确保每个人都对变化保持同步。


不要预设回应,可以减少99%烦恼。 

相关文章:

编译原理/软件工程核心概念-问题理解

目录 1.程序的编译执行过程 2.指针和引用的区别 3.堆和栈的区别 4.最熟悉的编程语言- Python:介绍PyTorch和TensorFlow框架 5.C与C的区别 6.软件工程是什么? 7.简述瀑布模型 8.敏捷开发方法是什么?它与瀑布模型相比有哪些优势和劣势 1…...

学习pyqt5相关知识回顾

1. 模块 1.1 import导入 1) 模块:是一系列功能的集合体,模块名.功能名,就可以使用模块的功能 2) 首次导入模块,就会立即执行模块里面的内容 3) 当前名称空间会产生一个名字module,指向module.py产生的名称空间.我们可以使用module.name/函数名,来调用module.py里面的内容. …...

OPENAIGC开发者大赛高校组银奖 | LonAC中小学编程学习平台

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…...

oneclick 命令:快速筛选控制变量的利器

目录 1. 命令语法2. 结果输出3. 使用示例4. 总结 在进行回归分析时,选择合适的控制变量对于确保模型的稳健性至关重要。然而,手动筛选变量组合不仅费时费力,还容易出错。为此,Stata 中的 oneclick 命令提供了一个高效的解决方案&a…...

Kotlin 代替Java接口回调,就这么简单

假如你使用旧的接口回调: 通常三步:1 定义接口和方法;2 使用接口中方法;3 继承接口并实现方法; 例: class XXXAdapter{public var mClickCollBack: clickCollBack? null //1定义interface clickColl…...

Codeforces Round 971 (Div. 4)——C题题解

本题的大意是一个青蛙从原点开始跳格子(0,0),最终要跳到点(x,y)去,并且每一步的步长不能超过k,问最短几步可以跳到终点 分析: 本题利用贪心思想,肯定是先跳最大的步长这样总体用的步数最长 代码演示: #inc…...

【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs

【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs Introduction方法 使用传统GANS建模去噪分布理解模式覆盖率 Paper:https://arxiv.org/abs/2112.07804 Code:https://github.com/NVlabs/denoising-diffusion-…...

常见 HTTP 状态码详解与Nginx 文件上传大小限制

在我们日常使用 Nginx 搭建网站或应用服务时,可能会遇到很多与文件上传和请求响应相关的问题。今天我们就来聊聊 如何限制文件上传的大小,并介绍一些常见的 HTTP 状态码 及其在 Nginx 中的处理方式。 一、文件上传大小限制 有时,我们需要限…...

在mac中使用numbers对数据进行分列(更详细的回答,已解决)

不想看我废话的同学直接看 “ 二、真正的方法 ” 不是抄袭不是抄袭,目前我能检索到的关于number分列的只有两篇回答,但我觉得有待补充,如果看不懂另外的回答,可以来看我的 这么问我猜大概率是Windows转macOS用户,不是…...

网格参数的应用和数学基础

引言 对于任意两个拓扑结构相似的表面,可以计算它们之间的一一对应映射。如果其中一个表面由三角形网格表示,那么计算这种映射的问题被称为网格参数化。映射到的表面通常被称为参数域。表面网格与各种域之间的参数化在计算机图形学和几何处理中有广泛的应…...

【Go】-基于Gin和GORM的小清单项目

目录 项目介绍 简介 技术 项目结构 项目分析 总结 项目介绍 简介 项目地址:knoci/list: 基于Gin的待办清单小项目 (github.com) 一个仿照github/Q1mi/bubble 做的一个gin框架练习 技术 gin 框架gorm 操作PostgreSQLini 配置文件 项目结构 list ├── R…...

【银河麒麟高级服务器操作系统】虚拟机服务器执行systemctl提示timeout——分析全过程及处理建议

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 现象描述 产品信息 产品名称 银河麒麟高级服务…...

【Unity错误】No cloud project ID was found by the Analytics SDK

在编译默认的URP 2D项目时,出现这样一个错误:No cloud project ID was found by the Analytics SDK. This means Analytics events will not be sent. Please make sure to link your cloud project in the Unity editor to fix this problem. 原因&…...

2. 变量和指令(omron 机器自动化控制器)——1

机器自动化控制器——第二章 变量和指令 1 2-1 变量一览表MC通用变量轴变量▶ 轴组变量 运动控制指令的输入变量输入变量的有效范围▶ 枚举体一览表 运动控制指令的输出变量运动控制指令的输入输出变量 2-1 变量一览表 MC功能模块使用的变量分为两类。 一类是监视轴等的状态及…...

gpt4最新保姆级教程

如何使用 WildCard 服务注册 Claude3 随着 Claude3 的震撼发布,最强 AI 模型的桂冠已不再由 GPT-4 独揽。Claude3 推出了三个备受瞩目的模型:Claude 3 Haiku、Claude 3 Sonnet 以及 Claude 3 Opus,每个模型都展现了卓越的性能与特色。其中&a…...

Java:继承和多态(1)

在 Java SE 中,继承和多态是面向对象编程(OOP)的两个核心概念。通过继承,子类可以复用父类的代码;而通过多态,子类可以在不修改父类的前提下定义自己的行为。这两者结合起来使得代码更具扩展性、灵活性和可…...

在RabbitMQ中四种常见的消息路由模式

1. Fanout模式 Fanout模式的交换机是扇出交换机(Fanout Exchange),它会将消息广播给所有绑定到它的队列,而不考虑消息的内容或路由键。 工作原理: 生产者发送消息到Fanout Exchange。Fanout Exchange会将消息广播给…...

Android 使用JSON动画:Lottie框架基本使用

Lottie是什么? GitHub的一种跨平台动画解决方案三方框架 使用? 3步 1.引入最新的依赖:https://github.com/airbnb/lottie-android 我写文章时最新版本是6.5.2 添加到 app/build.gradle 文件的以下方法中dependencies {//lottie 动画implementation com.airbnb.android:l…...

【SQL】百题计划 - SQL最基本的判断和查询。

[SQL]百题计划 Select product_id from Products where low_fats "Y" and recyclable "Y";...

C++学习笔记----6、内存管理(五)---- 智能指针(2)

书接上回! make_unique()使用值初始化。例如,将初始类型初始化为0,对象为缺省构造。如果不需要这样的值初始化,例如,因为不管怎么样你都会覆写共初始值,你就可以省略值初始化,通过使用make_uniq…...

游戏出海迎新变局——海外游戏市场有哪些新趋势和新机遇?

游戏出海的热度越来越高,也面临着竞争加剧、门槛提升、成本增加的现实环境,游戏出海有哪些新变化和新趋势? 移动游戏出海的主要海外市场 在海外市场分布方面,美日韩仍然是我国移动游戏重要的海外市场,占据了中国出海…...

【Unity踩坑】创建新项目后提示编译错误要进入安全模式

在创建了新项目后(比如URP,AR,VR),首次打开时提示有编译错误,要进入安全模式。 脚本是项目模板自带的,不会有问题。这时需要先选择进入安全模式,然后关闭项目,重新打开就…...

SpringBoot开发——整合Logbook进行HTTP API请求响应日志输出

文章目录 1. 简介依赖管理2. 实战案例2.1 基本用法2.2 结合Logback日志记录到文件2.3 自定义核心类Logbook2.4 自定义日志输出Sink2.5 与RestTemplate集成1. 简介 记录HTTP API请求响应日志对于监控、调试和性能优化至关重要。它帮助开发者追踪API的使用情况,包括请求来源、参…...

【嵌入式开发 Linux 常用命令系列 7.1 -- git log 只显示日期和主题(title)和commit id】

文章目录 git log 只显示日期和主题(title)和commit id示例其他日期格式选项 git log 只显示日期和主题(title)和commit id 要使用 git log 仅显示提交的日期、提交消息(title)和提交号(commit hash),你可以使用自定义…...

Android Radio2.0——交通公告状态设置(二)

通过前面的学习,我们知道在 Radio 广播中,交通公告(Traffic Announcement, TA)是一个比较重要的概念,它和交通广播(Traffic Radio)是相关的概念,但它们并不完全相同。 一、简介 1、概念介绍 交通公告 定义:交通公告是指在广播中插入的特别信息,通常是关于交通状况…...

用centos安装远程迅雷失败,重写程序做一台下载服务器

安装远程迅雷的时候,要不是安装包地址过期,就是出现64不兼容32的libz.so.1的包,而且32位的libz包也是好多网站过期。 没办法用仅有的python3,用flask搭建了一个小型的内网下载服务器,当然,只要路由器做映射…...

Mysql基础练习题 1407.排名靠前的旅行者(力扣)

编写解决方案,报告每个用户的旅行距离。 # 返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列 。 题目链接: https://leetcode.cn/problems/top-travellers/d…...

一维稳态与非稳态导热的详细分析

目录 引言 一维稳态导热 应用实例:单层平壁导热 数值求解: 一维非稳态导热 应用实例:单层平壁的非稳态导热 温度变化阶段 表格总结: 引言 热传导(Heat Conduction)是热量在物体内部通过微观粒子的相…...

以太坊开发环境

1. 测试网络 可以使用以下命令将以太坊的 Go 语言客户端 Geth 连接到测试网络 [admindaolian ~]$geth --testnet 下图显示了示例输出,该图显示了所选网络的类型以及有关区块链下载的其他各种信息。 Geth 客户端的下载地址如下: https://geth.ethereum…...

深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎

第八章 虚拟机字节码执行引擎 8.1 意义 不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果 8.2 运行时栈帧结构…...