首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您将如何设计一种编程语言?

您将如何设计一种编程语言?
EN

Software Engineering用户
提问于 2010-09-02 16:44:14
回答 13查看 3.7K关注 0票数 42

如果你要设计一种编程语言,你会怎么做呢?你会加入什么功能?你会漏掉什么?静态的还是动态的?强类型还是弱类型?编译或解释?为你的答案辩护。

EN

回答 13

Software Engineering用户

发布于 2010-09-02 21:42:57

  • 我肯定认为函数式编程语言会流行起来,所以我的语言将是功能性的。请参阅函数式编程的驯服效果
  • 我认为CPU很快就会有上百个核心,线程也会很难管理。所以Actor模型是必需的,而不是线程。请参阅Erlang -用于并发世界的软件
  • 我还认为OOP失败了,对象之间的通信被认为是异步的。所以我认为我们需要消息传递,具有不变的信息。送过去忘了。就像演员模型一样。请参阅面向对象的编程:错误的路径?
  • 我认为使用静态类型会更好,因此在开发周期的早期就会捕获错误。但是我会像在Haskell中那样使用类型推断,这样开发人员就不需要像C、C#和Java那样在代码中到处编写类型。请参阅为伟大的善学一只Haskell
  • 我还会设计一个很棒的UI库,其中包含声明式布局,比如WPF和Android。但是我想要和函数式反应规划一样。

因此,我的语言将类似于Erlang中的并发性,但与类型类似,如Haskell和GUI框架(如WPF.NET )。

票数 55
EN

Software Engineering用户

发布于 2010-09-02 17:47:18

注意:我在这篇文章中使用了类似C的语法来描述特性,但我并不挑剔语法本身,只要它不是像所有关键字都是大写的那样荒谬。

1.打字系统

在语言中,我想要的第一个特性是带有可选动态类型的静态类型。原因是静态类型允许您( a)尽早捕获错误,而不是延迟;( b)大多数代码都是隐式静态类型的,不管语言是否做出了区分。然而,有几个用例动态类型是非常有用的。例如,当从文件中读取数据时,您通常有不同类型的字段,而动态类型使异构容器变得容易。所以,我的理想语言是这样的:

代码语言:javascript
复制
//variable declarations
int anInt = 42 //anInt is now irrevocably an integer and assigning another type to it is an error
vartype aVariable = 42 //aVariable is currently an integer, but any type can be assigned to it in the future

//function definitions
int countElements(Collection c)
{
  return c.count();
} 

//c HAS to be a collection, since countElements doesn't make sense otherwise

void addToCollection(Collection& c, vartype v) 
{
  c.append(v)
}

//c is passed by reference here

2.编译和解释的

我希望该语言要么提前编译,要么编译JIT,但不是纯粹的解释,原因是速度。这与第一点联系在一起,因为优化编译器/抖动在优化静态类型化代码时会容易得多,而动态类型化代码可以保持原样。

3.闭包

语言必须支持函数式编程结构,而函数应该是一流的对象.

4.面向对象的

语言应该允许您编写面向对象的代码,但也应该允许简单的命令式代码。也就是说,应该可以这样写一个hello world程序:

代码语言:javascript
复制
int main(string<> args=null)
{
  printf("hello, world"); 
  return 0;
}

// this code also demonstrates two other features,
// default arguments for functions (not explained further)
// and immutable lists like string<> (see 6. Built-in datatypes)

5.名称空间

名称空间是一件好事。很小的东西应该进入全局命名空间。但是,如果必须将内容放在全局命名空间中,则可以(ala C++)。

6.内置数据类型

作为内置数据类型,该语言必须具有以下构造:

  • int数据类型或类型。如果只有一种int类型,它应该有无限的范围。如果有更多,则应该将隐式向上转换为能够保持计算结果的最小类型,其中最大的是无限范围类型。
  • 一种内置的二进制float类型,相当于IEEE 754 double
  • 一种可变的list类型,它被实现为一个双链接列表或一个包含指向每个元素的指针的连续内存块。
  • 一种不可变的list类型,其作用类似于数组,但其大小在创建后不能更改。
  • 可变和不可变的string类型,默认为不可变。
  • 可变的mapdict类型,包含不可变的键和可变和/或不可变的值。
  • 默认情况下,内置集合类型应该是同构类型,但如果需要,则可以是vartyped。
  • boolean
  • 可以分配给任何类型的变量的nullnone类型。
  • 可变和不可变的set类型
  • 实现十进制浮点变量的decimal类型
  • 一个fixed类型,它实现一个不动点数。

decimalfloatfixed类型应该共享完全相同的公共接口(通过继承或鸭子类型),允许将它们透明地传递到函数并从函数返回。父类型可以称为real

7.按值和引用调用

您应该能够同时通过值和引用调用函数,缺省值是值(即在函数中创建和操作参数的副本)。

8.指针

语言应该有指针和允许指针算法。指针只能静态输入(以避免void*的噩梦)。显式不允许vartype指针。具有指针和指针算术允许将该语言作为一种系统编程语言认真使用。

9.内联程序集

对于8.,该语言应该允许在必要的情况下使用内联汇编语言代码。

10.安全

该语言应该是最安全的使用,支持异常处理等。指针算法和内联程序集可以降级到代码中显式标记为不安全的部分。允许使用不安全的代码,但强烈禁止使用。

11.未定义行为

语言标准应指定程序在所有情况下的行为方式,除非代码明确标记为不安全,也就是说,在不安全块之外不应该有未定义的行为。这允许将该语言用作一种可行的应用程序开发语言,同时还允许您在其中编写操作系统。

这是我目前所能想到的,但我会编辑/更新这篇文章,因为我会想到更多的事情。

票数 21
EN

Software Engineering用户

发布于 2010-10-06 17:46:20

下面是我要加入的一系列功能:

类似

Lisp的语法

Lisp风格

优点:

  • 易于扩展的语法。曾经尝试过在C中实现foreach循环吗?这可不容易。(请注意,我已经做到了)。
  • 同象性。您可以简单地使用(eval "your data files")

Cons

  • 嵌套波兰符号通常很难读懂。

函数式编程

哈斯克尔风格

优点:

  • 容易并发,所有代码都是线程安全的。

Cons

  • 很难在纯功能代码中实现副作用,尽管monads似乎做得很好。

强动态分型

Python风格

优点:

  • 动态键入可以使代码清晰可读性强,强类型可以消除类型错误。

Implementation

允许基于类型的函数重载,类似于CL的defgeneric

代码语言:javascript
复制
(define (+ (a <int>) (b <int>))
  (ints-add a b))

(define (+ (a <string>) (b <string>))
  (string-concat a b))

(define (+ a b)
  (add-generic a b))

可编译和可解释的

Pros

  • 编译后的性能提升(通常为真,并非总是如此)

Cons

  • 可以限制语言的功能,llvm将是一个很好的支持。

系统编程

C风格

Pros

  • 吸引了一个范围非常小的更广泛的用户。
  • 如果应用程序、内核和设备驱动程序都是用同一种语言编写的,它们就更容易交互。

缺点:

  • 限制抽象在语言中,动态打字往往是不合适的。

卫生宏(CL样式和方案样式)

Pros

  • 易于扩展该语言,特别是使用Lispy™语法。
  • 我以前也这么说过,不是吗?

Cons

  • 如果用Lispy™语法完成的话,就不多了

想想看,除了编译和系统编程位之外,这或多或少地定义了方案。这可以通过使用libguile和用C语言编写这些位元来解决。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档