网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月01日
漏签
0
天
c语言吧
关注:
799,001
贴子:
4,353,018
看贴
图片
吧主推荐
视频
游戏
1
2
3
下一页
尾页
85
回复贴,共
3
页
,跳到
页
确定
<<返回c语言吧
>0< 加载中...
【新手教程】不详细解释→_→如何printf "Hello World"(*^﹏^*)
只看楼主
收藏
回复
汇蓝鸟
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
1L面码(*^﹏^*)
XX_GhOsT
团子家族
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
前排。。。
汇蓝鸟
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
方法一:
第一步:打开VS20??新建一个项目
第二步:包含stdio头文件
第三步:打上主函数
第四步:printf("Hello world")
于是代码是这样的
#include <stdio.h>
int main()
{
printf("Hello World");
}
折心灬小轩
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
蓝鸟也无聊了?
贴吧用户_0V58V2D
团子家族
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
汇蓝鸟
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
方法二:
类似于这种东西→_→
因为虽然不复杂但是代码量还真不少(⊙_⊙),下面就说说这个东西的基本原理吧
汇蓝鸟
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
其实那个贴子我真的没有卖萌=口=,很多人也第一眼就认出了这是一个脚本语言,或者说脚本引擎
我就不过于详细的说明了,做这个东西我参阅了下面几本书
《游戏脚本高级编程》
《编译原理》
《80x86汇编语言》
《C++高效编程与性能优化》
第一本书是本神书,按老大的话来说就是 脱光。。哔....也要买一本的书((⊙_⊙)没钱只买了影印版),里面有一个脚本引擎的完整的构架过程,我的hello world大部分也是按照上面的思路写的,后面几本就是一些基础知识与优化的技巧,因为脚本解析和虚拟机已经让性能大打折扣了,所以必须对它做出一些优化,因为第一本书里给的源代码几乎没有做任何的优化,不知道是不是我的问题,我搜到的源代码居然是有错误的(在绝对堆栈索引与相对堆栈索引的定位的那一段)而且很多地方看着也不舒服,比如调用注册函数的那一部分,因此最好看完书后自己重新写过一遍,并且用汇编 SIMD进行优化,当然,在知道其工作原理能够自己写一个脚本引擎的情况下,在实际项目中最好还是使用像lua py之类的现有脚本,毕竟他们是专业的而且优化的99.99999%会比我们的好,在游戏编程中我们不希望再在这里损失性能
晓晓默契
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
——他们说的节操满,是我记忆中,那段年华背后的纯情
汇蓝鸟
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
简单而言一个脚本引擎分为编译器和虚拟机,编译器负责将脚本编译为二进制文件,创建相应的函数表,字符串表与指令流并可以设定堆栈大小与线程优先级别并且能够检测出语法/词法的错误,虚拟机读取二进制文件,,分配堆栈空间,剖析操作数,为每一个线程分配时间片,然后执行指令流,同时它必须提供相应的API供注册API函数以实现脚本与程序的交互
个人你认为编译器的难点在于如何做出正确的语法分析,至于递归下降这种算法因为大家都知道所以倒不是什么难点,虚拟机或者说整个脚本引擎的难点在于如何保持堆栈平衡,因为稍不注意就会导致堆栈被破坏
汇蓝鸟
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
先说说编译器,比如下面这段代码
function Menma
{
value Text
mov Text,"Hello,World!!!\n"
push text
CallAPI PrintfText
}
首先我们需要创建像编译原理说的那样,将每一个词分开,比如说第一到三行function,menma,{,value,Text我们需要将它们分割开来,这样一说也很简单,我们规定空格,逗号,换行,大括号,小括号....为分隔符然后将它们一一分开,其中空格,换行之类的在读取之后就可以扔掉了
接下来我们要将他们分类,我们创建一个叫关键字表和指令集的东西,将他们进行筛选,比如我这里规定function是一个函数的开始,value是变量声明的开始,{是函数指令的开始,而}就是函数结束的标志(不支持内联函数),而mov push callAPI是指令集的助记符,所以他们作为指令,而其他的内容就要进行剖析了,比如那个Text,它显然是个identify(标识词),hello world是字符串,因为在它的前面有双引号
因此词法分析的结果应该是
TOKEN_TYPE_FUNCTION
TOKEN_TYPE_IDENT
TOKEN_TYPE_OPERNBRACE
TOKEN_TYPE_INSTR
TOKEN_TYPE_IDENT
........
NEMESIS_T2
团子家族
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
...
专业马克君
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
马克
汇蓝鸟
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
将他们分成块后就好办了,首先我们先要建立各种表
函数表
字符串表
标识词表
标志位表
....
我们还要建立指令集设置各各指令的操作码数量,操作码类型,与各指令对应的操作码....
以便于之后的分析,那么创建表的过程就是语法分析的一部分
比如说你当前开始读取源文件的块,然后你读到了一个TOKEN_TYPE_FUNCTION你明白,按照标准的语法而言,下一个读取的必须是一个TOKEN_TYPE_IDENT,因为它是一个函数的名字,所以一抛出一个TOKEN_IDENT_EXPECT然后读取下一个块看它是否是一个Ident,假如不是,就抛出一个错误,假如是,继续分析,然后取得函数名后,接下去不能跟别的东西了,所以你读取下一个“字符”也可以说是TOKEN _TYPE_NEWLINR,它必须是换行,假如不是,抛出错误,是,跳到下一行继续分析,最后将这个函数的信息写到函数表中,比如它的函数名,局部变量数目,入口指令索引
指令也是一样,首先检测到一个ITOKEN_TYPE_INSTR,然后搜索指令集看这个指令有多少个操作数与对应需要的操作数类型,比如mov指令,搜索指令集后知道操作数有2个,而下一个必须是一个变量或是寄存器,所以抛出一个TOKEN_VAR_EXPECT|TOKEN_REG_EXPECT然后读取下一个块检测................完全符合语法后将它写入指令流
大概类似的云云,当然,这只是编译器中的汇编器,编译器的工作应该是
源文件---》中间文件-----》汇编文件---------》二进制文件,具体的还是看书吧,因为我要上课去了┑( ̄▽  ̄)┍
躺问套
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
要火
cpr98yw01
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
前排^O^ 语法分析在c++ map 容器能实现吗 与编译原理有啥联系吗
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示