diff --git a/.gitignore b/.gitignore index 8a434a6..17134ca 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ main.idx main.ilg main.ind main.out +*.log diff --git a/Ch2-3-SoftwareLanguage.bbl b/Ch2-3-SoftwareLanguage.bbl new file mode 100644 index 0000000..b5e60d2 --- /dev/null +++ b/Ch2-3-SoftwareLanguage.bbl @@ -0,0 +1,136 @@ +\begin{thebibliography}{10} + +\bibitem{DBLP:journals/software/WamplerC10} +Dean Wampler and Tony Clark. +\newblock Guest editors' introduction: Multiparadigm programming. +\newblock {\em {IEEE} Software}, 27(5):20--24, 2010. + +\bibitem{DBLP:series/lncs/Torra16} +Vicen{\c{c}} Torra. +\newblock {\em Scala: From a Functional Programming Perspective - An + Introduction to the Programming Language}, volume 9980 of {\em Lecture Notes + in Computer Science}. +\newblock Springer, 2016. + +\bibitem{DBLP:books/daglib/0030751} +Markus Voelter, Sebastian Benz, Christian Dietrich, Birgit Engelmann, Mats + Helander, Lennart C.~L. Kats, Eelco Visser, and Guido Wachsmuth. +\newblock {\em {DSL} Engineering - Designing, Implementing and Using + Domain-Specific Languages}. +\newblock dslbook.org, 2013. + +\bibitem{DBLP:journals/toplas/FosterGMPS07} +J.~Nathan Foster, Michael~B. Greenwald, Jonathan~T. Moore, Benjamin~C. Pierce, + and Alan Schmitt. +\newblock Combinators for bidirectional tree transformations: {A} linguistic + approach to the view-update problem. +\newblock {\em {ACM} Trans. Program. Lang. Syst.}, 29(3):17, 2007. + +\bibitem{DBLP:conf/sp/RastogiHH14} +Aseem Rastogi, Matthew~A. Hammer, and Michael Hicks. +\newblock Wysteria: {A} programming language for generic, mixed-mode multiparty + computations. +\newblock In {\em 2014 {IEEE} Symposium on Security and Privacy, {SP} 2014, + Berkeley, CA, USA, May 18-21, 2014}, pages 655--670, 2014. + +\bibitem{DBLP:conf/sosp/ThereskaBOKRTBZ13} +Eno Thereska, Hitesh Ballani, Greg O'Shea, Thomas Karagiannis, Antony I.~T. + Rowstron, Tom Talpey, Richard Black, and Timothy Zhu. +\newblock Ioflow: a software-defined storage architecture. +\newblock In {\em {ACM} {SIGOPS} 24th Symposium on Operating Systems + Principles, {SOSP} '13, Farmington, PA, USA, November 3-6, 2013}, pages + 182--196, 2013. + +\bibitem{DBLP:conf/popl/AndersonFGJKSW14} +Carolyn~Jane Anderson, Nate Foster, Arjun Guha, Jean{-}Baptiste Jeannin, Dexter + Kozen, Cole Schlesinger, and David Walker. +\newblock Netkat: semantic foundations for networks. +\newblock In {\em The 41st Annual {ACM} {SIGPLAN-SIGACT} Symposium on + Principles of Programming Languages, {POPL} '14, San Diego, CA, USA, January + 20-21, 2014}, pages 113--126, 2014. + +\bibitem{DBLP:journals/ccr/BosshartDGIMRSTVVW14} +Pat Bosshart, Dan Daly, Glen Gibb, Martin Izzard, Nick McKeown, Jennifer + Rexford, Cole Schlesinger, Dan Talayco, Amin Vahdat, George Varghese, and + David Walker. +\newblock {P4:} programming protocol-independent packet processors. +\newblock {\em Computer Communication Review}, 44(3):87--95, 2014. + +\bibitem{DBLP:journals/cacm/ResnickMMREBMRSSK09} +Mitchel Resnick, John Maloney, Andr{\'{e}}s Monroy{-}Hern{\'{a}}ndez, Natalie + Rusk, Evelyn Eastmond, Karen Brennan, Amon Millner, Eric Rosenbaum, Jay~S. + Silver, Brian Silverman, and Yasmin~B. Kafai. +\newblock Scratch: programming for all. +\newblock {\em Commun. {ACM}}, 52(11):60--67, 2009. + +\bibitem{DBLP:conf/osdi/ChenMJZYSCWHCGK18} +Tianqi Chen, Thierry Moreau, Ziheng Jiang, Lianmin Zheng, Eddie~Q. Yan, Haichen + Shen, Meghan Cowan, Leyuan Wang, Yuwei Hu, Luis Ceze, Carlos Guestrin, and + Arvind Krishnamurthy. +\newblock {TVM:} an automated end-to-end optimizing compiler for deep learning. +\newblock In {\em 13th {USENIX} Symposium on Operating Systems Design and + Implementation, {OSDI} 2018, Carlsbad, CA, USA, October 8-10, 2018.}, pages + 578--594, 2018. + +\bibitem{DBLP:journals/cacm/RompfO12} +Tiark Rompf and Martin Odersky. +\newblock Lightweight modular staging: a pragmatic approach to runtime code + generation and compiled dsls. +\newblock {\em Commun. {ACM}}, 55(6):121--130, 2012. + +\bibitem{DBLP:journals/pacmpl/WangWS19} +Yuting Wang, Pierre Wilke, and Zhong Shao. +\newblock An abstract stack based approach to verified compositional + compilation to machine code. +\newblock {\em {PACMPL}}, 3({POPL}):62:1--62:30, 2019. + +\bibitem{DBLP:conf/pldi/YangCER11} +Xuejun Yang, Yang Chen, Eric Eide, and John Regehr. +\newblock Finding and understanding bugs in {C} compilers. +\newblock In {\em Proceedings of the 32nd {ACM} {SIGPLAN} Conference on + Programming Language Design and Implementation, {PLDI} 2011, San Jose, CA, + USA, June 4-8, 2011}, pages 283--294, 2011. + +\bibitem{DBLP:journals/ftpl/GulwaniPS17} +Sumit Gulwani, Oleksandr Polozov, and Rishabh Singh. +\newblock Program synthesis. +\newblock {\em Foundations and Trends in Programming Languages}, 4(1-2):1--119, + 2017. + +\bibitem{DBLP:journals/ftpl/VechevY16} +Martin~T. Vechev and Eran Yahav. +\newblock Programming with "big code". +\newblock {\em Foundations and Trends in Programming Languages}, 3(4):231--284, + 2016. + +\bibitem{DBLP:journals/cacm/Leroy09} +Xavier Leroy. +\newblock Formal verification of a realistic compiler. +\newblock {\em Commun. {ACM}}, 52(7):107--115, 2009. + +\bibitem{DBLP:conf/popl/MonsantoFHW12} +Christopher Monsanto, Nate Foster, Rob Harrison, and David Walker. +\newblock A compiler and run-time system for network programming languages. +\newblock In {\em Proceedings of the 39th {ACM} {SIGPLAN-SIGACT} Symposium on + Principles of Programming Languages, {POPL} 2012, Philadelphia, Pennsylvania, + USA, January 22-28, 2012}, pages 217--230, 2012. + +\bibitem{2019Move} +Sam Blackshear, Evan Cheng, David~L. Dill, Victor Gao, Ben Maurer, Todd + Nowacki, Alistair Pott, Shaz Qadeer, Rain, Dario Russi, Stephane Sezer, Tim + Zakian, and Runtian Zhou. +\newblock Move: A language with programmable resources. +\newblock Technical report, The Libra Association, 2019. + +\bibitem{DBLP:journals/jss2/Carpenter17} +Bob Carpenter, Andrew Gelman, Matt Hoffman, Daniel Lee, Ben Goodrich, Michael + Betancourt, Marcus~A. Brubaker, Jiqiang Guo, Peter Li, and Allen Riddell. +\newblock Stan: A probabilistic programming language. +\newblock {\em Journal of Statistical Software}, 76(1):1--32, 2017. + +\bibitem{kar50323} +Zhenjiang Hu, John Hughes, and Meng Wang. +\newblock How functional programming mattered. +\newblock {\em National Science Review}, 2(3):349--370, 2015. + +\end{thebibliography} diff --git a/Ch2-3-SoftwareLanguage.tex b/Ch2-3-SoftwareLanguage.tex index be354b9..6956b0f 100644 --- a/Ch2-3-SoftwareLanguage.tex +++ b/Ch2-3-SoftwareLanguage.tex @@ -1,8 +1,7 @@ -世界离不开计算,描述计算离不开程序设计语言。不同的程序设计语言描述不同的计算模式,比如,命令式语言描述以状态的变换作为计算的模式,函数式语言描述以函数作为计算的模式,逻辑语言描述以证明作为计算的模式,而量子语言则描述量子计算的模式。 +世界离不开计算,描述计算离不开程序设计语言。不同的程序设计语言描述不同的计算模式,比如,命令式语言描述以状态的变换作为计算的模式,函数式语言描述以函数作为计算的模式,逻辑语言描述以证明作为计算的模式,而量子语言则描述量子计算的模式。在第\ref{book1-PL}章,我们对众多的程序设计语言进行了比较并回顾了程序设计语言的发展历史,从中我们可以看到,新的程序设计语言的出现通常是为了应对新的计算模式、新兴应用、或者新兴硬件和计算平台的需要。 - -“软件定义一切”本质上是可编程思想扩张到整个社会和物理世界,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。随着人机物融合的发展,计算的泛在化成为必然,程序设计语言向下需要对物理世界进行抽象并提供处理物理世界的接口,向上需要能够处理不同场景的多范式的应用编程。泛在计算中不断涌现出的新的计算模式、新的计算平台和新的应用问题给程序设计语言的定义和实现带来了新的挑战。 +“软件定义一切”本质上是可编程思想扩张到整个社会和物理世界,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。随着人机物融合的发展,计算的泛在化成为必然,程序设计语言向下需要对物理世界进行抽象并提供处理物理世界的接口,向上需要能够处理不同场景的多范式的应用编程。泛在计算中不断涌现出的新的计算模式、新的计算平台和新的应用问题给程序设计语言的定义和实现带来了新的机遇和挑战。 首先,新的计算模式需要新的程序设计语言。随着不断涌现的新的计算模式,如适合于抽象描述机器学习的概率计算、神经网络计算、大数据计算、保护隐私的计算等,我们需要新的语言定义和实现技术,快速开发各种各样新的程序设计语言,支持各类新型计算模式。 @@ -67,6 +66,91 @@ 其次,需要提供充分保障支撑环境可靠性、安全性的分析、测试和验证等技术手段。编译器、虚拟机和执行引擎的代码复杂,其中潜伏着包含缺陷或者安全漏洞。如何提升编译器、虚拟机和执行引擎的安全性是一个重要的问题。当前已经出现了经过验证的编译器,例如CompCert。此外,已经出现了一批针对编译器和虚拟机的测试和安全分析工作,例如CSmith、EMI等。尽管如此,对编译器(包括优化算法)及虚拟机等安全性分析、测试、验证工作还面临很多问题,我们仍需要能够充分保障编译器、虚拟机和执行引擎的安全性的分析、测试和验证技术手段。例如,不可能枚举出一个语言的所有程序实例以对支撑环境进行穷尽测试,相反,需要提供一套策略,协助选择或者自动生成具有代表性的程序实例以高效测试支撑环境的健壮性。特别是,针对支撑环境进行广泛测试,针对各类编译技术和算法(如优化算法和垃圾回收算法)进行正确性验证,及验证应用程序接口的正确性,仍然是这个方向上的难点问题。此外,在程序设计语言动态演化过程中,需要提供足够的技术手段,保障语言新特性和支撑环境新功能可以被可靠地、安全地加入至既有语言和支撑环境中。 +\tikzstyle{every node}=[draw=black,thick,anchor=west] +\tikzstyle{selected}=[draw=red,fill=red!30] +\tikzstyle{optional}=[dashed,fill=gray!50] +\begin{figure} +\begin{tikzpicture}[% + grow via three points={one child at (0.5,-0.65) and + two children at (0.5,-0.65) and (0.5,-1.3)}, + edge from parent path={(\tikzparentnode.south) |- (\tikzchildnode.west)}] + \node{程序设计语言主要研究内容} + child {node{语言设计} + child {node {传统语言设计} + child {node {类型系统}} + child {node {语言定义}} + child {node {内存模型}} + } + child [missing] {} + child [missing] {} + child [missing] {} + child {node {新型语言设计} + child {node {泛在计算} + child {node {\it 软件定义网络的程序设计语言}} + child {node {软件定义内存的程序设计语言}} + child {node {\it 离散和连续混成系统的语言}} + child {node {\it 支持共享内存模型的并发程序设计}} + } + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child {node {大数据处理} + child {node {\it 面向数据管理统计的程序设计语言}} + } + child [missing] {} + child {node {人机物融合} + child {node {\it 支持最终用户编程的程序设计语言}} + } + child [missing] {} + child {node {多范式程序设计} + child {node {\it 多范式和领域特定的程序设计语言}} + } + child [missing] {} + } + } + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child {node {语言实现和支撑环境} + child {node {编译器设计与实现}} + child {node {程序分析与验证}} + child {node {程序综合与精化}} + child {node {\it 程序设计开发环境}} + child {node {\it 离散和连续混成系统的语言支撑工具}} + } + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child [missing] {} + child {node {语言生态} + child {node {\it 程序设计框架和库}} + child {node {\it 特定领域语言的元编程和开发环境}} + child {node {\it 程序设计语言的生态及其演化规律}} + } + ; +% child {node {E} +% child {node {``value''}} +% }; +\end{tikzpicture} +\caption{程序设计语言主要研究内容\label{fig:ProgrammingLanguages}} +\end{figure} + + \section{主要研究内容} 为了应对上述重大挑战,需要在多方面开展研究。首先,为了支持泛在计算(§2.1.1)、大数据处理(§2.1.3)、和人机物融合(§2.1.4)等多种新型应用场景,需要研究面向不同领域的编程语言,包括面向数据管理统计的程序设计语言(§2.2.2)、面向软件定义网络的程序设计语言(§2.2.3)、支持最终用户编程的程序设计语言(§2.2.6)。其次,为了设计面向泛在计算的语言(§2.1.1)和实现多范式程序设计支持(§2.1.2),需要研究多范式和领域特定的程序设计语言(§2.2.1)、离散和连续混成系统的语言和工具(§2.2.4)以及支持共享内存模型的并发程序设计(§2.2.5)。最后,为了支持新语言所带来的开发环境和生态的变化,我们需要研究程序设计框架和程序设计开发环境(§2.2.7)、特定领域语言的元编程和开发环境(§2.2.8)、程序设计语言的生态及其演化规律(§2.2.9)。 @@ -118,7 +202,7 @@ \section{本章小结} 如果说软件是社会的基础,那么程序设计语言就是软件的核心。泛在计算促使我们设计各式各样的满足某种性质的领域特定程序设计语言,研究语言随着时间和环境的改变而变化的演化和生长机制,并开发一个全新的“基于语言”的软件设计方法和支撑环境。在这一章里,我们指出了新时代程序设计语言的几个挑战性问题,有些问题并不是新的,但是它们被赋予新的内涵。作为参考,我们也列出了一些重要的研究内容,希望能够通过这些具体研究来迎接这些挑战。 -\section{参考文献} +\section*{参考文献} [1] Kreutz D, Ramos F M V, Esteves Verissimo P, et al. Software-Defined Networking: A Comprehensive Survey. Proceedings of the IEEE, 2014, 103(1):10-13. @@ -151,8 +235,8 @@ [11] Abadi M, Barham P, Chen J, et al. Tensorflow: A system for large-scale machine learning, 12th USENIX Symposium on Operating Systems Design and Implementation (OSDI 16). 2016: 265-283. - - + + [12] Paszke A, Gross S, Chintala S, et al. Automatic differentiation in pytorch. 2017. diff --git a/main.tex b/main.tex index 5679748..e761630 100644 --- a/main.tex +++ b/main.tex @@ -1,6 +1,6 @@ \documentclass[b5paper, oneside]{ctexbook} -\usepackage{graphicx} +\usepackage{graphicx} \usepackage{epigraph} \usepackage{hyperref} \usepackage{listings} @@ -10,6 +10,8 @@ \usepackage{makecell} \usepackage{subfigure} \usepackage{imakeidx} +\usepackage{tikz} +\usetikzlibrary{trees} \makeindex @@ -37,6 +39,7 @@ \input{Ch1-1-History} \chapter{程序设计语言与理论} +\label{book1-PL} \input{Ch1-2-ProgrammingLanguage} \chapter{系统软件} @@ -50,14 +53,14 @@ \part{新时代的软件学科} - + \chapter{引言} \input{Ch2-1-Overview} \chapter{软件理论} \input{Ch2-2-SoftwareTheory} -\chapter{软件语言} +\chapter{程序设计语言与支撑环境} \input{Ch2-3-SoftwareLanguage} \chapter{软件开发方法与技术} @@ -82,9 +85,7 @@ \input{Ch2-10-Education} \part{软件学科发展建议} -and so on +and so on \printindex \end{document} - -