Cateners 发表于 2024-4-7 19:14

为什么主流编程语言都以纯文本为载体?

很疑惑,想和大家一起讨论下。

为什么编程语言不被设计成有自己的文件结构,就像Word文档".docx"那样,必须用特定的文档编辑器查看或修改?

比较接近我的想法的语言是Scratch,但它不是作为通用编程语言设计的,缺少很多特性。

另外还有Blockly。但当你自定义Blocks时,还得手动改json文件...... 这就有些别扭了。



我认为纯文本有这些缺点:

1. 基于文本表示的代码语法奇怪且复杂

拿函数来说,一个函数通常有函数名、返回值类型、输入参数及其类型、函数体等属性。

比如C会把它们组织成这样:
__可能存在的奇怪的tag__ 返回类型 函数名(输入) {
被大括号包围的函数体
}

Python会把它们组织成这样:
@可能存在的奇怪tag
定义函数的关键字 函数名(输入) 返回类型:
需要注意缩进的函数体

等等。这些不同的书写方式,表示的内容却是相似且自然的,即:
{
函数名:xxxx,
输入参数及类型: ,
输出类型: xxxx,
函数体: xxxx,
......
}

这样,我们完全可以用一种整洁的方式存储函数(甚至代码的其他结构)。而且以这种方式表示的代码,其词法分析和语法分析实现应该也更加容易。

这些代码,肯定不方便直接编辑了。这个时候使用专用的编辑器编辑即可:


(当然这只是一个演示。编辑器的界面应该更美观,功能更强大)

同时这种定义方式保证了开发者不会在定义函数上犯语法错误。

(虽然对于熟练的开发者来说不可能弄错。但这只是开发者的优点......)
(我承认现代IDE有代码补全、语法错误检测、代码高亮等功能,而且非常强大!但我仍然感觉这是在错误的方向努力了。以Scratch为例,其语法基本不可能出错;哪怕要实现代码补全或跳转函数实现这类功能,由于语言数据结构的简洁,也会容易很多。对于一般的编程语言,其语法的复杂性,这些功能实现难度可想而知)

2. 代码和人类阅读习惯存在差异

程序中通常每一个步骤都是一个函数。

比如"把A的文本设置到B",用函数通常会被写成类似"文本设置(A, B)"的样子。那么具体是A设到B还是B设到A,还得看注释(或者开发者用熟练了牢记于心)。

我感觉很多代码到后面开发者自己也会忘记什么意思一部分原因就是这个。函数多了或者参数多了之后就很困难了,得靠好的注释、好的代码结构和IDE。

3. 无法国际化

众所周知编程语言关键字几乎都是基于英语的。

但如果代码有自己的文件结构的话,它可以以某种中立的方式表示数据,使得开发者用中文环境打开代码时程序以中文样式展示,用英文环境打开时则以英文展示。

比如SetText(A, B);在自己的文件结构可以以紧凑的字节码方式保存,而且在使用中文编辑器打开时显示为"把的文本设置到",使用英文编辑器时显示为"Set the text of to "。

当然怎么显示应该在编写函数时定义好。



(咳咳,发帖之前问了一下必应,找到一个关键词Projectional Editing,比较有趣的是JetBrains MPS,我先去了解!

如果大家知道有类似工具或概念还请告知{:1_893:} )

Fgaoxing 发表于 2024-4-7 22:36

我来解答你,因为是给人读的,你可以试试不用汇编器,直接用2进制写汇编,你看你累不累。所以当然是为了可读性,而且文本是通过词法和语法分析变成语法树进行编译,图形化代码也是转换成语法树,只是后者会跑在模拟器(正常叫虚拟机)中,如Scratch那种,变成js,不过Scratch也是压缩包,解压依旧是js其实,docx解压是xml也是纯文本,本质上还是需要纯文本来进行编译或者解释。

给点赞呗!

kittylang 发表于 2024-4-7 22:57

易语言倒是基于这两之间,但是写代码体验一点都不好,不仅没简单化,反而复杂化了。就流程控制,还是if这样写着舒服,非文本表现出来的流程控制挺抽象的。英文那不是问题,编程语言不是自然语言,与其说用的英文,不如说用的26个字母排列组合,方法名看不懂那也是没有i18的文档注释罢了,富文本要做到设置语言,不也需要内置i18n方案吗,最后好像殊途同归了{:1_918:}

爱飞的猫 发表于 2024-4-7 23:18

> 为什么编程语言不被设计成有自己的文件结构,就像Word文档".docx"那样,必须用特定的文档编辑器查看或修改?

方便集成第三方工具。例如 diff 二进制的效果没有纯文本的好。你看易语言,现在都没个 diff 工具,还得靠能人逆向分析格式转 .txt 储存。

> 这些代码,肯定不方便直接编辑了。这个时候使用专用的编辑器编辑即可:

复制粘贴不方便,需要定义新的纯文本格式,或定义一个大家都支持的二进制协议。

如果我要复制到网页怎么办?像易语言那样?

如果用户多复制了或少复制了一些空行,你要在编辑器做容错吗?还是直接报告不是合法的代码?

> 其词法分析和语法分析实现应该也更加容易

都结构存储了,就不需要语法解析了。直接解析二进制结构体就行。

> 比如SetText(A, B);在自己的文件结构可以以紧凑的字节码方式保存,

需要思考如何实现。

储存索引?如果函数要删除怎么办,硬是留着?新版本编译器/编辑器打开旧版源码怎么处理?谁来维护索引到函数的规则?

或者说拿易语言做例子,我用到了支持库 X 的 Y 函数,现在把代码给用户 B。他没有安装支持库 X,现在连代码都看不到。如果是纯文本,即便没有安装这个额外的支持库也可以查阅、理解它的行为。

> 同时这种定义方式保证了开发者不会在定义函数上犯语法错误。

也会限制编辑器的扩展性、语法灵活性。

GCC 支持这些函数体特性(常见部分): https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html

改成填表的话,你的表会很长,大部分还不会用到。得重新思考如何构建 UI。

> 而且在使用中文编辑器打开时显示为"把的文本设置到",使用英文编辑器时显示为"Set the text of to "。

工作量太大了。再回到一开始说的复制粘贴,如果翻译错了,下个版本修正了,我粘贴进来,如何识别/匹配上之前的版本的代码?

> 以Scratch为例,其语法基本不可能出错

但你也受编辑器的限制。

> 如果大家知道有类似工具或概念还请告知

易语言吧,但是真开源易语言还是图一乐,二进制代码项目文件根本没法 diff/合作并行开发。后续的火山我记得也是改成纯文字 + 编辑器渲染表格。

---

如果你给语言实现了一个新的语法特性,你还要修编辑器让它支持。纯文本的编辑器,最多没有正确的语法高亮,但是编译器只要支持就还可以继续使用。

gmg2719 发表于 2024-4-7 23:27

纯文本最大的优点就是纯粹,灵活。现在ide都懒得用,所有语言基本用个vim编辑器搞定,各种快捷键用起来比ide都快。当然入门门槛是高了些。但是一旦熟练了那就是效率最高的方式。可移植性也是最好的。

gmg2719 发表于 2024-4-7 23:29

也用过类似于你说的这种的程序语言,比如labview就是绝对的流程图编程方式,入门起来也很麻烦,尤其是涉及到各种if else的时候,流程图乱的自己都看的晕。

我心飞翔1995 发表于 2024-4-8 00:04

时间会证明一切,你不是第一个有这种想法的人,但不是有能力设计语言的人,曾经的语言千千万,最终你能看到的都是大浪淘沙留下了的。但凡你尝试过设计编程语言,就知道什么样的编程方式会留下来。文本式、图形式各有优劣,你没有接触过的专用编程语言更是比比皆是,只是你见到的太少,想的太多。

仙圣 发表于 2024-4-8 06:11

因为程序员都是懒狗,能用键盘搞定编程就不用鼠标,甚至他们连小键盘都不愿意碰。

jidesheng6 发表于 2024-4-8 06:19

你可以在GitHub随便找一个参与人数较多的开源项目看下他们的commit记录,文本形式对比起来比较方便,编程语言有不少,托管平台不可能出来一个新的编程语言就去开发个属于这个编程语言的解析代码然后在编辑器里面展示吧,当然了,这都是后话。


时间拉回计算机刚出现那几年,那会儿开发程序要的不就是简单直接么,这么发展有他的道理,易语言就是要自己的编辑器才能打开源码,他这么做是为了收费,但是这样做的结果就是,每次看到易语言程序的源码,很少人会为了它专门下个专属的开发工具仅仅是为了查看代码

cjy2323 发表于 2024-4-8 07:30

都是大神级别的,膜拜
页: [1] 2
查看完整版本: 为什么主流编程语言都以纯文本为载体?