Skip to content

Design of programming language

本文接着上一篇进行描述。programming language虽然多,但是其实在设计一门programming language的时候,会涉及很多相同主题的内容,这也是我们在阅读各种programming language的Language reference时,会发现它们涉及了很多相同的主题。所以如果我们对这些common主题有一定的了解,那么掌握一门programming language会变得相对容易。

一般一门programming language的设计,可以分为两大块:

  • language
  • standard library

Language

Syntax

programming language属于formal language,所以都会定义严格的syntax,“syntax"即语法。正如维基百科Syntax (programming languages)Levels of syntax段所总结的:

Computer language syntax is generally distinguished into three levels:

  • Words – the lexical level, determining how characters form tokens;
  • Phrases – the grammar level, narrowly speaking, determining how tokens form phrases;
  • Context – determining what objects or variables names refer to, if types are valid, etc.

上述“Words”即词法,“Phrases”即语法,关于syntax,可以参考工程compiler-principle

expression、statement等都是属于此范轴。

Semantics

参见维基百科Semantics (computer science)

Type system

语言的设计者,需要考虑这门语言的type system,参见Type system

语言的设计者还会向开发者提供对type system进行操作的接口,比如c++提供了typeiddynamic_cast,python提供了isinstance,Java提供了isinstanceof

Runtime model

前面都是language的静态时,还需要对run time进行说明,比如data model、程序的运行模型等。

Data model

语言的设计者需要为 这门语言定义统一的data model,比如The Python Language Reference中就有专门描述Data model的 章节,与此类似的是,在cppreference的Object中,对c++语言的data model进行了总结。

Run model

语言的设计者会假定该使用该语言所编写的程序运行与一个abstract machine上以便对run model进行描述,比如在cppreference的Memory model中有这样的描述:

Defines the semantics of computer memory storage for the purpose of the C++ abstract machine.

在The Python Language Reference的Execution model中对python程序的run model进行了描述。

Standard library

各种programming language都提供了大量的library,所以在学习一门programming language的时候,尤其需要注意其standard library。

一般standard library都会涉及到如下内容:

Container

container指各种常见的数据结构,一般programming language的standard library都会包含这部分内容。

Language support library

这是我在阅读cppreference的时候发现的一个概念,其中给出的Language support library解释如下:

Language support libraries provide classes and functions that interact closely with language features and support common language idioms.

依据此,python标准库中的很多library都可以归入此范轴:

Run time info

比如python的标准库提供了Python Runtime Services来供用户进行run time。

Specification of expectation of type in class-based OOP language

这部分内容移到了Theory\Programming-paradigm\Generic-programming\Specification-of-expectation-of-type.md中。

Design of specifier/keyword

语言为了简便,key word要尽可能地少,能够表达多种含义,因此一个key word能够用于多种entity,有多种用途,典型的例子有:

Design to an abstraction

本节标题的含义是: 对于general purpose programming language,designer在设计programming language的时候,是遵循如下原则的:

Design to an abstraction, not an implementation

它的意思是,designer在设计programming language的时候,是基于**abstract machine**来进行设计的,而不是specific to an concrete platform(physical machine、OS),然后由各个platform的开发者来完成abstraction到implementation的dispatch/map(映射),即在该platform上实现这门语言。这是很多programming language实现cross platform的关键所在。

NOTE:

"一个抽象(abstract)可以有多个实现(implementation)",参见文章Abstraction。

这是我仿照OOP design principle中的: "Program to an 'interface', not an 'implementation'"而总结的,其实两者背后的思想是相同的,关于OOP design principle,参见: Theory\Design-pattern\OOP-design-pattern\Principle

Example

下面以三种主流programming language为例来进行说明:

language implementation
Java 见下
Python python、java的跨平台是依赖于VM,这些VM也是由实现提供,比如VM for windows,VM for linux,由这些VM实现来完成abstract machine 到 physical machine 的映射。
C++ 跨平台由具体实现(compiler等)完成,MCVC for windows、gcc for linux,由这些compiler来完成abstract machine 到 physical machine的映射。

Abstract machine

出于语言设计的目标,programming language designer对abstract machine的定义是不同的:

Python都没有向programmer提供memory model,所以programmer无法直接操作memory;

Java、C++和C都提供了memory model,在C++和C中,programmer可以直接操作memory。

关于abstract machine,参见工程automata-and-formal-language

相关文章

1、stackoverflow C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?