Inhaltsverzeichnis
回复内容:
Heim Backend-Entwicklung PHP-Tutorial javascript - 为何有的语言要声明function关键字,有的却不需要呢?

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

Jun 06, 2016 pm 08:42 PM
c java javascript php 编程语言

我看了很多语言源代码,突然发现一个有趣的现象,对于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
Nach dem Login kopieren

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>
Nach dem Login kopieren

那么,我们就这么声明:

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

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

随后的 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>
Nach dem Login kopieren

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

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

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

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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Erklären Sie den Match -Expression (Php 8) und wie er sich vom Schalter unterscheidet. Erklären Sie den Match -Expression (Php 8) und wie er sich vom Schalter unterscheidet. Apr 06, 2025 am 12:03 AM

In PHP8 sind Übereinstimmungsausdrücke eine neue Kontrollstruktur, die unterschiedliche Ergebnisse basierend auf dem Wert des Expression zurückgibt. 1) Es ähnelt einer Switch -Anweisung, gibt jedoch einen Wert anstelle eines Ausführungsanweisungsblocks zurück. 2) Der Match -Ausdruck wird streng verglichen (===), was die Sicherheit verbessert. 3) Es vermeidet mögliche Auslassungen in Switch -Anweisungen und verbessert die Einfachheit und Lesbarkeit des Codes.

See all articles