- 浏览: 3067249 次
- 性别:
- 来自: 海外
-
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
(那个……我没读过中文版的ActionScript 3文档,不知道标准文档里翻译用了哪些词。凑合吧)
使用过ActionScript 3(AS3)的人应该会注意到其中的可选类型标注。在声明变量或常量时,可以有选择的在变量名之后加上冒号和类型名,像这样:
在编译的时候,可以选择使用标准模式(standard mode)和严格模式(strict mode)来编译,默认为标准模式。
ECMAScript 4(ES4)接受了AS3的这个设计,也提出相同的类型标注和两种编译模式。
在ES4的文档wiki,Strict and Standard compilation modes中特别提到,严格模式并不改变程序的语义,而只是对变量进行静态的类型检查,以杜绝一些常见的类型相关错误,例如对未声明的变量赋值,或者调用函数是给的参数的个数不正确等。
换句话说,AS3/ES4中的类型标注并不意味着更高的执行效率;在纯动态的解释器实现中,严格模式可能反而更慢(因为要做更多的动态检查来保证类型的正确性)。
Adobe在许多产品里都附带有AS3的编译器。我使用的是与Flex 3 SDK一起发布的,asc.jar,在Flex3SDK/lib目录下能找到。
直接用asc.jar来编译*.as源文件时,默认得到的是*.abc(Adobe ByteCode)文件,也就是对应AVM2(Adobe Virtual Machine 2,Flash 9/Flex 2/Flex 3/AIR所使用的虚拟机)的字节码。
在AVM2的指令集中,算术运算相关的指令都有专门针对整型的版本。例如add指令有相应的add_i版本。不过单是add指令本身的语义就很复杂了:
而add_i指令的语义相对简单些:
注意到,add_i指令并没有要求其操作数(栈顶的两个对象)是int型,而特别提到该指令的语义是用ToInt32算法将这两个对象转换到int。虽然如此,在将两个int型变量相加时,add_i执行的效率也应该比add指令好一些吧。
但实际上Adobe提供的AS3编译器会为我们编译出怎样的代码呢?让我们来看看下面的AS3代码,以严格模式编译会怎样:
(在命令行用java -jar asc.jar -import builtin.abc -import toplevel.abc -m -strict test.as编译)
test.as:
这里,我定义了几个方法,内容本质上都一样,都是使用+运算符把两个操作数“加”起来。但是其中foo()有完整的类型标注,包括参数和返回类型都标注上了;goo()完全没有类型标注;hoo()只有第二个参数做了类型标注;ioo()没有标注返回类型,局部变量也没有标注类型;joo()在ioo()的基础上标注了局部变量的类型。
编译时使用了-m参数,得到编译结果的文字表示test.il。其内容太长,就不完整贴出来了。下面的中间代码都出自test.il。
于是让我们把这几个方法分析一下。
首先是foo()。编译器为其生成的方法信息是:
稍微解释一下。根据ABC(Adobe ByteCode)文件的格式定义,用于描述方法的signature的method_info数据结构如下:
其中return_type与param_type里都是对multiname数组的索引。如果为0则意味着类型是“*”,也就是AS3的严格模式中的任意类型。
也就是说,编译器正确的识别出了foo()的两个参数类型都是int,返回类型也是int。
foo()的方法体部分编译结果如下:
可以看到,编译器在知道两个参数都是int型的前提下,仍然为运算符“+”选择了add而不是add_i指令。
另外几个方法编译出来的到的method_info分别为:
goo():
hoo():
ioo():
joo():
可以看到,编译器生成的method_info中关于类型的描述完全取决于代码中的标注;没有被标注的方法和变量一律被认为是“*”也就是任意类型;即便编译器有足够的信息区推导出其中的一些类型。
特别看一下ioo()中的状况:
它与foo()最大的不同是,在两个参数被add之后,还对结果做了一次隐式类型转换到Object类型(coerce_o)。虽然编译器可以通过类型标注合理的推断出局部变量i也应该是int类型的,但却并没有这么做,而是继续将i看作“*”类型。
总的说来,AS3的可选类型标注的意义仅仅在于:
1、为编辑器提供更好的支持,使其容易实现高质量的智能感应(打个点能出现成员列表之类);
2、为编译器提供静态的类型检查的依据,尽量早的将类型错误报告给用户;有标注的就检查,没标注的就不检查;不能对未声明的变量赋值(而不像ES3或之前的版本,可以直接对未声明的变量赋值,赋值时自动创建出新的变量)。
至于运行效率,严格模式与标准模式编译出来的东西似乎没多少区别……并没有生成出更快的代码,不过至少也没有变得比标准模式更慢。
我的结论是否与现实状况有出入,这个有待进一步探究。Flex 3的asc.jar没有进行类型推导这点应该是没错的。
===================================================================================
但是值得一提的是,新版本的AVM2(Tamarin)正在试验所谓的Tracing-JIT,可以有效的减少动态类型检查带来的额外开销。无论是以标准模式还是以严格模式编译的AS3代码都能从中获益。或许的Adobe的策略就是:“反正后面有Tracing-JIT,即便编译器前端不做类型推导也没关系”,吧?
使用过ActionScript 3(AS3)的人应该会注意到其中的可选类型标注。在声明变量或常量时,可以有选择的在变量名之后加上冒号和类型名,像这样:
var myvar : Number;
在编译的时候,可以选择使用标准模式(standard mode)和严格模式(strict mode)来编译,默认为标准模式。
ECMAScript 4(ES4)接受了AS3的这个设计,也提出相同的类型标注和两种编译模式。
在ES4的文档wiki,Strict and Standard compilation modes中特别提到,严格模式并不改变程序的语义,而只是对变量进行静态的类型检查,以杜绝一些常见的类型相关错误,例如对未声明的变量赋值,或者调用函数是给的参数的个数不正确等。
引用
In order to specify the two modes’ runtime behavior consistently, we specify the dynamic semantics of ECMAScript in a single, unified, dynamically typed language. In other words, the choice of strict or standard mode does not affect the meaning of a legal program; it only affects the definition of “legality”.
...
...Strict mode is only meant as a way for programmers to indicate their desire for more extensive and conservative error analysis. All programs, regardless of mode, must execute as though they were performing all dynamic checks.
...
...Strict mode is only meant as a way for programmers to indicate their desire for more extensive and conservative error analysis. All programs, regardless of mode, must execute as though they were performing all dynamic checks.
换句话说,AS3/ES4中的类型标注并不意味着更高的执行效率;在纯动态的解释器实现中,严格模式可能反而更慢(因为要做更多的动态检查来保证类型的正确性)。
Adobe在许多产品里都附带有AS3的编译器。我使用的是与Flex 3 SDK一起发布的,asc.jar,在Flex3SDK/lib目录下能找到。
直接用asc.jar来编译*.as源文件时,默认得到的是*.abc(Adobe ByteCode)文件,也就是对应AVM2(Adobe Virtual Machine 2,Flash 9/Flex 2/Flex 3/AIR所使用的虚拟机)的字节码。
在AVM2的指令集中,算术运算相关的指令都有专门针对整型的版本。例如add指令有相应的add_i版本。不过单是add指令本身的语义就很复杂了:
ActionScript Virtual Machine 2 (AVM2) Overview 写道
add
Operation
Add two values.
Format
add
Forms
add = 160 (0xa0)
Stack
…, value1, value2 => …, value3
Description
Pop value1 and value2 off of the stack and add them together as specified in ECMA-262 section 11.6 and as extended in ECMA-357 section 11.4. The algorithm is briefly described below.
1. If value1 and value2 are both Numbers, then set value3 to the result of adding the two number values. See ECMA-262 section 11.6.3 for a description of adding number values.
2. If value1 or value2 is a String or a Date, convert both values to String using the ToString algorithm described in ECMA-262 section 9.8. Concatenate the string value of value2 to the string value of value1 and set value3 to the new concatenated String.
3. If value1 and value2 are both of type XML or XMLList, construct a new XMLList object, then call [[Append]](value1), and then [[Append]](value2). Set value3 to the new XMLList.
See ECMA-357 section 9.2.1.6 for a description of the [[Append]] method.
4. If none of the above apply, convert value1 and value2 to primitives. This is done by calling ToPrimitive with no hint. This results in value1_primitive and value2_primitive. If value1_primitive or value2_primitive is a String then convert both to Strings using the ToString algorithm (ECMA-262 section 9.8), concatenate the results, and set value3 to the concatenated String. Otherwise convert both to Numbers using the ToNumber algorithm (ECMA-262 section 9.3), add the results, and set value3 to the result of the addition.
Push value3 onto the stack.
Notes
For more information, see ECMA-262 section 11.6 (“Additive Operators”) and ECMA-357 section 11.4.
Operation
Add two values.
Format
add
Forms
add = 160 (0xa0)
Stack
…, value1, value2 => …, value3
Description
Pop value1 and value2 off of the stack and add them together as specified in ECMA-262 section 11.6 and as extended in ECMA-357 section 11.4. The algorithm is briefly described below.
1. If value1 and value2 are both Numbers, then set value3 to the result of adding the two number values. See ECMA-262 section 11.6.3 for a description of adding number values.
2. If value1 or value2 is a String or a Date, convert both values to String using the ToString algorithm described in ECMA-262 section 9.8. Concatenate the string value of value2 to the string value of value1 and set value3 to the new concatenated String.
3. If value1 and value2 are both of type XML or XMLList, construct a new XMLList object, then call [[Append]](value1), and then [[Append]](value2). Set value3 to the new XMLList.
See ECMA-357 section 9.2.1.6 for a description of the [[Append]] method.
4. If none of the above apply, convert value1 and value2 to primitives. This is done by calling ToPrimitive with no hint. This results in value1_primitive and value2_primitive. If value1_primitive or value2_primitive is a String then convert both to Strings using the ToString algorithm (ECMA-262 section 9.8), concatenate the results, and set value3 to the concatenated String. Otherwise convert both to Numbers using the ToNumber algorithm (ECMA-262 section 9.3), add the results, and set value3 to the result of the addition.
Push value3 onto the stack.
Notes
For more information, see ECMA-262 section 11.6 (“Additive Operators”) and ECMA-357 section 11.4.
而add_i指令的语义相对简单些:
ActionScript Virtual Machine 2 (AVM2) Overview 写道
add_i
Operation
Add two integer values.
Format
add_i
Forms
add_i = 197 (0xc5)
Stack
…, value1, value2 => …, value3
Description
Pop value1 and value2 off of the stack and convert them to int values using the ToInt32 algorithm (ECMA-262 section 9.5). Add the two int values and push the result onto the stack.
Operation
Add two integer values.
Format
add_i
Forms
add_i = 197 (0xc5)
Stack
…, value1, value2 => …, value3
Description
Pop value1 and value2 off of the stack and convert them to int values using the ToInt32 algorithm (ECMA-262 section 9.5). Add the two int values and push the result onto the stack.
注意到,add_i指令并没有要求其操作数(栈顶的两个对象)是int型,而特别提到该指令的语义是用ToInt32算法将这两个对象转换到int。虽然如此,在将两个int型变量相加时,add_i执行的效率也应该比add指令好一些吧。
但实际上Adobe提供的AS3编译器会为我们编译出怎样的代码呢?让我们来看看下面的AS3代码,以严格模式编译会怎样:
(在命令行用java -jar asc.jar -import builtin.abc -import toplevel.abc -m -strict test.as编译)
test.as:
package { class TestClass { function foo(x : int, y : int) : int { return x + y; } function goo(x, y) { return foo(x, y); } function hoo(x, y : String) { return x + y; } function ioo(x : int, y : int) { var i = x + y; return i; } function joo(x : int, y : int) { var i : int = x + y; return i; } } var c = new TestClass(); var i = c.goo(1, "2"); print(i); // prints: 3 }
这里,我定义了几个方法,内容本质上都一样,都是使用+运算符把两个操作数“加”起来。但是其中foo()有完整的类型标注,包括参数和返回类型都标注上了;goo()完全没有类型标注;hoo()只有第二个参数做了类型标注;ioo()没有标注返回类型,局部变量也没有标注类型;joo()在ioo()的基础上标注了局部变量的类型。
编译时使用了-m参数,得到编译结果的文字表示test.il。其内容太长,就不完整贴出来了。下面的中间代码都出自test.il。
于是让我们把这几个方法分析一下。
首先是foo()。编译器为其生成的方法信息是:
MethodInfo param_count=2 return_type=1 param_types={ 1 1 } debug_name_index=2 needs_arguments=false need_rest=false needs_activation=false has_optional=false ignore_rest=false native=false has_param_names =false -> 1
稍微解释一下。根据ABC(Adobe ByteCode)文件的格式定义,用于描述方法的signature的method_info数据结构如下:
method_info { u30 param_count u30 return_type u30 param_type[param_count] u30 name u8 flags option_info options param_info param_names }
其中return_type与param_type里都是对multiname数组的索引。如果为0则意味着类型是“*”,也就是AS3的严格模式中的任意类型。
也就是说,编译器正确的识别出了foo()的两个参数类型都是int,返回类型也是int。
foo()的方法体部分编译结果如下:
MethodBody max_stack=2 max_locals=3 scope_depth=4 max_scope=5 code_length=6 traits_count=0 -> 1
// ++StartMethod foo$0 LoadThis 0:Getlocal0 [1] PushScope 1:Pushscope [0] LoadRegister 1, int 2:Getlocal1 [1] LoadRegister 2, int 3:Getlocal2 [2] InvokeBinary BinaryPlusOp 4:Add [1] Return 5:Returnvalue [0] // --FinishMethod foo$0 TestClass/foo
可以看到,编译器在知道两个参数都是int型的前提下,仍然为运算符“+”选择了add而不是add_i指令。
另外几个方法编译出来的到的method_info分别为:
goo():
MethodInfo param_count=2 return_type=0 param_types={ 0 0 } debug_name_index=2 needs_arguments=false need_rest=false needs_activation=false has_optional=false ignore_rest=false native=false has_param_names =false -> 2
hoo():
MethodInfo param_count=2 return_type=0 param_types={ 0 3 } debug_name_index=2 needs_arguments=false need_rest=false needs_activation=false has_optional=false ignore_rest=false native=false has_param_names =false -> 3
ioo():
MethodInfo param_count=2 return_type=0 param_types={ 1 1 } debug_name_index=2 needs_arguments=false need_rest=false needs_activation=false has_optional=false ignore_rest=false native=false has_param_names =false -> 4
joo():
MethodInfo param_count=2 return_type=0 param_types={ 1 1 } debug_name_index=2 needs_arguments=false need_rest=false needs_activation=false has_optional=false ignore_rest=false native=false has_param_names =false -> 5
可以看到,编译器生成的method_info中关于类型的描述完全取决于代码中的标注;没有被标注的方法和变量一律被认为是“*”也就是任意类型;即便编译器有足够的信息区推导出其中的一些类型。
特别看一下ioo()中的状况:
// ++StartMethod ioo$0 LoadThis 0:Getlocal0 [1] PushScope 1:Pushscope [0] LoadRegister 1, int 2:Getlocal1 [1] LoadRegister 2, int 3:Getlocal2 [2] InvokeBinary BinaryPlusOp 4:Add [1] CheckType * 5:Coerce.o [1] StoreRegister 3, * 6:Setlocal3 [0] LoadRegister 3, * 7:Getlocal3 [1] Return 8:Returnvalue [0] // --FinishMethod ioo$0 TestClass/ioo
它与foo()最大的不同是,在两个参数被add之后,还对结果做了一次隐式类型转换到Object类型(coerce_o)。虽然编译器可以通过类型标注合理的推断出局部变量i也应该是int类型的,但却并没有这么做,而是继续将i看作“*”类型。
总的说来,AS3的可选类型标注的意义仅仅在于:
1、为编辑器提供更好的支持,使其容易实现高质量的智能感应(打个点能出现成员列表之类);
2、为编译器提供静态的类型检查的依据,尽量早的将类型错误报告给用户;有标注的就检查,没标注的就不检查;不能对未声明的变量赋值(而不像ES3或之前的版本,可以直接对未声明的变量赋值,赋值时自动创建出新的变量)。
至于运行效率,严格模式与标准模式编译出来的东西似乎没多少区别……并没有生成出更快的代码,不过至少也没有变得比标准模式更慢。
我的结论是否与现实状况有出入,这个有待进一步探究。Flex 3的asc.jar没有进行类型推导这点应该是没错的。
===================================================================================
但是值得一提的是,新版本的AVM2(Tamarin)正在试验所谓的Tracing-JIT,可以有效的减少动态类型检查带来的额外开销。无论是以标准模式还是以严格模式编译的AS3代码都能从中获益。或许的Adobe的策略就是:“反正后面有Tracing-JIT,即便编译器前端不做类型推导也没关系”,吧?
- avmplus_test.zip (925.6 KB)
- 描述: 文章中所做的测试所需要的东西,包括Tamarin、asc.jar、builtin.abc、toplevel.abc等
- 下载次数: 37
发表评论
-
ActionScript 3茶几
2009-11-05 16:26 0Vector - Adobe® Flex™ 3.4 Langu ... -
Flex 3 mxmlc保留AS3
2009-11-03 22:16 0mxmlc --keep-generated-actionsc ... -
Flex 4/AS3里的双向数据绑定
2009-11-03 21:49 0http://www.hufkens.net/2009/06/ ... -
AS3, optional type annotation, and strict mode
2008-05-24 17:32 3021Boy, this is my first English p ... -
Flex 3正式发布了 (2008-02-25)
2008-02-29 09:55 1874Great, Flex 3 SDK和Flex Builder ... -
ActionScript 3中的E4X实现的小实验
2007-11-14 20:13 2456ActionScript 3或许是现在最接近ECMAScrip ... -
杜增强关于Flash与Flex的整合的idea
2007-11-10 04:05 3376Integrating a Flash Interface i ... -
Fisix,一个AS3物理引擎
2007-11-07 12:44 2747www.fisixengine.com 引用The Engin ... -
Flash中使用BitmapData来Double Buffering (转载链接)
2007-10-31 09:40 4288原文在此 Kieth的blog。相当有趣。看来可以在这个blo ...
相关推荐
基于arm64版本的docker-compose文件
台区终端电科院送检文档
埃夫特机器人Ethernet IP 通讯配置步骤
rv320e机器人重型关节行星摆线减速传动装置研发
气缸驱动爬杆机器人的设计().zip
56tgyhujikolp[
内容概要:本文档提供了基于OpenCV的数字身份验证系统的Python代码示例,涵盖人脸检测、训练和识别三个主要功能模块。首先,通过调用OpenCV的CascadeClassifier加载预训练模型,实现人脸检测并采集多张人脸图像用于后续训练。接着,利用LBPH(局部二值模式直方图)算法对面部特征进行训练,生成训练数据集。最后,在实际应用中,系统能够实时捕获视频流,对比已有的人脸数据库完成身份验证。此外,还介绍了必要的环境配置如依赖库安装、文件路径设置以及摄像头兼容性的处理。 适合人群:对计算机视觉感兴趣的研发人员,尤其是希望深入了解OpenCV库及其在人脸识别领域的应用者。 使用场景及目标:适用于构建安全认证系统的企业或机构,旨在提高出入管理的安全性和效率。具体应用场景包括但不限于门禁控制系统、考勤打卡机等。 其他说明:文中提供的代码片段仅为基本框架,可根据实际需求调整参数优化性能。同时提醒开发者注意隐私保护法规,合法合规地收集和使用个人生物识别信息。
内容概要:本文档详细介绍了Java并发编程的核心知识点,涵盖基础知识、并发理论、线程池、并发容器、并发队列及并发工具类等方面。主要内容包括但不限于:多线程应用场景及其优劣、线程与进程的区别、线程同步方法、线程池的工作原理及配置、常见并发容器的特点及使用场景、并发队列的分类及常用队列介绍、以及常用的并发工具类。文档旨在帮助开发者深入理解和掌握Java并发编程的关键技术和最佳实践。 适合人群:具备一定Java编程经验的研发人员,尤其是希望深入了解并发编程机制、提高多线程应用性能的中级及以上水平的Java开发者。 使用场景及目标:①帮助开发者理解并发编程的基本概念和技术细节;②指导开发者在实际项目中合理运用多线程和并发工具,提升应用程序的性能和可靠性;③为准备Java技术面试的候选人提供全面的知识参考。 其他说明:文档内容详尽,适合用作深度学习资料或面试复习指南。建议读者结合实际编码练习,逐步掌握并发编程技巧。文中提到的多种并发工具类和容器,均附有具体的应用场景和注意事项,有助于读者更好地应用于实际工作中。
这个数据集包含了日常步数统计、睡眠时长、活跃分钟数以及消耗的卡路里,是个人健康与健身追踪的一部分。 该数据集非常适合用于以下实践: 数据清洗:现实世界中的数据往往包含缺失值、异常值或不一致之处。例如,某些天的步数可能缺失,或者存在不切实际的数值(如10,000小时的睡眠或负数的卡路里消耗)。通过处理这些问题,可以学习如何清理和准备数据进行分析。 探索性分析(发现日常习惯中的模式):可以通过分析找出日常生活中的模式和趋势,比如一周中哪一天人们通常走得最多,或是睡眠时间与活跃程度之间的关系等。 构建可视化图表(步数趋势、睡眠与活动对比图):将数据转换成易于理解的图形形式,有助于更直观地看出数据的趋势和关联。例如,绘制步数随时间变化的趋势图,或是比较睡眠时间和活动量之间的关系图。 数据叙事(将个人风格的追踪转化为可操作的见解):通过讲述故事的方式,把从数据中得到的洞察变成具体的行动建议。例如,根据某人特定时间段内的活动水平和睡眠质量,提供改善健康状况的具体建议。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
nginx
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
模拟知识付费小程序,可流量主运营模式
什么是普通上传 调用接口一次性完成一个文件的上传。 普通上传2个缺点 文件无法续传,比如上传了一个比较大的文件,中间突然断掉了,需要重来 大文件上传太慢 解决方案 分片上传
英二2010-2021阅读理解 Part A 题干单词(补).pdf
2023-04-06-项目笔记-第四百五十五阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.453局变量的作用域_453- 2025-04-01
微信小程序项目课程设计,包含LW+ppt
GP300单缸液压圆锥破碎机CAD().zip