{"id":13780115,"url":"https://github.com/dinglixing/panda-org","last_synced_at":"2025-05-11T13:31:32.140Z","repository":{"id":215846190,"uuid":"66626593","full_name":"dinglixing/panda-org","owner":"dinglixing","description":"Panda is  a library to build your compiler/interpreter or embedded in your program. ","archived":false,"fork":false,"pushed_at":"2017-05-26T07:59:43.000Z","size":659,"stargazers_count":10,"open_issues_count":7,"forks_count":3,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-08-03T18:14:47.100Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://cupkee.cn","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dinglixing.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-08-26T07:29:15.000Z","updated_at":"2021-10-25T18:54:59.000Z","dependencies_parsed_at":"2024-01-17T01:34:24.193Z","dependency_job_id":"27073845-be6c-4e7f-98ad-998910457f54","html_url":"https://github.com/dinglixing/panda-org","commit_stats":null,"previous_names":["dinglixing/panda-org"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinglixing%2Fpanda-org","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinglixing%2Fpanda-org/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinglixing%2Fpanda-org/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinglixing%2Fpanda-org/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dinglixing","download_url":"https://codeload.github.com/dinglixing/panda-org/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225056763,"owners_count":17414204,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T18:01:12.493Z","updated_at":"2024-11-17T15:30:55.588Z","avatar_url":"https://github.com/dinglixing.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"# panda简介\n\npanda是脚本语言解释器，它基于javascript，但裁剪了部分语法特性;\n\npanda是轻量级语言，它被设计用来作为嵌入式硬件的解释器;\n\npanda很容易学习。\n\n## 动手操作\n\n首先，需要一个解释器来执行你编写的脚本，目前有几种方式：\n\n1. 在Mac或Pc机上运行panda的交互解释器（源代码编译生成）\n2. 通过Mac或Pc连接到安装了cupkee OS的硬件板（这种方式下，你将能够直接操作硬件，更多内容请参考cupkee相关资料）\n\n解释器在显示出一个漂亮（丑陋）的logo后，开始等待用户输入。\n你可以键入panda/javascript语句，解释器将进行语法解析、编译为字节码、解释执行，最后将执行结果通过终端返回。\n\n如果你使用panda交互解释器，看到的输出大概就是下面的样子\n\n```\n$ panda/repl\n\u003e \n```\n\n## 编译panda解释器\n\n### 获取源代码\n```\ncd your_workspace_path\ngit clone https://github.com/cupkee/panda.git\n```\n\n### 编译\n\n在编译panda之前，你需要安装gcc编译器以及libreadline库\n\n编译步骤：\n\n1. 通过终端，进入panda源代码目录\n2. 执行命令 make example\n3. 正常情况下，在panda源代码目录中会出现一个build子目录，这里存放所有编译好的可执行文件\n4. .../panda/build/example/repl 就是我们需要的交互解释器\n\n## 把panda用到你自己的项目中\n\n正向你所看到的，之前用到的交互解释器只是一个例子程序。\n\n你完全可以将panda用到自己的项目中，作为配置解释器、命令行或其它。\n\n## bug反馈\n我非常需要实际使用中发现bug的反馈，以便不断对程序进行完善。\n\n欢迎你通过以下两种方式提交bug：\n\n1. 在github上提交issue（推荐）\n2. 发EMail到bug-report@cupkee.cn\n\n## 使用简介\n\npanda一个裁剪板的javascript解释器，基础语法与javascript相同，非常易于学习掌握\n\n### 支持的数据类型\n\n* undefined类型\n* NaN类型\n* 布尔类型\n* 数值类型\n* 字符串类型\n* 数组类型\n* 对象类型\n\n### 基本语句\n\n#### var语句 － 定义变量\n\n1. 定义变量a, b, c\n\n```\nvar a, b, c\n```\n\n2. 定义变量并赋值\n\n```\nvar a = 0, b, c = 'hello'\n```\n\n#### 表达式语句\n\n1. panda解释器在计算表达式时与标准javascript区别\n\n    不同类型的值进行运算时，不会进行类型转换，直接返回NaN（非数字）\n\n2. 运算符\n\n  * ++ -- () [] .\n  * (单目) - ~ !\n  * * / %\n  * + -\n  * \u0026 | ^ \n  * \u003c\u003c \u003e\u003e \n  * \u003c \u003e \u003e= \u003c=\n  * == !=\n  * \u0026\u0026  || \n  * = += -= * = /= %= \u0026= |= ^= \u003c\u003c= \u003e\u003e= \n  * ? :\n  * , \n\n3. 基本表达式举例\n\n```\n\u003e 1 + 1\n2\n\u003e (10 + 5) * 3 / 5\n9\n\u003e 1, 2, 3, 5 + 6\n11\n\u003e 1 \u003e 2\nfalse\n\u003e 'hello' + 'world'\n\"helloworld\"\n\u003e 'a1' \u003c 'b2'\ntrue\n\u003e 'hello' + 1\nNaN\n\u003e 1 * 'hello'\nNaN\n...\n```\n\n#### if语句\nif语句是根据条件选择不同分支处理的语句\n\n```\nif (true) {\n    // always execute\n} else {\n    // never execute\n}\n\nif (a \u003e 100) {\n    ...\n}\n```\n\n#### while语句\nwhile语句是进行循环处理的语句\n\n```\nwhile(a++ \u003c 100) {\n    ...\n}\n```\n\n#### break语句\nbreak用于跳出循环\n\n#### continue语句\ncontinue用于跳转到循环条件判断\n\n#### return语句\nreturn 用于从函数跳出，并可指定返回值\n\n### 函数\n\n在panda中扩展了javascript定义函数的语法\n\n#### 定义函数\n\n1. 标准的定义方法\n\n```\nfunction fn() {\n  // statements ...\n}\n\n// 匿名函数\nvar fn = function () {\n  // statements ...\n}\n```\n\n2. panda扩展语法\n\n在panda中提供了def关键字，作为function的别名\n\n```\ndef fn() {\n  // statements ...\n}\n\n// 匿名函数\nvar fn = def () {\n}\n```\n\n在panda中定义单语句函数时，可以不带\"{}\"\n\n```\ndef fn() return 0;\nvar fn = def() return 1;\n```\n\n#### 调用函数\n\npanda支持javascript程序中常用的即时调用\n\n```\n(def(x, y) {\n    ...\n    return x + y;\n})(100, 50);            // return 150\n```\n\n#### 关于new关键字\n\n在panda中不支持new的相关语义，但保留new关键字(不要把\"new\"作为变量或函数名)。\n\n#### 闭包\n\npanda支持闭包\n\n```\nvar fn = (def(n) {\n    var c = n;\n    return def() return c++;\n})(100);\n\nfn() // 100\nfn() // 101\n```\n\n### 复合数据类型\n\n* panda中的数组和对象与javascript非常相似，但目前只提供了有限的方法。(一个好消息是：panda是开源代码，你可以随意添加需要的方法)\n\n* Buffer对象来源于nodejs, panda同样也没有实现完整操作接口\n\n* Date对象目前没有实现, 但已经在计划之中\n\n* panda对复合类型的支持还在持续完善中, 参考test和example中的代码了解更多（不用担心，代码非常容易理解）\n\n以下是一些使用复合对象的例子\n\n```\n/* array example */\nvar a = [];         // 定义空数组，赋值到变量a\n\na.push(1);\na.push('hello');\na.length();         // 2\na[0]                // 1\na[1]                // 'hello'\na[2]                // undefined\na.shift()           // 1\na.length()          // 1\na.pop()             // 'hello'\na.length()          // 0\na[0]                // undefined\na.unshift('hi');\na.push('panda');\na.length()          // 2\na[0]                // 'hi'\na[1]                // 'panda'\n\na.foreach(def(value, index) {\n    ...\n});\n\n/* object example */\nvar o = {};         // 定义空对象，赋值到变量o\n\no.length();         // 0\no.a                 // undefined\no.a = 1;            // 1\no.a                 // 1\no['a']              // 1\no['a'] = 'hello     // 'hello\no['a']              // 'hello\no.length();         // 1\no.foreach(def(key, value) {\n    ...\n});\n\n```\n\n### 定义原生函数\n\n请参考test和example中的代码，非常简单。\n\n\n## 总结和提示\n\npanda目前已经具备了解释器库的基本特性，而且很容易使用，可以用在很多项目中实现很有意思的功能\n\n但以下几点需要注意：\n\n1. panda还不完善，接口没有达到稳定状态，后续还将保持更新\n\n2. panda首先被设计用在资源有限的嵌入式处理器，最小4k内存就可以工作，但对于大内存条件没有经过良好测试\n\n3. panda内建了内存管理和垃圾收集机制，但当前的gc算法对大内存环境没有进行优化，随着内存使用量的增大gc占用的时间会有较大增长\n\n4. panda不依赖任何操作系统层的支持, 整合到应用中非常简单，但操作系统提供的高级特性(如：多线程/任务，事件处理)需要集成开发人员处理\n\n5. panda被cupkee(一个开源智能硬件操作系统)用来作为解释器，它的特性和开发进度是被cupkee驱动的\n\n## 帮助panda成长\n\n1. 使用并反馈bug或特性需求\n\n2. 为panda提交代码\n\n3. 其它你觉得有帮助的任何事\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdinglixing%2Fpanda-org","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdinglixing%2Fpanda-org","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdinglixing%2Fpanda-org/lists"}