编译时和运行时的关系

JavaScript,如何理解静态代码(编译时解析)和动态代码(运行时解析) JavaScript中静态代码与动态代码的主要区别在于解析时机和优化能力。静态代码(如ES6的import/export)在编译时解析,支持Tree Shaking等优化,依赖路径必须是静态字符串。动态代码(如require()或import())在运行时解析,允许动态路径和条件加载,但优化受限。静态代码适合性能敏感场景,动态代码适用于按需加载。最佳实践是优先使用静态导入,对大型模块采用动态导入实现代码分割,并避免混用ES6和CommonJS模块系统。 阅读详情

以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了.

编译时

编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)

那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.

 

运行时

所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.

 

 

举例说明

 

可能光讲概念你还是迷糊.还分别用C++和C#来举个简单点的例子.数组越界检查的例子(开发工具用的微软的VS)

 

C++中

 

int arr[] = {1,2,3};

int result = arr[4];

cout<<result<<endl;

 

上面的代码你一瞧你知道是错误的代码,数组越界了.但用编译器一编译,一点错都没.可见编译器其实还是挺笨的,还没你脑瓜子那么聪明啊.然后开始运行,Start Dubugging.于是报错了,于是你想虽然编译器笨了点,但运行起来时发现了错误也还不算太坏.但实际上运行时做数组的越界检查不是C++里面支持的特性,这里你dubug是VS中的一些工具给你做的检查.你如果点运行时选的是release而不是dubug的话会发现一切正常运行,但得到的结果不确定的.(因为你不知道arr[4]所指的内存里具有有啥数据.反正所以东东在内存中都是0101串嘛,你找到连续4个字节的一串0101来然后当成int数据处理.)我一运行得到个吓人的数字,数了下貌似是十亿多.要是银行计算我的账户中有多少钱时也这样来个数组越界,搞个十多亿那我可发了啊.哎显然是想多了,还是老实敲代码吧.

 

C#中

 

int[] arr = { 1, 2, 3 };

int result = arr[4];

Console.WriteLine(result);

一编译还是正常通过.但一运行就报错了啊.C#与C++中不同,它有与运行时类型检查.会检查数组是否越界不.如果越界了不会给你返回个错误的结果,而是直接报错.你如果没有异常处理语句处理的话整个软件就挂掉了啊.

 

为啥C++不在运行时做数组越界检查呢?

这应该主要是考虑到性能问题吧.C++设计之初为了达到与C差不多的效率.就尽量不会在运行时多做些额外的检查.因为这样无疑会降低性能的. 但有些地方却是必须得做运行时类型检查的.比如多态,你不在运行时做类型检查就没法搞定啊.举个简单例子吧.假如有父类Father,继承自Father的子类Son.这两个类中都有虚函数Fun.

Father fa;

Son so;

fa = so;

fa.Fun();   //在编译时,实际上是把Fun当作Father类中的Fun看待.

//但在运行时实际上这里的Fun是调用的Son中的函数Fun.所以不做运行时类型检查是没法确定的啊.

MATLAB App Designer 实现多窗口交互与数据传递实战 本文详细介绍了如何使用MATLAB App Designer实现多窗口交互与数据传递的实战技巧。从基础的多窗口应用设计到高级的动态窗口创建,涵盖了窗口调用控制、数据传递方法、状态管理及用户体验优化等核心内容,帮助开发者高效构建复杂的MATLAB GUI应用。 阅读详情

相关推荐

setoolkit克隆网站获取用户信息

一、环境 kali、DVWA 二、步骤 首先打开kali,输入setoolkit 依次选择选项1-选项2-选项3-选项2 输入钓鱼网站的网址(默认为本地网址) 输入要克隆的网址URL 这里我的网址如图,将网址复制 然后模拟攻击场景,攻击者向受害者发送了一条钓鱼链接,此链接与DVWA的登陆页面完全一样,受害者点击之后并进行登陆信息 点击login之后,用户信息就被setool...

BeatRex的博客 2996

C++、类型转换检查

C++类型转换检查,包括 static_cast, const_cast, reinterpret_cast 和 dynamic_cast。

生活就像海洋 1137

登临科技Goldwasser加速卡Python SDK实战:从环境配置到YOLOv5模型性能压测

本文详细介绍了登临科技Goldwasser加速卡的Python SDK实战指南,从环境配置到YOLOv5模型性能压测的全过程。通过驱动安装、SDK环境搭建、模型转换与推理优化等步骤,帮助开发者高效利用AI加速卡提升深度学习模型性能。重点分享了批量推理压测技巧和常见问题解决方案,助力开发者充分发挥Goldwasser加速卡的算力优势。

weixin_29035147的博客 300

运行时类型检查

运行时类型信息(run-time type information)通常记做RTTI。 在C++primer第五版中,译作运行类型识别(run-time type identification)。 运行时类型信息包括三部分: 1)一个运算符dynamic_cast,给它一个指向某某对象的基类指针,它能得到一个到这个对象的派生类指针。只有在被指对象确实属于所指明的派生类时,运算符dyn

waponx的专栏 1145

【通信原理 入坑之路】—— 详解IQ调制以及星座图原理

文章目录一. IQ调制与解调的原理与过程二.PSK(相移键控)和IQ调制的关系:2.1 用IQ调制实现QPSK调制 一. IQ调制与解调的原理与过程 IQ调制的定义是:“IQ调制就是数据分为两路,分别进行载波调制,两路载波相互正交。I是in-phase(同相), q是 quadrature(正交)” 我们通过下面的示意图介绍IQ调制的过程: 首先,信号分成两路:I路和Q路(为了方便理解我们把这两...

凝望,划过星空的博客 11万+

CloudCompare横截面工具实战:从点云切片到轮廓提取的完整流程

本文详细介绍了CloudCompare软件中Cross Section工具的核心功能与实战流程。从交互式裁剪框的精准操控,到包络线提取的参数设置与优化,再到内部轮廓提取及批量处理技巧,完整解析了如何从三维点云中高效提取建筑立面、隧道断面等关键轮廓信息,是点云数据处理与分析的实用指南。

weixin_29290963的博客 284

C++ 检查变量类型

inclu。de # include // 自定义结构体 struct MyStruct {int value;// 自定义类 class MyClass {int value;在这个示例中,我们定义了一个自定义的结构体MyStruct和一个自定义的类MyClass。然后,我们分别创建了一个结构体变量structVar和一个类变量classVar

guangqianzhang的博客 1489

Win11下高效管理JDK1.8与JDK17双环境的实战指南

本文提供了一份在Windows 11系统上高效管理JDK 1.8与JDK 17双环境的实战指南。文章详细讲解了如何实现双版本切换,包括如何干净安装两个JDK、通过巧妙配置环境变量实现命令行一键切换,以及在不同IDE和构建工具中为项目独立配置JDK版本,旨在帮助Java开发者彻底解决版本冲突问题,提升开发效率。

ipfs8storage的博客 543

什么叫编译时和运行时

以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了. 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我...

爱.NET 1667

S32K344开发环境搭建全攻略:S32DS 3.5.12与RTD 3.0.0实战指南

在嵌入式开发中,集成开发环境(IDE)与实时驱动(RTD)的协同配置是项目启动的关键。S32DS作为NXP官方IDE,结合RTD包,为S32K3系列提供底层驱动支持。正确安装与路径配置能确保编译、调试与烧录流程顺畅,避免常见错误。该环境适用于汽车电子、工业控制等场景,如车身域控、BMS。本文基于S32K344芯片,详细记录从软件下载到调试的完整过程,帮助开发者快速搭建稳定开发环境。

weixin_42713608的博客 211

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | ICML 2024 | RT-DETR引入ICB交互式卷积模块和ASB自适应频谱模块,助力目标检测、异常检测有效涨点、含多种创新改进点

RT-DETR目标检测模型通过引入ICB和ASB模块实现性能提升。ICB模块采用多尺度卷积交互,有效捕获局部和长程依赖特征;ASB模块通过自适应频域滤波优化特征表示,降低噪声干扰。两者结合使模型在复杂场景中表现更优,显著提升检测精度和鲁棒性。文章详细介绍了模块原理、代码实现及配置方法,并提供了8种改进版本的YAML配置文件,适用于不同网络结构。这些创新改进为RT-DETR模型提供了高效涨点方案,特别适合复杂背景和高噪声环境下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 211

【TS】1552- 浅谈TS运行时类型检查

What-什么是运行时类型检查? 编译时类型检查(静态类型检查):在编译阶段对变量类型进行静态检查,编译后的代码不保留任何类型标注信息,对实际代码运行没有影响运行时类型检查(动态类型检查):在代码实际运行过程中对数据类型进行检查,一般会用在约束函数参数、返回值这类内外部之间传递数据 Why-为什么需要运行时类型检查? TypeScript 对于前端项目可维护性提升很大,也能帮我们保障内部编码时的...

pingan8787 1830

YOLOv8 道路病害检测全栈工程|22 类路面裂缝坑洞 VOC&YOLO 数据集、PyQt 精美 GUI、ONNX 量化、全套训练评估曲线落地

城市道路、国省道、高速公路路面长期受车辆碾压、雨水侵蚀,衍生纵向 / 横向裂纹、坑洼、车辙、接缝剥落等二十余种路面病害。传统人工道路巡检存在致命行业痛点:人工徒步 / 乘车目视巡检效率极低,单日有效巡查里程不足 20 公里;毫米级细微线性裂纹肉眼极易漏检,雨水冲刷后微小病害快速扩张为大坑槽,养护成本翻倍;强光暴晒、阴雨积水、路面油污场景人工分辨难度大;海量巡检图片人工分类统计病害台账耗时数天,养护决策缺乏量化数据支撑。传统阈值、边缘检测图像处理仅能识别大面积坑洞,无法区分二十余种细分裂纹类型,泛化能力极差。

getusushu的博客 120

java中依赖关系_关于java:关于编译时和运行时依赖关系及其解析的问题?

我有以下问题:通常:什么是编译时和运行时依赖项javac编译器如何进行编译时依赖关系解析VM如何执行运行时相关性解析我已经略过JLS和JVMS的"依赖关系",但还没有提出任何建议。In general: what is compile- and run-time dependencies编译时依赖性:您需要CLASSPATH中的依赖性来编译工件。之所以产生它们,是因为您对代码中的硬编码有某种"引用...

weixin_29802461的博客 1564

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

运行时多态、编译时多态和重载、重写的关系(不区分Java和C#,保证能看懂!)

以前在大学学习OOP的时候,知道了重载和重写的区别,但如果要把他们和多态联系起来,我想很多新手朋友和我当初一样是死记的,可是时间长了,自然而然就忘记了,最近在写测试的时候,终于“开窍”了。在这里和大家分享一下。重载和重写我就不解释了,大家都知道,我现在主要是让大家记住                                                         重载是编译时多态,...

明天的你会感谢今天的自己 3580

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java编译时多态和运行时多态_运行时多态、编译时多态和重载、重写的关系(不区分Java和C#,保证能看懂!)...

以前在大学学习OOP的时候,知道了重载和重写的区别,但如果要把他们和多态联系起来,我想很多新手朋友和我当初一样是死记的,可是时间长了,自然而然就忘记了,最近在写测试的时候,终于“开窍”了。在这里和大家分享一下。重载和重写我就不解释了,大家都知道,我现在主要是让大家记住重载是编译时多态,重写是运行时多态这句话。编译时可以理解为“编写”代码;运行时也就是代码执行。好了,进入正题:public void...

weixin_35843410的博客 443

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

多态的两种调用:编译时确定调用和程序运行时确定调用

编译时确定调用:指在编译阶段,编译器就已经确定了具体要调用的函数或方法。这通常是通过函数重载、模板特化等方式实现的。编译时,编译器会进行语法检查、类型检查等,确保调用的正确性,并生成相应的可执行代码。程序运行时确定调用:指在程序执行过程中,根据运行时的实际情况(如参数类型、对象状态等)动态地确定要调用的函数或方法。这通常通过多态性(特别是动态多态性,如虚函数)来实现。

ale1216的博客 1109

Java:编译时类型和运行时类型

1.编译时类型:声明该变量时使用的类型。 2.运行时类型:该变量指向的对象类型。 记住:对象调用编译时类型的属性和运行时类型的方法 class Birds { public String name; public Birds() { name = "birds"; } public void yell() { System.out.println("birds yell"); } } class Sparrows extend

weixin_48493408的博客 611

运行时与编译时:深入理解二者的区别

编译时指的是源代码被编译器处理并转换为机器码或字节码的过程。在编译时,程序的静态特性会被检查和处理,例如语法错误、类型检查和代码优化等。在编译时,编译器将程序的源代码转换为目标代码或字节码。这一过程的核心任务是通过编译器的分析,将程序转换为机器可以执行的代码。在这一过程中,很多错误(如语法错误、类型错误等)会被检测出来,并阻止程序的执行,直到这些问题得到修正。运行时指的是程序在执行过程中所发生的一切。在运行时,程序的行为是动态的,程序的运行依赖于系统环境、用户输入、资源状态等因素。

aifs2025的博客 1404

编译时和运行时分别做了哪些动作

代码段(Text Segment):存放可执行指令,编译器将源代码编译为机器码并确定其位置。数据段(Data Segment):存放全局变量和静态变量,编译器分配内存并确定初始值。BSS段(Block Started by Symbol):存放未初始化的全局变量和静态变量,编译器分配内存但不初始化。堆(Heap):动态分配内存,通过、、等函数在运行时分配,大小不固定。栈(Stack):存放局部变量和函数调用信息,由编译器自动管理,遵循LIFO原则。内存映射段(Memory Mapping Segment):

XinCurry的博客 485

class类常量池与运行时常量池的关系(JDK8)

类常量池中的内容(字面量和符号引用)会被读取并保存到运行时常量池中。:对于类常量池中的符号引用(如方法引用、字段引用),JVM 会根据实际的类加载顺序,进行符号解析并将其转化为直接引用,这个过程是在类加载后,运行时常量池中完成的。符号解析阶段:对于类、方法、字段的引用,JVM 会在类加载时通过符号解析的方式,将符号引用转换为直接引用(例如,类的对象或方法的地址等)。运行时常量池的作用是存储程序在运行过程中需要使用的常量,特别是当类加载时遇到的常量,它们会被加载到内存中,供 JVM 在执行时使用。

weixin_51028997的博客 574

编译时异常和运行时异常的区别

[size=large][/size]java 中的异常分为3种 1.编译时异常 :java.lang.Exception 2 运行时异常 :java.lang.RuntimeException 3 错误:Java.lang.Error 其中 java.lang.Exception 和Java.lang.Error 都继承自Java.lang.Throwable 、Java.la...

w727204747的专栏 258

编译时常量和运行时常量

有些常量是在编译阶段就可以确定是自己指向常量池中的哪个地址; 而有些在编译阶段无法确定,需要在运行阶段才能确定; 但是在编译阶段会把要使用的常量全部加载到常量池。 package JVM.RunTime; public class Test1 { static { System.out.println("test1的静态代码块"); } public static final int num=12345; public static final String

weixin_43975276的博客 508

C++ 编译时多态和运行时多态

前言 多态多为C++的三大特性之一,我们对此的了解和应用大多停留在类继承层次和运行时阶段。那既然有运行(动态)时阶段,那是否也有静态的多态?有,那就是编译时多态 正文 动态多态 运行时的多态存在于继承类中,通过虚函数实现动态选择调用。简单的说就是通过一张虚函数表——vptable,vptable中记录了基类的虚函数地址,在派生类中继承了基类的这张vptable,而且在派生类的构造函数中对继承来的vptable相关地址进行替换,因此在调用时通过vptable的实际地址能够知道调用哪个函...

金州饿霸吃不饱的博客 1808

java 编译时间_编译时间与运行时间依赖关系 – Java

编译时依赖 :你需要CLASSPATH的依赖来编译你的工件。 它们的产生是因为你对代码中的硬编码依赖有某种“引用”,例如为某个类调用new ,直接或间接地扩展或实现某些东西,或者使用直接reference.method()方法调用方法reference.method()符号。运行时依赖关系 :您需要CLASSPATH的依赖项来运行您的工件。 它们是由于您执行访问依赖项的代码而产生的(以硬编码的方式...

weixin_39828715的博客 411

静态库与动态库、编译时库与运行时库RuntimeLibrary

静态库与动态库,编译时库与运行时库

Edward2022的博客 2926
上一篇: C++那些细节--static_cast,dynamic_cast,const_casst,reinterpret_cast
下一篇: Direct-X学习笔记--封装一个网格模型类
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值