自然语言编程?-思考:编程与自然语言
python-AI
类似 自然语言编程 的思考还有图形化编程
本文我尝试发布在GitHub。
相关实况体验视频 【【GPT4】自然语言编程实战,一线程序员的真实使用感受!】 https://www.bilibili.com/video/BV1gN411T7CE/
对于编程语言,自然语言的一些思考 这个思考实际在2019年以前就有了,虽然并不是应对AI编程的,但是也是希望实现自然语言编程。 严格来讲,叫做 领域特定语言(Domain Specific Language(DSL))在编程,也就是DSL编程
我发现一个新的软件,用自然语言编程!非常酷! https://blog.csdn.net/coderising/article/details/90624874 https://metacode.app/ 这个Metacode自定义了一个更加高层的语言,程序员可以用这个语言中的指令来写程序, 然后Metacode再把他们转化成实际代码 也就是说,它是类似于重命名了一些代码来实现的。 类似 C语言宏定义 宏定义会直接替换掉你的代码.txt 某清华大佬的51行宏定义etc.txt
详细情况请跳转到下面的DSL编程。
,我遇到的问题是,请AI写代码的时候,虽然它已经会分段写注释了 ,但是这样的注释依然不够具体到让我理解新的代码 ,我有时需要让它逐句解释代码,或许这样的情况对于其他编程者也一样类似
,举个例子吧,在进行文件操作的时候,python需要Import OS库 ,那我很好奇,什么是OS库,它和operating system有关联嘛? ,于是我问了他,他说确实是operating system ,于是我感觉很奇怪,Operating system和文件操作有什么关系?
,所以我的体会可能是英语作为一个信息熵(量)比较小的语言 ,它的一些简写容易引发歧义,毕竟在编程的时候,传统的编程都是希望简写的 ,所以或许需要改变AI的编程习惯,让他以后的命名方式更加接近自然语言 ,但是已经有了那些方法名称,恐怕已经没法改变了
,比如说我们有时候遇到一些方法名,库的名称会觉得很古怪
,比如说numpy,sympy已经是非常清楚的了 ,但是第一次见你依然不可以确定它是Symbol python之类的意思
,提出一些根治,但是无力回天的方案
1 让AI的编程习惯,命名习惯更加接近自然语言,这样的话对于注释的要求会更低,至少更加符合大众的阅读习惯 ,毕竟接下来大众会优先,希望阅读代码而不是自己编写代码 实现 从自然语言中来,到自然语言中去
,或者直接让它逐句解释代码吧
2 尝试用一种中文作为语言的编程语言 ,确实有人进行过尝试,叫做 易语言
,当然很明显,这挺难的,尽管世界上使用人数最多的语言是中文,但是最受欢迎的编程语言依然是英文
3 DSL编程
一、DSL的定义与特点
- 定义:DSL是一种高度专业化的编程语言,旨在解决特定领域或任务中的问题。它提供了更简洁、更直观的方式来表达解决特定问题的方案。
- 特点:
- 高度专用性:DSL专注于一个特定领域或任务,与通用编程语言(如Java、Python等)相比,其语法和语义更加简洁、易于理解。
- 提高生产效率:由于DSL直接反映了应用领域的概念、术语和操作流程,因此开发者能够更快地编写出解决特定问题的代码。
- 增强可读性:DSL通常使用领域内的专业术语和操作符,使得代码更加易于理解和维护。 三、DSL的应用领域 DSL在多个领域都有广泛的应用,包括但不限于:
- 网络配置:如Cisco的IOS和Juniper的JunOS等网络设备使用DSL来配置网络路由和安全策略。
- 数据库查询:SQL是一种广泛应用于数据库查询的DSL,它提供了一种有效的方式来执行复杂的数据库操作。
- 图形界面设计:HTML作为网络设计中的DSL,定义了如何展示和排版网页内容。
- 软件测试:如JUnit等测试框架使用内部DSL来编写测试用例,使测试代码更易于编写和阅读。
- 金融领域:如QuantLib和MatLab等DSL用于金融市场数据分析和模拟。 也就是说上面提到的 SQL、HTML和matlab这些耳熟能详的语言实际上就是DSL编程?
二、DSL的分类 DSL可以分为内部DSL和外部DSL两大类:
- 内部DSL:也称为嵌入式DSL,是在宿主语言之内构建的。它利用宿主语言的语法来表达特定领域的概念,因此无需从零开始构建完整的语言解析器。Ruby和Scala是常用于内部DSL的语言。 也就是说更接近于 C语言宏定义?
- 外部DSL:完全独立于任何宿主语言,拥有自己的语法和解析器。外部DSL的开发通常较为复杂,需要设计语言的语法规则,并实现解析器来理解这些规则。SQL和正则表达式是外部DSL的典型例子。
当然可以。以下是一个简单的例子,展示了如何在Python(此时Python作为宿主语言)中创建一个内部DSL(Domain-Specific Language)来模拟一个简化的订单处理系统。这个DSL将允许我们使用领域特定的术语和语法来创建和处理订单。
class OrderDSL: def init(self): self.orders = []
def order(self, item, quantity, price):
order = {
'item': item,
'quantity': quantity,
'price': price,
'total': quantity * price
}
self.orders.append(order)
return self # 支持链式调用
def show_orders(self):
for order in self.orders:
print(f"Item: {order['item']}, Quantity: {order['quantity']}, Price: {order['price']}, Total: {order['total']}")
dsl = OrderDSL() dsl.order("Laptop", 2, 999.99).order("Smartphone", 5, 499.99).show_orders()
在这个例子中:
-
OrderDSL 类是我们的内部DSL的主体。它维护了一个订单列表,并提供了添加订单和显示订单的方法。
-
order 方法接受商品名称、数量和价格作为参数,并计算订单的总金额。然后,它将订单添加到订单列表中,并返回 self 以支持链式调用(即可以在一次调用中连续添加多个订单)。
-
show_orders 方法遍历订单列表,并打印每个订单的信息。
当我们使用 OrderDSL 类时,可以像使用自然语言一样创建和处理订单。例如,上面的代码片段创建了两个订单(一个包含2台笔记本电脑,每台999.99美元;另一个包含5部智能手机,每部499.99美元),并显示了这两个订单的信息。
虽然这个例子很简单,但它展示了如何使用Python的内部DSL来模拟特定领域的操作,并使用领域特定的术语和语法来编写代码。在实际应用中,内部DSL可以更加复杂和强大,以支持更广泛和深入的领域特定操作。