如果您像我一样,您可能有经历过几个月前编写的代码的经验,并且不了解任何一行。 我知道这件事发生在我很多次。 与此相反,如果我从现在起十年后读这篇文章,我仍会理解它的含义(尽管我可能认为我天真无知地写了它)。 原因很明显,这段文字是用普通的英语编写的,而不是像Javascript或C ++这样的编程语言。 即使是经验丰富的程序员也能更好地理解自然语言。
编程语言有什么问题?
很明显,即使我们可能已经花了多年的时间编写计算机代码,但我们对英语的习惯仍然要好得多。 使用非自然语言进行编码具有很大的成本。 任何程序员都知道编写代码仅仅是开始。 该代码需要记录,调试,维护和重构。 代码的非自然特性需要花费大量的精力和时间来理解代码的逻辑。 培训其他开发人员使用代码的要求甚至更高。 使用公共API(或公司范围的API)提出了更大的文档和培训挑战。 如果我们能用英语编码。
…但是自然语言编程可行吗
自然语言编程长期以来一直是软件世界的圣杯。 在设计类似于自然语言的编程语言(Cobol,SQL,AppleScript)方面进行了一些尝试,但是没有一个类似于实际的自然语言。 自然语言编程只是一个无法实现的目标。 没有一种现代的,经常使用的编程语言试图模仿自然语言。 放弃NLP(自然语言编程)的最常见原因是:
- 语言太复杂,计算机无法理解
- 用人类语言陈述一条指令的方法有很多
- 语言天生就是模棱两可的。 计算机语言必须明确(确定性)
尽管没有人可以否认这些语句的可行性,但是它们提供了目标的二进制视图,无论您使用自然语言编程还是没有。
我想建议达到NLP的目标应该是一个渐进的过程,沿着非自然的计算机代码和自然的语言之间的连续性发展。 我想提供以下阶段来实现艰巨的目标:
- 受限制的自然语言处理
- 计算机辅助自然语言处理
- 需求编程
第一阶段-受限制的NLP
在此阶段,我们建议您阅读一种计算机语言,就像自然语言一样,但是编写它需要对编程有一定的了解,并需要一些可用的自然语言功能的知识。 考虑以下JavaScript表达式:
strlen(Str);
getElementById('button1').focus();
Node2.parentElement.insertBefore(Node1,Node2);
该符号是从数学函数中借用的,这是数学部门研究软件的日子的残余。 这没有什么自然的。 现在,考虑以下相似之处:
length of Str
focus on element "button1"
insert Node1 before Node2
第二个序列的含义与第一个序列完全相同,但是第二个序列是可读的,甚至对于非程序员来说也是很自然的。 主要区别在于参数在函数名称中内联而不是在括号中分组。 语法上的微小差异会使代码的可读性产生巨大差异。 内联格式不需要任何复杂的机器学习算法。 它只与更改语言的语法有关。 考虑以下函数定义:
DEFINE length of S AS
return S.length;
END
该定义可以是确定性编程语言的一部分,可以与我们习惯的编程语言范例一起使用。 唯一的区别是参数是内联的。
自然语言的另一个重要的“特征”是可以使用的形式,它可以导入正式的编程语言中。 在自然语言中,通常使用确定器“ the”在短语的上下文中引用实体,例如, move the image 23 pixels to the right
。 在传统的编程范例中,最大的缺点之一就是引用函数体外部的对象。 实际上,引用上下文对于编程至关重要。 解决方法是将上下文作为附加参数传递。 不用说,这不会提高代码的可读性。 在自然编程语言中,这可能看起来像这样:
//defining the function
DEFINE move to next token CONTEXT the text, the current position,the current token AS ... END
// ==> function moveToNextToken(theText, theCurrentPosition, theCurrentToken){...};
//calling the function
the text = "hello world"; the current position = 0;
move to next token;//referencing the text and the current position
show (the current token)
显然,自然语言编译器需要支持使用保存原始值的某些上下文值对象通过引用进行调用。
现有编程语言还有其他“调整”,可以使它们更加“自然”,例如键入和使用代词。
注意,程序员在编写代码时,需要知道length of S
的可用函数length of S
该函数采用的参数以及通常如何编写程序,任何阅读length of Str
文本length of Str
都可以轻松理解其含义。这个词组 受限制的NLP意味着编写者必须使用现有的NLP功能,但读者可以在没有先验知识的情况下理解代码。 这暗示着不需要其他文档。 该代码是文档。
我在github项目naturaljs中建议了这种语言的可能语法。 这是对Java语言自然语言扩展的建议,该扩展可转换为Javascript代码,类似于转换打字稿的工作方式。 如果您相信该项目,请给 它 加注 星标 。 我保证一旦项目获得100星就将其实施。
第二阶段-计算机辅助NLP
在第一阶段,编程经验与当前的编程语言范例非常相似。 程序员必须:
- 注意可用的不同功能及其语法
- 下载并集成所需的库
- 编写明确的代码-
show (length of S)
而不是show length of S
计算机辅助NLP将通过放宽这些限制来简化编程过程。 输出仍将是相同的确定性代码。 但是,程序员可以更加自由地编写代码,并且交互式编译器会根据以前的编程历史,可用的NLP编程语料库和机器学习来建议不同的选项。 它可以建议以下内容:
- 当程序员写“专注于按钮1”时,会提示“专注于(标记为'按钮1'的按钮)”
- 当程序员编写“ S中的字符数”时,将建议现有的自然函数“ S的长度”
- 当程序员编写“ S中大写字符的数量”时,建议输入“自然文本”包,并将代码更改为“ S中大写字符”,以匹配“自然文本”包中自然函数的语法。
我确实相信,通过实施第一阶段和第二阶段,我们将大大改善编程经验,并显着降低软件开发和维护的成本。 但是,第三阶段将完全改变我们的软件开发概念。
第三阶段-需求编程
我认为自然语言编程的最终目标应该是从需求文档中自动获取计算机代码。 这意味着更深的自然语言理解能力,解决方案的很大一部分将是某种程度的自动软件设计。 “计算机”可能使用在线配置文件或需求提示来设计最佳的工作设计。 设计也可以根据需求进行自动更改。
尽管目前看来这很难实现,但我确实相信,随着机器学习技术的进步以及依赖于前两个阶段,这个目标是可以实现的。 这可能需要一些形式上的需求编写,但是达到这样一个阶段的意义是巨大的。 这将完全改变我们了解软件工程的方式。
您能提供什么帮助
如果您相信自然语言编程的概念,那么建议您看一下我的naturaljs github项目 。 它包含有关我的相貌的一些想法。 我保证一旦该项目获得100颗星,就将开始实施第一阶段。
From: https://hackernoon.com/its-time-we-code-in-english-e02df6b62ecc