• 关于

    编译器

    的搜索结果

回答

其实在内存上没什么差别,但编译器知道,m是字符串数组,x是字符指针。于是在编译sizeof(m)的时候,编译器生成指令去根据当前内存管理方式找到申明的数组长度编译器生成指令返回数组长度,在编译sizeof(x)的时候,编译器生成指令直接返回指针大小。中间更正一下,sizeof的值就是在编译时确定的其实像你例子这样得情况下,编译器根本不用生成指令去找那些长度,因为编译时数组长度已经确定,所以m的长度7就在指令里作为操作数了。一般free malloc出来的空间才会去找。总之,,编译器已经看透了一切。。

a123456678 2019-12-02 02:39:12 0 浏览量 回答数 0

问题

请问大牛 高版本的gcc编译的库能被低版本的gcc链接使用吗?

杨冬芳 2019-12-01 19:32:49 1571 浏览量 回答数 1

回答

PCH代表预编译头. 在计算机编程中,预编译头是一个(C或C++)头文件,它被编译成一个中间形式,为编译器处理得更快。使用预编译头可能会大大减少编译时间,特别是当应用于大型头文件、包含许多其他头文件的头文件或包含在许多翻译单元中的头文件时。 为了减少编译时间,一些编译器允许将头文件编译成编译器处理速度更快的表单。这种中间形式称为预编译头,通常保存在扩展名为.pch或类似的文件中,如GNU编译器集合下的.gch。 在Visual Studio中,预编译头通常被命名为“pch.h”(用于基于控制台的应用程序),但是可以使用不同的名称,或者根本不使用它。哪个文件是预编译的头文件(如果有的话)是由项目设置决定的。 如果预编译的头文件是“pch.h”,并且编译选项是/Yu之前,VisualStudio将不会编译任何内容。#include "pch.h"在源文件中;它假定源代码中的所有代码(直到并包括该行)都已经编译好了。

aqal5zs3gkqgc 2019-12-19 19:02:11 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

Java是解释性语言还是编译型的,这个我觉得不好说,倒不是骑墙。我的理解:Java源程序通过javac编译成中间代码class文件,这也是实现Java跨平台的方式(Java开发的程序交付一般都是jar或者war包,只要系统上有JVM就能运行了)。那么从class文件到机器码的过程呢?这时候就需要JVM出马了。JVM有三种执行模式:解释执行,编译执行,混合执行(默认是混合执行)。Java一共有两套解释器,一个是古老的字节码解释器,还有一个是现在正在用的模板解释器,模板解释器将每一条字节码和一个模板函数关联,模板函数中直接产生这条字节码执行的机器码,类似于活字印刷术吧,这便实现了解释执行。但是这要效率还是很低,尤其是出现热点代码的时候,比如函数被频繁调用。为了解决这个问题,JVM又提供了一种叫做JIT(just in time)编译的技术,即将真个函数编译成机器码,每次函数执行只要执行编译后的机器码就行了。后来还出现了动态编译(Dynamic Conpiler)器,针对程序特性或者是让程序执行几个循环,在根据结果是否编译这段程序码。刚开始学的时候也有疑问,就是既然编译执行效率高为啥不都搞成编译执行模式而是要默认混合执行模式。首先来看一下编译执行和解释执行的优缺点,解释执行:解释一句执行一句,无需等待全部编译结束。编译执行:全部编译再执行,下一次再调用到这段代码的时候跳过解释直接用编译后的机器码。但根据28法则,20%的代码占用了80%的计算资源,那对于80%的不常用代码就没必要编译了,所以只对热点代码编译,当然我想jvm判断哪段代码编译哪段代码解释执行是综合考虑的

kissjz 2019-12-02 01:14:45 0 浏览量 回答数 0

回答

用Eclipse或MyEclipse是要设置编译器的,如果没提供设置JDK7作为编译器,你肯定就无法编译。Eclipse4.2设置编译器为1.7之后,就可以编译了。

爵霸 2019-12-02 02:44:43 0 浏览量 回答数 0

回答

编译器产生的代码,是原始代码的等价形式,所谓等价,就是相同的输入,相同的结果。注意是等价形式,而不是相等。所以编译出来的代码反编译回去和你写的不同这很正常。当然,如果不是等价的,那么可能就是反编译程序或者编译器本身的bug了(编译器的bug这个比较罕见)

蛮大人123 2019-12-02 01:52:48 0 浏览量 回答数 0

回答

JIT:即时编译器。 它是一个程序,帮助将Java字节码转换为直接发送到处理器的指令。 默认情况下,JIT编译器在Java中处于启用状态,并且在调用Java方法时会被激活。 然后,JIT编译器将被调用方法的字节码编译为本地机器代码,“及时”编译以执行。编译完该方法后,JVM会直接调用该方法的已编译代码,而不是对其进行解释。这就是为什么它经常在运行时负责Java应用程序的性能优化的原因。

YDYK 2020-04-23 19:34:53 0 浏览量 回答数 0

回答

同问. 在用JActor时,也出现过这样的问题.Eclipse能编译,Idea却报错.而且程序还能正确运行的. eclipse有自己的编译器。所以有些静态信息在编译过程中保留下来了。比方说方法中的变量名。 不信你用antjavac编译你的程序一定还会出错。 你这个是GWT的项目?,也许是少了一些编译环节了吧?ant编译不报错 eclipse使用的自己的编译器ecj编译的 IDEA是用的javac编译的。 某些情况下可能存在问题,ecj编译的代码兼容性好,javac编译要严格点 首先,这个和编译器神马的没有太大关系. 其次,主要的原因是IDEA 用的是MAVEN 编译,  出现这个问题应该是你POM.XML文件中的引用没有配置正确. 主要可能是此类的项目没有在文件中声明或者是在多个项目中存在冲突 又或者是这个缺少的类对应的JAR包版本不对. 解决方法就是仔细检查POM.XML文件中的项目内容.我怎么没找着pom.xml文件?..检查一下JDK的版本。

爱吃鱼的程序员 2020-06-22 17:42:54 0 浏览量 回答数 0

回答

希望楼主能多分享下优化心得哈 ######心得?就是怀疑一切。我相信在Soc公司里,开发driver,特别是网络,电源管理,总线方面的朋友都知道。spec有时只能当草纸用。 ######反汇编下代码,看看编译结果有无问题.######去掉编译优化选项再试试######会不会跟子函数传递形参有关?###### 你用的是什么编译器? gcc for arm?你这个问题很可能是编译器的问题. gcc不可靠的对容易有歧义和很复杂的表达式,编译出来的东西是错误的.以前遇到过. VC的或者商用编译器就好多了. ######这么说,反汇编已经检查过了吧,如果确定汇编也没有问题的话,那就只能是硬件层的了。 编译器一般情况下是不会犯错的,因为它无论怎么优化,第一个原则就是正确性,在原程序中会被执行的代码在结果里也一定会被执行。然而,对于不同的芯片,实现上可能会有一定的差异,对编译器也有不同程度的裁剪,但它毕竟只是个程序。再者,芯片实现越来越复杂,内部指令到底是个怎么执行流程,连代码自己都不能知道,何况是编译器和程序员。###### 引用来自“ZeroOne”的答案 你用的是什么编译器? gcc for arm?你这个问题很可能是编译器的问题. gcc不可靠的对容易有歧义和很复杂的表达式,编译出来的东西是错误的.以前遇到过. VC的或者商用编译器就好多了. 上ARM 1GHz的Soc跑的准“固件”。我没办法用VC。而且是android 的NDK。 ###### 引用来自“晓寒”的答案 这么说,反汇编已经检查过了吧,如果确定汇编也没有问题的话,那就只能是硬件层的了。 编译器一般情况下是不会犯错的,因为它无论怎么优化,第一个原则就是正确性,在原程序中会被执行的代码在结果里也一定会被执行。然而,对于不同的芯片,实现上可能会有一定的差异,对编译器也有不同程度的裁剪,但它毕竟只是个程序。再者,芯片实现越来越复杂,内部指令到底是个怎么执行流程,连代码自己都不能知道,何况是编译器和程序员。 目前怀疑是函数过早跳出,对应寄存器的值没有有效传递给外部变量前,被堆栈弹出的数据覆盖,转而将数据写出变量时导致错误。虽然问题解决了。但是具体原因我还需要查一下。当然可能有另外个错误,就是进入计算和判断的变量,在寄存器传递为有些写入前,就被使用。 ######这个问题目前查清楚了,让小朋友看反汇编,让他自己理解。还不错。把问题向我汇报清楚了 。也希望大家注意, android下的C编译器存在错误。尽量把C代码写简单点。上述错误是C编译器在优化模式下的逻辑错误。

kun坤 2020-05-30 14:00:18 0 浏览量 回答数 0

问题

为什么Java编译器不直接编译成二进制文件?

Atom 2020-04-25 14:25:14 0 浏览量 回答数 1

回答

@SuppressWarnings指示被该Annotation修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告。@SuppressWarnings会一直作用于该程序元素的所有子元素,例如,使用@SuppressWarnings修饰某个类取消显示某个编译器警告,同时又修饰该类里的某个方法取消显示另一个编译器警告,那么该方法将会同时取消显示这两个编译器警告。在通常情况下,如果程序中使用没有泛型限制的集合将会引起编译器警告,为了避免这种编译器警告,可以使用@SuppressWarnings修饰。

星尘linger 2020-04-12 10:25:32 0 浏览量 回答数 0

回答

gcc -c main.c使用-c参数告诉编译器的driver只执行编译gcc main.c编译器的driver会执行编译,在一个临时目录中生成.o文件,再执行链接,生成可执行文件。windows下使用MS 编译器同理,不过不知到具体的参数是什么。

a123456678 2019-12-02 02:38:51 0 浏览量 回答数 0

回答

java最重要的是JVM,JVM所指的就是Java虚拟机。Java正是凭借Java虚拟机来实现其平台无关性的。通过在机器与编译程序之间加入一层抽象(即JVM)来实现脱离平台这一性质。Java虚拟机面向编译器给其提供相同的接口(即各平台编译器相同),这就是说,编译器只要面向Java虚拟机生成Java虚拟机可以理解的代码,那么就可以通过不同平台的不同解释器来生成与平台相对应的机器码来执行Java程序。虚拟机暴露给编译器的接口是相同的,而虚拟机的解释器针对不同的平台而不同。

hiekay 2019-12-02 01:39:31 0 浏览量 回答数 0

回答

字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。 采用字节码的好处: Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。 先看下java中的编译器和解释器: Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。 Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。

问问小秘 2020-03-27 16:17:39 0 浏览量 回答数 0

回答

同问. 在用JActor时, 也出现过这样的问题. Eclipse能编译, Idea却报错. 而且程序还能正确运行的. ###### eclipse有自己的编译器。所以有些静态信息在编译过程中保留下来了。比方说方法中的变量名。 不信你用ant javac编译你的程序一定还会出错。 你这个是GWT的项目?,也许是少了一些编译环节了吧? ######ant编译不报错###### eclipse使用的自己的编译器 ecj 编译的 IDEA是用的javac 编译的。 某些情况下可能存在问题,ecj 编译的代码兼容性好,javac编译要严格点 ###### 首先,这个和编译器神马的没有太大关系 . 其次, 主要的原因是IDEA 用的是 MAVEN 编译,  出现这个问题应该是你POM.XML文件中的引用没有配置正确. 主要可能是此类的项目没有在文件中声明或者是在多个项目中存在冲突 又或者是这个缺少的类对应的JAR包版本不对. 解决方法就是仔细检查POM.XML文件中的项目内容. ######我怎么没找着pom.xml文件?..######检查一下JDK的版本。

爱吃鱼的程序员 2020-06-03 17:13:53 0 浏览量 回答数 0

回答

1、如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的 Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。确定。2、在文件开头添加: #include "stdafx.h"对预编译头文件说明如下:所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。

a123456678 2019-12-02 01:57:38 0 浏览量 回答数 0

回答

预编译就是在向编译器说明你在下面的程序中用到的一些库函数之类的东西,好比你去订饭,你应该告诉吃什么,不能只说我明天中午来吃饭一样。编译器自动搜索include关键词,找到后检查后面尖括号的内容,去编译器已有的类似程序集合里寻找相关文件并调入,以免后面影响编译效率。clear?

a123456678 2019-12-02 02:18:14 0 浏览量 回答数 0

回答

编译器不对。这是Linux下的编译器,是不是你下的QT安装包就不对>>>> 或者看看安装目录里有没有Windows版本的编译器。没的话重新下个版本好了。单独下编译器挺折腾——顺便说下,QT开发安卓,玩玩就知道玩不下去了。。。

爵霸 2019-12-02 02:30:33 0 浏览量 回答数 0

回答

对于右移大于或等于位宽的操作,或者右移负数的操作,其结果将依赖于编译器的处理和硬件指令的处理,并不唯一。32正好是一个int变量所占的内存,但这种位移的行为是未定义的。由编译器决定,所以没有标准答案。在VC++编译器上是等于原值的LZ可以看一下汇编的代码就会发现,编译器直接把代码编译成了赋值操作,而没有做移位操作.所以第一种情况下还是原值,而第二种由于移位小于32位,所以就按正常的移位操作来,就得到了0

a123456678 2019-12-02 02:01:26 0 浏览量 回答数 0

回答

对于右移大于或等于位宽的操作,或者右移负数的操作,其结果将依赖于编译器的处理和硬件指令的处理,并不唯一。32正好是一个int变量所占的内存,但这种位移的行为是未定义的。由编译器决定,所以没有标准答案。在VC++编译器上是等于原值的LZ可以看一下汇编的代码就会发现,编译器直接把代码编译成了赋值操作,而没有做移位操作.所以第一种情况下还是原值,而第二种由于移位小于32位,所以就按正常的移位操作来,就得到了0

a123456678 2019-12-02 02:19:00 0 浏览量 回答数 0

回答

引入了JIT编译器来弥补解释器的缺点。执行引擎首先作为解释器运行,并在适当的时候,JIT编译器编译整个字节码以将其更改为本机代码。之后,执行引擎不再解释该方法,而是直接使用本机代码执行。本地代码中的执行比逐个解释指令要快得多。由于本机代码存储在高速缓存中,因此可以快速执行编译的代码

bravozu 2019-12-02 01:39:30 0 浏览量 回答数 0

回答

map<int,vector<int>>的两个右尖括号(>>),在较低版本的编译器里,被识别为移位运算符,所以将出现编译错误。在较高版本的编译器里,编译器已经足够智能,能够进行正确的识别。 你的g++的版本应该比较低,或者没有使用  - std= c++ 0x开关。 遇到这种情况,就老老实实的加个空格。 语法要求,好好看看C++primer 引用来自“liuyong051”的评论 map<int,vector<int>>的两个右尖括号(>>),在较低版本的编译器里,被识别为移位运算符,所以将出现编译错误。在较高版本的编译器里,编译器已经足够智能,能够进行正确的识别。 你的g++的版本应该比较低,或者没有使用  - std= c++ 0x开关。 遇到这种情况,就老老实实的加个空格。

爱吃鱼的程序员 2020-06-09 11:49:16 0 浏览量 回答数 0

回答

首先,调理清晰是个很大的优势,程序毕竟是给人读的,更加清晰的代码有助于表达作者的想法。从编译实现上来说,switch 一般编译器会生成一张表来处理 对应的分支,在某些场景下,效率会更高,因为这些都是编译器在后面偷偷做的,不同的编译器的实现也可能会不同,优化的结果也可能会不相同,如果真要扣,可以把编译出来的汇编代码研究一下。另外需要说明的是,如果程序中出现了很多的 if else,一般来说都是设计缺陷,需要重构。

挺锋 2019-12-02 02:02:25 0 浏览量 回答数 0

回答

编译器在通常情况下会生成比你更好的代码。现代超标量处理器的优化非常复杂,指令集并行、缓存命中、寄存器重命名、分支预测等等都是编译器优化要考虑的问题,单条指令上你觉得优化了,但是打破了编译器的整体优化,得不偿失。

a123456678 2019-12-02 02:19:06 0 浏览量 回答数 0

问题

中科院所发布编程语言“木兰”,为套壳产品你怎么看待?

珍宝珠 2020-01-19 11:09:44 1100 浏览量 回答数 1

回答

python实际执行的时候会将代码编译成字节码的pyc文件(这一步是编译,由编译器负责)之后执行pyc当中的字节码(这一步是解释器的工作,为了避免每次运行都要编译加快速度)

大财主 2019-12-02 01:06:30 0 浏览量 回答数 0

回答

1.首先,擦除通俗的说是指泛型标签是交给Javac编译器去执行的,并起作用的。 代码过完编译期,运行期间就不管了《T》,在class文件找不到T了。 这里你显示了指明了类型是,那么编译器会在编译期间将GenericHolder中持有的T转换成String类型。 所以你的get不用转型了(编译器已经把String识别出来了)。2.擦除是泛型中很重要的概念,可以说不懂擦除就不懂泛型。实际工作中有常见有关联的是对象的序列化反序列化,如gson等框架中会用到。

蛮大人123 2019-12-02 02:06:46 0 浏览量 回答数 0

回答

Java泛型实现原理:类型擦出 Java的泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。 如在代码中定义的`List<object>`和`List<String>`等类型,在编译后都会编程`List`。`JVM`看到的只是`List`,而由泛型附加的类型信息对`JVM`来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与`C++`模版机制实现方式(后面介绍)之间的重要区别。

蛮大人123 2019-12-02 02:07:58 0 浏览量 回答数 0

回答

include 包含其他库、类、接口等的头文件。预处理器实际上就只是把整个头文件复制到你的源代码里面 (是的,这就是包含防御之所以是件好事的原因了). define 谁会不喜欢宏呢! 预处理器会把所有定义的实体替换成被定义的代码. 定义会一直持续直到发现这个定义的 #undef 指令. ifdef 条件行为告诉预处理器包含在遇到声明的条件成立的条件块中的代码. 你可以就像if-else语句一样使用它们,从这里面选择: #ifdef, #ifndef, #if, #else, 以及 #elif, 而你总是要使用一个 #endif 作为结束。leoxuleoxu翻译于 1年前0人顶顶 翻译的不错哦! error #warning 用来向用户发送消息。预处理器会在 #error 处, 而不会在 #warning 处停下来. 两种情况下他都会发送他在指令背后(的括号里面)发现的字符串, 发送到屏幕作为输出,因此它是一种确保针对你的平台一切OK的手动方式. line 用来在你遇到编译错误时修改显示的错误行号和文件名. 例如,加入你需要查看一个来自编译的中间文件的源文件(可能是自动生成的). pragma 其它由编译器解释的特殊指令。你的编译器文档会告诉你指令是怎么用的,而你不要假定他们在全世界都通用哦.leoxuleoxu翻译于 1年前0人顶顶 翻译的不错哦! assert #unassert 这些在老程序里面总是特别受欢迎的 (好吧,只要我也曾经为这样一个程序工作过), 但是它们在现在已经过时了。强烈建议不使用它们,这意味着不要把他们放到新的代码里面预定义宏 有许多可以利用的预定义宏:FILE 给出一个字符串的文件名LINE 给出当前的行号(整型)DATE 当前编译日期的字符串TIME 当前编译时间的字符串STDC 同编译器相关的,但常常被定义成1,以声明同ISO C标准兼容.__cplusplus 在编译一个C++程序是总是会被定义特别是开头两个在调试时真的非常有用。只要拿出它们俩,不用你自己编写文件和行处理类,就能神奇的让你获得丰富的信息输出.leoxuleoxu翻译于 1年前0人顶顶 翻译的不错哦!你的编译器可能还支持其它的宏,例如,你这从 这里 获得(面向GCC)的整个宏清单.那么当你运行预处理器时实际会发生什么呢? 替换所有的三字母组合,我会在将来的一篇文章中谈论到他,因为尽管他只是一个历史上的特性(而且你也要在GCC中对它进行切换),它仍让是很有趣的. 将并列的源代码分成多行. 移除所有的注释并用一个空格替换. 处理(我们上面讲到的)的预处理器指令。对于 #include, 他会在新文件上递归执行1 - 3步 :-) 处理转义序列. 把文件发送给编译器 如果你想看看预处理之后你的文件会是什么样子 (谁不想呢?),你可以向 gcc 传入 -E 选项. 这将会想stdout标准输出发送预处理过的源代码,并且没有编译和连接就直接终止gcc命令的执行。具体实例如下:`1g++ -E myfile.cpp`你也可以使用这个参数:`1-save-temps`编译的后会有一份临时文件。拿下面这个简单的程序说吧: 1#include <stdio.h> 2 3#define ONE 1 4#define TWO 2 5 6int main() 7{ 8 printf("%d, %d\n", ONE, TWO); 9 return 0; 10} 用下面这行命令编译`1g++ hello.cpp -save-temps`编译完后, 会在文件夹中生成两个文件: hello.s 和 hello.iihello.s 里面是汇编代码, 而 hello.ii 则是预处理过后的源代码。用文本编辑器打开 hello.ii , 你会发现多出许多代码. 那是因为 #include 指令把 stdio 头文件的代码加进去了。如果你把滚动条拉到最底下, 就会发现, printf 那一行的宏定义 ONE 和 TWO 已经被预处理器替换成 1 和 2 了 .神奇吧!其实它只是在编译的时候, 把你的源代码文件复制一份, 当作临时文件, 然后把里面的预处理指令替换掉. 用完后就把这个临时文件删了. 所以一般情况下我们不知道这个文件的存在.

a123456678 2019-12-02 01:56:33 0 浏览量 回答数 0

问题

MaxCompute工具及下载:MaxCompute Studio:开发 SQL 程序:提交 SQL 脚本

行者武松 2019-12-01 22:06:22 1036 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站