分享我写的语言 cobj - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
Cofyc
V2EX    iDev

分享我写的语言 cobj

  •  
  •   Cofyc
    Cofyc 2012-08-29 23:19:53 +08:00 6030 次点击
    这是一个创建于 4855 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://github.com/Cofyc/cobj

    名字叫 cobj, C Object 的缩写。

    一两年前,一本编译原理,一堆 checkout 出来的源码,从零开始,纯粹只是为了实现”自己的”语言,开始了这个业余项目。

    虽然是还是一个 toy language,但如今有了点雏形,感觉迈出了第一步,鼓起勇气放到网上,希望与更多语言爱好者交流。。。

    很多代码与技术是基于或者借自其他开源语言,其中核心的对象模型与 GC 是 Python 的翻版,但词法、语法分析器,语法树,VM,以及一些辅助设施均自己实现,当然技术均来自书籍以及各种开源语言,包括并不限于以下:Python, PHP, Ruby, Lua, Go。这方面目前不敢说有任何独到之处。

    以下是例子:(目前很雏形,对象,模块,第三方 API 均还没有)

    // print primes
    maxnum = 10
    i = 2
    func is_prime(n)
    ----local j = 2
    ----while j * j < n + 1
    --------if n % j == 0
    ------------return False
    --------end
    --------j += 1
    ----end
    ----return True
    end

    while i <= maxnum
    ----if is_prime(i)
    --------print(i)
    ----end
    ----i += 1
    end

    // closure
    # Borrowed from Programming Lua, 2nd edition, section 16.5
    func newObject(value)
    ----return func (action, v)
    --------if action == "get" do return value
    --------elif action == "set" do value = v
    --------end
    ----end
    end
    d = newObject(0)
    print(d("get", None))
    d("set", 10)
    print(d("get", None))


    更多例子可以看代码的 examples/ 目录。希望与更多同好交流。。。并希望自己的代码对想要写语言的人有所帮助。
    28 条回复    1970-01-01 08:00:00 +08:00
    Cofyc
        1
    Cofyc  
    OP
       2012-08-29 23:25:05 +08:00
    不知道如何贴代码,用 "----" 代替了缩进。
    Cofyc
        2
    Cofyc  
    OP
       2012-08-29 23:28:48 +08:00
    补充:macosx 下开发,还没 port 到 linux
    yangg
        3
    yangg  
       
    @Cofyc 一般都是把例子放到gist.github.com里,然后把链接直接入到这里就会解析(貌似要去掉https里的s)
    ultragtx
        4
    ultragtx  
       2012-08-29 23:40:14 +08:00
    nb
    miaoever
        5
    miaoever  
       2012-08-29 23:43:34 +08:00
    也想自己言,但不知道何做起,看本原理的,感偏理,上不知道如何一步一步下手,主指教,多。
    thedevil7
        6
    thedevil7  
       2012-08-29 23:43:58 +08:00
    @Cofyc 用 gist 代码, http://********* 不能用 https.
    Cofyc
        7
    Cofyc  
    OP
       2012-08-29 23:59:54 +08:00   2
    @thedevil7 下手总是从最开始的入手。

    1+2*3 这是一个算式,但也是大多语言的一部分。如果你看过编译原理,里面会提到 lex, yacc 等工具,分别是词法和语法解析生产工具(目前主要使用其后代,re2c,bison等)。而这些工具的手册里就有如何实现一个计算器的范例。可以从这里开始实践并学习。
    haiyang416
        8
    haiyang416  
       2012-08-30 00:14:37 +08:00
    只为了鼓励下楼主。
    udonmai
        9
    udonmai  
       2012-08-30 00:16:23 +08:00
    赞~ 最喜欢能做到自己想做的事的人了!
    Cofyc
        10
    Cofyc  
    OP
       2012-08-30 00:16:43 +08:00   2
    @thedevil7 最开始 -> 最基础

    之后去逐步了解编译器、解析器的组成与运行环节,了解参与其中的数据结构及其实现等等。

    我看的编译原理书是"龙"书 (Compilers: Principles, Techniques, and Tools),对这方面讲解的非常好。

    最好对照一门开源语言一起看,推荐 Python 和 Lua。这两门语言的语言,是我读起来最容易,也是我个人好的代码编写方式。

    慢慢地让自己草稿上的符号变成程序中有意义的部分,然后设计语法,让它们动起来。

    还有就是,思考语言本身,以及何为语言很重要。
    Cofyc
        11
    Cofyc  
    OP
       2012-08-30 00:24:23 +08:00
    语言的语言 -> 语言的源码

    悲剧,ipad 上打了好多错别字,不好意思。。。
    Cofyc
        12
    Cofyc  
    OP
       2012-08-30 00:30:52 +08:00
    @miaoever sry,前面贴子是回复你的,@ 错用户名了
    miaoever
        13
    miaoever  
       2012-08-30 00:32:45 +08:00
    @Cofyc 非常感 :)
    Cofyc
        14
    Cofyc  
    OP
       2012-08-30 00:33:30 +08:00
    主贴没法修改了,不过只是语法示例,这样缩进看上去也很不错。
    DeepBlue
        15
    DeepBlue  
       2012-08-30 15:14:32 +08:00
    理想和兴趣是最值得赞扬的
    Linux诞生的时候世界上也不缺OS么。。
    语言设计我是彻底的门外汉,无能评论,但是我有个建议不妨考虑一下。
    给语言定一个定位。
    像PHP致力于WEB开发,Lua专注于嵌入式,Go的定位貌似是系统开发?
    给语言一个明确的定位会给自己一个方向与目标,也能直观的让别人知道这语言能做什么。(当然,如果定位是学习就当我没说……
    dn
        16
    dn  
       2012-08-30 18:03:35 +08:00
    可能不会去用这个东西,但是还是支持一次。造轮子的过程应该能学到很多东西。
    zxy
        17
    zxy  
       2012-08-30 18:24:49 +08:00
    zxy
        18
    zxy  
       2012-08-30 18:26:10 +08:00
    ,勘误,贴错了,不认真的后果
    http://gist.github.com/3525706
    cabinw
        19
    cabinw  
       2012-08-30 18:28:44 +08:00
    鼓励!
    jimbray
        20
    jimbray  
       2012-08-30 18:36:02 +08:00
    NB
    Js
        21
    Js  
       2012-08-30 18:54:34 +08:00
    赞, 话说那两例子除了True和None,整体好有lua的赶脚
    Cofyc
        22
    Cofyc  
    OP
       2012-08-30 19:11:54 +08:00
    @DeepBlue 目标是写一门通用目的的 DSL 语言。不过,还在往巨人的肩膀上爬。。。以后会怎样不好说。
    Hualin
        23
    Hualin  
       2012-08-30 19:17:49 +08:00
    好赞 v2ex 上也有这样另类的GEEK
    Cofyc
        24
    Cofyc  
    OP
       2012-08-30 19:22:09 +08:00
    @DeepBlue 关于定位,一直在思考,只是能定什么位与能做出什么直接有关,等能站在前人的肩膀上,才能确定吧。虽然目标确定,但主要以学习为主。感谢建议 ;-)
    Cofyc
        25
    Cofyc  
    OP
       2012-08-30 19:30:15 +08:00
    关于语法,Lua/Python/Ruby 是我直接的借鉴。

    三者语法都是极简。我在设计语法时,也是不允许一点冗余。
    一些地方比它们还要简单,比如合用 then/do。当然目前语言还很小。
    iminto
        26
    iminto  
       2012-08-31 09:54:25 +08:00
    跟lua 比较接近
    adow
        27
    adow  
       2012-08-31 10:20:37 +08:00
    LZ NB 啊
    lemonleo
        28
    lemonleo  
       2012-12-10 22:05:05 +08:00
    顶楼主,很GEEK
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     762 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 20:32 PVG 04:32 LAX 12:32 JFK 15:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86