无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 19213|回复: 170
打印 上一主题 下一主题

cish 开发构想

    [复制链接]
跳转到指定楼层
1#
发表于 2018-3-7 00:17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 不点 于 2018-8-1 02:52 编辑

广告:长期招募开发者、合作者。粗略考虑,有以下条件:

1、招募略懂英文、但英文比较烂的人,写中英文文档;完成富有挑战性的任务,以期提升英文水平。
2、招募略懂 UNIX shell、但又一知半解的人,共同参与开发;通过富有挑战性的工作,提升 shell 知识水平。
3、招募略懂 C 语言而几乎完全不懂 C++ 语言的人,共同参与开发;通过富有挑战性的工作,提升 C++ 语言开发能力。












本主题带有 “博客”、“日志” 的性质,记录本人的探索思考过程,主要是为了方便自己将来能够追踪和回忆。

本项目 cish 只支持 Linux,不支持 BSD、Android 等其它 Unix(或类 Unix)平台。

不使用 Linux 者,以及对 Linux 不感兴趣者,请远离此处——远远地躲开,不要 “帮忙”,不要发言;实在憋不住、非要发言的话,也不要尽是说风凉话,不要指手划脚的,不要干扰此处的记述和讨论;更不要存心捣乱,请注意自己的形象,请自尊。您的每一句发言,都记录在案;不适当的发言,会毁了您自己的形象,待到将来您后悔了、想 “洗白”,都不那么容易了。请尊重您自己!我丝毫都不怕您讽刺我、骂我;但您恶心我的时候,同时也在恶心大家,属于捣乱的范畴,所以真心不欢迎您!请您不要攻击 VPS,您的攻击,已经表明您是老对手了,是从 grub4dos 时代就跟着我不断发动攻击的那个五毛。我确实损害了某些公司的利益,所以会引来攻击,这个我认了;也早有思想准备。但另一方面,攻击者也明显暴露了身份。您收手吧!您会无功而返!我饶不了您!我会慢慢地、慢慢地让大家都知道您是谁!您的攻击其实是在伤害您自己!您明白吗?嗯??请您不要假装成傻瓜问我 “攻击者是谁?”。您若真是毫不知情(就跟傻子一样),我懒得去答复您——我得费多少年才能跟您解释清楚?您若不是傻瓜,明知故问,那您就是攻击者,因而也不用回答您的问题了,是不是?在您提问之前,请反复确认,您该来这儿吗?这是您必须来的地方吗?如果不是,请远远地走开——远远地!远远地!

目前项目处于“Alpha 测试” 状态,即,“开发者内部测试”。有开发能力的人,可以参与开发和测试。非开发者、普通用户,不适合参与测试。




























自从几年前接触到 Ch 这个闭源的 shell 之后,我就在想,要是有个开源的版本该多好啊。Ch 是个 C 语言的解释器,同时也是一个 Unix shell。

后来接触到 Cling 这个开源的 C++ 解释器,然而遗憾的是,它不是 shell,而且它的开发者并不把 shell 当作一个开发目标。

纠结了很久,最终我意识到不能坐等了,必须主动出击,实现自己的想法。

前几天,我谈了自己的想法。wintoflash 给予超乎寻常的支持,提供了 VPS 空间,方便这个项目的开发。大家可以用 shell 来访问 VPS 空间,随时可以体验开发的效果。

现在想想,这种开发方式可能还很少见,具有某种 “开创性”,因而很 “刺激”。

为 cling 添加 shell 的功能特性之后,新的软件就准备叫做 cish。

cling 是逐行处理代码的,我们也顺其自然吧。但 C++ 代码与 shell 代码的风格(或语法)有矛盾和冲突,不容易兼容并蓄、两全其美。

(以下这段话作废,涂掉,请跳过)
于是采取如下的限制或取舍:

1、以 “#”、“;”(分号)、“!”(感叹号)开头的行,按照 C++ 语言来处理
2、以 “)”、“]”、“}” 开头的行,按照 C++ 语言来处理
3、以 “(”、数字(0~9)开头的行,按照 C++ 语言来处理
4、以 “(”、“[”、“{” 结尾的行,按照 C++ 语言来处理
5、以 “\”(反斜杠)、“,”(逗号)、“;”(分号)、“!”(感叹号)、“//”(双斜杠)结尾的行,按照 C++ 语言来处理

不符合上述条件的行,都当作 shell 命令来处理。


【更新】登录 VPS 的账户和口令如下

账户:public
口令:cish_public

Windows 下可以用浏览器直接访问 http://45.77.210.168/ (敲入用户名和口令即可看到 shell 提示符)。

Windows 下还可以先安装一个虚拟终端(PuTTY 或 colinux 之类的软件),然后在其 shell 提示符下用

ssh public@45.77.210.168

命令来登录 VPS(会提示您敲入 public 用户的口令)。

无论以哪种方式登入 VPS 之后,在 bash 提示符 $ 之下,敲入 ./cish 就进入 cish 的命令行,这就可以进行测试了。测试完毕,敲入 exit 可以退回到 bash 的提示符。再次敲入 exit 就登出(log out)了。

万一 cish 文件被攻击者删除了,请自行建立符号链接:

ln    -s    /home/user/inst/bin/cling    cish

顺便说,这个五毛真够 傻 B——这个软件处于开发者内部测试状态,来测试的人、感兴趣者,也基本上都是熟悉 Linux 的人。你用 rm -rf 删掉 public 用户的全部文件,就算你有能耐了吗?你的主子要是赏你五毛钱,这个主子也真掉价啊!你跟着这样的主子胡乱混日子有啥意思?还不如早早地拍屁股走人!你的攻击,没有多大点卵用,却暴露了你的主子在惦记着这里;你这等于是“通风报信”啊——提醒我不要放松警惕!所以你真是
傻 B 啊!说不定你的主子还要打你屁股呢!

在 colinux 下可以使用 scp 命令向服务器拷入文件(或从服务器拷出文件)。Windows 命令提示符下也可以用 pscp 命令进行拷贝(pscp 是 PuTTY 官网提供的一个命令行工具)。也可以下载具有图形界面的 WinScp 软件进行拷贝。注意:Windows 自带的 rcp 命令与 Linux 不兼容,无法进行拷贝。如果您有 Linux 系统,则可以使用 rcp 或 scp 命令进行拷贝。

src.diff.gz

27.51 KB, 下载次数: 1, 下载积分: 无忧币 -2

2018-06-24 制作的补丁,备份一下,以免丢失

src.diff.gz

26.83 KB, 下载次数: 0, 下载积分: 无忧币 -2

2018-06-16 制作的补丁,备份一下,以免丢失

tmp.tar.gz

21.38 KB, 下载次数: 0, 下载积分: 无忧币 -2

src.diff.gz

27.51 KB, 下载次数: 0, 下载积分: 无忧币 -2

2018-06-25 制作的补丁,备份一下,以免丢失

评分

参与人数 5无忧币 +25 收起 理由
2011hubeilcsun + 5 finsh是RT-Thread的命令行外壳(shell),.
freesoft00 + 5
zmac2007 + 5
wintoflash + 5 很给力!
不知 + 5 很给力!

查看全部评分

2#
发表于 2018-3-7 08:49:43 | 只看该作者
大神威武,必须要学习一下,谢谢分享你的想法,如果可能,分享我的想法吧
回复

使用道具 举报

3#
 楼主| 发表于 2018-3-7 10:13:00 | 只看该作者
谢谢各位,有你们支持,有你们作后盾,我就更敢做、更放得开了。
回复

使用道具 举报

4#
发表于 2018-3-7 13:10:32 | 只看该作者
看不懂,纯帮顶...
回复

使用道具 举报

5#
发表于 2018-3-7 17:20:28 | 只看该作者
如果帮得上忙,一定会尽力而为!
回复

使用道具 举报

6#
发表于 2018-3-7 17:47:41 | 只看该作者
也不太懂但如果帮得上大大的忙,一定会尽力而为!
回复

使用道具 举报

7#
发表于 2018-3-7 18:51:55 | 只看该作者
嗯,工作进行中,大赞,保持关注,以后时间充足,水平提高了,也许可以好好学习下cish的源码。
回复

使用道具 举报

8#
 楼主| 发表于 2018-3-7 18:57:12 | 只看该作者
最近在学习 POSIX shell 规范,虽然不可能遵守 POSIX 规范,但了解一下也有好处。

我们最常用的其实不是 “管道”、“输入输出重定向”、“作业控制” 之类的高级功能,而是 “通配符(文件名模糊查找)” 之类的简单功能。

VPS 上的代码,大家都能看得见。大家共同开发吧。说不定您有某种眼光、某种独到的视角、某种水平,而能让软件向前迈一大步。当初我开了个头做 grub4dos,还真是有点胆量。我现在知道,我技术水平实在很一般。也许是因为我敢于担当,才有了那个软件。后来参与开发的人、明里暗里提供帮助的人,那就太多了。要不是那些参与者,光凭我一个人,那是走不了多远的。



回复

使用道具 举报

9#
 楼主| 发表于 2018-3-7 21:12:47 | 只看该作者
本帖最后由 不点 于 2018-3-9 13:28 编辑

关于 if 语句——

“真假” 值,shell 真是制造了麻烦。其实也不是 shell 开发者制造的麻烦,而是操作系统开发者制造的(不经意制造的):不出错时,返回 0,然而这是 “假” 啊!出错时,返回 “非 0”,然而这是 “真” 啊!

好的,承认 0 是真,1 是假。那么,这次轮到 C 语言开发者在制造麻烦了:刚好相反。

所以,真假是相对的,而不是绝对的。把其中一个定义为真,另一个就是假。

哲学是兜圈子,解决不了问题。我们遇到的现实问题是:

if (
        ls
) {
        ls
;}

本意是,当 ls 执行成功时,再执行一次 ls 命令。然而,实际却只执行了第一个 ls。这是因为,当 ls 执行成功时,返回值为 0,这在 C 语言看来,那就是 “假”,因此不去执行花括号里面的 ls 命令。

纠结啊!

顺便说,先别挑剔上述 if 语句难看。将来会让它紧凑一些(比如,可以在一行实现,而不是多行)。

shell 命令返回值是整数,我觉得还是维持这种 “不和谐” (与 C 语言的矛盾)吧。

【补充】slore 大人点评的方向是对的。要完成前面所说的任务,目前应该这样
if ( !
        ls
) {
        ls
;}

这里 if 的条件当中要有 “!” 来取反。这与通常 shell 当中的 IF 语句的情况就不同了。这是差别所在。

就是说,cish 与以前的 shell 是不同的,用 cish 编程时需要注意这些差别。
回复

使用道具 举报

10#
 楼主| 发表于 2018-3-7 21:52:35 | 只看该作者
wintoflash 发表于 2018-3-7 21:33
代码要不要托管到GitHub上?
毕竟cling是LGPL协议的

没问题,可以这么做。不过,我有点懒,不想学新知识。以前为了开发 grub4dos,好不容易跟 bean 学会了 svn 命令。可后来项目空间被迫多次转移,现在也转移到 GITHUB 上了。然而我就是没有学会用 git 来操作代码库。我只会用 git 下载代码,不会上传和维护。如果让谁代劳的话,也很辛苦。让你代劳?我估计你没时间。别看让你出钱你愿意,你不一定拿得出时间。git 仓库有个好处,是能够记录和跟踪代码的变化。可惜我跟不上时代的步伐了。

对了,正好有个问题顺便请教你。github 上的 cling 这个软件,有 79 个 fork。你知道 fork 的目的是啥吗?fork 以后怎么用?fork 以后能改名字吗?能改代码吗?
回复

使用道具 举报

11#
发表于 2018-3-7 22:07:22 | 只看该作者
不点 发表于 2018-3-7 21:52
没问题,可以这么做。不过,我有点懒,不想学新知识。以前为了开发 grub4dos,好不容易跟 bean 学会了 sv ...

fork跟复制差不多,把源代码放到了自己的账号上。fork过后就可以自己修改源代码了,也可以创建新分支。
回复

使用道具 举报

12#
 楼主| 发表于 2018-3-7 22:10:33 | 只看该作者
不知 发表于 2018-3-7 22:07
fork跟复制差不多,把源代码放到了自己的账号上。fork过后就可以自己修改源代码了,也可以创建新分支。

如果原始的代码有变动的话,fork 后的代码是不是自动跟着变?
回复

使用道具 举报

13#
发表于 2018-3-7 22:18:23 | 只看该作者
不点 发表于 2018-3-7 22:10
如果原始的代码有变动的话,fork 后的代码是不是自动跟着变?


默认应该不会,fork过后,一般是先把代码下下来(一般不在浏览器上修改),修改后再传上去。
————————————————————————————————————————————
https://www.jianshu.com/p/6c366b53ea41

https://www.cnblogs.com/patchouli/p/6511251.html
回复

使用道具 举报

14#
 楼主| 发表于 2018-3-8 10:32:19 | 只看该作者
本帖最后由 不点 于 2018-3-8 20:43 编辑

震撼!

我搜 “c++ string to argv”,目的是让我的命令行处理能够 “偷懒” 一点——想找一个现成的方案。结果还真找到了:

convert string to argv in c++
https://stackoverflow.com/questions/1511797/convert-string-to-argv-in-c

问题的提出是 2009 年,总共有 9 个回复,最后一个回复是 2016 年 11 月 16 日。这最后一个回复太棒了!抄录如下:

May be it is too late to answer on this question but you could use standard POSIX functions glob or wordexp:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wordexp.h>

int
main(int argc, char **argv)
{
   wordexp_t p;
   char *exec_path = "/bin/ls";

   p.we_offs = 1;
   wordexp("-l -t /etc", &p, WRDE_DOOFFS);
   p.we_wordv[ 0 ] = exec_path;
   execv(exec_path, p.we_wordv);

   /* This code is unreachable */
   exit(EXIT_SUCCESS);
}

It would prepare 3 parameters: -l (long listing format), -t (sort by modification time) and directory /etc to list, and run /bin/ls. Call wordexp() gives you exactly the same result as call /bin/sh -c recomended previously but spawaned process would have parent process not /bin/sh.

我采纳 wordexp 的目的,仅仅是让它替我做 string to argv 的转换,以便用在 execvp 的参数上。然而出人意料的是,wordexp 做得更多,它能把 *.* 之类的扩展成文件名,也能处理 $(command) 或等价的反引号命令(`command`)。现在在 cish 下敲入

ls *.c
echo `ls`
echo $(ls)
echo $(( 5 + 8 ))

就能体验其强大之处了!而这都是 wordexp 函数完成的,我没有写任何实质性的处理代码。

我感叹幸亏我现在才着手干。如果提前两年,上面这个回帖还不存在,那就不知道会走多大的弯路了,做出来的效果肯定与现在不一样。


回复

使用道具 举报

15#
 楼主| 发表于 2018-3-8 20:38:35 | 只看该作者
内部命令 exit 和 cd 已经实现。如果不太 “挑剔” 的话,这个 cish 凑合着已经可以 “工作” 了。
回复

使用道具 举报

16#
 楼主| 发表于 2018-3-9 23:08:34 | 只看该作者
谢谢各位关心帮助。待我将来学会 git 的操作之后,再找托管空间。

我对于 cling 的改动,相比于 cling 本身庞大的身躯,是非常小的。因此,小打小闹即可。

这些小小的改动,容易维护,并不十分需要托管空间。



今天增加了出错处理,更健壮了。
回复

使用道具 举报

17#
 楼主| 发表于 2018-3-10 10:53:56 | 只看该作者
本帖最后由 不点 于 2018-3-10 11:01 编辑
wintoflash 发表于 2018-3-10 09:11
wetty装好了。除了ssh和http之外的网络都屏蔽了。
现在可以网页打开 http://45.77.210.168/ 输入用户名 us ...


试验成功!棒极了!

尤其是,断网,保证了安全,竖起大拇指!

rcp 命令仍然可以拷贝本地文件到 VPS,够用了。

还剩下两件事需要完善:

1、开出更多虚拟内存,让 cling 编译不卡顿。

2、建立一个不同于 user 的账户,以便实行隔离,免得项目中的文件被人破坏。

也或者可以建立一个叫做 public 的账户,供大众使用。而把 user 账户留给开发者使用(如果这样的话,我只需更改 user 账户的密码即可阻止别人用 user 账户进入)。


回复

使用道具 举报

18#
发表于 2018-3-10 11:14:13 | 只看该作者
不点 发表于 2018-3-9 23:08
谢谢各位关心帮助。待我将来学会 git 的操作之后,再找托管空间。

我对于 cling 的改动,相比于 cling  ...

git 和 svn 都支持的。

回复

使用道具 举报

19#
 楼主| 发表于 2018-3-10 11:24:51 | 只看该作者
回复

使用道具 举报

20#
 楼主| 发表于 2018-3-10 11:28:08 | 只看该作者
ygao2004 发表于 2018-3-10 11:14
git 和 svn 都支持的。

有办法用 svn 来上传、提交、管理吗?如果只能用 svn 下载,那就等于不支持 svn。
回复

使用道具 举报

21#
发表于 2018-3-10 12:07:30 | 只看该作者
恭喜不点大师,新项目又有进展了啊,等公众号搞好了,也上去试玩下cish。
回复

使用道具 举报

22#
 楼主| 发表于 2018-3-10 13:59:33 | 只看该作者
user 密码已改
回复

使用道具 举报

23#
发表于 2018-3-10 17:00:08 | 只看该作者
不点 发表于 2018-3-10 11:28
有办法用 svn 来上传、提交、管理吗?如果只能用 svn 下载,那就等于不支持 svn。

http://git.mydoc.io/?t=154713

你说的刚好都支持。
回复

使用道具 举报

24#
发表于 2018-3-10 18:01:59 | 只看该作者
报告一个错误:
printf()打印数字的问题。
回复

使用道具 举报

25#
 楼主| 发表于 2018-3-10 20:16:33 | 只看该作者
不知 发表于 2018-3-10 18:01
报告一个错误:
printf()打印数字的问题。


这是已知的问题。cling 可能缓存了一行,直到碰上回车符才输出一行(也可能是 printf 自己缓存的,这我不懂)。我改动的部分,不涉及到这个问题。

我不太清楚,是否在调用 refresh 或者 fflush 之类的函数之后,会有不同的结果。你可以在百度搜搜看。

回复

使用道具 举报

26#
发表于 2018-3-10 22:01:44 | 只看该作者
刚才用公众号登录去瞧了下。嗯,网页登录tty,确实很方便使用。

看到最初的提示,提点小意见:
User logged:5
Notice:
1.To use cish,please type cish,you can also add parametors.To view the cish sources,please type cd $src
2.To clean the information on the screen,please type clear.
标点符号后带点空格吧,这样相邻句看起来自然点,要不然给人感觉挤挤的。

试了两个shell命令,ls cd  竟然第二个命令的输出氏一大堆0x
#0 0x000055a7d6e3b8fa llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/home/user/inst/bin/cling+0xaa78fa)
#1 0x000055a7d6e39786 llvm::sys::RunSignalHandlers() (/home/user/inst/bin/cling+0xaa5786)
#2 0x000055a7d6e398cc SignalHandler(int) (/home/user/inst/bin/cling+0xaa58cc)
#3 0x00007fc56ae15140 (/lib/x86_64-linux-gnu/libc.so.6+0x37140)
#4 0x000055a7d6de9c24 shellInterpreter(char const*) (/home/user/inst/bin/cling+0xa55c24)
#5 0x000055a7d6dea9de cling::MetaProcessor::process(llvm::StringRef, cling::Interpreter::CompilationResult&,
cling::Value*, bool) (/home/user/inst/bin/cling+0xa569de)
#6 0x000055a7d6e664cb cling::UserInterface::runInteractively(bool) (/home/user/inst/bin/cling+0xad24cb)
#7 0x000055a7d6c99a8b main (/home/user/inst/bin/cling+0x905a8b)
#8 0x00007fc56adff1c1 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x211c1)
#9 0x000055a7d6d0cc3a _start (/home/user/inst/bin/cling+0x978c3a)
Stack dump:
0.      Program arguments: /home/user/inst/bin/cling
Segmentation fault (core dumped)

public@ttyd:~$

照bash的命令反馈,若cish不氏目录,应该直接告知用户 cish 不氏目录就行了。不能搞出一大堆0x出来。

回复

使用道具 举报

27#
 楼主| 发表于 2018-3-10 22:12:37 | 只看该作者
gnuxwy 发表于 2018-3-10 22:01
刚才用公众号登录去瞧了下。嗯,网页登录tty,确实很方便使用。

看到最初的提示,提点小意见:

cd 命令有 bug,会尽快修复。

回复

使用道具 举报

28#
 楼主| 发表于 2018-3-10 22:48:32 | 只看该作者
gnuxwy 发表于 2018-3-10 22:01
刚才用公众号登录去瞧了下。嗯,网页登录tty,确实很方便使用。

看到最初的提示,提点小意见:

bug 已修复,请检查。
回复

使用道具 举报

29#
 楼主| 发表于 2018-3-11 03:22:48 | 只看该作者
wintoflash 发表于 2018-3-10 12:37
public帐户密码:cish_public
加了1GB的swap

增加 swap 之后,重新从头编译,经过 4 个小时,顺利完成,没有卡顿。
回复

使用道具 举报

30#
发表于 2018-3-11 10:20:05 | 只看该作者
不点 发表于 2018-3-10 20:16
这是已知的问题。cling 可能缓存了一行,直到碰上回车符才输出一行(也可能是 printf 自己缓存的,这我 ...

确实需要flush。不过直接编写程序是不需要的。
——————————————————————————————————
cish:

________________________________________________________
gcc:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-10 19:36

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表