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 · 5445 次点击
    这是一个创建于 4476 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
       2012-08-29 23:40:07 +08:00
    @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   ·   实用小工具   ·   2598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:26 · PVG 23:26 · LAX 07:26 · JFK 10:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.