search
HomeBackend DevelopmentPHP Tutorialjavascript - 为何有的语言要声明function关键字,有的却不需要呢?

我看了很多语言源代码,突然发现一个有趣的现象,对于function这个关键字,很多语言设计出来了,而很多语言却没有。这是基于一种什么考虑呢?

而且经过我的统计,出现function关键字的大多数是脚本语言,比如php,js等等,而编译式语言比如java,c等等,往往却没有用到这个关键字,这其中有什么内在联系吗?

回复内容:

我看了很多语言源代码,突然发现一个有趣的现象,对于function这个关键字,很多语言设计出来了,而很多语言却没有。这是基于一种什么考虑呢?

而且经过我的统计,出现function关键字的大多数是脚本语言,比如php,js等等,而编译式语言比如java,c等等,往往却没有用到这个关键字,这其中有什么内在联系吗?

很赞的一个问题。

我也看过很多语言源代码,也对不同的语言的语法感兴趣,所以简单的聊聊这个问题。

首先出场的是 LISP 语言。 LISP 语言以逼格高闻名于世。他属于函数式编程语言,所有的语句都是函数,因此不需要 function 这个关键词。

随后的 Fortran 语言,公式翻译的意思 FormulaTranslation。既然是公式翻译语言,因此 数学公式 f(x) = a + b 在 Fortran 的调用就是 x = a + b

在定义函数的方式上,使用 function:(代码来自google)

function add(a, b)
implicit none
real::a, b    !声明函数参数类型,这是必需的
real::add     !声明函数返回值类型,这是必需的
add = a + b   !返回值的表达式
return
end

COBOL语言。COBOL 设计的目的和 Fortran 不同,甚至连赋值语句都没有,而且根本就没有函数的概念,取而代之的是 PROCEDURE DIVISION(过程)。

随后就是 Basic:Beginner's All-purpose Symbolic Instruction Code。Basic 可谓是集大成者,不仅仅有函数,还有过程。函数使用 function, 过程使用 sub。(抄袭 fortran 和 cobol?)

C语言改变了这种局面,原因是C语言的一个独辟蹊径的设计理念:函数如何调用,就如何声明。也就是说,我们如果这样调用函数

<code>sum = f(a, b);
</code>

那么,我们就这么声明:

<code>double f(a, b)     /* 旧式语法 */
    double a;
    double b;
{}

double f(double a, double b)  // 新式语法
{}
</code>

随后的 C++ Java C# 走的是C的路线。

但是调用和声明一致的前提是,函数调用之前需要声明。在 C 语言中,不仅仅是函数,即使数据类型定义也需要声明。

不过在很多动态语言中,大部分数据和函数都不需要提前声明,而且有很多函数只调用一次,那么在函数调用之前声明一次,以后这个函数就再不使用了,这样就会显得繁琐。这时,就需要在语法上将函数定义和函数调用分别出来。

还有一个原因,C是种编译性的语言,他的语法是为了更好的提升编译速度和编译完成后的代码性能,比如早期C和pascal编译器要求的数据和代码分离的原则。

而现在的主要动态编程语言都不再需要编译,更无需预编译。

function是个标记,表明正在声明的是一个函数,这个关键字和编译型或解释型没什么太大关系,使用这个关键字的大多是动态类型语言,对于C/JAVA这一类静态类型语言,标明返回值和参数列表就可以明确的区分函数声明函数调用,因为函数本身和参数都标明了类型,但动态类型的语言没有类型表示,如果不加入一个特定的关键字,从语法上就不太好区分函数声明函数调用,比如C语言中:
int f(int n)是一个声明,f(n)是一个调用,但在JavaScript中,如果你不加function这个关键字,你该如何解释f(n)到底是什么呢?

问一个问题, 请问 "打" 的正确含义是什么?

任何人都不应该给出正确的答案, 因为你不知道它被作为动词还是量词, 或者其他意思.

所以我们需要从 "一打" "打手" "打开" 这样的上下文中分析该词的含义.

至于 function 这个关键词需不需要出现, 取决于语言的设计.

合格的程序员都知道代码文本, 经过编译之后, 最终成为机器码或者 vm 用的字节码, 所以跟你写不写 function 没有关系. function 之类的关键字方便在编译前的分析阶段, 能够正确(并且实现上不那么费力)地通过语法和语义分析.

举个例子, 在 5.4 之前, php 不支持 abc()[1] 这种对函数返回值取数组索引(前提是得保证返回了理想长度的数组), 鸟哥给的原因(记不清了,估计是他)是解析代码比较乱, 比较难实现, 到 5.4, 总算有人愿意干这个脏活了, 解决了这个问题. 如果哪天谁把 function 这个关键字的解析工作优化了, 那么可能就会出现一个不需要 function 关键字的 php.

举个栗子, 因为语法被很多人讨厌的 bash
函数定义如下

<code> [ function ] name () compound-command [ redirections ]
</code>

定义函数的的时候, function 关键字是可选的, 但, 没有 function 的时候, 需要写上 ()
所以, 意味着 bash 通过 function 或者 () 来定位这是一个函数声明, 而不是语句.

更加准确的回答, 需要从语言的解析具体实现进行分析, 另外还要确定是否存在和 abc(){} 冲突的特性存在, 就不继续深入了

什么叫思而不学则殆?这就是活生生的例子。

你没见过用def定义函数的python吗?没见过用fn定义函数的rust吗?没见过用func定义函数的swift吗?没见过可以加function也可以不加function的bash函数吗?没见过既可以用def也可以用val定义函数的scala吗?

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
如何知道 Windows 上是否安装了 PHP?如何知道 Windows 上是否安装了 PHP?May 01, 2023 pm 09:31 PM

如何在Windows10或11上检查PHP版本在学习本教程之前,请确保已在您的Windows系统上正确配置PHP。除此之外,您还需要一个命令提示符或终端访问权限。使用命令提示符或Powershell检查PHP版本识别已安装的PHP版本的最好和最简单的方法是使用其命令行工具。但是,要使用,用户必须有权访问Windows命令行应用程序,如CMD。转到Windows10或11搜索框并键入CMD或Powershell。您可以使用其中任何一个。当图标出现在这些

Web 开发 FastAPI、Flask 和 Streamlit 的比较Web 开发 FastAPI、Flask 和 Streamlit 的比较Apr 09, 2023 am 11:51 AM

Python 已成为最流行的 Web 开发编程语言之一,这要归功于它的简单性、多功能性以及大量的库和框架集合。在使用 Python 构建 Web 应用程序时,开发人员有多种选择,从 Django 和 Pyramid 等全栈框架到 Flask 和 FastAPI 等轻量级微框架,再到用于数据科学应用程序的 Streamlit 等专用工具。在本文中,我们将比较三种最流行的 Python Web 框架——FastAPI、Flask 和 Streamlit——以帮助您为项目选择合适的工具。我们将探讨每个

基于Taichi的Python高性能计算入门指南基于Taichi的Python高性能计算入门指南Apr 12, 2023 am 08:46 AM

自从Python编程语言诞生以来,它的核心理念一直是最大限度地提高代码的可读性和简单性。Python对可读性和简单性的追求简直达到了如痴如狂的境地。一个事实即可证实这一点:只要你在Python系统的根目录中输入命令“import this”后按下回车键,竟然马上打印出一首英文小诗,翻译成中文大致意思是:“美丽胜过丑陋,显式优于隐式。简单比复杂好,复杂比繁杂好。扁平优于嵌套,稀疏胜过密集。可读性很重要……”简单总比复杂好,可读性很重要。毫无疑问,Python确实在实现这些目标方面非常成功:它是迄今

html和css算编程语言吗html和css算编程语言吗Sep 21, 2022 pm 04:09 PM

不算。html是一种用来告知浏览器如何组织页面的标记语言,而CSS是一种用来表现HTML或XML等文件样式的样式设计语言;html和css不具备很强的逻辑性和流程控制功能,缺乏灵活性,且html和css不能按照人类的设计对一件工作进行重复的循环,直至得到让人类满意的答案。

如何在 Windows 10 上使用命令提示符安装 PHP如何在 Windows 10 上使用命令提示符安装 PHPMay 08, 2023 pm 05:13 PM

使用命令提示符或PowerShell在Windows上安装PHP安装ChocolateyChoco包管理器我尝试了Windows默认包管理器Winget,但无法通过它安装PHP。因此,剩下的另一个最佳选择是使用流行的Chocolatey包管理器。但与Winget不同的是,Choco默认情况下不存在于我们的Windows系统中,因此我们需要在我们的系统上手动安装它。转到您的Windows10或11搜索框并键入CMD,出现时选择“以管理员身份运行”将给定的命令复制

在 Windows 11 或 10 上安装最新 Python 的 2 种方法——GUI 和 CMD在 Windows 11 或 10 上安装最新 Python 的 2 种方法——GUI 和 CMDApr 13, 2023 pm 11:31 PM

在 Windows 10 或 11 上安装 Python 3在这里,我们讨论两种设置 Python 的方法,一种是使用图形安装向导,另一种是借助提示符或 Powershell(终端)中的命令。使用图形用户界面:1.下载Python最新版本众所周知,默认情况下,Windows 中不包含 Python 来编译我们基于它的程序。因此,请访问官方网站python.org ,通过单击“下

Python Web3 开发:用 Brownie 部署智能合约Python Web3 开发:用 Brownie 部署智能合约May 19, 2023 pm 05:34 PM

Python是最通用的编程语言之一:从研究人员运行他们的测试模型到开发人员在繁重的生产环境中使用它,几乎在每个可能的技术领域都有使用案例。在今天的指南中,我们将了解Brownie,一个基于Python的工具,用于编写和部署智能合约。准备安装Python3以太坊节点文本编辑器终端什么是Brownie?智能合约开发主要由基于JavaScript的库主导,如web3.js、ethers.js、Truffle和Hardhat。Python是一种通用的、高度使用的语言,也可用于智能合约/web3的开

30 个数据工程必备的Python 包30 个数据工程必备的Python 包Apr 12, 2023 pm 04:58 PM

Python 可以说是最容易入门的编程语言,在numpy,scipy等基础包的帮助下,对于数据的处理和机器学习来说Python可以说是目前最好的语言,在各位大佬和热心贡献者的帮助下Python拥有一个庞大的社区支持技术发展,开发两个各种 Python 包来帮助数据人员的工作。在本文中,将介绍一些非常独特的并且好用的 Python 包,它们可以在许多方面帮助你构建数据的工作流。1、KnockknockKnockknock是一个简单的Python包,它会在机器学习模型训练结束或崩溃时通知您。我们可以

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.