??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品无码久久青草 ,欧美777精品久久久久网,99久久精品国产毛片http://www.shnenglu.com/sunicdavy/archive/2017/12/19/215432.html战魂筑战魂筑Tue, 19 Dec 2017 14:04:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2017/12/19/215432.htmlhttp://www.shnenglu.com/sunicdavy/comments/215432.htmlhttp://www.shnenglu.com/sunicdavy/archive/2017/12/19/215432.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/215432.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/215432.html嵌套git库的理
使用git作ؓ(f)源代码管理时Q经帔R要在一个git代码库中从外|获取新的git库,也就是在git库下嵌套另外一个git库。而同时维护两个git库的q程变的非常复杂?/div>
submodule的弊?/span>
常见的做法是使用git 提供的submodule功能。但submodule的管理嵌套git库的l果往往不是我们期望的结果。假设有一个git库叫projectQ在project的某个子目录下还包含一个叫3rd的目录,是另外一个git库?/div>
D:.
└─project
└─3rd
mytext.txt
假设甲和乙都取了project的代码,׃旉差异Q甲通过submodule取到V1版,而乙取到了V2版本。甲乙同时在不同?rd库下q行开发,势必?x)造成不同的运行结果。也怽认ؓ(f)可以在获取submodule时指定版本,但这个获取过E很难控制?/div>
一般说来,W三方库应由ȝ序进行更新及(qing)l护Q一般情况下Q项目没有特D需求时Q不?x)随便更新第三方库到最新版本,因此submodule更新嵌套的git库ƈ不是理想的解x案?/div>
嵌套git库的修改可见?/span>
前面的例子中Qproject git库下?rd的git库中如果有文件发生修改,此时在project目录下,使用sourceTree{git理工具无法识别3rd下的文g修改?/div>
也就是说Q无法将3rd下的修改提交到project的git库中?/div>
l极解决Ҏ(gu)
此时Q?span style="font-weight: bold;">?rd目录下的.git目录暂时Udproject?rd目录Q此Ӟ在project目录用sourceTree查看Ӟ可以看?rd下的文g修改Q提交修改到project库中。再刚Udȝ3rd?git目录Ud3rd目录下,?rd目录下用git statusQ将可看?rd目录的修改,提交Ӟ?x)将修改提交?rd目录?/div>


战魂筑 2017-12-19 22:04 发表评论
]]>在Windows下运行Linux Shellhttp://www.shnenglu.com/sunicdavy/archive/2017/11/27/215373.html战魂筑战魂筑Mon, 27 Nov 2017 07:15:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2017/11/27/215373.htmlhttp://www.shnenglu.com/sunicdavy/comments/215373.htmlhttp://www.shnenglu.com/sunicdavy/archive/2017/11/27/215373.html#Feedback3http://www.shnenglu.com/sunicdavy/comments/commentRss/215373.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/215373.html

来多的h选择用Mac或者Linux环境q行跨^台项目开发。但是仍然有大部分h?fn)惯于在Windows环境下进行开发,毕竟Windows在各斚w使用q是较ؓ(f)方便Q特别像文g版本理QGitQSVN{)(j)

在跨q_下开发游戏或软gQ就需要有一套方便的自动化工兗Windows下需要用批处理Q虽然有PowerShell加持Q但q东西学了也不靠谱,只有一个^台能用。大家还是习(fn)惯Linux Shell。连Macq_都可以用ShellQW(xu)indows上要做自动化脚本显得非常尴?/p>

我曾l在目中用go~写了一套将配置转ؓ(f)批处理和Linux Shell的工兗用过E较为复杂,但是能跨q_q行表格导出和协议编译等工作?/p>

但是Q这个工兯是需要对不同的^台编写多套模板进行代码生成,非常J琐。如果有一套跨q_的ShellQ编写一ơ就可以跨^台运行那该多好?/p>

查阅资料后,一共有几个Ҏ(gu)Q?/p>

  1. 使用Python作ؓ(f)自动化工?q个Ҏ(gu)其实是使用python把批处理和Shellq的事情用代码来解决。但前提是要重新学习(fn)PythonQ也需要一部分熟?zhn)单的Python语法Qh为学?fn)成本较高,也比较费事?/p>

  2. 自己~写一套独立的自动化工?q个Ҏ(gu)需要长旉的适配q程Q差什么指令补什么指令,寚w目进度有一定干扰?/p>

  3. 自己~写Linux Shell的解释器 q个更难了Q要做到100%兼容Q基本不可能?/p>

  1. 使用Cygwin和Mingw 需要一个微型运行时q行Linux Shell的解释,msys大概?8M左右Q可行性较高?/li>

在研ICygwin和Mingw如何整合的过E中Q我误操作点M一个sh后缀的Linux ShellQ这是我希望让Mingwq行的Shell。结果呢Qsh后缀的文件居然能在Windows下运行。我马上~写了一pd的例子,发现几乎完全兼容常用的Shell指o(h)?l过研究Q我发现Windows下能q行sh文g是由Git自带的msys2提供的。MSYS2 QMinimal SYStem 2Q?nbsp;http://www.msys2.org/Q?/a> 是一个MSYS的独立改写版本,主要用于 shell 命o(h)行开发环境。同时它也是一个在Cygwin QPOSIX 兼容性层Q??MinGW-w64Q从"MinGW-生成"Q基上生的Q追求更好的互操作性的 Windows 软g?/p>

那就是说Q?span style="box-sizing: border-box; font-weight: 600;">只要安装了GitQ?a style="box-sizing: border-box; background-color: transparent; color: #0366d6; text-decoration-line: none;">https://git-scm.com/Q,那么可以在Windows下直接运行Linux ShellQ只需要将文g后缀命名为sh卛_?/p>

问过周边友h是否知道q一功能Q都说知道,只是没有q播而已Q害我研I很?#8230;…



战魂筑 2017-11-27 15:15 发表评论
]]>
使用Visual Studio Code调试Golang工程http://www.shnenglu.com/sunicdavy/archive/2017/04/20/214874.html战魂筑战魂筑Thu, 20 Apr 2017 04:52:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2017/04/20/214874.htmlhttp://www.shnenglu.com/sunicdavy/comments/214874.htmlhttp://www.shnenglu.com/sunicdavy/archive/2017/04/20/214874.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/214874.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/214874.html使用Visual Studio Code调试Golang工程

  • 最单的调试ȝ
  • 多项目调? 适用个h开发和目开?/li>
  • 无需修改pȝ环境变量
  • 准备VSCode

    在官|下载最新版的VSCode:

    https://code.visualstudio.com/

    安装Golang插g

    • 打开扩展面板

      VSCode->查看->扩展

    • 扑ֈGo插g 在搜索框里输入Go, 扑ֈW二行写?Rich Go language support for Visual Studio Code的插? 点击安装

      注意不是排名最高的

    • 重启~辑?/p>

  • 打开调试面板

    VSCode->查看->调试

  • d调试目标

    ?没有调试"的下拉框中点?d配置.."

  • d目标调试配置

    例子:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Launch",
                "type": "go",
                "request": "launch",
                "mode": "debug",
                "remotePath": "",
                "port": 2345,
                "host": "127.0.0.1",
                "program": "${fileDirname}",
                "env": {
                    "GOPATH":"D:/Develop/vscodegolang"
                },
                "args": [],
                "showLog": true
            }
        ]
    }
  • 其中: "port", "host"都是go插g自动生成?/p>

    "env"|环境变? 讄Z的工E目录就可以(包含bin, src的文件夹)

    准备调试插g

    此时扑ֈmain.go按F5, ?x)报错提C?

    Failded to continue:"Cannot find Delve debugger. Install from https://github.com/derekparker/delve & ensure it is in your "GOPATH/bin" or "PATH"

    我们使用go命o(h)行编译调试器

    go get github.com/derekparker/delve/cmd/dlv

    dlv调试器放在GOPATH(工程目录)的bin目录?/p>

    选中要调试的main.go, 点击F5, 既可以开始调?/p>

    调试快捷键和Visual StudiopM?/p>

    • F9 切换断点
    • F10 Step over
    • F11 Step in
    • Shift+F11 Step out

    注意?/p>

    • 某些l构体成员无法直接显C时, 可以直接选中变量? d到监? 或者右键点? "调试:求?

    在launch.json中可以添加多l调试入? 通过调试面板中选中对应的配|开启不同目标的调试

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "client",
                "type": "go",
                "request": "launch",
                "mode": "debug",
                "remotePath": "",
                "port": 2345,
                "host": "127.0.0.1",
                "program": "${fileDirname}",
                "env": {
                    "GOPATH":"D:/Develop/vscodegolang"
                },
                "args": [],
                "showLog": true
            },
    
            {
                "name": "server",
                "type": "go",
                "request": "launch",
                "mode": "debug",
                "remotePath": "",
                "port": 2345,
                "host": "127.0.0.1",
                "program": "${workspaceRoot}/src/server",
                "env": {
                    "GOPATH":"D:/Develop/vscodegolang"
                },
                "args": [],
                "showLog": true
            }
        ]
    }

    "program"中的"${fileDirname}"是以当前选中文g作ؓ(f)启动?/p>

    更徏议?program"?${workspaceRoot}", 以包名作为启动点的方式进行配|?/strong>

    https://code.visualstudio.com/Docs/editor/debugging



    战魂筑 2017-04-20 12:52 发表评论
    ]]>Go语言的冷知识http://www.shnenglu.com/sunicdavy/archive/2016/11/02/214375.html战魂筑战魂筑Wed, 02 Nov 2016 03:09:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2016/11/02/214375.htmlhttp://www.shnenglu.com/sunicdavy/comments/214375.htmlhttp://www.shnenglu.com/sunicdavy/archive/2016/11/02/214375.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/214375.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/214375.htmlappend, map, len不是关键?/h1>

    他们其实q是cd功能, 都在buildin包里? pȝ默认l你做了?/p>

    1. import(
    2. . "buildin"
    3. )

    buildin的包内容都映到全局而已, 其实你也可以用自q包这么做

    打印的另一U写?/h1>

    惌脚本一栯试打印数据么?

    1. println("hello world")

    无需包含M? 因ؓ(f)它在buildin包里

    iota不是黑科技

    q是在buildin包里的定?/p>

    1. // iota is a predeclared identifier representing the untyped integer ordinal
    2. // number of the current const specification in a (usually parenthesized)
    3. // const declaration. It is zero-indexed.
    4. const iota = 0 // Untyped int.

    其实go是有泛型概念?/h1>

    xmap和数l的定义 
    只是泛型没有开攄用户用而已(只许XX攄,不许XX点灯)

    map是支持多个key? 而且很方?/h1>

    q在为多个key转id的复杂算法而头g?

    1. type myKey struct{
    2. number int
    3. str string
    4. }
    5. func main(){
    6. t := map[ myKey] int {
    7. myKey{ 2, "world"}: 1,
    8. }
    9. fmt.Println(t[myKey{2, "world"}])
    10. }
    11. 输出: 1

    枚D是可以{成string?/h1>

    默认定义一个枚?/p>

    1. type MyConst int
    2. const (
    3. MyConst_A MyConst = iota
    4. MyConst_B MyConst = iota
    5. )
    6. func main(){
    7. fmt.Println(MyConst_A)
    8. }

    输出: 0 
    如果我们惌动化输出MyConst_A字符串时 
    需要用golang的一个工具链:golang.org/x/tools/cmd/stringer 
    其下蝲, ~译成可执行工具? 对代码进行生?nbsp;
    生成的代码会(x)多出一个xx_string.go 
    里面是枚D的String()string 函数

    临时转换一个接口ƈ调用的方?/h1>
    1. type love struct{
    2. }
    3. func (self*love)foo(){
    4. fmt.Println("love")
    5. }
    6. func main(){
    7. var chaos interface{} = new(love)
    8. chaos.(interface{
    9. foo()
    10. }).foo()
    11. }

    Golang的receiver实际上就是this的变U实?/h1>
    1. func( self*MyStruct) foo( p int ){
    2. }

    写不惯receiver的写? 如果q样改下?

    1. func foo( self *MyStruct, p int ){
    2. }

    所以ؓ(f)什么说Golangq是一个C语言?/p>

    关于内存分配…

    • new 传入Typecd, q回*Typecd
    • make 可以在分配数l时讄预分配大? new不可?/li>
    • make 能分配数l?map, 但不能分配结构体和原始类?/li>
    • new 能分配数l? map, l构体和原始cd{的所有类?/li>
    • &Type{效于new
    • 切片不需要分配内?make,new), 直接声明可以了…

    Golang的反无法通过一个类型名, 创徏其实?/h1>

    C#有Assembly概念, 可以在一个Assembly里搜? 创徏实例

    Golang是静态类型语a, 如果需? 只能注册你需要创建的l构? 然后注册好的map用于创徏

    Golang可以替换Python来进行复杂的工具程处理

    如果你需要跨q_的工hE处? 对Python不熟(zhn)? 可以使用

    1. go run yourcode.go 参数1 参数2

    方式来进行工具处?nbsp;
    觉得? 可以~译成可执行文g

    q样做的好处: 如果有些cd本n是go写的, Python想用是很麻?ch)? 而Golang来写则轻而易?/p>

    例子: 通过go的protobuf? 对一些文件进行处?/p>

    Golang可以自动持有Ҏ(gu)的接收者实?/h1>
    1. type myType struct{
    2. }
    3. func (self*myType) foo( p int){
    4. fmt.Println("hello", p )
    5. }
    6. func main(){
    7. var callback func( int )
    8. ins := new(myType)
    9. callback = ins.foo
    10. callback( 100 )
    11. }

    做过lua的C++代码l定的童鞋都清楚: lua只支持外部静态或者全局函数调用 
    如果要进行C++cL员函数调用时, 要自己处理this和成员函?nbsp;
    q种技巧因为早L(fng)译器的虚表不同^台实现细节不l一需要专门处?nbsp;
    后面跨^台虚表统一? cL员函数的调用写法也是很恶心复杂的 
    但是Golang的小白式用法, 直接吊打C++, 甚至C#复杂的delegate

    LiteIDE? 多开U籍

    • 扑ֈ 菜单->查看->选项->通用->存储->存储讄到本地ini文g

    • 关闭LiteIDE

    • 复制LiteIDE整个目录, 命名文g夹ؓ(f)你的工程?/p>

    • 每个工程所在的LiteIDE的配|将是独立的, 不会(x)互相q扰

    LiteIDE? 试E序也是可以调试?/h1>

    别以为程序一定要是main开始的才可以调?/p>

    Golang的测试程序虽焉是一个个Test开头的函数,但执行go test? q是有main入口

    在LiteIDE? 可以?调试->开始调试测试程序里q行试E序调试

    LiteIDE? 在Windows上可以输出linux可执行文?/h1>

    go的工具链默认支持交叉~译 
    在LiteIDE? 可以通过切换输出q_, 输出不同q_的可执行文g



    战魂筑 2016-11-02 11:09 发表评论
    ]]>Google Protobuf 3版本介绍http://www.shnenglu.com/sunicdavy/archive/2016/01/25/212739.html战魂筑战魂筑Mon, 25 Jan 2016 06:23:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2016/01/25/212739.htmlhttp://www.shnenglu.com/sunicdavy/comments/212739.htmlhttp://www.shnenglu.com/sunicdavy/archive/2016/01/25/212739.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/212739.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/212739.html本文~写? Google 官方?protobuf 版本?.0.0beta

    下面介绍下proto3的一些细节变?/p>

    Proto3的语法变?/h1>

    语法标记

    q个版本的protoc的protobuf~译器已l可以支持proto2语法和proto3的语?/p>

    如果你的proto文g没有dsyntax说明的话, 用这个版本的~译器会(x)报错, 提示你默认proto2支持, h加语法标?/p>

    syntax = "proto2";

     

    optional不需要了

    只保留repeated标记数组cd, optional和required都被L?/p>

    实际使用证明, required的设计确实是蛋疼, C++的调试版?x)弹出assert,release版和optional也没啥区?/p>

    map支持

    map~写格式?/p>

    map<key_type, value_type> map_field = N;
    例如:
    map<string, Project> projects = 3;
    代码生成认支持map, q对于很多语a来说又可以偷懒了

    字段default标记不能使用?/h2>

    位于proto2语法的字Dnumber后的[default=XX]

    q个东西不能用了, 理由?

    对于同一D序列化后的数据, 如果序列化端的default和反序列化端的default描述不一样会(x)D最l结果完全不一?/p>

    ? 同一个数据两个结? q是不可预测的结? 因此q掉q个Ҏ(gu)?/p>

    不过本h觉得, 对于游戏来说, q个功能本n可以压羃很多数据,虽然?x)有隐(zhn)?/p>

     

    枚D默认g定是0

    proto2里的默认值是枚D的第一个value对应的? 不一定ؓ(f)0

    proto3在你定义value? 强制要求W一个值必Mؓ(f)0

    q个修改为避免隐(zhn)还是有帮助?/p>

    泛型描述支持

    anycd, 可以代表Mcd, 可以先读q来, 再进行解? 没具体用, 步子跨大了怕扯到蛋

    支持json序列?/h2>

    q个极好, json再次被同化了

    增加了多U语a支持

    js, objc, ruby, C#{等

    然? C#版本的基runtime库是用C# 6.0的语法写?q对于Unity mono传2.0来说, 实扯到蛋了,没法?/p>

    Protobuf现在使用CMAKE做配|系l?/h2>

    ~译hE微ȝ(ch), q要下个被墙掉的cmake?/p>

     

     

    W三方库里对于proto3的变?/h1>

    Golang的官方protobuf支持: https://github.com/golang/protobuf

    生成代码中的l构体字D늱型变?/h2>

    对于proto2的文? 生成的go代码中的l构体依然用类型指针作为默认存? 兼容老的pȝ

    对于proto3的文? 生成的go代码中的l构体直接用字D作为默认存? 不再使用GetXXX来作为字DD? 赋值时也无需使用proto.cd() 函数q行指针cd字段值创?

    q个调整很是方便, 但丢׃optional判断功能, 对应C++里就是hasXXX的功? 不过好歹q个逻辑现在用的不多?/p>

    q个修改大概也是配合json序列化来做的, go默认的json序列化时, 无法使用proto2生成的结构体? 因ؓ(f)都是指针,无法赋?.

     

    新版protoc-gen-go的插件会(x)生成descriptor的压~数?/h2>

    新插件会(x)l每ơ生成的文gdq样一D代?/p>

    var fileDescriptor0 = []byte{
        // 220 bytes of a gzipped FileDescriptorProto
        0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x64, 0x8f, 0xcd, 0x4e, 0xc5, 0x20,
        0x10, 0x85, 0x53, 0xbd, 0x35, 0x32, 0xb7, 0xdd, 0x4c, 0x5c, 0xb0, 0x70, 0x71, 0xd3, 0xb8, 0x70,
        0x75, 0x17, 0xfa, 0x04, 0xc6, 0xd8, 0xb8, 0x50, 0x63, 0xa8, 0x2f, 0x80, 0xed, 0x44, 0x89, 0x28,
        0x04, 0xc6, 0xbf, 0x47, 0xf1, 0x6d, 0x95, 0x49, 0x8d, 0x4d, 0x5c, 0x01, 0xdf, 0x39, 0x7c, 0x30,
        0x00, 0x1c, 0x82, 0xdf, 0xc6, 0x14, 0x38, 0xe0, 0xaa, 0xec, 0xbb, 0x37, 0x68, 0x2e, 0x3e, 0x62,
        0x48, 0x7c, 0x49, 0x76, 0xa2, 0x84, 0x47, 0xd0, 0xde, 0x96, 0xf8, 0xee, 0x33, 0xd2, 0x8d, 0x7d,
        0x26, 0x5d, 0x6d, 0xaa, 0x63, 0x65, 0xda, 0xb8, 0x84, 0xd8, 0x41, 0x63, 0xc2, 0x7b, 0xef, 0xc8,
        0x4f, 0x52, 0xda, 0x91, 0x52, 0x93, 0x16, 0x0c, 0x0f, 0x41, 0x89, 0xa9, 0x77, 0x9e, 0xf4, 0xae,
        0x14, 0x54, 0xfc, 0x05, 0xdd, 0x57, 0x05, 0x4a, 0xba, 0xd7, 0xc4, 0x16, 0xb7, 0x80, 0x03, 0x27,
        0xf7, 0xf2, 0x70, 0x72, 0xe5, 0x32, 0x0f, 0xd1, 0x3b, 0xa6, 0x34, 0x5b, 0x31, 0xff, 0x4b, 0x70,
        0x03, 0x6b, 0x43, 0x91, 0x2c, 0x9f, 0x3f, 0xd2, 0xf8, 0x24, 0xf6, 0x7d, 0xb3, 0x4e, 0x7f, 0x08,
        0x0f, 0xa0, 0x3e, 0xf3, 0xce, 0x66, 0xbd, 0x12, 0x49, 0x6d, 0xcb, 0xa1, 0x4c, 0x37, 0xbf, 0xf3,
        0xb3, 0xbc, 0x8e, 0xac, 0x6b, 0xb9, 0xd9, 0xe6, 0x25, 0xbc, 0xdf, 0x93, 0x6f, 0x9e, 0x7e, 0x07,
        0x00, 0x00, 0xff, 0xff, 0x0c, 0x9f, 0x10, 0xa8, 0x2e, 0x01, 0x00, 0x00,
    }

    对于meta信息的提取还是很方便?/p>

    然?/p>

    对于多个文g的生? q样做非常的ȝ(ch), 因ؓ(f)q个字段?x)重复导致编译错?/p>

    很多人在论坛里吐? 官方l出的解x法是, 使用protoc一ơ性传入一个package下的所有的proto直接生成一个go

    而不是现在的一个proto一个go

    生成代码?x)自动注册到全局, q可以方便的查询

    以前q个代码需要自己来? 现在官方提供了支? 很是方便

    然? Z么不支持遍历?D念? 又要自己动手?/p>

    战魂筑 2016-01-25 14:23 发表评论
    ]]>
    ZProtobuf的电(sh)子表格导出器tabtoy开?/title><link>http://www.shnenglu.com/sunicdavy/archive/2016/01/25/212738.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Mon, 25 Jan 2016 06:00:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2016/01/25/212738.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/212738.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2016/01/25/212738.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/212738.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/212738.html</trackback:ping><description><![CDATA[<p>目地址:</p> <p><a title="https://github.com/davyxu/tabtoy" >https://github.com/davyxu/tabtoy</a></p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/212738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2016-01-25 14:00 <a href="http://www.shnenglu.com/sunicdavy/archive/2016/01/25/212738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>git服务器简易搭建法http://www.shnenglu.com/sunicdavy/archive/2015/06/10/210870.html战魂筑战魂筑Wed, 10 Jun 2015 06:53:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2015/06/10/210870.htmlhttp://www.shnenglu.com/sunicdavy/comments/210870.htmlhttp://www.shnenglu.com/sunicdavy/archive/2015/06/10/210870.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/210870.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/210870.html受尽svn各种折磨的小伙伴都听说过git. 但是|上一搜烦(ch), 本来打算跟svn一? 下一个服务器, 装下可以开始用?

    没想到啊, 没想? 居然需要Linux天赋点?/p>

    好吧, 拜鸟哥门下把Linux上手了吧, 刚开始搭git, ? 又需要公钥和各种辅助软g.

    伤不起啊

    很多伙伴们, 自此l箋沉默的l用svn

    我们没有攑ּ, 我们扑ֈ了简(shan)?zhai)搭徏?/p>

     

    先看疗效:

    1. 无需公钥

    2. 只需要几个最常用的Linux命o(h)可以搭?/p>

     

    看步?/h2>

    1. 准备Linux服务? 安装好git(一般都是默认装好的)

    2. 命o(h)行操?/p>

    useradd git   #创徏一个git账号

    passwd git    #讄git账号的密?/p>

    su ?git    #切换到git账号

    cd ~  #转到用户目录

    mkdir 目名称.git   #建立目git文g?/p>

    cd 目名称.git

    git ?bare –share init   #初始化git?/p>

     

    3. 马上拿v你的git客户? 乌龟, SourceTree均可)输入q样格式的地址git@ip:/path/to/project.git

    例如: git@192.168.1.2:/home/git/YourProject.git

    git pull? 需要输入密? p入上面创建好的git账号的密码就可以

    开始用吧!

     

    Tips

    q种Ҏ(gu)搭徏的git服务器仅限于团队和对A(ch)献代码不敏感的项目而生

    git本n的公钥是Z防止别h伪造用户名q行虚假提交. 但这个方法绕开了这?/p>

    惛_新的git库时, 切记使用git账号去重复以上步? 若用rootU别账号创徏的文件夹使用客户端时?x)遇到权限不的提?/p>

    战魂筑 2015-06-10 14:53 发表评论
    ]]>
    使用SVN处理多h׃n修改文ghttp://www.shnenglu.com/sunicdavy/archive/2015/03/06/209943.html战魂筑战魂筑Fri, 06 Mar 2015 08:27:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2015/03/06/209943.htmlhttp://www.shnenglu.com/sunicdavy/comments/209943.htmlhttp://www.shnenglu.com/sunicdavy/archive/2015/03/06/209943.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/209943.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/209943.htmlSVN的工作流是checkout->modify->update->merge->commit, 如果多h修改同一个文? 需要进行合q? 但对于Excel{复合文件格? svn无法处理合ƈ. 虽然云风试处理q?a >Excel合ƈ的问?/a>, 但其实对于我们日常开发来? q不太期望有些操作进行合q? 而是cM于VSS那种早期的代码管理工L(fng)锁定行ؓ(f). SVN依然有这个功?

    q里使用的是风靡世界的TortoriseSVN. 选中一个SVN理下的文g, 点击右键, 打开属?/p>

    image

    在New对话框中选中Needs-Lock

    image

    提交q个属性修?

    现在我们的工作流的某些步骤变化了:

    image

    getlock->modify->commit

    如果有他人在修改, getlock?x)失?/p>

    getlock的原理与早期的VSS一? 使用了文件只ȝ属? 如果试不getlock׃Ҏ(gu)? 那么文g最l无法保?



    战魂筑 2015-03-06 16:27 发表评论
    ]]>
    深入挖掘protobuf: 通过protoc获取proto文g信息http://www.shnenglu.com/sunicdavy/archive/2015/03/01/209894.html战魂筑战魂筑Sun, 01 Mar 2015 05:49:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2015/03/01/209894.htmlhttp://www.shnenglu.com/sunicdavy/comments/209894.htmlhttp://www.shnenglu.com/sunicdavy/archive/2015/03/01/209894.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/209894.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/209894.html准备:

    ?a title="http://code.google.com/p/protobuf/" >http://code.google.com/p/protobuf/下蝲protobuf-2.5版本

    预备知识: 已经使用qprotobuf, 熟练应用protobuf序列化在各语a间交互信?/p>

    目标: 获取proto内容而无需手动解析proto文g

    为proto文gd更多的meta信息, q在q行期获?

     

    protoc~译器准?/strong>

    通过protobuf-2.5的源码或者从官网下蝲, 可以获得protoc的protobuf~译? q个~译器由C++~写, 官方支持完整的protobufҎ(gu)? ~译器默认支持C++, python和java 三种语言的代码生? 如需生成更多的语a, 可以通过官网的第三方面获取.

     

    protoc插g原理

    但我们在日常使用? 可能需要提取proto信息, 例如: 所有的枚D,消息{信? 字段名称和导出号. 自己~写词法解析器来做是费力不讨好的. 官方推荐的方法是使用protoc外挂插g来实?

    protoc的插件设计比较独? 不用动态链接库或者java的jar包导入方? 而是直接使用了命令行来交换数?查看protobuf源码我们可以发现q样一个文?

    protobuf-2.5.0\src\google\protobuf\descriptor.proto

    q个文g描述了一个proto文g的格? 消息l成?qing)枚丄完整信? q是一U自我描q的Ҏ(gu).

    在找到这样一个文?/p>

    protobuf-2.5.0\src\google\protobuf\compiler\plugin.proto

    q样一个文件描q? 插g如何与protocq行交互的协?/p>

    protoc~译器在l定指定proto文g?qing)搜索\径后, 各U信息填充ؓ(f)descriptor.proto描述的结构后通过CodeGeneratorRequest消息pd化ؓ(f)二进制流后输出到命o(h)? 插g只用捕获protoc命o(h)行输出的二进制流, 序列化化回CodeGeneratorRequest卛_获得解析后的proto文g内容

    q里需要注意的? 插g可执行文件很有讲I? 必须为protoc-gen-$NAME,  而且输出文g名参数必Mؓ(f)--${NAME}_out

    看一个栗?

    protoc.exe foo.proto --plugin=protoc-gen-go=..\tools\protoc-gen-go.exe --go_out foo.go --proto_path "."

    q个栗子? $NAME=go

    protocfoo.proto文g(搜烦(ch)路径为当前\?的内定w过命o(h)行输出给位于..\tools\的插件protoc-gen-go.exe,  输出文g名字?foo.go

    descriptor.proto信息挖掘

    我们注意到在descriptor.proto文g中包含有q样的一个message: SourceCodeInfo, q个消息体里有如下字D?/p>

    optional string leading_comments = 3;
        optional string trailing_comments = 4;

    q两个字D对于我们获取proto文g的meta信息ؓ(f)重要, 所谓的meta信息, 理解理解为C#语言中的attribute

    q个attribute功能可以Z个字D? 一个消息扩充一些描q? 比如: 当一个字D通过反射昄在gui上时, gui需要获取这个字D늚中文描述

    那么只需要如下编?

    optional int32 somevalue = 1 //@ desc=”中文描q?

    位于字段N的描q? ?x)被填充到SourceCodeInfo?trailing_comments? 而位于字D上方的字段, ?x)被填充到l(f)eading_comments?

     

    SourceCodeInfo q没有直接挂载在message或者字D늚附近, 而是通过其下的path字段来描qC字段的关p? q是个极为麻?ch)的设?

    其原理如?

    假设我有如下一个message

    message foo

    {

         optional int32 v = 1;  // comments

    }

    要获取v后的注释, 对应的path?4, 0, 2, 0

    4 表示descriptor中message_type所在的序号,׃message_type对应的类型DescriptorProto是一个数l? 所?表示foo是在FileDescriptorProto的message_type数组cd的烦(ch)引ؓ(f)0;

    如此cL: 2, 0 表示 v在DescriptorProtol构体的field成员序号?的数l元素的索引?

     

    如果需要更多的参? 可以获取https://github.com/golang/protobuf

    github.com\golang\protobuf\protoc-gen-go工程内有详细代码解析

    战魂筑 2015-03-01 13:49 发表评论
    ]]>
    Visual Studio下的proto文g高亮插ghttp://www.shnenglu.com/sunicdavy/archive/2014/12/16/209189.html战魂筑战魂筑Tue, 16 Dec 2014 06:06:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2014/12/16/209189.htmlhttp://www.shnenglu.com/sunicdavy/comments/209189.htmlhttp://www.shnenglu.com/sunicdavy/archive/2014/12/16/209189.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/209189.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/209189.html推荐一个适用于Visual Studio2013/11的Google protobuf的proto文g高亮插g, 上图

    image

    虽然没有Eclipse插g的自动生成序号功? 但已l很漂亮? q自带有protobuf关键字提? 很不?br />地址: https://visualstudiogallery.msdn.microsoft.com/4bc0f38c-b058-4e05-ae38-155e053c19c5



    战魂筑 2014-12-16 14:06 发表评论
    ]]>
    git遇到remote: fatal: early EOF + index-pack failed的处理方?/title><link>http://www.shnenglu.com/sunicdavy/archive/2014/05/29/207142.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Thu, 29 May 2014 06:30:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2014/05/29/207142.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/207142.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2014/05/29/207142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/207142.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/207142.html</trackback:ping><description><![CDATA[<p>感谢q位的博客提供的解决Ҏ(gu)</p> <p><a title="http://www.lszhang.com/topics/git-push-%E6%97%B6%E5%87%BA%E7%8E%B0-remote-fatal-early-eof-%E9%94%99%E8%AF%AF" >http://www.lszhang.com/topics/git-push-%E6%97%B6%E5%87%BA%E7%8E%B0-remote-fatal-early-eof-%E9%94%99%E8%AF%AF</a></p> <p> </p> <p>修改 GIT 的本?config 文gQ在 core 中加入:(x) <p>compression = -1 <p>q里是在clone方处?<p>windows git目录在c:\Program Files (x86)\Git\etc\gitconfig?<p>  <p>其他辅助Ҏ(gu)参?a >http://git.661346.n2.nabble.com/Large-pack-causes-git-clone-failures-what-to-do-td5481488.html</a> <p>git repack --max-pack-size=100m -a -d </p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/207142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2014-05-29 14:30 <a href="http://www.shnenglu.com/sunicdavy/archive/2014/05/29/207142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TortoiseGit的远E拉?/title><link>http://www.shnenglu.com/sunicdavy/archive/2014/04/02/206434.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Wed, 02 Apr 2014 06:17:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2014/04/02/206434.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/206434.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2014/04/02/206434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/206434.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/206434.html</trackback:ping><description><![CDATA[<p>用惯了hg的便? 换做git感觉实有些不h性化. 但是比vhg分支的反人类,git的强大还是值得我们q移?/p> <p>q里使用TortoiseGit Windows客户?Git-1.9.0-preview20140217.   不是使用msysgit, 理论上差异不?/p> <p>|上大多数文章都介绍如何和githubq行q程拉取. 我想? 我们开发客L(fng), 用github资源是个大问题, q更别说直接开源?/p> <p> </p> <p>和TortoiseHG一? TortoiseGit也有一L(fng)q程P2P方式拉取的方?/p> <p>只需要在一个代码库上右键菜单中选取Daemon卛_</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/91192584c6b6_C6DC/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/91192584c6b6_C6DC/image_thumb.png" width="684" height="144"></a></p> <p>q里的提C告诉你, q样的拉取无需M的权? 其实本地开? q不存在, 要的是方? 所以果断Proceed</p> <p> </p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/91192584c6b6_C6DC/image_4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/91192584c6b6_C6DC/image_thumb_1.png" width="807" height="349"></a></p> <p>本图表示, 你已l对外开放了你指定库的权?/p> <p> </p> <p>局域网的其他h选择一个空文g? 然后选择Clone</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/91192584c6b6_C6DC/image_6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/91192584c6b6_C6DC/image_thumb_2.png" width="559" height="396"></a></p> <p>注意, q里有巨大的? daemon中只告诉你git://你的IP/  但是实际拉取?x)出? 正确的URL格式必须?/p> <p>git://你的IP/.git</p> <p>表示讉K的git的目?!</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/206434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2014-04-02 14:17 <a href="http://www.shnenglu.com/sunicdavy/archive/2014/04/02/206434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义TexturePacker插g导出自己的plist文ghttp://www.shnenglu.com/sunicdavy/archive/2014/02/06/205645.html战魂筑战魂筑Thu, 06 Feb 2014 07:23:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2014/02/06/205645.htmlhttp://www.shnenglu.com/sunicdavy/comments/205645.htmlhttp://www.shnenglu.com/sunicdavy/archive/2014/02/06/205645.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/205645.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/205645.htmlcocos2dx引擎使用plist文g, 一U特D的xml格式作ؓ(f)其atlasU理的描q文? plist遵@Ҏ(gu)的xml中key-value的设计风?对于OC来说是合适的, 但xml本n性能低下, 垃圾内容q多, 也让plist对于高性能游戏引擎不再适合. 因此, 研究TexturePacker的导出插件技?/p>

    TexturePacker的自定义插g目录位于其安装目录的bin\exporters\? 但有一些插件属于内建支? 例如cocos2dx的plist格式, 因此无法扑ֈ对应插g

    本h参考shiva3d插g, 对应导出界面的DataFormat中的Shiva3D, 快速学?x)了如何导?/p>

    官方文档位于http://www.codeandweb.com/texturepacker/documentation/#customization

    插g的基本格式及(qing)原理?

    bin\exporters\下的某一目录下存在的一个名为exporter.xml文g作ؓ(f)插g的描q?例如:

    <exporter version="1.0">
        <!-- identifier of the exporter -->
        <name>shiva3d</name>
     
        <!-- display name of the exporter for the combo box -->
        <displayName>Shiva3D</displayName>
        
        <!-- description of the exporter -->
        <description>Exporter for Shiva3D.</description>
     
        <!-- exporter version -->
        <version>1.0</version>
        
        <!-- currently only one file allowed - more to come with update -->
        <files>
            <file>
                <!-- name of this file variable -->
                <name>xml</name>
     
                <!-- human readable name (for GUI) -->
                <displayName>XML</displayName>
     
                <!-- file extension for the file -->
                <fileExtension>xml</fileExtension>
     
                <!-- name of the template file -->
                <template>shiva.xml</template>
            </file>
        </files>
     
        <!-- target framework supports trimming -->
        <supportsTrimming>false</supportsTrimming>
     
        <!-- target framework supports rotated sprites -->
        <supportsRotation>true</supportsRotation>
     
        <!-- rotated sprites direction (cw/ccw) -->
        <rotationDirection>cw</rotationDirection>
     
        <!-- supports npot sizes -->
        <supportsNPOT>true</supportsNPOT>
     
        <!-- supports file name stripping (remove .png etc) -->
        <supportsTrimSpriteNames>yes</supportsTrimSpriteNames>
     
        <!-- supports texure subpath -->
        <supportsTextureSubPath>yes</supportsTextureSubPath>
     
    </exporter>
     
     

     

    在Template字段? 描述同目录的导出文g格式模板. TexturePacker使用一U叫Grantlee的模板引?cM于Python使用的Django模板引擎, 文档参见:Grantlee Documentation. 单的文本格式可以参考shiva.xml快速学?/p>

    q里我们使用protobuf的文本格?极ؓ(f)cMjson)导出plist, 下面是导出模?/p>

     

    {% for sprite in allSprites %}
    Sprite {
        Name: "{{sprite.trimmedName}}"
        FrameX: {{sprite.frameRect.x}}
        FrameY: {{sprite.frameRect.y}}
        FrameWidth: {{sprite.frameRectWithoutRotation.width}}
        FrameHeight: {{sprite.frameRectWithoutRotation.height}}
        OffsetX: {{sprite.cornerOffset.x}}
        OffsetY: {{sprite.cornerOffset.y}}
        OriginalWidth: {{sprite.untrimmedSize.width}}
        OriginalHeight: {{sprite.untrimmedSize.height}}
        {% if sprite.rotated %}Rotated: true {% endif %}
    }
    {% endfor %}

    导出的结果类g:

     
    Sprite {
        Name: "car01"
        FrameX: 100
        FrameY: 129
        FrameWidth: 76
        FrameHeight: 47
        OffsetX: 0
        OffsetY: 0
        OriginalWidth: 76
        OriginalHeight: 47
        Rotated: true 
    }
     
    Sprite {
        Name: "car02"
        FrameX: 100
        FrameY: 51
        FrameWidth: 76
        FrameHeight: 47
        OffsetX: 0
        OffsetY: 0
        OriginalWidth: 76
        OriginalHeight: 47
        Rotated: true 
    }

    ...

    导出插gq支持js扩展, 具体内容L(fng)l参考官Ҏ(gu)? 但对于简单的文本格式, q种方式已经_?/p>

    Ҏ(gu)plist? 发现plist中的垃圾信息极ؓ(f)? 而且作ؓ(f)spriteframe的name居然带有扩展?..  因此qplist,~写自己的导出插件才是王?



    战魂筑 2014-02-06 15:23 发表评论
    ]]>
    [转]Go 1.3+ ~译器变?/title><link>http://www.shnenglu.com/sunicdavy/archive/2014/01/22/205525.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Wed, 22 Jan 2014 04:23:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2014/01/22/205525.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/205525.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2014/01/22/205525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/205525.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/205525.html</trackback:ping><description><![CDATA[<h3>概述</h3> <p>目前Go~译器是C写的Q是时候换成Go啦?<h5>背景</h5> <p>“gc"Go工具链来自Plan 9~译器的工具链。组装器、C~译器和链接器基本没变。Go的编译器(cmd/gc,cmd/5g,cmd/6g,cmd/8g)是配合工具链写的新的CE序?<p>目起始Ӟ用C而不是Go写编译器有很多好处。突出的比如Q首先,那时候Goq不存在Q没法儿写编译器。而且实际上,q存在Q也?x)经常有明显的不兼容的变化。用C不用Go可以避免初始和持l开发导致的问题。然而如今Go 1已经E_Q所以这些持l的问题减少了很多?<p>持箋开发的问题已经消除Qؓ(f)了让Go实现的编译器比C更有吸引力,另一些工E问题出玎ͼ(x) <ul> <li> <p>写正的Go代码比写正确的C代码更容易?/p> <li> <p>调试错误的Go代码比调试错误的C代码更容易?/p> <li> <p>使用Go~译器需要对Go有一定理解。而用C~译器还需要一定理解C?/p> <li> <p>Go使ƈ发执行比C更方ѝ?/p> <li> <p>Go有更好的标准支持模块化,自动重写Q单元测试和性能分析?/p> <li> <p>Go比C更有?fun)?/p></li></ul> <p>Z以上理由Q我们相信是时候用Go写Go~译器啦?<h5>计划设想</h5> <p>我们打算用自动化译工具来用Go重写现在C的编译器。这个翻译需要一些阶D,从Go 1.3开始持l到未来的发行版?<p>W一阶段。开发和调试一个自动化译工具。这可以在日常开发时同步q行。而且Qh们还可以在这个阶Dؓ(f)C~译器l改q。这个工具工作量很大Q不q我们有信心完成q个Ҏ(gu)使命的工兗有许多C的观忉|法儿直接转换成GoQmacros(?Qunions(联合Q共用体,)Qbit fields(位域)可能最先考虑。比较幸q(不是巧合Q,q些功能功能用的,都会(x)被翻译掉。指针运和数组也需要一些{换工作,管~译器里很少。编译器里主要是tree(?和linked list(链表)。翻译工具会(x)保留注释和C代码的结构,所以翻译后的代码和当前的编译器代码一样可阅读?<p>W二阶段。用译工具转换C代码到GoQƈ删除C源码。这时我们已l开始翻译,但是Goq是q行在C~译器上。非怹观的Q这可能发生在Go 1.3。不q更可能是Go 1.4?<p>W三阶段。用一些工P可能来自gofix和the Go oracleQ拆分编译器到包Q清理和文档化代码,d适当的单元测试。这是编译器?x)是地道的GoE序。目前打在Go 1.4实现?<p>W四a阶段。用标准的分析和测试工具优化编译器的CPU和内存用。可能要引入q行。如果真q样Q?a >Race Detector</a>(Go的ƈ行竞争检工?)?x)有很大帮助。这目标在Go 1.4Q可能部分会(x)延后?.5。基本的优化分析?x)在W三阶段完成?<p>W四b阶段。(和四a几段同时q行Q当~译器依照明昄界限分割成包之后Q需要明引入一个中介码Q在l构无关的无序树(wi)(Node_s)和结构相关的有序链表(Prog_s)之间。这个中介码应该不依赖整体架构,但是包含准确的执行顺序信息,可以用于有顺序但是结构无关的操作的优化,比如清理多余的nil(g)和出界(g)。这些过E基?a >SSA</a>Q静态单赋|(j)Q你可以从Alan Donovan?go.tools/ssa 包中了解更多?<p>W五阶段。替换go/parser和go/types到最斎ͼ全新Q的版本。Robert Griesemer参考现在的l验Q讨Z设计新的parser和types的可能。如果联pM们到~译器后端,怿对设计新的API有很大帮助?<p><strong>自展QBootstrappingQ?/strong>用Go语言实现的Go的编译器Q从一开始就要考虑如何自展。我们考虑的规则就是Go1.3~译器必ȝGo1.2~译QGo1.4的编译器必须由Go1.4~译Q以此类推?<p>q时Q我们就有了一个清晰的程来生成当前的E序Q编译Go1.2的工具链Q由C~写Q,然后使用它编译Go1.3的工具链Q以此类推。这里需要一个脚本来做这个事情,来保证只?x)消耗CPU的时间而非某个人的旉。这L(fng)自展Q每个机器只?x)做一ơ,Go1.x的工具链会(x)在本C留,q在执行all.bash来编译Go1.(x+1)工具铄时候被再次使用?<p>昄Q随着旉的推U这U自举方式是不充分的。在后面的多个版本被发布之前Qؓ(f)~译器写一个后端来生成C代码也许是一个更有意义的事情。这些C代码不要求效率或可读性,只要正确卛_。这些C代码会(x)被签入,像我们{օ由yacc生成的y.tab.c文g一栗这P自展q程׃(x)变成Q先用gcc~译C代码生成一个自展编译器Q然后用这个自展编译器来编译真正的~译器。类g另一个自展过E,q个自展~译器将?x)在本地保留Qƈ在每ơ执行all.bash的时候重复用(不用重新~译Q?<p><strong>替代选择</strong>q有一些比较明昄替代Ҏ(gu)Q需要我们说明一下ؓ(f)什么放弃了q些选择?<p>从一开始写一个编译器。现在的~译器有一个非帔R要的特征Q他们能够正常工作(或者其臛_能够满所有用L(fng)要求Q。尽Go语言比较单,但是~译器中有很多细微的l节优化和改写,直接丢弃10或数q的在这上面的努力是比较愚蠢的?<p>对编译器q行人工译。我们已l以人工的方式翻译了一部分C/C++代码到Go语言了。这个过E是枯燥而且易错的,且这些错误非常的l微?qing)难以发现。相反,使用机械译?x)Ş成一些比较一致的错误Q而这些错误是易于发现的;而且不会(x)因ؓ(f)枯燥的过E开差。Go~译器的代码明显的比我们译的代码多很多Q超q?0,000行C代码Q机械翻译会(x)使这个过E容易一些。就像Dick Sites?974q说的一P(x)“相比写E序Q我宁愿写一个程序来帮我写程序。?使用机械来翻译编译器也方便于在准备好切换之前Q我们可以l开发完善现有的CE序?<p>只翻译后端ƈ链接到go/parser和go/types.从前端传l后端的数据l构所包含的信息中Qgo/parser和go/types所能提供的除了API没其他的东西了。如果用这些库来替代前端,需要写代码来{换go/parser和go/types所能提供数据结构到后端Q这是一个非常宽泛且易出错的工作。我们相信用这些库是有意义的,但更明智的是Q等到将~译器代码调整的更像GoE序Q分成确定边界的、包含说明文档和单元试子包之后再用?<p>攑ּ现有的编译器Q用gccgoQ或者go/parser + go/types + LLVM, …)(j)。现有的~译器是Go语言昑־比较灉|的一个重要组成部分。如果尝试用基于大量代码的GCC或LLVM来开发GoE序Q感觉会(x)有碍到Go语言的灵zL。另外,GCC是大量C代码Q现在有部分C++Q、LLVM是大量C++代码的程序。以上列丄、用于解释不使用现有~译框架代码的几个原因,也都适用于更多的cM的代码库?<h5>C语言的长期?/h5> <p>临近l束Q这个计划还留下了由C写成的Plan9的工具链的一部分。在长期发展中,q是所有的C从代码树(wi)排除掉比较好。本章节推测了一下这件事会(x)如何发生Q但不保证其指定?x)发生或者按照这U套路发生?<p>q行时包(runtime)?runtime包的大部分都是用C写成Q基于一些同L(fng)原因QGo~译器也是用C实现。但是,runtime包远比编译器的代码量要小Q且它现在已l是用Go和C混合~写。将C代码转换为Go代码Ӟ一ơ{化一部分貌似也是可行的。其中,主要部分有:(x)调度器(schedulerQ,垃圾回收Qthe garbage collectorQ,散列映射表(hash mapQ的实现Q和channel的实现。(q里Go和C代码混合的很融洽Q是因ؓ(f)q里使用?c而不是gcc来编译的C代码。)(j) <p>C~译器?Plan 9的C~译器本w就是用C写成Q如果我们要从Go包实现里面移除所有的C代码Q那么我们将U除q些~译工具Q“go tool 6c”等{,另外Q?c的文件也不被支持出现的Go包的目录里面。我们应该提前声明这L(fng)计划Q以便用C的第三方包有旉ȝ除这cC代码的用。(CgoQ由于用了gcc来替?cQ所以它仍然可以作ؓ(f)一个途径来在Go包中使用C实现部分功能。)(j)在Go1的兼Ҏ(gu)文档中没有包含工具链修改的描述Q也是说去掉C~译器是被允许的?<p>汇编器?Plan 9的汇~器也是用C实现的,但这个汇~器只不q是一pd解析?wi)组成的单解析器Q这使得不论手动q是自动它译成Go语言都比较简单?<p>q接器?Plan 9的连接器也是由C写成。最q的一些工作,已经大部分的连接器工作攑ֈ的编译器中,而且Q也已经有个计划剩余的部分重写成一个新的、更单的GoE序。{Ud~译器的部分q接器代码,现在需要随着~译器的原有代码一赯行翻译?<p>ZLibmach的工? nm, pack, addr2line, 和objdump?Nm现在已经使用Go语言重写。Pack和addr2line可以M一天被重写。Objdump现在依赖于libmach的反汇编器,但这些{换ؓ(f)Go也是比较单的Q不论是使用机械q是人工译。所以基于这几点Qlibmach本n来也可以被U除?<p>  <p>来源: <a >http://www.oschina.net/translate/go-1-3-compiler-overhaul</a> <p>英文来源:<a title="https://docs.google.com/document/d/1P3BLR31VA8cvLJLfMibSuTdwTuF7WWLux71CYD0eeD8/preview?sle=true&pli=1" >https://docs.google.com/document/d/1P3BLR31VA8cvLJLfMibSuTdwTuF7WWLux71CYD0eeD8/preview?sle=true&pli=1</a></p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/205525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2014-01-22 12:23 <a href="http://www.shnenglu.com/sunicdavy/archive/2014/01/22/205525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下protoc-gen-go的用方?goprotobuf)http://www.shnenglu.com/sunicdavy/archive/2014/01/21/205517.html战魂筑战魂筑Tue, 21 Jan 2014 08:22:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2014/01/21/205517.htmlhttp://www.shnenglu.com/sunicdavy/comments/205517.htmlhttp://www.shnenglu.com/sunicdavy/archive/2014/01/21/205517.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/205517.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/205517.htmlgoprotobuf是go语言中写的较好的一个实? linux下的安装非常方便, 但是windows需要添加plugin的\径才能识?/p>

    先确认你已经讄好GOPATH, q安装好goprotobuf

    我的goprotobuf路径是标准的: $GOPATH/src/code.google.com/p/goprotobuf

    ~译q安装proto工具:

    go install code.google.com/p/goprotobuf/proto

    go install code.google.com/p/goprotobuf/protoc-gen-go

    认$GOPATH/bin下有protoc-gen-go.exe

     

    ~译proto文g输出go文g:

    使用命o(h)行编译path/to/protoc.exe  --plugin=protoc-gen-go=$GOPATH\bin\protoc-gen-go.exe --go_out . --proto_path .  XXX.proto

    q里Z贴出notepad++使用nppexec插g的command

    "path/to/protoc.exe"  --plugin=protoc-gen-go=path/to/gopath/bin/protoc-gen-go.exe --go_out $(CURRENT_DIRECTORY) --proto_path $(CURRENT_DIRECTORY)  $(FULL_CURRENT_PATH)

    P.S.

    protoc误行在protobuf官网下蝲C++源码后编?/p>

    战魂筑 2014-01-21 16:22 发表评论
    ]]>
    Qt技术优?/title><link>http://www.shnenglu.com/sunicdavy/archive/2014/01/14/205359.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Tue, 14 Jan 2014 03:53:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2014/01/14/205359.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/205359.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2014/01/14/205359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/205359.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/205359.html</trackback:ping><description><![CDATA[<p>1. Qtq个C++的图形库由Trolltech?994q左叛_发。它可以q行在Windows,Mac OS X, UnixQ还有像Sharp Zaurusq类嵌入式系l中。Qt是完全面向对象的?<p>2. Qt的架构明显是l过_ֿ设计的面向对象的。Qt因此在命名,l承Q类的组l等斚w保持了优U的一致性。你只需要提供唯一一个方法的参数Q仅此一个。在不同的类中调用方式也是有很强的连贯性。返回g很有逻辑性。所有一切达C单和强大的和谐统一。一旦你使用了其中一个类Q其他的cMpcL通,因ؓ(f)他们是一致的?<p>3. Qt不强制用Q何设计模式。如果你认ؓ(f)恰当Q用Document/view没有M问题。不使用也没有Q何问题?<p>4. MFC是事仉动的架构。要执行M操作Q都必须是对特定的消息作出响应。Windows对应用程序发送的信息C千计Q遗憄是,要分清楚q些分繁芜杂的消息是很困隄Qƈ且关于这斚w的文档ƈ不能很好的解册些问题?br>Qt的消息机制是建立在SIGNAL()发送和SLOT()接受的基上的。这个机制是对象间徏立联pȝ核心机制。利用SIGNAL()可以传递Q何的参数。他的功能非常的强大。可以直接大传递信L(fng)SLOT()Q因此可以清楚的理解要发生的事情。一个类所发送的信号的数量通常非常的小(4或?)Qƈ且文档也非常的齐全。这让你感觉C切尽在掌握之中。SIGNAL/SLOT机制cM于Java中listener机制,不过q种机制更加轻量U,功能更齐全?<p>5. Qt拥有非常单而又不失强大的layout机制Q布局灉|多变<br>Qtq提供了一个图形用户工PQt DesignerQ可以用来帮助徏立用L(fng)面。可以修Ҏ(gu)使用的Q何控件的属性。不用将他们攑֜严格的位|,可以通过layout完美的组l他们。这个工h产生的代码我们是可以实际上阅dƈ且可以理解的。生成的代码单独攑֜一个文仉Q在~程的同Ӟ你可以随心所Ʋ的多次重新生成用户界面?br>Qt Designer可以让你完成许多在MFC中不可能完成的Q务,比如用预先填好的生成listviewQ在每个tab上用不同的view来用tab 控制?<p>6. 使用MFCQ一部分开发过E要依靠“resources?在很多的案例中开发者必M用他们。这样会(x)D如下的后果:(x)ZVisual StudioQ你很难使用其他的工h完成开发?br>资源~辑器仅有有限的功能Q比如:(x)通过Dialog~辑器不可能改变所有的属性,一些属性可以改变,另一些属性则不可能改变?译者注Q下面还有两条陈qMFC~点的实例,但我感觉q些已经够说明问题了Q暂时删节不?<br>然而Qtq没有资源的概念Q这p决了以上所提到的问题。Qt提供了一个脚本得能编入你的代码。对于界面设计,Qt Designer则创Z可读的代码?<p>7. Qt的文档完备且详细的覆盖了Qt的方斚w面,竟然仅有18M。每一个类和方法都被详描qͼ巨细靡遗QD例充实。通过Trolltech公司提供的链接或者是Qt Assistant工具Q可以方便的从一个类或者方法蟩转到其他的类。文档还包含了一个初学者教E和一些典型应用的例子 <p>8. 在发布基于MFC的Y件时Q必M靠存在于客户?sh)脑上的MFC。但是这是不安全的,同样是MFC42.dllQ可以基于相同的库得?个不同的版本。通常Q需要检查是否拥有正的MFC42.dll版本Q如果不是,升U它。但是升UMFC42.dll?x)改变很多Y件的行ؓ(f)?br>Qt则没有这个风险,因ؓ(f)Qt压根没有“升U整个系l”这个概c(din)?<p>9. Qt 完全支持CSS2Q这使得Qt应用E序Q无论是化q是换肤Q实现v来都相当?<p>10. Qt自带译器,可以随意切换软g语言 <p>  <p>在用Qt动态链接库的情况下Q根据LGPL协议规定Q是可以闭源发布M形式的程序的?<p>参考链接:(x) <p>来自Qt官方论坛的讨论:(x)<a >http://qt-project.org/forums/viewthread/2428</a> <p>博客链接Q?a >http://devbean.blog.51cto.com/448512/313477</a> <p>  <p>  <p>转自:<a >http://blog.csdn.net/superzhaifd/article/details/18224923</a> <a >冬狼_Trump</a> <p>  <p>本h较喜Ƣ第二点: 不用Q何设计模式构建底? 设计模式只是思想, 也是绊. 大量使用只会(x)让系l臃?</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/205359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2014-01-14 11:53 <a href="http://www.shnenglu.com/sunicdavy/archive/2014/01/14/205359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让VC助手在外部文件变化时自动parsehttp://www.shnenglu.com/sunicdavy/archive/2013/11/13/204237.html战魂筑战魂筑Wed, 13 Nov 2013 02:39:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2013/11/13/204237.htmlhttp://www.shnenglu.com/sunicdavy/comments/204237.htmlhttp://www.shnenglu.com/sunicdavy/archive/2013/11/13/204237.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/204237.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/204237.html我们的工E用notepad++挂蝲protobuf的protoc代码生成? 每次生成? 助手都要手动parse一? 很麻? 研究了下VC助手的选项, 按下N|即可静默刷新文?/p>

    image



    战魂筑 2013-11-13 10:39 发表评论
    ]]>
    VC工程的命令行~译?/title><link>http://www.shnenglu.com/sunicdavy/archive/2013/11/05/204099.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Tue, 05 Nov 2013 07:20:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2013/11/05/204099.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/204099.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2013/11/05/204099.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/204099.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/204099.html</trackback:ping><description><![CDATA[<p>我用的是VS2010, 老版本的未测</p> <p>call "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"<br>    cd 你的工程sln目录</p> <p>MSBuild “你的工E?sln?/t:Build /p:Configuration=Release /maxcpucount:4</p> <p>解释: 首先调用VC上下文徏立批处理, 转到你的sln目录,保证工作目录正确, /maxcpucount是ƈ行编? Ҏ(gu)你的需求配|即?/p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/204099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2013-11-05 15:20 <a href="http://www.shnenglu.com/sunicdavy/archive/2013/11/05/204099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用HG(Mercurial)做分布式代码理的一些经?/title><link>http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Fri, 25 Oct 2013 14:51:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/203915.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/203915.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/203915.html</trackback:ping><description><![CDATA[<p>距离W一ơ用HG已经?,3q了?从第一ơ将HG用于自己的项目, 用U盘同步代? 到现在将HG应用于linux, 版本差异发布, 目内部多h的分布式开发,已经感觉非常熟练?/p> <p>我们的项目的客户端和服务器均由C++开发,׃HG设计的理忉|1个工E对?个库Q?因此我们的客L(fng)和服务器是分开的两个HG代码库。这U思想和SVN理的代码有很大不同。SVN时代的游戏工E大多是q样安排目录的:(x)</p> <p>common <-客户端和服务器共享的?/p> <p>client<-客户端的代码</p> <p>server<-服务器的代码</p> <p>通过SVN强大的权限控制给不同的前后端赋予权限Q前后端E序获得不同的目录l合。SVN下的q种工程l织Ҏ(gu)能很好的解决单一语言跨工E的代码Q协议共享问题。虽然现在各UErlangQJava的服务器语言与as3,lua的不同客L(fng)脚本语言h的时代已l无所谓这U老式设计思想。但是对于我们纯C++的手游来_(d)q是必须面对分布式代码管理工具下的代码跨库共享问题?/p> <p>我就q个问题与多q前被我推荐qHG的朋友讨v来,他们也存在我们这个问题,但是他们的解x法就是每个工E一个库。然后被我问刎ͼ(x)“同步一ơ代码,一ơ次的打开不同的库Q他们客L(fng)+服务器一??个HG代码库)(j)Q进行同步, 完成后, q要反向pullQ不累啊Q”, 朋友回答Q“习(fn)惯就好?/p> <p>随后Q我也翻查了git对多目的支持。得到的{案也是跟HG一L(fng)Q?q类分布式代码管理工hw的设计理念只有账号Q而无权限Q?本n是Z开源代码精设计的工具Q?如果分了权限Q岂不是q背开源精(q是我想?img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="微笑" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/09a081eb5d4c_13A7F/wlEmoticon-smile_2.png">Q。因此如果想理多个目代码Q?要么多库Q要么合库?/p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/203915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2013-10-25 22:51 <a href="http://www.shnenglu.com/sunicdavy/archive/2013/10/25/203915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>E序异常VC调试器无法定位的处理http://www.shnenglu.com/sunicdavy/archive/2013/06/27/201339.html战魂筑战魂筑Thu, 27 Jun 2013 03:05:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2013/06/27/201339.htmlhttp://www.shnenglu.com/sunicdavy/comments/201339.htmlhttp://www.shnenglu.com/sunicdavy/archive/2013/06/27/201339.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/201339.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/201339.html最q调试程序发现空指针老无法定? 使用一个最单的main函数做空指针(g)查也一? 具体症状见图

    image

    pdb加蝲是正常的, 但是堆栈没显C如此简单的I指针访问位|? Google了以?/p>

    http://blogs.msdn.com/b/debugger/archive/2010/05/12/visual-studio-debugger-fails-to-catch-unhandled-exception-for-a-windows-form-or-wpf-application.aspx

    解决Ҏ(gu): Debug->Exception中将所有异常勾选即?/p>

     

    不知道哪里的讄D如此诡异的问? 害的我重装一?.



    战魂筑 2013-06-27 11:05 发表评论
    ]]>
    2D游戏必备的TexturePackerhttp://www.shnenglu.com/sunicdavy/archive/2013/06/05/200812.html战魂筑战魂筑Wed, 05 Jun 2013 07:44:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2013/06/05/200812.htmlhttp://www.shnenglu.com/sunicdavy/comments/200812.htmlhttp://www.shnenglu.com/sunicdavy/archive/2013/06/05/200812.html#Feedback1http://www.shnenglu.com/sunicdavy/comments/commentRss/200812.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/200812.html 下蝲http://www.codeandweb.com/texturepacker/download
    工具本n不是免费? 但是可以通过甌获得免费的Licence, ?a >q里?br /> 条g是有一个自q博客, q且从事游戏/软g/|页斚w的开? 且近期有5文章发?br /> 作者特别强调,微博不等于博?br />
    填写好邮地址Q要不了几个时可以获取到序列?img src ="http://www.shnenglu.com/sunicdavy/aggbug/200812.html" width = "1" height = "1" />

    战魂筑 2013-06-05 15:44 发表评论
    ]]>
    [转]Lisp的永恒之?/title><link>http://www.shnenglu.com/sunicdavy/archive/2012/06/12/178505.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Tue, 12 Jun 2012 04:38:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2012/06/12/178505.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/178505.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2012/06/12/178505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/178505.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/178505.html</trackback:ping><description><![CDATA[<h5>本文转自: <a >http://coolshell.cn/articles/7526.html</a></h5> <p> </p> <h5>Lisp之魅</h5> <p>长久以来QLisp一直被许多为史上最非凡的编E语a。它不仅?0多年前诞生的时候带来了诸多革命性的创新q极大地影响了后来编E语a的发展,即在一大批C语言不断涌现的今天,Lisp的诸多特性仍然未被超。当各式各样的编E语a摆在面前Q我们可以从q行效率、学?fn)曲Uѝ社区活跃度、厂商支持等多种不同的角度进行评判和选择Q但我特别看中的一点在于语a能否有效地表辄E者的设计思想。学?fn)C意味着学习(fn)如何用过E来表达设计思想Q学?fn)Java意味着学习(fn)如何用对象来表达设计思想Q而虽然Lisp与函数式~程有很大的关系Q但学习(fn)Lispl不仅仅是学?fn)如何用函数表达设计思想。实际上Q?strong>函数式编Eƈ非Lisp的本?/strong>Q在已经掌握了lambda、高阶函数、闭包、惰性求值等函数式编E概念之后,学习(fn)Lisp仍然大大加深了我对编E的理解?strong>学习(fn)Lisp所收获的是如何“自由地”表达你的思想</strong>Q这正是Lisp最大的力所在,也是q门古老的语言仍然h很强的生命力的根本原因?<h5>Lisp之源</h5> <p>Lisp意ؓ(f)表处?List Processing)Q源自设计者John McCarthy?960q发表的一论文《符可辑ּ的递归函数?qing)其机器计算》。McCarthy在这论文中向我们展CZ用一U简单的数据l构S表达?S-expression)来表CZ码和数据Qƈ在此基础上构ZU完整的语言。Lisp语言形式单、内涉|刻,Paul Graham在《Lisp之根源》中其对编E的贡献与欧几里德对几何的A(ch)献相提ƈ论?<h5>Lisp之Ş</h5> <p>然而,与数学世界中单易懂的Ƨ氏几何形成鲜明Ҏ(gu)Q程序世界中的Lisp却一直是一U古老而又秘的存在,真正理解其精妙的是少数。从表面上看QLisp最明显的特征是它“古怪”的S表达式语法。S表达式是一个原?atom)Q或者若qS表达式组成的列表(list)Q表辑ּ之间用空格分开Q放入一Ҏ(gu)号中。“列表“这个术语可能会(x)Ҏ(gu)让h联想到数据结构中的链表之cȝUŞl构Q实际上QLisp的列表是一U可嵌套的树(wi)形结构。下面是一些S表达式的例子:<pre>foo () (a b (c d) e) (+ (* 2 3) 5) (defun factorial (N) (if (= N 1) 1 (* N (factorial (- N 1))) ) ) </pre> <p>据说Q这个古怪的S表达式是McCarthy在发明Lisp时候所采用的一U(f)时语法,他实际上是准备ؓ(f)Lisp加上一U被UCؓ(f)M表达?M-expression)的语法,然后再把M表达式编译ؓ(f)S表达式。用一个通俗的类比,S表达式相当于是JVM的字节码Q而M表达式相当于Java语言Q但是后来Lisp的用者都熟?zhn)q喜Ƣ上了直接用S表达式编写程序,q且他们发现S表达式有许多独特的优点,所以M表达式的引入也就被无限期延迟了? <p>许多Lisp的入门文章都比较Lisp的函数式Ҏ(gu),而我认ؓ(f)q是一U误对{真正的Lisp之门不在函数式编E,而在S表达式本w,Lisp最大的奥秘p在S表达式后面。S表达式是Lisp的语法基Q语法是语义的蝲体,形式是实质的寄托?strong>“S表达式”是E序的一UŞQ正如“七a”是诗的一UŞQ“微博”是信息的一UŞ</strong>。正是Ş的不同,让微博与博客有了质的差异Q同L(fng)道理Q正是S表达式让Lisp与C、Java、SQL{语a有了天壤之别? <h5>Lisp之道</h5> <p>一门语a能否有效地表辄E者的设计思想取决于其抽象机制的语义表达能力。根据抽象机制的不同Q语a的抽象机制Ş成了面向q程、面向对象、函数式、ƈ发式{不同的范式。当你采用某一U语aQ基本上pCZ已经“面向XXX“了Q你的思维方式和解决问题的手段׃(x)依赖于语a所提供的抽象方式。比如,采用Java语言通常意味着采用面向对象分析设计Q采用Erlang通常意味着按Actor模型对ƈ发Q务进行徏模? <p>有经验的E序员都知道Q无论是面向XXX~程Q程序设计都有一条“抽象原则“:(x)What与How解耦。但是,<strong>普通语a的问题就在于表达W(wng)hat的手D非常有?/strong>Q无非是q程、类、接口、函数等几种方式Q而诸多领域问题是无法直接抽象为函数或接口的。比如,你完全可以在C语言中定义若q函数来做到make file所做的事情Q但C代码很难像make file那样声明式地体现出target、depends{语义,它们只会(x)作ؓ(f)实现l节被没在一个个的C函数之中。采用OOP或是FP{其它范式也?x)遇到同L(fng)困难Q也是说make file语言所代表的抽象维度与面向q程、OOP以及(qing)FP的抽象维度是正交的,使得各种范式无法直接表达出make file的语义。这是普通语a的“刚性”特征,它要求我们必M语言的抽象维度去分析和解决问题,把问题映到语言的基本语法和语义? <p>更进一步,如果仔细探究q种刚性的Ҏ(gu)Q我们会(x)发现正是׃普通语a<strong>语法和语义的紧耦合</strong>造成了这U刚性。比如,C语言中printf(“hello %s? name)W合函数调用语法Q它表达了函数调用语义,除此之外别无他义QJava中interface IRunnable { ?}W合接口定义语法Q它表达了接口定义语义,除此之外别无他义。如果你认ؓ(f)“语法和语义紧耦合“是理所当然的,看不有什么问题,那么理解Lisp׃(x)让你Ҏ(gu)产生更深的认识? <p>当你看到Lisp?f a (b c))的时候,你会(x)惛_什么??x)不会(x)马上联惛_函数求值或是宏扩展Q就像在C语言里看到gcd(10, 15)马上惛_函数调用Q或者在Java里看到class A马上惛_cd义一栗如果真是这P那它?yu)是你理解Lisp的一道障,因ؓ(f)你已l习(fn)惯了着语言L考,L在想q一句话机器怎么解释执行Q那一句话又对应语a的哪个特性?理解Lisp要反q来Q让语言着你,Lisp?f a (b c))可以是Q何语义,完全׃来定Q它可以是函数定义、类定义、数据库查询、文件依赖关p,异步d的执行关p,业务规则 ? <p>下面我准备先通过几个具体的例子逐步展示Lisp的本质。需要说明的是,׃Lisp的S表达式和XML的语法Ş式都是一U树(wi)形结构,在语义表达方面二者ƈ无本质的差别。所以,Z理解方便Q下面我暂且用多Ch更ؓ(f)熟?zhn)的XML来写代码Q请C我们可以很轻易地把XML代码和Lisp代码怺转换? <p>首先Q我们可以轻易地用XML来定义一个求两个数最大公U数的函敎ͼ(x)<pre> <func name='gcd' return_type='int'> <params> <a type='int'/> <b type='int'/> </params> <body> <if> <equals> <a/> <int>0</int> </equals> </if> <then> <return><b/></return> </then> <else> <return> <gcd> <modulo><b/><a/></modulo> <a/> </gcd> </return> </else> </body> </func> </pre> <p>其次Q我们可以用它来定义c:(x)<pre> <class name="Computer"> <field access="private" type="MainBoard" name="main-board" /> <field access="private" type="CPU" name="cpu" /> <field access="private" type="Memory" name="memory" /> <method access="public" return_type="boolean" name="powerOn" /> <params>...</params> <body>...</body> </method> <method access="public" return_type="boolean" name="powerOff" /> <params>...</params> <body>...</body> </method> </class> </pre> <p>q可以轻易地用它来编写关pL询:(x)<pre><sql> <select> <column name="employees.id" /> <column name="bonus.amount" /> </select> <from> <table name="employees" /> <table name="bonus" /> </from> <where> <equals> <column name="employees.id" /> <column name="bonus.employee_id" /> </equals> </where> </sql> </pre> <p>q可以用它来实现cMmake file的自动化构徏(语法取自ant)Q?pre> <project name="MyProject" default="dist" basedir="."> <property name="src" location="src"/> <property name="build" location="build"/> <property name="dist" location="dist"/> <target name="init"> <mkdir dir="${build}"/> </target> <target name="compile" depends="init" description="compile the source " > <javac srcdir="${src}" destdir="${build}"/> </target> <target name="dist" depends="compile" description="generate the distribution" > <mkdir dir="${dist}/lib"/> <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/> </target> <target name="clean" description="clean up" > <delete dir="${build}"/> <delete dir="${dist}"/> </target> </project> </pre> <p>一口气举了q么多个例子Q目的在于用XMLq种?wi)Şl构来说明Lisp的S表达式所能够描述的语义。不知道你是否发CS表达式和XMLq种?wi)Ş语法在语义构造方面有着特别的“柔性”?我们可以L地用它构造出函数、变量、条件判断语义;cR属性、方法语义;可以L地构造出关系模型的select、where语义Q可以轻易地构造出make的target、depends语义Q等{数不清的语义。在普通语a里,你可以定义一个函数、一个类Q但你无法ؓ(f)C语言增加匿名函数Ҏ(gu),也没法给Java语言加上RAII语义Q甚臌自己创造一个foreach循环都不行,而自定义语义意味着在Lisp之上<strong>你创造了一门语a</strong>Q不是面向q程Q面向对象,函数式,q是关系模型Q在Lisp里统l都变成了一UDSLQ而Lisp本n也就成了一U定义语a的语aQ即元语a(Meta Language)? <p>Lisp的柔性与S表达式有着密切的关pRLispq不限制你用S表达式来表达什么语义,同样的S表达式语法可以表辑֐U不同领域的语义Q这是<strong>语法和语义解?/strong>。如果说普通语a的刚性源于“语法和语义紧耦合”,那么Lisp的柔性正是源于“语法和语义解耦”!“语法和语义解耦”得Lisp可以随意地构造各U领域的DSLQ而不强制用某一U范式或是领域视角去分析和解决问题。本质上QLisp~程是一U超了普通编E范式的范式Q这是<strong>Lisp之道Q面向语a~程(LOP, Language Oriented Programming)</strong>。Wikipedia上是q样描述LOP的:(x) <blockquote> <p>Language oriented programming (LOP) is a style of computer programming in which, rather than solving problems in general-purpose programming languages, the programmer creates one or more domain-specific languages for the problem first, and solves the problem in those languages ?The concept of Language Oriented Programming takes the approach to capture requirements in the user’s terms, and then to try to create an implementation language as isomorphic as possible to the user’s descriptions, so that the mapping between requirements and implementation is as direct as possible.</p></blockquote> <p>LOP范式的基本思想是从问题出发Q先创徏一门描q领域模型的DSLQ再用DSL去解决问题,它具有高度的声明性和抽象性。SQL、make file、CSS{DSL都可以被认ؓ(f)是LOP的具体实例,下面我们再通过两个常见的例子来理解LOP的优ѝ? <p>?Q在股票交易pȝ中,交易协议定义若干二进制的消息格式Q交易所和客L(fng)需要对消息q行~码和解码? <p>消息格式是一U抽象的规范Q本w不对语a做Q何的限制Q你可以用CQC++QJavaQ或者Python。普通的实现方式是按照消息格式规范,在相应的语言中定义消息结构,q编写相应的~解码函数。假设ؓ(f)一个消息定义结构和实现~解码函数的工作量ؓ(f)MQ不同消息类型的数量为NQ这U方式的工作量大致ؓ(f)M*N。也是说每增加一U消息类型,需要ؓ(f)该消息定义结构,实现~解码函敎ͼ引入bug的可能性当然也和M*N成正比。如果仔l观察不隑֏玎ͼ各个消息l构其实是高度类似的Q编解码函数也大同小异,但是普通语a却找不到一U抽象机制能表达q种共性,比如Q我们无法通过面向对象的方法定义一个基cL消息l构的共性抽象出来,然后让具体的消息ȝ承它Q达到复用的目的。这正是׃普通语a的抽象维度限制所_(d)在普通语a中,你只能从函数、接口等l度对事物进行抽象,而恰好消息格式共性所在的l度与这些抽象维度ƈ不匹配? <p>其实Q不同消息类型的<strong>共性在于它们都h相同的领域语?/strong>Q比如:(x)“某字段内容是另一个字D内容的md5码”就是一U消息格式的领域语义Q这U领域语义是OOP的抽象机制无法描q的。LOP的思\是先创徏一门消息定义DSLQ比如,cMGoogle的Protocol BufferQAndroid的AIDL。然后,通过DSL~写消息定义文gQ直接声明式地描q消息的l构特征Q比如,我们可以声明式地描述“某字段内容是另一个字D内容的md5码”。我们还需要ؓ(f)DSL开发编译器用于生成C、Java{通用语言的消息定义和~解码函数? <p>有了消息定义DSL和编译器之后Q由于DSL~写消息定义是一U高度声明式的编E方法,每增加一U消息的只需要多~写一个消息定义文件而已Q工作量几乎可以忽略不计。所有的工作量都集中在编译器的开发上Q工作量是一个常数CQ与消息的数量没有关p;质量保证斚w也只需要关注编译器q一点,不会(x)因ؓ(f)增加新的消息cd而引入bug? <p>?Q在图书理pȝ中,需要支持在理界面上对书籍、学生、班U等各种实体q行理操作? <p>如果按传l的三层架构Q一般需要在后端E序中ؓ(f)每一U实体定义一个类Qƈ定义相应的方法实现CRUD操作Q与之相应的Q还需要在前端面中ؓ(f)每一个实体编写相应的理面。这些实体类的CRUD操作都是大同异的,但细节又各不相同Q虽然我们很惛_用某些共同的设计实现Q但OOP所提供的封装、ѝ多态等抽象机制不以有效捕获实体之间的共性,大量的代码还是必L在子cM来完成。比如,Student和Book实体cȝ实现非常怼Q但是如果要通过OOP的方式去抽象它们的共性,得出的结果多半是Entityq样的大而空的基c,很难起到复用的效果? <p>其实Q不同实体之间的共性还是在于它们具有相同的领域语义Q比如:(x)实体h属性,属性具有类型,属性具有取D_(d)属性具有可d、可~辑{访问属性,实体之间有关联关pȝ。LOPҎ(gu)正是直接面向q种领域语义的。采用LOPҎ(gu)Q我们ƈ不需要ؓ(f)每一个实体类单独~写C(j)RUDҎ(gu)Q也不需要单独编写管理页面,只需要定义一UDSLq实现其~译器;然后Q用DSL声明式地~写实体描述文gQ去描述实体的属性列表,属性的cd、取D_(d)属性所支持的操作,属性之间的关系和约束条件等Q最后,通过q个实体描述文g自动生成后端的实体类和前端管理页面。采用LOPQ不论前后端采用何种技术,Java也好QC#也好QJSP也好QASP.NET也好Q都可以自动生成它们的代码。采用LOP的工作量和质量都集中在DSL的设计和~译器的开发,与实体的数量无关Q也是_(d)是庞大的系l,实体c越多越是能体现LOP的优ѝ? <p>通过上面两个例子我们可以感受到QLOP是一U面向领域的Q高度声明式的编E方式,它的抽象l度与领域模型的l度完全一致。LOP能让E序员从复杂的实现细节中解脱出来Q把x炚w中在问题的本质上Q从而提高编E的效率和质量? <p>接下来的问题是如果需要ؓ(f)某领域设计DSLQ我们是应该发明一门类似SQLq样的专用DSL呢,q是用XML或S表达式去定义DSL呢?它们各有何优~点呢? <p>我认为采用XML或S表达式定义DSL的优点主要有Q?) SQL、make file、CSS{专用DSL都只能面向各自的领域Q而一个实际的领域问题通常是跨多个领域的Q有时我们需要将不同领域融合在一P但是׃普通语a的刚性,多语a融合通常?x)是一仉常困隄事情Q而XML和S表达式语法结构的单一性和“代码及(qing)数据”的特点使得跨领域融合毫无障?) 在ؓ(f)DSL开发编译器或解释器的方面,二者难度不同。对XML和S表达式定义的DSLq行语法分析非常单,相比之下Q对SQLq样的专用DSLq行语法分析Q虽然可以借助Lex、Yacc、ANTLR{代码生成工P但ȝ来讲复杂度还是要明显高一些? <p>当然QXML和S表达式的优点也正好是其缺点,׃XML和S表达式的语法形式是固定的Q不能像专用DSL那样自由地设计语法。所以,一般来讲专用DSL的语法显得更加简z。换句话_(d)XML和Lisp其实是在语法和语义间做了一个交换,用语法的限制换来了语义的灉|? <h5>Lisp之器</h5> <p>接下来我们l探讨DSL的解释执行问题。DSL代码的解释执行一般分?U典型的方式Q?) 通过专门的解释器解释执行Q?) ~译生成其他语言的代码,再通过其他语言的解释器解释执行(或编译运?Q?) 自解释。比如,W?cȝ代表是SQLQ上一节D的两个例子都属于W?c,而第3c自解释正是Lisp的特艌Ӏ? <p>Z理解自解释,我们可以先从内部DSL的解释执行说赗内部DSL是指嵌入在宿主语a中的DSLQ比如,Google Test单元试框架定义了一套基于流畅接?Fluent Interface)的C++单元试DSL。从语义构造的角度看,内部DSL直接借用宿主语言的语法定义了自己的领域语义,是一U语法和语义解耦;从解释执行的角度看,内部DSL是随宿主语言的解释器而自动解释的Q不需要像外部DSL一样开发专门的解释器,因而实现的代h(hun)很低。当?dng)q不是说设计内部DSL不用兛_M的解释实玎ͼ实际上,q是需要熟(zhn)宿主语a的特性,q利用该Ҏ(gu)得DSL能随着宿主语言的解释器得到解释执行? <p>Lisp拥有强大的自解释Ҏ(gu),q得益于独一无二?strong>Lisp之器Q宏 (macro)</strong>。宏使得Lisp~写的DSL可以被Lisp解释器直接解释执行,q在原理上与内部DSL是相通的Q只是内部DSL一般是利用宿主语言的链式调用等Ҏ(gu),通常形式陋,功能有限Q而Lisp的宏则要强大和灵zd多? <p>C语言中也有宏的概念,不过Lisp的宏与C语言的宏完全不同QC语言的宏是简单的字符串替换。比如,下面的宏定义Q?pre>#define square(x) (x*x) </pre> <p>square(1+1)的期望结果是4Q而实际上它会(x)被替换成(1+1*1+1)Q结果是3。这个例子说明,C语言的宏只在预编译阶D进行简单的字符串替换,对程序语法结构缺乏理解,非常脆弱。Lisp的宏不是单的字符串替换,而是一套完整的代码生成pȝQ它是在语法解析的基上把Lisp代码从一UŞ式{换ؓ(f)另一UŞ式,本质上vC普通语a~译器的作用。不同的是,普通编译器是把一U语a的代码{换ؓ(f)另一U语a的代码,比如QJava~译器把Java代码转换成Java字节码;而Lisp宏的输入和输出都是S表达式,它本质上是把一UDSL转换为另一UDSL。下面的例子是宏的一个典型用法? <p>?Q假设Lisp解释器已l具备解释执行面向过EDSL的能力,需要实现类似ant的自动化构徏工具? <p>我们可以Z宏构Z门类ant的DSLQ宏的作用是把类ant DSL通过宏展开变成面向q程的DSLQ最后被Lisp解释器所解释执行。这L(fng)Lisp~写的ant DSL׃需要被~译为其他语aQ也不需要像XML的ant一样依赖于专门的解释器了? <p>当然Q和开发专门的解释?~译器相比,Lisp的宏也ƈ非没有缺点,宏难以理解,开发和调试更加困难。到底是开发专门的解释?~译器还是直接采用宏应该视具体情况而定? <h5>ȝ</h5> <p>Lisp采用单一的S表达式语法表达不同的语义Q实C语法和语义解耦。这使得Lisph强大的语义构造能力,擅长于构造DSL实现面向语言~程Q而宏使得Lisph自解释能力,让不同DSL之间的{换游刃有余。进入Lisp的世界应当从理解面向语言~程入门Q这是Lisp之道Q而函数式~程和宏皆ؓ(f)Lisp之器Q以道驭器方为正途? <h5>后记</h5> <p>本文是我学习(fn)Lisp的一个ȝQ也是写l有兴趣学习(fn)Lisp的程序员的入门资料。必说明,我还是一个标准的Lisp初学者,几乎没有写过像样的LispE序Q文中的错误和不_所隑օQ希望读者批评指正,感谢Q? <h5>参?/h5> <p><a >The Roots of Lisp</a> <p><a >The Nature of Lisp</a> <p><a >Why Lisp macros are cool, a Perl perspective</a> <p><a >Wikipedia: Language-oriented programming</a> <p><a >《实用Common Lisp~程?/a> <p><a >《冒可??~程范式与OOP思想?/a></p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/178505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2012-06-12 12:38 <a href="http://www.shnenglu.com/sunicdavy/archive/2012/06/12/178505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下TortoiseHg合ƈ代码DFlashDevelop打开q的处理方?/title><link>http://www.shnenglu.com/sunicdavy/archive/2012/05/12/174629.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Sat, 12 May 2012 02:17:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2012/05/12/174629.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/174629.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2012/05/12/174629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/174629.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/174629.html</trackback:ping><description><![CDATA[<p>最q团队已l全面弃用SVN全面转移到HG(Mercurial)分布式代码管?/p> <p>Visual Studiopȝ辑工L(fng)于质量过? 兼容性超?因此使用HG一直没有出现过问题</p> <p>但是W三方开发的FlashDevelop对UNICODE兼容性不? 出现了很多ؕ码问? 特别是在HG合ƈ代码? 代码中的中文在FlashDevelop中的q现象更是严重. l过验证, 同样代码在FlashBuilder中没有问? 因此可以推断是FlashDevelop兼容性问?/p> <p>x问题, 需要调整HG的配|? q里以Windows环境下的TortoiseHgZ</p> <p>解决Ҏ(gu)如下:</p> <p>kdiff3是TortoiseHg的默认合q工? 默认安装路径在c:\Program Files\TortoiseHg\kdiff3.exe, 扑ֈq运?/p> <p>在菜单中扑ֈSettings->Configure KDiff3...</p> <p>在Regional Settings选项卡中选择Unicode, 8 bit(UTF-8) 然后取消N右边的Auto Detect Unicode</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/FlashDevelopHG_8E7A/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/FlashDevelopHG_8E7A/image_thumb.png" width="625" height="273"></a></p> <p>注意, 如果需要؜合开发UTF8保存的源码和UNICODE保存的源? 需要准备两套合q方? 可以选择兼容性比较好的BeyondCompare</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/174629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2012-05-12 10:17 <a href="http://www.shnenglu.com/sunicdavy/archive/2012/05/12/174629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZHG版本理软g的服务器/客户端数据版本发布流E?/title><link>http://www.shnenglu.com/sunicdavy/archive/2012/04/26/172798.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Thu, 26 Apr 2012 03:11:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2012/04/26/172798.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/172798.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2012/04/26/172798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/172798.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/172798.html</trackback:ping><description><![CDATA[<h1><font face="Lucida Console">传统发布现状</font></h1> <p><font face="Lucida Console">传统的服务器/客户端版本发布流E都需要经历以下流E?</font></p> <p><font face="Lucida Console">1. 获取代码</font></p> <p><font face="Lucida Console">2. ~译代码</font></p> <p><font face="Lucida Console">3. 配|?二进制文? 资源打包</font></p> <p><font face="Lucida Console">4. 挂接q程服务器磁盘拷贝打包文?/font></p> <p><font face="Lucida Console">5. q程操作解压打包文g</font></p> <p><font face="Lucida Console">6. 修改讄,指向最新版?/font></p> <p><font face="Lucida Console">7. 重启服务?/font></p> <p><font face="Lucida Console">此流E繁?重复且无? 同时, ׃|络带宽,|速等U束, 每次若用完整包发布,传输h非常吃力</font></p> <p><font face="Lucida Console">本文讨论的外|服务器׃安全性要?止rootd,只能用普通帐L(fng)录或传输? 提权为rootl箋q行以上操作, 因此rsync的用受C重限?/font></p> <p><font face="Lucida Console">即便使用Windows下的同步软g, 也几乎不可能.</font></p> <h1><font face="Lucida Console">HGҎ(gu)及(qing)优势</font></h1> <p><font face="Lucida Console">HG作ؓ(f)一个优U,y的跨q_代码理软g的特?正好能解决以上问? 主要Ҏ(gu)?</font></p> <p><font face="Lucida Console">1. 安装? 可以使用代码直接安装</font></p> <p><font face="Lucida Console">2. 利用本地映射版本可以Ҏ(gu)版本做差异比?/font></p> <p><font face="Lucida Console">3. 增量包传? 100%同步, 本地文g删除? q程文g也会(x)同步删除</font></p> <p><font face="Lucida Console">4. 传输压羃</font></p> <p><font face="Lucida Console">5. 增量包可以打包ؓ(f)patchq行ȝ更新</font></p> <p><font face="Lucida Console">6. 可以恢复CQ意版? 提交版本有据可查</font></p> <p><font face="Lucida Console"></font> </p> <p><strong><font face="Lucida Console">以下部vpȝ以CentOS为基, 其他pȝcM</font></strong></p> <p><strong><font face="Lucida Console">本文来自战魂筑的博?a href="http://www.shnenglu.com/sunicdavy">http://www.shnenglu.com/sunicdavy</a> 转蝲h明来?/font></strong></p> <h1><font face="Lucida Console">E服务器安装HG </font></h1> <h2><font face="Lucida Console">安装依赖?/font></h2> <p><font face="Lucida Console">yum install python-devel</font> </p> <h2><font face="Lucida Console">获取HG源码</font></h2> <p><font face="Lucida Console">wget </font><a ><font face="Lucida Console">http://mercurial.selenic.com/release/mercurial-2.1.tar.gz</font></a> </p> <p><font face="Lucida Console">tar zxvf ./mercurial-2.1.tar.gz</font> </p> <h2><font face="Lucida Console">~译安装</font></h2> <p><font face="Lucida Console">make all</font> </p> <p><font face="Lucida Console">make install</font> </p> <p><font face="Lucida Console">hg debuginstall</font> </p> <p><font face="Lucida Console"></font>  </p> <h1><font face="Lucida Console">使用HG同步数据</font></h1> <h2><font face="Lucida Console">创徏仓库</font></h2> <p><font face="Lucida Console">扑ֈ你需要同步的目录,q入目录</font></p> <p><font face="Lucida Console">执行</font></p> <p><font face="Lucida Console">hg init</font></p> <p><font face="Lucida Console">vi .hg/hgrc</font></p> <p><font face="Lucida Console">d以下内容,让这个仓库支持外部push</font></p> <p><font face="Lucida Console">[ui]</font></p> <p><font face="Lucida Console">username=<font color="#ff0000">服务器提交后看到的用户名</font></font></p> <p><font face="Lucida Console">[web]<br /></font></p> <p><div>push_ssl = false</div><font face="Lucida Console">allow_push=*<br /></font></p> <h2><font face="Lucida Console">同步</font></h2> <p><font face="Lucida Console">vi /etc/sysconfig/iptables</font></p> <p><font face="Lucida Console">dHG服务?000端口</font></p> <p><font face="Lucida Console">-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT</font></p> <p><font face="Lucida Console">开启仓库同步服?/font></p> <p><font face="Lucida Console">hg serve</font></p> <p><font face="Lucida Console">本地机器同样扑ֈ文g?创徏仓库</font></p> <p><font face="Lucida Console">hg init</font></p> <p><font face="Lucida Console">以后每次需要同步时,使用命o(h),或者乌龟HG的界面工h取服务器数据卛_</font></p> <p><font face="Lucida Console">hg pull http://服务器地址:8000</font></p> <p><font face="Lucida Console"></font> </p> <p><font face="Lucida Console">版本提交Ҏ(gu)与HG日常使用cM, q里不再阐述</font></p> <h1><font face="Lucida Console">ȝ更新</font></h1> <p>对于某些服务器深处防火墙或者安全登录后?不能直接开?000端口的情?/p> <p>可以使用hg导出一个patch, 传输到远E服务器, 使用hg import PATCH 卛_</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/172798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2012-04-26 11:11 <a href="http://www.shnenglu.com/sunicdavy/archive/2012/04/26/172798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下用CodeLite讄工作路径gdb出错的解x?/title><link>http://www.shnenglu.com/sunicdavy/archive/2012/03/30/169535.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Fri, 30 Mar 2012 08:07:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2012/03/30/169535.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/169535.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2012/03/30/169535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/169535.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/169535.html</trackback:ping><description><![CDATA[<p>CodeLite极力的模仿Visual Studio的界面及(qing)表现形式. 但是在有些配|项上却存在着操作不同, 看图说话:</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/LinuxCodeLite_E0CD/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/LinuxCodeLite_E0CD/image_thumb.png" width="763" height="183"></a></p> <p>q是目中的工程配置讑֮中的调试器参数讄. 图中Program启动E序设定ؓ(f)相对路径, 而W(xu)orking Folder工作目录设为绝对\?</p> <p>q样的设定无法启动调试器, gdb报? 无法扑ֈ调试E序:</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/LinuxCodeLite_E0CD/image_4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/LinuxCodeLite_E0CD/image_thumb_1.png" width="400" height="155"></a></p> <p>研究了一? 发现讑֮w引导你用浏览目录对话框q行选择, 试一? Program改ؓ(f)l对路径</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/LinuxCodeLite_E0CD/image_6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/LinuxCodeLite_E0CD/image_thumb_2.png" width="759" height="107"></a></p> <p>F5开始调? 不报? main中用getcwd获取当前路径验证, 讄正确, 问题解决</p> <p> </p> <p>分析: CodeLite应该只是两个参数简单的传给了gdb, 但是gdbq不知道工程相对路径,因此报错. q对于CodeLite开发者来?理解是正的, E序员思想.</p> <p>但是对于产品来说是失败的</p> <p>VisualStudio的调试器与IDEl合紧密, 因此以品思想开发程? p避免q种cM的问?/p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/169535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2012-03-30 16:07 <a href="http://www.shnenglu.com/sunicdavy/archive/2012/03/30/169535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让VC调试器正显CUTF-8字符?/title><link>http://www.shnenglu.com/sunicdavy/archive/2012/02/14/165566.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Tue, 14 Feb 2012 07:21:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2012/02/14/165566.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/165566.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2012/02/14/165566.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/165566.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/165566.html</trackback:ping><description><![CDATA[<p>默认? VC调试器只能正常显CANSI字符串及(qing)UNICODE字符? 而UTF-8字符串及(qing)其他格式则无法显C?/p> <p>q里无需~写插g?qing)修攚w|文?只需要将要显C的字符串拉到Watch?q在变量后面d,s8卛_昄</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/165611ed03f8_D62F/image_4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/165611ed03f8_D62F/image_thumb_1.png" width="233" height="42"></a> --> <a href="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/165611ed03f8_D62F/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/165611ed03f8_D62F/image_thumb.png" width="173" height="51"></a></p> <p>同样cd的功能也应该很熟(zhn)?/p> <p>,数字  变量拆分ؓ(f)数组昄, 数字是要昄多少? 此法对const char*q类原始字符串非常有?/p> <p>,x 16q制查看</p> <p>,hr  查看Windows HRESULT解释</p> <p>,wm Windows消息,例如0x0010, wm 昄 WM_CLOSE</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/165566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2012-02-14 15:21 <a href="http://www.shnenglu.com/sunicdavy/archive/2012/02/14/165566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转自CSDN]三好学生Chris Lattner的LLVM~译工具?/title><link>http://www.shnenglu.com/sunicdavy/archive/2011/12/31/163277.html</link><dc:creator>战魂筑</dc:creator><author>战魂筑</author><pubDate>Sat, 31 Dec 2011 08:51:00 GMT</pubDate><guid>http://www.shnenglu.com/sunicdavy/archive/2011/12/31/163277.html</guid><wfw:comment>http://www.shnenglu.com/sunicdavy/comments/163277.html</wfw:comment><comments>http://www.shnenglu.com/sunicdavy/archive/2011/12/31/163277.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.shnenglu.com/sunicdavy/comments/commentRss/163277.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sunicdavy/services/trackbacks/163277.html</trackback:ping><description><![CDATA[<p>原文链接: <a >http://www.programmer.com.cn/9436/</a></p> <p>作? 王越</p> <p> </p> <p><strong>2011q?2?日,LLVM 3.0正式版发布,完整支持所有ISO C++标准和大部分C++ 0x的新Ҏ(gu), q对于一个短短几q的全新目来说非常不易?/strong></p> <p><strong>开发者的惊愕</strong></p> <p>?011qWWDCQ苹果全球开发者大?x)?j)的一ZObjective-C相关的讲座上Q开发者的人生观被颠覆了?/p> <p>作ؓ(f)一个开发者,理好自q序所使用的内存是天经C的事Q好比h们在溜狗时必L理狗的排泄物一P国随处可见“Clean up after your dogs”的标志Q。在本科阶段上C语言的课E时Q教授们?x)向学生反复Q如果用malloc函数甌了一块内存,使用完后必须再用free函数把申L(fng)内存q给pȝ——如果不q,?x)造成“内存泄漏”的l果。这对于Hello World可能q不严重,但对于庞大的E序或是长时间运行的服务器程序,泄内存是致命的。如果没CQ自p清理了两ơ,造成的结果则严重得多—?a >直接DE序崩溃</a>?/p> <p>Objective-C有类似malloc/free的对子,叫alloc/deallocQ这U原始的方式如同理C内存一样困难。所以Objective-C中的内存理又增加了“引用计数”的Ҏ(gu)Q也是如果一个物件被别的物g引用一ơ,则引用计数加一Q如果不再被该物件引用,则引用计数减一Q当引用计数减至零时Q则pȝ自动清掉该物件所占的内存。具体来_(d)如果我们有一个字W串Q当建立Ӟ需要用allocҎ(gu)来申请内存,引用计数则变成了一Q然后被其他物g引用Ӟ需要用retainҎ(gu)d加它的引用计敎ͼ变成二。当它和刚才引用的物件脱d联时Q需使releaseҎ(gu)减少引用计数Q又变回了一Q最后,使用完这个字W串Ӟ再用releaseҎ(gu)减少其引用计敎ͼq时Q运行库发现其引用计数变为零了,则回收走它的内存。这?a >手动的方?/a>?/p> <p>q种方式自然很麻?ch),所以又设计ZU叫做autorelease的机Ӟ不是cMJava的自动垃圑֛Ӟ(j)。在Objective-C中,设计了一个叫做NSAutoReleasePool的池Q当开发者需要完成一个Q务时Q比如每开启一个线E,或者开始一个函敎ͼ(j)Q可以手动创立一个这L(fng)池子Q?然后通过昑ּx把物件扔q自动回收池中。NSAutoReleasePool内有一个数l来保存声明为autorelease的所有对象。如果一个对象声明ؓ(f)autoreleaseQ则?x)自动加到池子里。如果完成了一个Q务(l束U程了,或者退出那个函敎ͼ(j)Q则开发者需对这个池子发送一个drain消息。这ӞNSAutoReleasePool?x)对池子中所有的物g发送release消息Q把它们的引用计数都减一 ——这好比游x关门旉知所有客人都“滚蛋”一栗所以开发者无需昑ּ声明releaseQ所有的物g也会(x)在池子清I时自动呼叫release函数Q如果引用计数变成零了,pȝ才回攉块内存。所以这是个<a >半自动、半手动的方?/a>?/p> <p>Objective-C的这U方式虽然比起C来进了一大步Q我刚才׃几分钟就和读者讲明白了。只要遵守上面这两个单的规则Q就可以保证不犯M错误。但q和后来的Java自动垃圾回收相比则是非常J琐的,哪怕是再熟l的开发者,一不小心就?x)弄错。而且Q哪怕很单的代码Q比如物件的getter/setter函数Q都需要用户写上一堆的代码来管理接收来的物件的内存?/p> <p>l典教材《Cocoa Programming for Mac OS X》用了整整一章节的篇q,来讲解Objective-C中内存管理相关的内容Q但初学者们看得q是一头雾水。所以,?007q?0.5发布ӞObjective-C做出了有史以来最大的更新Q最大的亮点是它的运行库libobjc 2.0正式支持自动垃圾回收Q也是p行库在运行时随时侦测哪些物g需要被释放。听上去很不错,可惜使用q个技术的目却少之又。原因很单,使用q个Ҏ(gu),?x)有很大的性能损失QObjective-C的内存管理效率低得和Java一P而且一旦有一个模块启用了q个Ҏ(gu),q个q程中所有的地方都要启用q个Ҏ(gu)——因此如果你写了一个用垃圑֛收的库,那所有引用你库的E序都得被q用垃圑֛收。所以Apple自己也不使用q项技术,大量的第三方库也不用它?/p> <p>q个问题随Apple在移动市场的一炮走U而变得更加严峅R不q这ơ,Apple和与?x)的开发者讲Q他们找C一个解决问题的l极Ҏ(gu)Q这个方法把从世界各CE赶来聆听圣谕的开发者惊得目瞪口呆——你不用写Q何内存管理代码,也不需要用自动垃圑֛收。因为我们的~译器已l学?x)了上面所介绍的内存管理规则,?x)自动在~译E序时把q些代码插进厅R?/p> <p>q个~译器,一直是Apple公开的秘密——LLVM。说它公开Q是因ؓ(f)它自始至l都是一个开源项目;而秘密,则是因ؓ(f)它从来没公开在WWDC的Keynote演讲上亮相过 ?/p> <p>一直关注这pdq蝲的读者一定还记得Q在W二《Linus Torvalds的短视》介lApple和GPLC֌的不合时Q提到过“自以ؓ(f)是但代码又写得差的开源项目,Apple事后也遇C,比如GCC~译器项目组。虽然大把钞扔q去Q在先期能够解决一些问题,但时间长了这hdAppleq不去,q以自己在开源世界的C恫吓之,最lApple׃受不了这些项目组的态度、协议、代码质量,觉得q不如自己造轮子来得方ѝ”LLVM则是Apple造的q个轮子Q它的目的是完全替代掉GCC那条~译链。它的主要作者,则是现在p于Apple的Chris Lattner?/p> <p><strong>~译器高材生Chris Lattner</strong></p> <p>2000q_(d)本科毕业的Chris Lattner像中国多数大学生一P按部q地考了GREQ最l前往UIUCQ伊利诺伊大学厄巴纳香槟分校Q,开始了艰苦读计机士和博士的生(dng)。在q阶D,<a >他不仅周游美国各大景?/a>Q更是努力学?fn)科学文化知识,ȝ了“龙书”(《Compilers: Principles, Techniques, and Tools》)(j)Q?a >成了GPA牛h</a>【注Q最l学分积4.0满分】,以及(qing)不断地研I探索关于编译器的未知领域,发表了一又一的论文Q是中国传统观念里的“三好学生”。他?a >士毕业论文提出了一套完整的在编译时、链接时、运行时甚至是在闲置时优化程序的~译思想</a>Q直接奠定了LLVM的基?<br>LLVM在他念博士时更加成熟Q用GCC作ؓ(f)前端来对用户E序q行语义分析产生IFQIntermidiate FormatQ,然后LLVM使用分析l果完成代码优化和生成。这研I让他在2005q毕业时Q成为小有名气的~译器专Ӟ他也因此早早地被Apple怸Q成为其~译器项目的骨干?/p> <p>Apple怸Chris Lattner主要是看中LLVM能摆脱GCC束缚(x)。AppleQ包括中后期的NeXTQ?一直用GCC作ؓ(f)官方的编译器。GCC作ؓ(f)开源世界的~译器标准一直做得不错,但Apple对编译工具会(x)提出更高的要求?/p> <p>一斚wQ是Apple对Objective-C语言Q甚臛_来对C语言Q新增很多特性,但GCC开发者ƈ不买Apple的帐——不l实玎ͼ因此索性后来两者分成两条分支分别开发,q也造成Apple的编译器版本q落后于GCC的官方版本。另一斚wQGCC的代码耦合度太高,不好独立Q而且<a >是后期的版本,代码质量差</a>Q但Apple惛_的很多功能(比如更好的IDE支持Q需要模块化的方式来调用GCCQ但GCC一直不l做。甚xq,?a >GCCq行环境豁免条款 Q英文版Q?/a>》从Ҏ(gu)上限制了LLVM-GCC的开发?所以,q种不和让Apple一直在L一个高效的、模块化的、协议更放松的开源替代品QChris Lattner的LLVM昄是一个很的选择?/p> <p>刚进入AppleQChris Lattner大展n手:(x)首先在OpenGL组做代码优化,把LLVMq行时的~译架在OpenGL栈上Q这样OpenGL栈能够出更高效率的囑Ş代码。如果显卡够高U,q些代码?x)直接扔入GPU执行。但对于一些不支持全部OpenGLҎ(gu)的昑֍Q比如当时的Intel GMA卡)(j)Q?a >LLVM则能够把q些指o(h)优化成高效的CPU指o(h)QɽE序依然能够正常q行</a>。这个强大的OpenGL实现被用在了后来发布的Mac OS X 10.5上。同ӞLLVM的链接优化被直接加入到Apple的代码链接器上,而LLVM-GCC也被同步C用GCC4代码?/p> <p>LLVM真正的发q,则得{到Mac OS X 10.6 Snow LeopardM舞台。可以说Q?Snow Leopard的新功能Q完全得益于LLVM的技术。而这一个版本,也是LLVM推向真正成熟的重大机遇?/p> <p>关于Snow Leopard的三主推技术(64位支持、OpenCLQ以?qing)Grand Central DispatchQ的l节Q我们会(x)在下一ơ有整整一期篇q仔l讨论,q次只是点到为止——我们告诉读者,q些技术,不但需要语a层面的支持(比如<a >Grand Centrual Dispatch所用到的“代码块”语?/a>Q?q被很多人看作是带lambda的CQ,也需要底层代码生成和优化Q比如OpenCL是在q行时编译ؓ(f)GPU或CPU代码q发执行的)(j)。而这些需求得以实玎ͼ归功于LLVM自n的新前端——Clang?/p> <p><strong>优异的答卷——Clang</strong></p> <p>前文提到QApple吸收Chris Lattner的目的要比改qGCC代码优化宏大得多——GCCpȝ庞大而笨重,而Apple大量使用的Objective-C在GCC中优先很低。此外GCC作ؓ(f)一个纯_的~译pȝQ与IDE配合得很差。加之许可证斚w的要求,Apple无法使用LLVM l箋改进GCC的代码质量。于是,Apple军_从零开始写 C、C++、Objective-C语言的前?ClangQ完全替代掉GCC?/p> <p>正像名字所写的那样QClang只支持CQC++和Objective-C三种C家族语言?a >2007q开始开?/a>QC~译器最早完成,而由于Objective-C相对单,只是C语言的一个简单扩展,很多情况下甚臛_以等价地改写为C语言对Objective-Cq行库的函数调用Q因此在2009q时Q已l完全可以用于生产环境。C++的支持也热火朝天地进行着?/p> <p>Clang的加入代表着LLVM真正走向成熟和全能,Chris Lattner以媄(jing)响他最大的<a >“龙书”封?/a>【注Q见http://en.wikipedia.org/wiki/Dragon_Book_(computer_science)】ؓ(f)灉|Qؓ(f)目选定了图标—?a >一条张牙舞爪的飞龙</a>?/p> <p>Clang一个重要的Ҏ(gu)是~译快速,占内存少Q而代码质量还比GCC来得高。测试结果表明Clang~译Objective-C代码旉度为GCC?倍【注Qhttp://llvm.org/pubs/2007-07-25-LLVM-2.0-and-Beyond.pdf】,而语法树(wi)QASTQ内存占用则~译源码?.3倍,?a >GCC则可以轻易地可以过10?/a>。Clang不但~译代码快,对于用户犯下的错误,也能够更准确地给出徏议。用过GCC的读者应该熟(zhn),GCCl出的错误提C基本都不是lh看的?/p> <p>比如最单的Q?/p> <p>struct foo { int x; } <br>typedef int bar;</p> <p>如果使用GCC~译Q它?yu)告诉你Q?<br>t.c:3: error: two or more data types in declaration specifiers</p> <p>但是Clangl出的出错提C则昑־人性化得多Q?<br>t.c:1:22: error: expected ??after struct</p> <p>甚至QClang可以Ҏ(gu)语境Q像拼写(g)查程序一样地告诉你可能的替代Ҏ(gu)?<br>比如q个E序Q?/p> <p>#include <inttypes.h> <br>int64 x;</p> <p>GCC一L(fng)Zؕ码似的出错提C:(x)</p> <p>t.c:2: error: expected ?? ?? ?? ‘asm?or ‘__attribute__?before ‘x?/p> <p>而优雅的Clang则用彩色的提C告诉你是不是拼错了Qƈl出可能的变量名Q?/p> <p>t.c:2:1: error: unknown type name ‘int64? did you mean ‘int64_t? <br>int64 x;^~~~~int64_t</p> <p>更多的例子可以参考http://blog.llvm.org/2010/04/amazing-feats-of-clang-error-recovery.html?而同时又因ؓ(f)Clang是高度模块化的一个前端,很容易实C码的高度重用。所以比如Xcode 4.0的集成编E环境就使用Clang的模块来实现代码的自动加亮、代码出错的提示和自动的代码补全。开发者用Xcode 4.0以后的版本,可以极大地提高编E效率,可能地降低~译错误的发生率?/p> <p>支持C++也是Clang的一w要命。C++是一门非常复杂的语言Q大多编译器Q如GCC、MSVCQ用了十多年甚至二十多年来完善对C++的支持,但效果依然不很理惟뀂Clang的C++支持却一直如火如荼地展开着?010q??日,Clang已经成熟到能自DQ即使用Clang~译ClangQ到我发E时Q?a >LLVM 3.0发布已完整支持所有ISO C++标准Q以?qing)大部分C++ 0x的新Ҏ(gu)?/a>?/p> <p>q对于一个短短几q的全新目来说是非怸易的。得益于本n健壮的架构和Apple的大力支持,Clang来全能,?a >FreeBSD</a>【注Qhttp://lists.freebsd.org/pipermail/freebsd-current/2009-February/003743.html??a >Linux Kernel</a>【注Qhttp://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-October/011711.html】, ?a >Boost</a>【注Qhttp://blog.llvm.org/2010/05/clang-builds-boost.html??a >Java虚拟?/a>Q?Clang支持的项目越来越多?/p> <p>Apple的Mac OS X以及(qing)iOS也成了Clang和LLVM的主要试验场—?0.6时代Q很多需要高效运行的E序比如OpenSSL和HotspotqLLVM-GCC~译来加速的。?0.6时代的Xcode 3.2诸多囑Ş界面开发程序如Xcode、Interface Builder{,皆由Clang~译。到了Mac OS X 10.7Q整个系l的的代码都由Clang或LLVM-GCC~译【注Qhttp://llvm.org/Users.html】?/p> <p><strong>LLVM周边工具</strong></p> <p>׃受到Clang目的威胁,GCC也不得不软下来,让自己变得稍微模块化一些,推出<a >插g的支?/a>Q而LLVM目则顺水推舟,索性废掉了出道时就一直作为看家本领的LLVM-GCCQ改Z?a >GCC的插件DragonEgg</a>?Apple也于Xcode 4.2d抛弃了GCC工具链?/p> <p>而Clang的一个重要衍生项目,则是<a >静态分析工?/a>Q能够通过自动分折E序的逻辑Q在~译时就扑ևE序可能的bug。在Mac OS X 10.6Ӟ静态分析被集成qXcode 3.2Q帮助用h找自q下的错误。其中一个功能,是告诉用户内存理的BugQ比如alloc了一个物件却忘记使用<a >release回收</a>。这已经是一很可怕的技术,而Apple自己一定用它来发现ƈҎ(gu)Mac OS X整个pȝ各层面的问题。但许多开发者还不满——既然你能发现我漏写了releaseQ你Z么不能帮我自动加上呢Q于是ARC?a >集成qClang</a>Q发生了文章开头开发者们的惊愕——从来没有h觉得qg事是可以做成的?/p> <p>除LLVM核心和Clang以外QLLVMq包括一些重要的子项目,比如一?a >原生支持调试多线E程序的调试器LLDB</a>Q和一?a >C++的标准库libstdc++</a>Q这些项目由于是从零重写的,因此要比先前的很多项目站得更高,比如先前GNU、Apache、STLport{C++标准库在设计ӞC++0x标准q未公布Q所以大多不支持q些新标准或者需要通过一些肮脏的改动才能支持Q而libstdc++则原生支持C++0x。而且在现代架构上Q这些项目能动用多核把事情处理得更好?/p> <p>不单单是AppleQ诸多的目和编E语a都从LLVM里取得了关键性的技术?a >Haskell语言~译器GHC使用LLVM作ؓ(f)后端</a>Q实C高质量的代码~译。很多动态语a实现也用LLVM作ؓ(f)q行时的~译工具Q较著名的有Google的Unladen Swallow【注Q?a >Python实现Q后夭折</a>】、PyPy【注Q?a >Python实现</a>】,以及(qing)MacRuby【注Q?a >Ruby实现</a>】?a >例如 MacRuby 后端改ؓ(f)LLVM后,速度不但有了显著的提?/a>Q更是支持Grand Central Dispatch来实现高度的q行q行。由于LLVM高度的模块化Q很方便重用其中的组件来作ؓ(f)一个实现的重要l成部分Q因此类似的目?x)越来越多?/p> <p>LLVM的成熟也l其他痛恨GCC的开发项目出了一口恶气。其中最重要的,恐怕是以FreeBSDZ表的BSDC֌。BSDC֌和Apple的联pM向很紧密Q而且׃代码怼Q很多Apple的技术如Grand Central Dispatch也是最早移植到FreeBSD上?a >BSDC֌很早在找GCC的替代品</a>Q无奈大多都很差Q如Portable C Compiler产生的代码质量和gcc不能同日而语Q?/p> <p>一斚w是因Z满意GCC的代码品质【注QBSD代码整体要比GNU的高一些,GNU代码永无休止地出现各U严重的<a >安全问题</a>】,更重要的是协议问题。BSD开发者有z癖的居多,大多都不喜欢GPL代码Q尤其是<a >GPL协议W三版发布时Q和FreeBSD的协议甚x冲突?/a>。这也正是ؓ(f)什么F(tun)reeBSD中包含的GNU的C++q行库还?007q以GPLv2发布的老版本,而不是支持C++0x的但依GPLv3协议发布的新版本?因此历时两年的开发后Q?012q初发布的FreeBSD 9.0中,<a >Clang被加入到FreeBSD的基pȝ</a>?但这只是W一步,因ؓ(f)FreeBSD中依然用GNU的C++ STL 库、C++q行库、GDB调试器、libgcc/libgcc_s~译库都是和~译相关的重要底层技术,先前全被GNU垄断Q而现在LLVM子项目lldb、libstdc++、compiler-rt{项目的出现QBSDC֌有机?x)向GNU说“不”,因此一个把<a >GNUlgUdFreeBSD的计划被构想出来</a>Qƈ完成了很大一部分。编写过《Cocoa Programming Developer’s Handbook》的著名Objective-C牛hDavid Chisnall也被吸收入FreeBSD开发组完成q个计划的关键部分?预计在FreeBSD 10发布Ӟ不再包含GNU代码?/p> <p>LLVM在短短五q内取得的快速发展充分反映了Apple对于产品技术的q见和处理争端的军_和手腕,q一跃成为最领先的开源Y件技术。而Chris Lattner?010q也赢得了他应有的荣誉——Programming Languages Software AwardQ程序设计语a软g奖)(j)?/p> <p> </p> <p> </p> <p>本站?</p> <p>    一直对LLVM ?qing)Clang搞的qp糊? q篇文章写的很翔?</p> <p>    微Y在品及(qing)q_上的开放性简直是坑爹. 虽然开发工具上很给? 但其致命点仍然是闭</p> <p>    Ҏ(gu)?高效, 用户至上的思想在其q_?qing)品?AppleScript,LLVM,Clang)体现得淋漓精? 垃圾回收的改q一路磕碰?但最l的Ҏ(gu)让我们折?</p><img src ="http://www.shnenglu.com/sunicdavy/aggbug/163277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sunicdavy/" target="_blank">战魂筑</a> 2011-12-31 16:51 <a href="http://www.shnenglu.com/sunicdavy/archive/2011/12/31/163277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Notepad++挂接ProtoBuffer代码生成器protochttp://www.shnenglu.com/sunicdavy/archive/2011/12/22/162578.html战魂筑战魂筑Thu, 22 Dec 2011 03:00:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2011/12/22/162578.htmlhttp://www.shnenglu.com/sunicdavy/comments/162578.htmlhttp://www.shnenglu.com/sunicdavy/archive/2011/12/22/162578.html#Feedback2http://www.shnenglu.com/sunicdavy/comments/commentRss/162578.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/162578.html在插件菜单NppExec->Execute弹出的对话框中输入以下信?/p>

    "protoc.exe"   --cpp_out $(CURRENT_DIRECTORY) --proto_path $(CURRENT_DIRECTORY)  $(FULL_CURRENT_PATH) 

     

    protoc.exe的\径可以自己指定本机的l对路径

    ~译出的文g自动放|到proto文g所在目?/p>

    战魂筑 2011-12-22 11:00 发表评论
    ]]>
    跨^C改代码的解决Ҏ(gu)http://www.shnenglu.com/sunicdavy/archive/2011/12/15/162159.html战魂筑战魂筑Thu, 15 Dec 2011 03:02:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2011/12/15/162159.htmlhttp://www.shnenglu.com/sunicdavy/comments/162159.htmlhttp://www.shnenglu.com/sunicdavy/archive/2011/12/15/162159.html#Feedback4http://www.shnenglu.com/sunicdavy/comments/commentRss/162159.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/162159.html本h使用WindowsZ要开发^? Linux为编?调试q_

    Linux使用cVC的IDE CodeLite

    讄Ҏ(gu):

    1. Settings->Global Editor Preferences->Misc->Encoding and Locale

    2. File font encoding: 选择 WINDOWS-936

    3. Locale to use zh_CN: Chinese(Simplified)

    重启CodeLite, 可有效避免Linux修改了文?导入Windows变成q!



    战魂筑 2011-12-15 11:02 发表评论
    ]]>
    VC9的预~译头C1859~译错误解决Ҏ(gu)http://www.shnenglu.com/sunicdavy/archive/2011/12/12/161982.html战魂筑战魂筑Mon, 12 Dec 2011 11:07:00 GMThttp://www.shnenglu.com/sunicdavy/archive/2011/12/12/161982.htmlhttp://www.shnenglu.com/sunicdavy/comments/161982.htmlhttp://www.shnenglu.com/sunicdavy/archive/2011/12/12/161982.html#Feedback0http://www.shnenglu.com/sunicdavy/comments/commentRss/161982.htmlhttp://www.shnenglu.com/sunicdavy/services/trackbacks/161982.html今天从hg取过代码后编译代?居然出现了C1859的预~译头破损错?查过预编译头讄与清IZ间文件夹重试,问题依旧.

    Google后发现解x?打补?/p>

    问题说明:http://support.microsoft.com/kb/976656

    补丁地址 http://archive.msdn.microsoft.com/KB976656/Release/ProjectReleases.aspx?ReleaseId=3703

     

    考虑部v到vs2010, 但vs2012又要出来?q是忍忍?/p>

    战魂筑 2011-12-12 19:07 发表评论
    ]]>
    Ժձһձþ| þþƷŷ| þþƷ77777| ˾þô߽Ʒ| ޹㽶þþþþ| ҹƷþþþþ99| 㽶þþþ| þþƷ99Ʒ| þֻƷ99 | ˾þô߽AVۺӰԺ| Ʒݾþþþ| ɫվþav| ݺɫۺϾþ| þþþ99оƷ10| þþۺϾɫ۹| ƷëٸAVѾþ| þù˾Ʒ鶹| ٸۺϾþĻ| ƷһþþƷ | aaþ| ۺϳ˾þС˵ | þþƷ޾Ʒ2020| þ99Ʒ99þ6| Ʒþþþѿ| 94þù׾Ʒ| պĻþ| þ99Ʒһ| ƷŮþþm| þۺϳDž| þ99ֻоƷ | ҹþþþüŮӰԺ| þۺϾþԾ99ëƬ| 91Ըߺþþþ| þùѾƷ| 99þ㽶߿| þҹۺϾþ| ҹƷþ| þþþĻƷ| Ʒ99þþþþ| ˺ݺۺϾþ88| þþþƷһ|