免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 蔡万钊

一步步实现QBASIC编译器 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
发表于 2013-01-08 01:49 |显示全部楼层
插个楼,QBasic未必就比Go好,虽然我也完全无法适应Go的语法………………

QBasic因为历史原因,其类型系统还是非常原始的。缺乏能提供足够灵活性的一些特征:比如模板,或者类型推导,而Go在这方面就很现代了。

如果要在QBasic里面做类型推导,就不是单纯词法语法分析那么简单了,需要做到语义分析,这就是现代编译器的一个大难点。即使是C++11也已经带上了一些语义特征了(最直接的也是最浅显的一个例子,C++写模板声明已经不需要在嵌套尖括号之间打空格了,这就必须涉及到对一个语句本身语义上的理解)。

所以,如果要做一个真正在现代有实际价值的编译器,那么最起码还是需要做语义分析才行。这是最最前提的条件。

而其余的东西,都是有很成熟的理论了,基本上照本宣科即可。如同你写的代码,实际上也只是将语法整个写出来,然后交给别的工具去生成而已,未必就有多少技术含量,然而理解这些东西是如何把语法的描述格式具体变成分析代码的,这才需要技术——虽然是很成熟的技术了。

举个例子。你用了lex是吧?Lua的早期版本就是用lex&yacc做分析。后来因为编译效率的原因,改用了纯手写lex&parser。为什么呢?这就是理论的先进性了。通常《编译原理》教程上都说递归向下是很原始的语法分析器,而LL(1)LR(1)甚至SLAR(1)这些才是所谓的“先进”分析器。这已经是老黄历了。事实证明yacc的LR(1)和lex的LL(1)就是比递归向下慢——虽然递归向下在理论的时空分析上比上述算法慢,但是它的常数小,没有语法栈词法栈状态机什么的。所以实际上它就是比这些东西要快速。之所以clang宣称编译比gcc快好几倍,就是因为它是手写的语法/词法分析器而gcc是用的lex&yacc。

这也就是说,虽然看起来这样可以很容易地写一个编译器了:前端有lex&yacc,后端有llvm,但是实际上,如果不懂这些东西基本的实现原理,你写出来的东西还是没办法和现代的编译器如Go或者clang比较,而只是图个热闹罢了。

这让我想起来前几年的《十分钟建站》什么的文章,看上去好像很酷,实际上却只是教你如何使用别人做好的积木而已。这样子永远不会进步,而如果因为有了这种堆积木的能力就自信自大起来,那就真无药可救了。我大学里面就听说一哥们就很狂妄,学了Python啥都不怕,啥东西都简简单单能搞出来,但是只要他用的积木出问题了, 那么就没辙了,最可怕的是他还会将这种本质上是自己的知识浅薄或者无能怪罪在其他的东西上面。这种扭曲与其说是中国特色,倒不如说是类似暴发户的无知。

就如同现在中国人的普适价值观就是挣钱养家糊口,倒不是说是错的,但是如果人就是为了这些而活着,那和猪狗有什么区别呢?虽然活着才能谈价值,但是如果是以这种心态来奋斗的话,即使最后得到的东西远远不止可以挣钱养家糊口了,最终他们依然无法创造出符合其身份的价值。中国IT行业的怪现状,乃至于所有行业的怪现状,包括所谓的体制问题,都是由此引起的。

其实TG的理论虽然错漏百出,但是放在实践上,“科学的发展观”倒的确是非常必要的。然而很多人就都没了这种发展观,身价百万千万上亿还要在目视所及的地方放慢食物才会安心,有了大笔钱还要做纯金衬衫才满意,不能不说是一种讽刺。

倒不是说你的教材不好,虽然就我看来,在现在这种阶段,与其发明语言/写编译器,不如完全吃透一种语言的内在思想。但是,你所写的东西,恰巧就是去吃透一种思想的第一步。所以我还是很支持你的。就是希望在做了这些之后,能够再进一步,去深挖,而不是很浮躁地说“哇哇看我做了一个QBasic!我明天再做个javascript!后天我做个Python玩玩!!”这样就完全没有意义了。从QBasic的实现看其的设计思路和演变,看其不足,然后结合他的演变去追逐现代的设计思想和理念,最后将之超越,这才是“科学的发展观”。

说白了,就是用深度优先搜索的思路去探究和学习,而千万别用广度优先搜索了。

@Ager,你怎么看?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:11数据库技术版块每日发帖之星
日期:2015-08-30 06:20:00
发表于 2013-01-08 12:25 |显示全部楼层
不錯,我也是寫 QBASIC 編譯器的時候更加深入的瞭解了 C++語言,知道了C++語言的一些設計原委。如果不寫編譯器,一輩子都不知道爲啥 C++要這樣設計。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
发表于 2013-01-09 03:46 |显示全部楼层
本帖最后由 Ager 于 2013-01-10 19:08 编辑

既然SW大虾召唤了我,我就随便扯扯,效颦耳。

starwing83 发表于 2013-01-08 01:49
需要做到语义分析,这就是现代编译器的一个大难点。

所以,如果要做一个真正在现代有实际价值的编译器,那么最起码还是需要做语义分析才行。这是最最前提的条件。


而其余的东西,都是有很成熟的理论了,基本上照本宣科即可。如同你写的代码,实际上也只是将语法整个写出来,然后交给别的工具去生成而已,未必就有多少技术含量,然而理解这些东西是如何把语法的描述格式具体变成分析代码的,这才需要技术。

十分赞同!

语义分析,是最最核心的技术之一(也是最最困难的实现之一)。不过很遗憾的是,它也往往也是容易被忽略的,同时,对它的误解也很多 —— 比如,我在以前的帖子里,就提到过:有些从BASIC等解释型语言过渡到C这样的编译型语言的学生,或者那些从依赖IDE过渡到CLI/CUI编程环境的学生,对于“编译”二字常有玄奥之感,于是去阅读《编译原理》一类的书籍,但一读却发现里面全是词法分析、语法分析、语义分析、正则语言、自动机、有限状态机等等这样的对于他们来说十分抽象的内容,于是只要就此作罢;事实上(被遮蔽的事实是),他们关心的、能够满足解决他们困惑的知识,应该是属于《程序员的自我修养》那一类的。

对于计算机编程语言这种形式语言的语法分析与语义分析,可以溯源到对人类自然语言的分析学科上,比如现代一般语言学(比较细分的大类又有:语音学、语法学、语义学等等)(在中国传统文化中,还有音韵学、训诂学等等),以及后起的数理语言学(Mathematical Linguistics)。后者是传统语言学与现代计算机科学的重要结点之一,由此,计算机科学与语言学相互渗透直至糅合、彼此敦促。

语言学上的许多观念、被观察到的许多现象、以及这门学科本身的方法,对于计算机科学尤其是语义分析这个领域,具有非常重要的参照意义。

首先,可以提到的是:我们生活在自然语言的世界中,我们各人的语言/言语系统(器官)几乎无时不刻地不在进行“语义分析(与语法分析不作区分)”工作(即便做梦时亦是如此)。但这种工作,与对于计算机编程语言的语法分析与语义分析,两者之间有着天然的迥异:

我们在自然语言世界的生存当中,通常不需要完整地闻听或阅读一个单词、句子甚至段落直至它们全面的结束,就可以非常准确地理解或把握被听或被读的对象的意义。而另一方面,我们接受这些对象,也并非“逐音素”、“逐单词”、“逐句子”、“逐段落”的进行,我们通常是同时“一勺子”@KBTiller语)“吃”进若干个元素并同时“消化” —— 也就是说:我们对于自然语言的接受,“粒度”是很粗(很大)的、“原子”的边界是十分模糊的。甚至有时候,我都在这麽想:

在自然语言的单位元素被接受(或解释)的过程中,(单位性的/原子性的)时间是没有意义的 —— 只有发生了意义的跃迁,时间才呈现出来。

而计算机(并非作为读者的人)对计算机编程语言的语法分析(还不是语义分析),却完全不是这样。语法解读的“探针”,在某一时刻,所能触及到(或处理)的元素是孤独的、原子性的,“原子”的大小是确定的(经由词法分析确定),“原子”的边界是绝对明确的 —— 而另一方面,在“探针”随着时间维度向下前行的过程中,接下来要触及的元素,是不可预知的,关于一个段落的准确的语法上的意义或是否符合语法的判别,直到语法分析完成了一个诸如自动机的机构上的全部(可行的)动作后,才能确定。

从这个意义上说,计算机对计算机编程语言的语法分析(还不是语义分析),比我们对自然语言的解读,要困难(不自然)得多,也违悖我们的寻常体验,但我们却要实现它!

第二,计算机编程语言本身的设计,显然要先于编译器对由前者编写的代码的语法分析与语义分析。不同编程语言之间的,关于设计理念的争端,通常与语言本身优劣的争执或评判如影随形。

而在这个问题上,不论是作为代码读者的人,还是计算机(编译器/实现机构),都会遇到难题。在C语言中,一个最具代表性的问题,就是由语言保留字“extern”的语义地位所引发的“定义性声明”vs“引用性声明”之胶着 —— 这是C语言极少的固有缺陷中最大的之一。

如何在语言的设计和与之不能割离的编译机构的设计上,规避类似胶着(有时候甚至需要为用户布置“方案”/“模型”,这实在是亡羊补牢、实为无奈之举),需要重新审视语言在其语义要素上的正交性,即用少量的基本要素实现复杂与庞大却无歧支的语义结构。

这跟自然语言世界里的现实相比,仍然是困难重重,但却可以藉由后者得到相当的启发。

就拿我的那篇帖子《“波”的读音?》http://bbs.chinaunix.net/thread-4061774-1-1.html里所涉及的例子来说。

如在英语单词“Spam”的发音(选项3)现象所揭示的:位于单词打头的s后面紧跟着的p的寻常发音应该是:清音(声带不震动)且不送气(跟汉语单词“示波器”中的“波”的情况一致)。

但是,若将“Spam”的p发成清音且送气(跟汉语单词“滑坡”中的“坡”的情况一致)—— 许多中国学生就是这麽发的 —— 英语使用者(以英语为母语的人)也不会觉得有什么问题。

甚至,将这个p发成浊音(声带振动),不论是不送气(如英语单词“Base”中的b)还是送气(这比较罕见,英语中寻常不存在这种状况),英语使用者也不会觉得有什么问题,尽管或许他们觉得听起来“有点怪”。

上面说到的“不会觉得有什么问题”,其真确含义是:语音的接受者,不会因为该音素发了“不标准”的音,而误解了发音者的意思。

也就是说:在英语中,通常紧接在/s/后面的唇塞音(Bilabial Stop Consonant),不论怎么发(是清或浊,是送气或不送气),都没有辨义作用

如果若干种发音,没有辨义作用,则我们说:它们是同一音位(Phoneme)的。

音素发音不同却可以被当作同音位的例子,在各种语言中,都是普遍存在的。

比如,对于南京人来说:/l/和/n/是混用的,即齿龈边音与龈鼻音不分(湖北话中也有类似情况)。南京人把“牛奶”说成“liulai”,不会影响南京人对该词义的理解。

那么,对于南京话来说,/l/和/n/就是同音位的。

目前,在网络亚文化中流行的,如将“泪流满面”写作或念作“内牛满面”、“拉风”作“拉轰”、“少年”作“骚年”、“这样子”作“酱紫”、“Thank you”作“3Q”等等现象,就是一种“构造同音位”的做法,并且实现了一种“超修辞”的手段 —— 这种“构造同音位”的方法,有的是基于或源于方言(如“内牛满面”、“拉轰”、“酱紫”),有的是受外国语的影响(如日语中“しょうねん”的读音->“骚年”),有的则是因为汉语音素的限制(如“Thank”->“3-k”)。

那么,一对不同的音素,在某些语言里是同音位的,在另一些语言里却是对立的不同音位,这也显而易见,比如:

对于汉语使用者来说,/s/(清龈擦音)和/θ/(清齿擦音)是不分的,比如有人把“三”发成/θan/,不会影响辨义,最多就是被人当作“大舌头”罢了。

但是,对于英语使用者来说,/s/和/θ/是可以用来辨义的一对不同音位,单词sank(动词下沉的过去式或名词水槽)和thank(动词感谢)的意义完全不同。

可见,音位,是一种语义和心理学上的范畴,而不是音素的。

值得注意的是:音位现象,还体现了一门语言在音素的分配上的策略

比如:经过观察,我们不难发现,在汉语普通话中(用汉语拼音标识):

能够和/j/、/q/、/x/这三个(龈颚擦音)声母搭配的韵母,只能是以/i/或/ü/开头的;这三个声母它们不能接/a/、/e/、/u/(/w/)开头的韵母。

而能够和/z/、/c/、/s/这三个(齿龈擦音)声母(以及它们的卷舌音/zh/、/ch/、/sh/)搭配的韵母,只能是以/a/、/e/、/u/(/w/)开头的;这三个声母它们不能接/i/或/ü/开头的韵母。

即/a/、/e/、/u/和/i/、/ü/这五个韵母,被分为前后两组,不重叠地分配给了/z/、/c/、/s/和/j/、/q/、/x/这两组声母。

那么,就可以认为:/j/、/q/、/x/分别与/z/、/c/、/s/,是同音位的(不同变体而已)。

这也就是,在汉语拼音中,/xüe/可以被正字法(简化)为/xue/,以及/zhʅ/可以被正字法(借字母i)为/zhi/的合理性 —— 因为不存在真正发/xue/和/zhi/的音。

回到英语单词“Spam”,这里的p,它正确的发音即不送气的清音/p=/,与p位于重读音节开头(如英语单词“Programmer”中的p)的发音即送气的清音/p'/,二者可以混用,即它们是清唇塞音的同音位 —— 让它们得以同音位(即不会影响辨义)的关键因素是:发/p=/音,当且仅当p紧接着打头的/s/之后。所以,国际音标IPA也允许用同一个不加符号的字母/p/来兼表二者。(浊唇塞音则是用/b/。)这也说明了:国际音标IPA是一套音位音标,而不是音素音标。

这里顺带可以解释了:基于威妥玛式拼音,“台北”被拼作“Taipei”,“北大”是“PKU”而不是“BJU”的合理性。

再回到C语言的“extern”问题。

“extern”是一个具有“同形异义”特征的词法元素或语法元素,在不同的处境中,就可能是不同的语义元素,或者说它将在不同的语义实现中扮演不同的角色。

如何为编译机构、读者与编程者消解胶着?

从编译器的角度来说,它通常需要将其视野在代码空间上扩张得足够大,因为语言标准为这个存储类别指定符之使用场合的限定是比较小的 —— 后者在这方面的限定越小,前者的视阈就被迫地要扩张得越大。

从读者的角度来说,除了基于临场经验之外,处理的原则大体同上。

而对于编程者,则可以“紧贴着语言标准的墙角小心行走”,选择性地施行某种方案或模型,也就是自己给自己(或Teammates)约定。

而如何从语言设计的本身,消解胶着,则可以借鉴自然语言的经验,比如音位现象。

音位现象可以给予我们的启发是:

(1)词法元素或语法元素在外观上的多样性,可以不妨害对语义的准确理解 —— 当且仅当不可能存在的(错误的)语义可以被轻易地、直观地(显式地)剔除。

(2)由于存在“分配”现象,又可以减少词法元素或语法元素的设置(降低它们的数量) —— 即约减掉为不可能存在的(错误的)语义服务的词法/语法元素。

以上,仅供参考,其中恐怕难免错误的概念和拙劣的见解与馊主意(虽然我已经竭尽全力去避免了),还请@蔡万钊@starwing83等诸位大虾指正,呵呵 ——

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
发表于 2013-01-09 06:43 |显示全部楼层
本帖最后由 Ager 于 2013-01-09 06:46 编辑
starwing83 发表于 2013-01-08 01:49
其实TG的理论虽然错漏百出,但是放在实践上,“科学的发展观”……


接着,谈谈“科学的发展观” —— 我的着眼点从“科学的”三个字开始。

理解TG在各个历史阶段发明出来的命题,是一件很有意思的事情。(就连“各个历史阶段”这几个字,也是这类命题之一。)

游客,如果您要查看本帖隐藏内容请回复


学生也可以藉由这个思路,很顺畅而不枯燥地理解与识记《马哲》、《毛邓三》等思想政治课中那些命题。理科学生也可以在这些科目上轻松地考出高分!

甚至,我们可以由此追溯到2200多年以前的先秦 —— 诸子百家之争鸣现象。

不少有识之士,都十分尊崇以老庄为代表的道家思想。

老庄的思想,真比孔孟、韩非、墨翟的更优越吗?

我看未必那么简单。我的意思是:如果老庄的思想的出现时机,不在百家争鸣,其思想倒可能更有价值(我当然不是藉此否定道家思想固有的价值,如果它真有价值的话)。换言之,“百家争鸣”,在乎于一个“争鸣”的“争”字。

在那个时代,一家学说,为了占据话语的Summit以及凸显自己的Reasonability,势必对别家学说的关键要素进行有力的Reaction,所谓“有的放矢” —— 请别误会,这种“争”,绝对不是坏事。

具体说来,这种“地位之争”十分自然地萌发了这麽一个过程:将原来不自觉的思维方式,提升到一个可以被自觉的、被反省、被归纳、被范畴化(形而上)的高度 —— 这对于人类思想的迭进,起着至关重要的作用。

令人惋惜的是,“百家争鸣”当中这种你来我往、当面锣对面鼓的Reaction,到了后世,被人为地给halt掉了,导致了中国传统文化,始终无力迈进高度的形而上学,自然也就无法媲肩于希腊哲学了。

然而,更多为人类思想做出卓绝贡献的Reaction,并非是以Summit之争为动机的。

比如自希腊哲学开端以来就成为主轴的“唯实论”vs“唯名论” —— 后者就是前者的一种Reaction。

不过,在这种Reaction冲突之中,哲学家们大多始终保守着基本的伦理精神,如“吾爱吾师,吾尤爱真理” —— 我所想强调的是:这里的“爱吾师”总是“爱真理”的前项。

在这里,我想强调的是:Reaction现象对于命题的提出,总是先导性的。

换言之,理解一个命题,不能割绝了它的发生现场;命题的价值与意义,只有被还原到它被提出来的现场中,才能更加生动地呈现出来。

在对基督教历史,尤其是教义神学的考察中,这也同样十分重要。

当代的基督教福音派,把“因信称义”作为基要教义,因为使徒保罗在《罗马书》的第3-4章“强调”了这一点(如果单纯从文字上理解的话),更因为马丁路德藉由前者实现了宗教改革与基督教新教(抗罗宗)的缔造。

但如果无视“因信称义”不论在使徒保罗时代还是在宗教改革时代的被提出来的历史处境的话,高举“因信称义”的旗帜,恐怕只能是一种对基督信仰的误解。—— 这种误解的确发生了,并且延续了几百年,滋生出了无数稀奇古怪、匪夷所思、违悖常理的学说(比如“正是因为不合理,我才相信”云云)。

我们应该尽可能地回到事发现场:

使徒保罗之所以在《罗马书》第3-4章“强调”“因信称义”,那是为了Reaction犹太教的传统:割礼。

马丁路德之所以高举“因信称义”,那是为了Reaction罗马天主教当时的“赎罪券”制度。

在不同时期,信仰的捍卫者,面对的宗教境况是不同的,自然体现出不同的诉求。但把这些诉求,从历史真实中抽离出来,提纯为一种形而上的教义,是相当缺乏灵性的。

用保罗自己的话说:

你们若是与基督同死,脱离了世上的小学,为什么仍像在世俗中活着,服从那“不可拿、不可尝、不可摸”等类的规条呢?
这都是照人所吩咐、所教导的。说到这一切,正用的时候就都败坏了。
这些规条使人徒有智慧之名,用私意崇拜,自表谦卑,苦待己身,其实在克制肉体的情欲上,是毫无功效。

—— 《歌罗西书》2:21-23

理解福音书里所记载的耶稣的教导,也应该回到他所面临的宗教处境。耶稣曾说:

“我又告诉你们,若是你们中间有两个人在地上,同心合意地求什么事,我在天上的父,必为他们成全。
因为无论在哪里,有两三个人奉我的名聚会,那里就有我在他们中间。”
—— 《马太福音》18:19-20

有的信徒,为了祷告能够“灵验”,自以为遵照基督的教导,特地要再拽上一两个信徒,然后“要求”他们必须与自己“同心合意”,又要“奉主的名”。

其实,耶稣这样的教导,不应该割绝了当时的宗教处境去理解。

当时的宗教处境是:按照犹太教的法规,崇拜上帝的聚会与祷告,必须在圣殿与会堂(有规模数量的会众参与)中进行。

而耶稣所说的“两三个人”,其实就是“很少很少的人”的意思(Reaction犹太教所规定的地点与人数),哪怕仅仅是一个人,不论身处何时何地,都有资格祈求上帝与他/她同在 —— 正如以色列人所认为的那种上帝仅仅在圣殿中才有的与他们的同在一样。

总结一个事情,就是:无论对于什么文本,原本的意义能被正确地呈现,总不能脱离了它的处境。

除了现象,没有本质,一切都应该回到事情本身的现场。

是为 „Zu den Sachen selbst!“

呵呵,以上,仅供参考 —— {:3_193:}

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
发表于 2013-01-09 20:19 |显示全部楼层
蔡万钊 发表于 2013-01-08 12:25
不錯,我也是寫 QBASIC 編譯器的時候更加深入的瞭解了 C++語言,知道了C++語言的一些設計原委。如果不寫編譯 ...


赞,支持楼主 {:3_193:}

论坛徽章:
8
2015年迎新春徽章
日期:2015-03-04 09:58:112015元宵节徽章
日期:2015-03-06 15:51:33数据库技术版块每日发帖之星
日期:2016-06-09 06:20:00数据库技术版块每日发帖之星
日期:2016-06-10 06:20:00数据库技术版块每日发帖之星
日期:2016-07-20 06:20:0015-16赛季CBA联赛之同曦
日期:2016-07-21 21:26:51数据库技术版块每日发帖之星
日期:2016-07-23 06:20:00数据库技术版块每日发帖之星
日期:2016-07-26 06:20:00
发表于 2013-01-11 20:49 |显示全部楼层
看看。      

论坛徽章:
0
发表于 2013-01-15 17:50 |显示全部楼层
一步步实现QBASIC编译器

论坛徽章:
0
发表于 2013-02-11 23:43 |显示全部楼层
Ager的高论让我云里雾里,
不过知其然也要知其所以然,这一点我很赞同

论坛徽章:
0
发表于 2013-03-22 12:36 |显示全部楼层
谢谢分享!!!!:wink:

论坛徽章:
0
发表于 2013-04-01 14:15 |显示全部楼层
大侠膜拜啊。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP