淘优惠

淘优惠

Triton:openai开源GPU编程神器

热门文章 0
gpu编译器开发,pinetwork开源代码,gpu编程技术,开源编程软件

标签:Triton mask stride tl openai GPU BLOCK


    • 序言
    • GPU编程的困难
    • 编程模型
    • 矩阵乘法
    • 高级系统架构
    • 编译器后端

我们将发布Triton 1.0,这是一种开源的类似Python的编程语言,使没有CUDA经验的研究人员能够编写高效的GPU代码C大多数情况下与专家所能产生的代码相当。Triton使其有可能以相对较少的努力达到硬件性能的峰值;例如,它可以用来编写FP16矩阵乘法内核,其性能与cuBLAS相当C这是许多GPU程序员在25行代码以下无法做到的。我们的研究人员已经用它编写了比同等的Torch实现效率高2倍的内核,我们很高兴能与社区合作,使GPU编程对每个人来说都更容易。 深度学习领域的新的研究思路一般都是使用本地框架运算符的组合来实现的。虽然方便,但这种方法往往需要创建(移动)许多临时张量,这可能会降低神经网络的规模性能。这些问题可以通过编写专门的GPU内核来缓解,但由于GPU编程的许多复杂性,这样做可能会出乎意料地困难。而且,尽管最近出现了各种系统来简化这一过程,但我们发现它们要么过于嗦,要么缺乏灵活性,要么生成的代码明显比我们手工调整的基线慢。这促使我们对Triton进行了扩展和改进,这是一种最新的语言和编译器,其最初的开发者现在在OpenAI工作。 Triton代码 Triton文档

现代GPU的架构可以大致分为三个主要部分CDRAM、SRAM和ALUC在优化CUDA代码时必须考虑到每一个部分。

  • 来自DRAM的内存传输必须凝聚成大型事务,以利用现代内存接口的大总线宽度。
  • 在重新使用之前,数据必须被手动存储到SRAM中,并进行管理,以便在检索时尽量减少共享内存库的冲突。
  • 计算必须在流式多处理器(SM)之间和内部仔细划分和安排,以促进指令/线程级并行,并利用特殊用途的ALU(如张量核心)

GPU的基本架构如下: 对所有这些因素进行推理是具有挑战性的,即使是对具有多年经验的经验丰富的CUDA程序员也是如此。Triton的目的是将这些优化完全自动化,以便开发人员能够更好地专注于他们的并行代码的高层逻辑。Triton的目标是广泛适用,因此不会自动安排跨SM的工作C将一些重要的算法考虑(如tiling,SM间的同步)留给开发者决定。 CUDA和Triton中编译器优化的比较如下:

在所有可用的特定领域语言和JIT编译器中,Triton也许与Numba最相似:内核被定义为装饰过的Python函数,并在所谓实例的网格上以不同的program_id并发启动。然而,正如下面的代码片段所示,相似之处仅此而已。Triton通过在块上的操作暴露了实例内的并行性,而不是单指令多线程(SIMT)7的执行模型,块的尺寸是2的幂。这样做,Triton有效地抽象了所有与CUDA线程块内并发有关的问题(例如,内存凝聚、共享内存同步/冲突、张量核心调度)。

下面是Numba中的向量加法:

下面是Triton中的向量加法:

虽然这可能对令人尴尬的并行(即逐个元素)计算没有特别帮助,但它可以大大简化更复杂的GPU程序的开发。 例如,考虑融合softmax内核的情况,其中每个实例都对给定的输入张量X的不同行进行归一化处理,在 X ∈ R M × N X \in \mathbb{R}^{M imes N} X∈RM×N中。这种并行化策略的标准CUDA实现在编写时可能具有挑战性,需要线程之间明确的同步,因为它们同时减少X的同一行。这种复杂性在Triton中大部分都消失了,每个内核实例加载感兴趣的行,并使用类似NumPy的基元对其进行顺序标准化。 在triton中编写fused softmax代码如下:

请注意,Triton JIT将X和Y视为指针,而不是张量;我们认为保留对内存访问的低级控制对于解决更复杂的数据结构(例如,块状稀疏张量)是很重要的。

重要的是,softmax的这一特定实现在整个规范化过程中保持X的行在SRAM中,这在适用的情况下最大限度地提高了数据的重复利用(~<32K列)。这与PyTorch的内部CUDA代码不同,后者对临时内存的使用使其更加通用,但速度明显较慢(如下)。这里的底线不是说Triton本质上更好,而是说它简化了专门内核的开发,可以比通用库中的内核快很多。 M=4096时,A100处理fused Softmax的性能如下: Torch(v1.9)JIT的较低性能突出了从高级张量操作序列中自动生成CUDA代码的难度。

能够为向元素运算和还原编写融合的内核是很重要的,但考虑到神经网络中矩阵乘法任务的突出性,这还远远不够。事实证明,Triton对这些任务也非常有效,只用了大约25行Python代码就达到了峰值性能。另一方面,在CUDA中实现类似的东西将花费更多的精力,甚至有可能实现更低的性能。下面是Triton中矩阵乘法代码:

手写矩阵乘法内核的一个重要优势是,它们可以根据需要进行定制,以适应其输入(如切片)和输出(如Leaky ReLU)的融合变换。如果没有像Triton这样的系统,对矩阵乘法内核的非实质性修改对于没有特殊GPU编程专长的开发者来说是遥不可及的。

Triton的良好性能来自于以Triton-IR为中心的模块化系统架构,Triton-IR是一种基于LLVM的中间表示,其中多维值块是较为重要的。 @triton.jit装饰器的工作原理是遍历所提供的Python函数的抽象语法树(AST),以便使用常见的SSA构建算法快速生成Triton-IR。 然后,所生成的IR代码被我们的编译器后端简化、优化并自动并行化,然后被转换为高质量的LLVM-IR,最终是PTX,以便在最近的NVIDIA GPU上执行。目前还不支持CPU和AMD的GPU,但我们欢迎社区为解决这个问题做出贡献。

我们发现,通过Triton-IR使用块状程序表示法,我们的编译器可以自动执行各种重要的程序优化。例如,通过查看计算密集型块级操作(如tl.dot)的操作数,可以将数据自动存储到共享内存,并使用标准的有效性分析技术进行分配/同步。 另一方面,Triton程序可以有效地自动并行化:(1)通过并发执行不同的内核实例在SM之间并行化;(2)在SM内部通过分析每个块级操作的迭代空间并在不同的SIMD单元之间充分划分,如下所示。 参考链接: .

标签:Triton,mask,stride,tl,openai,GPU,BLOCK
来源: https://blog.csdn.net/qq_42322191/article/details/119346832

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。


Tutorial: An Introduction to Reinforcement Learning Using OpenAI Gym

tutorial翻译,tutoring,tutorialspoint官网,tutorial book

In this introductory tutorial, we'll apply reinforcement learning (RL) to train an agent to solve the?'Taxi' environment from OpenAI Gym. We'll cover:

  • A basic introduction to RL

  • Setting up OpenAI Gym & Taxi

  • Step-by-step tutorial on how to train a Taxi agent in Python3 using RL

Taxi is one of many environments available on OpenAI Gym. These environments are used to develop and benchmark reinforcement learning algorithms.

The goal of Taxi is to pick-up passengers and drop them off at the destination in the least amount of moves. In this tutorial, you'll start with a taxi agent that takes actions randomly:

…and train the agent to be a better taxi driver using reinforcement learning:

Think about how you might teach a dog a new trick, like telling it to sit:

  • If it performs the trick correctly (it sits), you'll reward it with a treat (positive feedback)

  • If it doesn't sit correctly, it doesn't get a treat (negative feedback) ?

By continuing to do things that lead to positive outcomes, the dog will learn to sit when it hears the command in order to get its treat. Reinforcement learning is a subdomain of machine learning which involves training an 'agent' (the dog) to learn the correct sequences of actions to take (sitting) on its environment (in response to the command 'sit') in order to maximise its reward (getting a treat). This can be illustrated more formally as:

Source:?Sutton &?Barto

We'll be using the 'Taxi-v3' environment for this tutorial.

You'll need to install:

  • OpenAI Gym?

  • NumPy?

The following snippet will import the necessary packages, and create the Taxi environment:

import numpy as np import gym import random # create Taxi environment env=gym.make('Taxi-v3')

We'll start by implementing an agent that doesn't learn at all. Instead, it will sample actions at random. This will be our baseline.

The first step is to give our agent an initial?state?of its environment. A state is how our agent will observe its environment. In Taxi, a state defines the current positions of the taxi, passenger, and pick-up and drop-off locations. Below are examples of three different states for Taxi:

Note: Yellow=taxi, Blue letter=pickup location, Purple letter=drop-off destination

To get the initial state:

# create a new instance of taxi, and get the initial state state=env.reset()

Next, we'll run a for-loop to cycle through the game. At each iteration, our agent will:

  1. Make a random action from the action space (0?-?south, 1?-?north, 2?-?east, 3?-?west, 4?-?pick-up, 5?-?drop-off)

  2. Receive the new state

Here's our random agent script:

import gym import numpy as np import random # create Taxi environment env=gym.make('Taxi-v3') # create a new instance of taxi, and get the initial state state=env.reset() num_steps=99 for s in range(num_steps+1): print(f"step: {s} out of {num_steps}") # sample a random action from the list of available actions action=env.action_space.sample() # perform this action on the environment env.step(action) # print the new state env.render() # end this instance of the taxi environment env.close()

You can run this and watch your agent make random moves. Not super exciting, but hopefully this helped you get familiar with the OpenAI Gym toolkit.

Next, we'll implement the Q-learning algorithm that will enable our agent to learn from rewards.

Q-learning is a reinforcement learning algorithm that seeks to find the best possible next action given its current state, in order to maximise the reward it receives (the 'Q' in Q-learning stands for quality?-?i.e. how valuable an action is).

Let's take the following starting state:

Which action (up, down, left, right, pick-up or drop-off) should it take in order to maximise its reward? (Note: blue=pick-up location and purple=drop-off destination)

First, let's take a look at how our agent is 'rewarded' for its actions.?Remember in reinforcement learning, we want our agent to take actions that will maximise the possible rewards it receives from its environment.

According to the?Taxi documentation:

"…you receive +20 points for a successful drop-off, and lose 1 point for every timestep it takes. There is also a 10 point penalty for illegal pick-up and drop-off actions."

Looking back at our original state, the possible actions it can take and the corresponding rewards it will receive are shown below:

In the image above, the agent loses 1 point per timestep it takes. It will also lose 10 points if it uses the pick-up or drop-off action?here.

We want our agent to go North towards the pick-up location denoted by a blue R -?but how will it know which action to take if they are all equally punishing?

Our agent currently has no way of knowing which action will lead it closest to the blue R. This is where trial-and-error comes in?-?we'll have our agent take random actions, and observe what rewards it gets (i.e. our agent will?explore).

Over many iterations, our agent will have observed that certain sequences of actions will be more rewarding than others. Along the way, our agent will need to keep track of which actions led to what rewards.

A Q-table is simply a look-up table storing values representing the maximum expected future rewards our agent can expect for a certain action in a certain state (known as Q-values). It will tell our agent that when it encounters a certain state, some actions are more likely than others to lead to higher rewards. It becomes a 'cheatsheet' telling our agent what the best action to take is.

The image below illustrates what our 'Q-table' will look like:

  • Each row corresponds to a unique state in the 'Taxi' environment

  • Each column corresponds to an action our agent can take

  • Each cell corresponds to the Q-value for that state-action pair?-?a higher Q-value means a higher maximum reward our agent can expect to get if it takes that action in that state.

Before we begin training our agent, we'll need to initialize our Q-table as so:

state_size=env.observation_space.n # total number of states (S) action_size=env.action_space.n # total number of actions (A) # initialize a qtable with 0's for all Q-values qtable=np.zeros((state_size, action_size))

As our agent explores, it will update the Q-table with the Q-values it finds. To calculate our Q-values, we'll introduce the Q-learning algorithm.

The Q-learning algorithm is given below. We won't go into details, but you can read more about it in?Ch 6 of Sutton & Barto (2018).

The Q-learning algorithm will help our agent?update the current Q-value (Q(St,At)) with its observations after taking an action.?I.e. increase Q if it encountered a positive reward, or decrease Q if it encountered a negative one.

No


vb动态数组占用内存多少 vb和vc在现实中怎么区分

vbs 动态数组,vb中动态数组声明语句,vb中动态数组重新定义,vb的动态数组
的支持。 扩展界面支持库六:对多功能条控件进行的小的改进。 农历日期支持库:修改农历日期框控件调用“增减日期”“置农历日期”“置公历日期”等方法后未及时更新显示文本的BUG。 数据结构支持库:修改"链表.加入节点"方法有时不能按键值正确排序的BUG。 其它一些支持库的改进和修正 -------------------------------------------------------------------------------- 易语言4.02版相对于4.0版更新说明: 1、DLL命令调用功能全面增强,具体请参见核心支持库手册里面的“调用API.e”例程和相关文档。 2、新增位图操作和易LOGO两个支持库。 3. 核心库中的外部数据库组件被修正。 4、以下支持库被修正或增加新功能: 互联网服务支持库 网络传送支持库 mysql支持库 Sqlite数据库支持库:增加了20个命令以直接返回相关数据(而不是写入到参数变量中)。 扩展界面支持库三:增加了提示文本功能,同时更新了卷帘式菜单和高级选择夹的属性编辑对话框并增加了相关方法;在卷帘式菜单控件的“项目”属性编辑对话框中,如果项目名称为空文本,则显示为“未命名”,以便于用户以鼠标点击选中。 扩展界面支持库五:“汽球提示框”更名为“气球提示框”并增加“批量关联组件”方法,以方便用户动态指定提示文本;修改其“提示框即将弹出”事件的参数“手柄横向坐标”“手柄纵向坐标”,由屏幕坐标改为客户坐标,以方便用户处理。 数据图表支持库:曲线图和柱状图增加了“显示标注”和“提示文本”属性;鼠标指向曲线图和柱状图的相应区域时会有提示框弹出并显示当前数据值。 XML解析支持库:增加导入导出字节集功能,另外增加了9个命令以直接返回相关数据(而不是写入到参数变量中)。 -------------------------------------------------------------------------------- 易语言4.0版相对于易语言3.8正式版更新说明: 1、“新建”对话框布局改变,将一些新建项目进行了分类,大家可以在Samples和Wizard目录中组织目录,“新建”对话框会自动列出。 2、新的“文本代码编辑器”工具。 代码编辑方式是以文本方式编辑,在每一行程序编辑完成后不必回车确认,直接下移光标继续输入。或按[Shift+回车]可代替原单键[回车]形式。 可以将代码以文本方式复制到记事本,或从记事本将文本代码粘贴回来,系统自动恢复为程序代码。 “系统配置”中可以设置改变编辑区字体及字号。 “系统配置”中的“输入新语句后自动检查语法错误”项选中时,当光标在代码行末时回车,就可以编译当前行检查是否有语法错误,并在提示面板中提示出来。默认为选中。 若“系统配置”的“输入新语句后自动检查语法错误”项未勾选,代码编辑时将不会弹出错误提示,代码编辑后的运算符号不会规范整理,而会在调试或编译时给出错误提示,或使用全程提示工具检查,或通过按[Shift+回车]编译当前行进行检查。 3、新的“全程提示”工具,当用户将鼠标移至常量、变量、属性表等名称上停留片刻,会显示当前名称的相关信息。对未事先声明的变量不作任何提示。 4、新的“寻找替换管理器”工具。可以在当前程序集中进行寻找与替换。 5、新的“程序调试管理器”工具。新设计的“调用表”面板与“监视表”面板代替了原调试面板,具体使用与原来的调试方法类似,可用“查看表达式/变量”菜单查看当前子程序变量值。 6、新的“整体搜寻管理器”工具。提示夹中增加“搜寻1”、“搜寻2”两个面板。使用“整体搜寻”菜单命令可将搜寻结果显示在其中,并且可以对比查看。 7、新的“条件断点管理器”工具。新增“条件断点”菜单,可以设置断点时给定一组条件,方便调试,如果断点不是条件公式,就会自动转换为普通断点。 8、新的“组件排列管理器”工具。当没有安装扩展组件、OCX组件或COM组件时,不显示分类,当组件排列拥挤时,自动增加分类。 9、新的“配色方案管理器”工具。编辑代码区与属性表的配色方案已合并,且支持任意颜色自由定制,大家可将自定义的配色方案拷贝到Clr目录中,就可在列表中看到。 请使用菜单“工具”→“系统配置”→“程序显示”→“颜色配置”,在下拉列表中选择本Clr目录中的颜色配置文件。 10、“提示”面板中显示命令帮助内容时,将会显示当前命令所处的上级支持库分类信息,以利于用户查询所在支持库。 11、调试中断后回到代码编译界面,可将鼠标移到变量上查看变量值提示。 12、备注直接使用单引号标注,并兼容打开以前版本的代码自动改为单引号标注形式。 13、热键调整:如原直接使用键盘的方向键可展开命令,现在需要使用[ALT+方向键]才可以展开,“单步跟踪”热键有所改动。 编辑时原[F1]热键插入文件名称路径现改为[F2]热键插入。[F10]可删除一行,[CTRL+K]可屏蔽一行。 14、菜单调整:如“配置”子菜单移至“程序”菜单下,增加“条件断点”菜单,原“易向导”菜单改为“执行易向导”菜单.....具体请自行对比。 15、Samples目录中增加大量的经典例程,供大家学习交流。 16、Ecom易模块目录中新增若干易模块及例程。 17、易向导中增加“通用密码登录管理向导”及“OpenGL向导”。 18、系统配置对话框的“编译选项”中新增“是否使用Windows通用组件库6.0版”选项,默认不选中。如果选中,编译后的程序将使用6.0版风格的组件。 19、推出了以下新的支持库: 农历月历支持库中新增“农历月历”组件 拖放支持库 正则表达式支持库 进程通讯支持库 BT下载支持库 网络通讯支持库二 扩展界面支持库三中增加“高级选择夹”组件(本库必须在易语言4.0以上版本中使用) 应用接口支持库 OpenGL支持库 DirectX发支持库 SQLite数据库支持库 控制台操作支持库 扩展界面支持库五 20、办公组件支持库已升级,推荐大家使用该升级后的支持库。 21、新表格组件改名为高级表格以区分基本支持库中的表格,方便大家定义数据类型。 22、网络传送支持库更新及易语言下载快车已更新。 23、基本组件中的打印机组件已支持自定义纸张,“开始打印”方法中当“纸张”参数为-1时,可以自定纸张宽高。 24、“打印机”对象和“打印设置信息”数据类型中的打印纸类型新增了100多种扩展打印纸类型。 25、系统核心支持库中的“寻找字节集”和“倒找字节集”命令各增加一个参数。 26、窗口组件的基本事件中加入了“滚轮被滚动”事件,以支持鼠标滚轮编程。 27、核心库“其它”类别中增加了“DLL命令调用转向”命令,以支持程序中对非固定文件名DLL中的输出命令进行调用。 28、编辑组件的文本型属性时可以编辑多行文本。 29、组件箱右上角增加一个按钮,可以在组件图标排列与组件名列表中切换。 30、“输出调试文本”命令支持通用数据类型。 31、编译使用了易模块的易程序时,由过去仅在易语言安装目录ECOM下寻找所需要的易模块文件改为首先在易程序所处目录下寻找,然后再去ECOM目录下寻找。 32、易模块管理对话框中新增了“创建指定易模块文件的接口程序集”按钮。 33、为规范编程,多个易语言打开同一个源代码时,将会提示切换到打开的程序中,否则请另存为新文件名后再打开,以保护程序。但如果你用新建方式打开程序时,不受此保护。 34、修改了用户程序当支持库不存在时弹出的出错信息。 35、所有带图片组属性的组件选索引时支持直接通过选取图片组的方式输入。在索引项目后多了一个按钮,点击按钮后弹出图片组预选窗口,直接选中图片即可。 36、扩展界面库一中的树型框增加了“右键单击项目”事件。 37、系统颜色配置里面新增了“窗体设计器背景”项。 38、编译时实施了严格的重复名称检查,编译选项中新增“严格的重复名称检查”选项,为了兼容以前的程序,默认为不选中,建议将其选中。 39、支持库列表中增加排序功能,可按拼音顺序排列支持库。具体是支持库面板的鼠标右键菜单中增加“排序”子菜单。 40、核心支持库中的“窗口”数据类型增加了“置父窗口”方法。 41、核心库中的“数值转换”类中新增了“到字节”、“到短整数”、“到整数”、“到长整数”、“到小数”命令。 42、核心库中的“位运算”类中新增了“左移”、“右移”、“合并整数”、“合并短整数”命令。 43、核心库中的“变体型”数据类型新增“取字节集”方法,并且其“赋值”方法支持置入字节集类型数据。 44、核心库中的“载入”命令被改进,当以对话框方式载入不可视窗口时,不再强制显示并等待,而直接返回, 然后可以通过设置该窗口的可视属性为真来显示该对话框。此改进后,可以进行以下操作: 载入 (窗口1, , 真) 窗口1.标题="演示" 窗口1.可视=真 45、核心库中的“从字节集转换”命令更名为“取字节集数据”,并增加一个参数,以支持从字节集中随意取出部分数据。 46、核心库中的“打印机”对象有所改进,并且增加了四个方法用作在Windows2000/NT/XP下设置自定义纸张类型。 47、“支持库配置”对话框上方加入了查找功能。 48、“支持库配置”对话框下方增加了删除支持库按钮。 49、“系统配置”对话框内“颜色配置”部分增加了“导入”按钮。 50、左侧支持库列表中数据类型部分列入了成员事件并加入了全面的提示。 51、属性表下方的事件组合框内对已有事件子程序的事件进行了标记,并将自有事件和固定事件分开。 52、鼠标指针属性新增“手型”类型。 53、对列表式组件箱进行了排序。 54、窗口设计器中右键单击组件后所弹出的菜单内新增了“查看数据类型定义”菜单项。 55、组件右键菜单中加入“锁定”和“解除锁定”菜单,锁定组件时只能使用键盘的光标键移动或使用SHIFT的组合改变大小。 56、当前系统正在编辑一份易程序时,双击打开新易程序时,会弹出询问对话框,用户可以选择重新启动一份易语言系统打开程序。 57、输入备注时不再有提示框出现。 58、单行编辑框文字垂直居中。 59、恢复了调试变量表。 60、恢复了在行尾回车时自动询问增加未定义的变量、子程序、常量名(仅当“输入新语句后自动检查语法错误”系统设置被选中时有效)。 61、打印机对象改正了默认纸张的设置问题。 62、核心支持库增加“置错误提示管理”命令,用作支持用户自行提示严重错误信息。 63、核心支持库中的“选择夹”组件增加了“是否填充背景”、“背景颜色”两个属性,用作解决“隐藏自身”属性为真时选择夹内 一些子组件的刷新问题。 64、系统的“程序”菜单中新增“重新名称关联”菜单项。 65、加入了源代码加密功能。 66、核心库中“服务器”组件的“取回客户”方法支持在“数据到达”事件中使用。 67、核心库中“媒体播放”类别中增强了对MP3播放的支持。 68、核心库中“系统处理”类别中增加了“多文件对话框 ”命令。 69、编译器所支持语法格式改进,返回值支持直接引用其成员,如“a.方法1 ().a1.方法2 ()”语句格式现在已经可以使用。 70、系统的“工具->系统配置”菜单中新增“目的程序安全”选项夹。 71、系统的“编辑”菜单中新增“到最近修改处”菜单项。 72、改进了各种编程语言对易语言DLL的调用支持。 73、新增扩展界面支持库六、DirectX3D支持库。 74、自定义鼠标指针支持彩色。 75、易模块管理功能被去除,支持新的易模块引入功能,且易模块公开支持项目增多。 76、系统自带易模块中新增3D图形引擎支持易模块。 -------------------------------------------------------------------------------- 易语言3.8正式版(修正第二版)相对于3.8测试版的改动部分: 1、支持开发并使用易语言向导程序,具体例程请见lib\ewizard\samples目录下的“应用程序向导.e”及“API助手.e”文件。 2、源程序编辑窗口右键菜单中新增“收缩屏蔽”功能,可以用作一次性屏蔽大段代码。 3、系统不再默认载入所有支持库,而必须在支持库配置中指定。 4、源程序的载入速度得到提高。 5、推出了以下新的支持库: 易向导支持库 农历日期支持库 远程服务支持库 扩展界面支持库三 互联网服务支持库 邮件接受支持库 多媒体支持库 表格支持库 超级菜单支持库 保密通讯支持库 办公组件支持库 另外,图表支持库和表格支持库现在支持和打印机对象合作打印。 -------------------------------------------------------------------------------- 易语言3.8测试版相对于3.7正式版的改动部分: 1、支持完全的面向对象编程,可以在程序中定义并使用对象。 2、编写DLL时其中的公开子程序可以接受文本数据类型参数,且可以返回文本和字节集型数据。 3、支持源程序代码的收缩和展开(操作方法:选中程序块后单击右键选“收缩”菜单项,在子程序头上可以直接左键单击子程序名左边的减号)。 附,易语言面向对象开发特性简要说明: 1、易语言支持类的构造、析构、继承、虚拟方法、多态、封装特性。 2、对象的构造: 构造顺序为:先构造基类对象,再构造其继承类对象,如果类中具有对象成员,则先于其所处对象构造。 3、对象的析构: 析构顺序为:先析构继承类对象,再析构基类对象,如果类中具有对象成员,则在其所处对象后析构。 4、继承: 任何类均可以指定另外一类作为其基类,继承层数不限。 5、虚拟方法: 在基类中的方法可以被其继承类中的同名方法覆盖,当调用此方法时,系统自动根据所调用的对象 实体去调用对应的方法。 6、多态性: 可以将一个继承类对象赋予到其基类数据类型变量中,此时对此基类对象变量进行操作,将反映出继承类对象的特性。 7、类的封装: A、类的所有成员数据变量只能由该类本身的方法代码所访问,属于私有性质。 B、在继承类中可以以“类名.方法名”的方式指定访问基础类中的方法。 C、只有标记为“公开”的方法才能在类代码外部通过该类的对象实体来访问。 -------------------------------------------------------------------------------- 易语言3.7正式版相对于3.7测试版的改动部分: 1、编辑环境可以打开未安装对应支持库的易语言源程序。 2、“内码转换”支持GBK与日文内码SJIS之间的转换。 3、核心支持库中的“对象”数据类型增加了“取接口”方法。 4、“到字节集”、“到文本”命令被增强。 5、“数值到人民币”改名为“数值到金额”。 6、“取系统语言”命令支持linux,并增加日文类别。 7、“取操作系统类别”命令支持linux。 8、所有COM封装对象的“取子对象”方法更改为“取接口”,并增加一参数以取出指定接口。 9、改进后的packcom工具,用3.7测试版中的packcom生成的npk请使用本版本中的packcom打开后保存,以进行转换。 10、对测试过程中发现的所有问题都已经纠正。 -------------------------------------------------------------------------------- 易语言3.7测试版 相对于 3.6 正式版的新增功能: 1、对微软COM技术的全面支持,包括ActiveX组件、OLE自动机、COM类型库等等,详细说明请见ESDN帮助 2、跨平台的网络通讯支持库 3、跨平台的Mysql数据库支持库,且功能全面加强 4、跨平台的多线程支持库 5、EXCEL2000支持库(直接操作Excel) 6、WORD2000支持库(直接操作Word) 7、PowerPoint2000支持库(直接操作PowerPoint) 8、数据图表支持库(柱形图,饼形图、曲线图) 9、脚本语言支持库(可以运行VBscript Jave script等脚本) 10、文本语音支持库(提供对文本转语音输出以及语音识别的支持) 11、易语言支持库在运行时支持动态加载 12、枚举常量的支持(详细说明见ESDN帮助) 13、更新了setup安装程序(即菜单"编译生成安装软件"的功能改进,解决了反安装时删除全部目录的问