3 Star 6 Fork 0

calvinwilliams / zlang

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

每一位热爱编程的软件工程师都有一个终极梦想:创造一门自己的计算机语言。

zlang简介

zlang是一门C/Java语系的、追求简洁但又高阶的、基于对象克隆的的解释性编程语言。

import stdtypes stdio ;

function int main( array args )
{
        stdout.Println( "hello world" );

        return 0;
}

创造zlang的一部分初衷是觉得手头的语言总存在这样那样的不方便之处,C在处理字符串时不够高阶简单,JavaGet/Set太八股,这些通过扩展很难彻底解决,但如果拥有一门自己的语言,就能打造成自己想要的样子,岂不爽哉。

import stdtypes stdio ;

function int main( array args )
{
        string  fruit = "pear" ;
        string  guess ;
        stdin.Scan( guess );
        if( guess == fruit )
                stdout.Println( "Yes" );
        else
                stdout.Println( "No" );

        return 0;
}

首先是如何设计zlang的语法,程序员在学习一门新的编程语言时最烦的就是新语言的语法完全特立独行、奇形怪状、满眼都是符号,自己得重新培养新的语感,其实C/Java的语法已经设计的相当完美了,新语言根本没必要完全设计一套新的语法,新语言的重点应该放在如何解决老语言的问题上,以及基于既有语法做扩展,zlang语法继承自C/Java,能让最广大的同学们快速学习掌握,把有限的时间精力放在差异化部分。

import stdtypes stdio ;

function int factorial( int n )
{
        if( n == 1 )
                return 1;
        else
                return factorial(n-1) * n ;
}

function int main( array args )
{
        n = factorial( 6 ) ;
        stdout.Println( n );

        return 0;
}

UNIX/Linux的伟大之一是所有进程都是从根进程克隆出来的,这和Windows笨重的从头创建一个新进程形成鲜明的对比,克隆体现出一种简单而又不失强大的UNIX哲学,zlang尝试通过克隆根对象来创造整个应用程序来实践一门语言哲学,希望这是正确的。

import stdtypes stdio ;

function int main( array args )
{
        string  sheep1 = "Dolly" ;
        sheep1  sheep2 ;
        stdout.Println( sheep2 );

        return 0;
}

性能方面,zlang虽然是解释性语言,但还未做大规模的优化就拥有不俗的性能了,在我的老爷机上短连接、串行请求一个WEB动态页面(模板实例化),RT在1ms左右(TPS 1000)。

<html>
<head>
<title>((HEADER_TITLE))</title>
</head>
<body>
({UNLOGIN))
<p>Please login first</p>
(/UNLOGIN})
({LOGIN))
<p>USER : ((USER))</p>
<table border="1">
        <tr>
                <td>ID</td>
                <td>NAME</td>
                <td>AMOUNT</td>
        </tr>
        ([DETAIL))
        <tr>
                <td>((ID))</td>
                <td>((NAME))</td>
                <td>((AMOUNT:%.1lf))</td>
        </tr>
        (/DETAIL])
</table>
<p>      TOTAL  : ((TOTAL))</p>
<p>TOTAL_AMOUNT : ((TOTAL_AMOUNT))</p>
<p>    DATETIME : ((DATETIME))</p>
(/LOGIN})
</body>
</html>
$ ab -c 1 -n 10000 'http://192.168.11.79:9527/test_httpserver_htmlsection_1_1'
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.11.79 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        192.168.11.79
Server Port:            9527

Document Path:          /test_httpserver_htmlsection_1_1
Document Length:        466 bytes

Concurrency Level:      1
Time taken for tests:   10.448 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      5060000 bytes
HTML transferred:       4660000 bytes
Requests per second:    957.13 [#/sec] (mean)
Time per request:       1.045 [ms] (mean)
Time per request:       1.045 [ms] (mean, across all concurrent requests)
Transfer rate:          472.96 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     1    1   0.1      1       3
Waiting:        1    1   0.1      1       3
Total:          1    1   0.1      1       3

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      1
  99%      1
 100%      3 (longest request)

除此之外,zlang还拥有如下特性:

  1. 同时支持面向过程和面向对象,语言设计者根本不用考虑面向过程和面向对象哪个好,都支持好了,看用户怎么喜欢怎么用。

    import stdtypes stdio ;
    
    interface animal
    {
            string  name ;
    
            function void SetWarriorName( string name )
            {
                    this.name = name + " warrior" ;
            }
    
            function void Cry();
            function void Eat( string food );
    }
    
    object cat implements animal
    {
            function void Cry()
            {
                    stdout.Println( "miaomiaomiao~" );
            }
    
            function void Eat( string food )
            {
                    if( food == "fish" )
                            stdout.Println( ":)" );
                    else
                            stdout.Println( ":(" );
            }
    }
    
    object dog implements animal
    {
            function void Cry()
            {
                    stdout.Println( "wangwangwang~" );
            }
    
            function void Eat( string food )
            {
                    if( food == "bone" )
                            stdout.Println( ":>" );
                    else
                            stdout.Println( ":<" );
            }
    }
    
    function int main( array args )
    {
            cat     my_cat ;
    
            my_cat.SetWarriorName( "ahua" );
            stdout.Println( my_cat.name );
            my_cat.Cry();
            my_cat.Eat( "fish" );
            my_cat.Eat( "bone" );
    
            dog     my_dog ;
    
            my_dog.SetWarriorName( "black" );
            stdout.Println( my_dog.name );
            my_dog.Cry();
            my_dog.Eat( "bone" );
            my_dog.Eat( "fish" );
    
            return 0;
    }
  2. 自动推导类型,声明变量时,明显可自动推导出来类型,则不用写出来。

    import stdtypes stdio ;
    
    function int main( array args )
    {
            str2 = "hello2" ;
            stdout.Println( str2 );
    
            return 0;
    }
  3. 对象动态增删方法和属性,既然是解释语言,就要把运行时这个优势发挥好,语言只管提供这种能力,天知道会被神一般的用户玩出什么花来,比如我对实体类就很感冒。

    import stdtypes stdio ;
    
    function int main( array args )
    {
            zobject o ;
            string  str ;
    
            o.AddProperty( <object>string , "name" );
    
            o.name = "cal" ;
            stdout.Println( o.name );
    
            str = o.ReferProperty( "name" ) ;
            str =* "vin" ;
            stdout.Println( o.name );
    
            o.RemoveProperty( "name" );
    
            return 0;
    }
  4. 提供完整、必要的集合对象:数组、链表、映射、队列、栈,管理数据基本无忧。

    import stdtypes stdio ;
    
    function int main( array args )
    {
            list<string>    my_list ;
    
            my_list.AddTail( "111" );
            my_list.AddTail( ”222“ );
            my_list.AddTail( "333" );
    
            stdout.Println( my_list.Length() );
    
            foreach( string s in my_list )
            {
                    stdout.Println( s );
            }
    
            return 0;
    }
  5. 人必云GetSet能做到封装性、提供扩展能力,我觉得封装性不一定非要用方法,对象中的一些属性为什么就不能作为接口暴露出来,不要人云己云,至于扩展性,那是Java语言的设计问题了,zlang提供了属性拦截器解决扩展性问题,没必要为将来极小概率的扩展性而要求每个属性都用繁琐的存取写法,大胆的直接赋值好了,直接的、简单的就是最好的,将来碰到需要扩展性时写一个属性拦截器就解决了,真没必要为了将来1%的扩展性导致99%都遵循繁琐的写法。比如以下表达,你更喜欢哪一种?

    赋值

    Java

    tortoise.setName( msg.getName() );

    zlang

    falcon.name = msg.name ;

    字符串比较

    Java

    if( name.equals(name2) )

    zlang

    if( name == name2 )

    自创的属性拦截器

    zlang

    import stdtypes stdio ;
    
    object greasy_man
    {
            public string   name ;
            public int      age ;
    
            intercept get name( object name )
            {
                    if( name == null || name == "" )
                            name = "" ;
                    else
                            name += "@Hangzhou" ;
                    return;
            }
    
            intercept set age( object age )
            {
                    if( age < 0 )
                            age = 0 ;
                    else if( age > 200 )
                            age = 200 ;
                    return;
            }
    }
    
    function int main( array args )
    {
            greasy_man      i ;
    
            i.name = "calvin" ;
            stdout.FormatPrintln( "i.name[%s]" , i.name );
    
            i.age = 296 ;
            stdout.FormatPrintln( "i.age[%d]" , i.age );
    
            return 0;
    }
  6. zlang的迭代器支持前后移动。

  7. 关键字、函数名、变量名都可以使用中文。还是那句话,我提供功能,喜欢的人就用,不喜欢的人可以不碰。

    charset "zh_CN.gb18030"
    
    导入 stdtypes stdio ;
    
    函数 整型 主函数( 数组 命令行参数集 )
    {
            字符串  招呼 = "你好,世界" ;
            字符串  A前中后B有字母C = "A前中后B有字母C" ;
            整型    数 = 3 ;
            整型    序号 , 总数 ;
    
            如果(招呼!="你好,世界")
            {
                    标准输出.显示并换行( "不对" );
            }
            否则
            {
                    标准输出.显示并换行( A前中后B有字母C );
            }
    
            分支判断(数)
            {
                    分支匹配 1 :
                            标准输出.显示并换行( "击中1" );
                    分支匹配 2 :
                            标准输出.显示并换行( "击中1" );
                    分支缺省:
                            标准输出.显示并换行( "击中缺省" );
            }
    
            总数 = 3 ;
            循环( 序号=0 ; 序号<总数 ; 序号++ )
            {
                    标准输出.格式化显示并换行( "序号[%d]" , 序号 );
            }
    
            循环每一个( 字符串 参数 在里面 命令行参数集 )
            {
                    标准输出.格式化显示并换行( "命令行参数[%s]" , 参数 );
            }
    
            返回 0;
    }
  8. zlang加入了很多各种编程语言精华的特性,比如延迟执行等。

    import stdtypes stdio ;
    
    function int main( array args )
    {
            stdfile         f ;
    
            nret = f.Open( "test_defer_1.out" , "w" ) ;
            if( nret == -1 )
            {
                    stdout.Println( "open file failed[%d]" , nret );
                    return 1;
            }
            defer f.Close();
    
            f.FormatPrintln( "hello" );
    
            return 0;
    }
  9. zlang的输出对象支持格式化串中不给定参数对应的类型而通过自动推导、支持直接在格式化串给定变量名而不用在后面苦哈哈的一个又一个加对应的参数。

    stdout.FormatPrintln( "s[%?] i[%?] l[%?] f[%?] d[%?]" , s , i , l , f , d );
    stdout.FormatPrintln( "s[%{s:2hd}] i[%{i:-4d}] l[%{l:ld}] f[%{f:4f}] d[%{d:10.2lf}]" );
  10. zlang是我几乎完全自研的编程语言,连词法分析器都手工编写,以下是仅有的依赖:

  • 我的开源项目:Linux红黑树库的模板库rbtree_tplzlang源代码中已包含其源码)
  • 我的开源项目:追加模式数据页管理函数库aodatapagezlang源代码中已包含其源码)
  • 我的开源项目:字节序函数库byteorderzlang源代码中已包含其源码)
  • 我的开源项目:通用数据库访问层cdbczlang源代码中已包含其源码)
  • 我的开源项目:GUS_UUID编码库libguszlang源代码中已包含其源码)
  • 我的开源项目:JSON解析库fasterjsonzlang源代码中已包含其源码)
  • 我的开源项目:XML解析库fasterxmlzlang源代码中已包含其源码)
  • 我的开源项目:HTTP解析库(支持流式)fasterhttpzlang源代码中已包含其源码)
  • 我的开源项目:通用模板库fastertplzlang源代码中已包含其源码)
  • 我的开源项目:WEB服务器hetaozlang源代码中已包含其源码)
  • 我的开源项目:日志库iLOG3zlang源代码中已包含其源码)
  • Linux内核:链表和红黑树函数库listrbtreezlang源代码中已包含其源码)
  • Redis客户端库:hiredis(链接时外部依赖)
  • 各个数据库客户端API库:libmysqlclient.solibpq.solibsqlite3.so(链接时外部依赖)
  1. 更多特性持续增加中...

zlang教程传送门

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

完全自研、国产编程语言——Z语言 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/calvinwilliams/zlang.git
git@gitee.com:calvinwilliams/zlang.git
calvinwilliams
zlang
zlang
release

搜索帮助