02 你好世界

02 你好世界

“你好,世界!”程序是显示类似于“Hello, World!”的消息的计算机程序。在屏幕/终端上。它说明了所有周围的“生态系统”(例如编译器、解释器、源文件)如何一起使用。它还显示了编程语言的一些非常基本的语法。在 Python 等高级语言中,这样的程序对我来说往往很小。

我们将重复这个过程几次,每次我都会解释更多关于这个过程的东西。

但在此之前,我们需要进入预先配置 Python 环境的 Docker 容器。如果您没有安装 Docker,请转到上一章并安装 Docker。

现在,在您的主机操作系统中打开终端/CMD。类型:

 docker pull alexberkovich/alpine-python39

{01_docker_pull}

此命令会将我的 Docker 映像从 Docker Hub 下载到您的主机操作系统。

你会得到这样的东西:

现在,输入:

 docker run -it alexberkovich/alpine-python39 bash

{02_docker_run}

pwd — 打印工作目录。

ls -al — 列出目录中的所有文件,包括隐藏的,带有长描述(不仅是文件名)。

cd tmp — 将目录更改为 tmp(相对于 cwd=当前工作目录=/)

注意,登录后,我们从目录 / 开始。当我们列出该目录中的所有文件时,我们会看到其他文件 tmp.我们可以写 光盘 /tmp 这使用绝对路径,可以从任何目录工作。

笔记: 这些解释对你来说可能还不够。随意搜索这些特定命令或一些基本的 bash 教程。

现在,使用您最喜欢的文本编辑器,例如 , 但是我更喜欢 纳米 创建您的第一个程序。类型

 纳米你好.py

{03_nano_hello}

类型:

 print("你好,世界!")

{04_hello.py}

现在,点击 CTRL+O, 您应该看到以下屏幕:

按回车键,现在您应该在屏幕底部显示以下内容:

CTRL+X 退出编辑器。

类型 猫你好.py 为确保一切正常,您应该看到以下内容:

第一次迭代

所以,我们有文件 你好.py 一行:

 print("你好,世界!")

{04_hello.py}

有所谓的“机器语言”——计算机可以理解和运行的语言,有人类语言,我们人类交流的语言,以及介于两者之间的编程语言,如汇编、C、C++、 Python。 Python 不是人类语言,它的使用方式有严格的限制。完成这些限制是为了让某些“翻译器”/其他程序能够将其“翻译”成机器语言。

在 Python 中,这样的“翻译器”就是解释器。他的名字是 Python .基本用法如下:

 蟒蛇你好.py

{05_python_hell.py}

Python 解释器逐行检查提供的文件 hello.py 并解释它,使其“执行”。

因此,文件中只有一个。它说在屏幕上打印“Hello, World”,所以解释器就是这样做的。还有更多细节,我在这里跳过,但我稍后会回复它们。

第二次迭代

现在,让我们运行“Hello, world!”以不同的方式。让我们打开 交互式翻译 模式,让我们输入:

 Python

{06_python.py}

比,让我们输入

 print("你好,世界!")

{07_print_hello_world.py}

比,我们会得到:

 你好世界!

{08_hello_world.py}

在终端上。

我们也可以输入:

 1+1

{09_1_plus_1}

我们会得到

 2

{10_two}
正如预期的那样。为了退出解释器类型

 相当()

{11_quite}

交互的 模式我们可以输入表达式并获得即时反馈。

另一方面,在第一次近似运行 Python 使用源文件就像逐行提供交互式解释器。如果我们深入挖掘,我们会发现运行 Python 带有源代码文件的解释器启用特殊类型的优化,有助于减少程序运行的时间。我将在下一章讨论它。

Jupyter Notebook 等基本上都是 交互的 口译员。它们提供了更加用户友好的、基于 Web 的、现代的 UI 来使用,而不是 CLI Python 确实如此,但原则上它们是完全相同的。

您可以通过运行 docker 容器进行尝试,如下所示:

 docker run -itp 8888:8888 alexberkovich/alpine-python39 /bin/bash -c "\  
 conda install jupyter -y --quiet && \  
 mkdir -p /opt/笔记本 && \  
 jupyter笔记本\  
 --notebook-dir=/opt/notebooks --ip='*' --port=8888 \  
 --no-browser --allow-root"

{12_jupiter_notebook}

第三次迭代

运行“Hello, World!”至关重要。文本编辑器中的示例,没有任何 IDE 集成开发环境。在这样的环境中,您在一个地方拥有文本编辑器、解释器、调试器等。运行程序很容易,只需单击按钮即可。为了使用本书,你可以继续使用文本编辑器,甚至可以获取源代码,只看它并运行。

笔记

1. 掌握 IDE、调试等对于生产性工作是必不可少的,但这超出了本书的范围。

2. 如果你想在一些 docker 容器中使用 IDE,我推荐使用 PyCharm Proffessional。另一种选择可能是带有 Docker 扩展的 VSCode。我没有尝试过 VSCode。请注意,Pycharm 社区版不支持 Docker。

本书附有存储在 GitHub 中的源代码。

当然,您可以在主机操作系统上使用 Git,然后将我的文件内容复制并粘贴到 docker。您甚至可以上网并从他们那里获取文件的内容。您始终可以自己输入代码。

但是您不必知道如何使用 Git 来获取代码。搜索“git-hub alex-ber”,然后打开名为 IntroCS 的存储库。

我将为您提供一组说明如何下载源代码。当然,您可以使用 Git(无论是在 Docker 容器中还是在主机操作系统中)来执行此操作,甚至可以

笔记 :在我的 docker-container 中,我已经预装了 Git。

首先,我们将创建放置源代码的目录。例如,

 mkdir -p /opt/project

{13_git1}

它可以是您想要的任何目录,但我想具体一点。此命令创建 - 如果不存在 /opt 而不是 /opt/project。比类型:

 curl -L https://github.com/alex-ber/IntroCS/archive/refs/tags/1.0.0.tar.gz -o /tmp/1.0.0.tar.gz

{14_git2}

此命令从 GitHub 以 ZIP 文件的形式下载源代码为 tar.gz 文件并将其放入 /tmp。 -L,--location - 表示跟随重定向,-o - 表示将输出重定向到提供的文件名。

类型:

 tar -zxvf /tmp/1.0.0.tar.gz -C /opt/project

{15_git3}

这会将 tag.gz 文件提取到 /选择/项目 目录。

要删除 tar.gz 文件类型:

 rm /tmp/1.0.0.tar.gz

{16_git4}

比类型

 cd /opt/project/IntroCS-1.0.0

{17_git4}

笔记 : 您可以使用 cd/密码/ls -al 遍历源树。请阅读任何基本教程如何做到这一点。我将展示如何运行第一个“Hello, world!”程序。您可以选择安装 Midnight Commander 来执行此操作。只需键入

 apk 添加--no-cache mc

{18_mc}

所以,我们在 介绍CS-* 目录。只需输入:

 cd 02_hello_world/

{19_cd_hello_world}

这是章节的名称。

然后,键入

 蟒蛇04_hello.py

{20_python_hello}

你会看到“你好,世界!”终端上的消息。

您可以转到您正在阅读的章节的目录并从中运行文件。

第四次迭代-一些理论

Python(和 C)是 至关重要的 语。这是什么意思?
命令式编程 是一种编程范式,它使用改变程序状态的语句。与自然语言中的祈使语气表达的方式大致相同 命令 ,一个命令式程序由 命令 供计算机执行。命令式编程侧重于描述 ** 如何** 一个程序是逐步运行的,而不是对其预期结果的高级描述。该术语通常用于对比 声明性的 编程,它专注于程序应该完成什么,而不指定所有细节 如何 该计划应该达到的结果。简而言之,Python中的程序确实 确切地 我们说过要做的。

不,让我们回到 Python .我说过,这是解释器,它只是用代码逐行读取和执行文件。

如你所见,有分裂 命令式 vs 声明式。 它不是排他性的,或者,它是一个范围。例如,在 Python 中使用正则表达式,就是使用声明性方法(但 Python 通常接近命令式语言的末端)。

如果这是您第一次阅读本书,请随意跳过所有内容,直到本章结束。如果您已经了解某种编程语言,我鼓励您阅读它。

你可以安全地跳过这一段。 声明式编程是一种 非强制性的 一种编程风格,其中程序描述了它们想要的结果,而没有明确列出必须执行的命令或步骤。 功能性合乎逻辑的 编程语言的特点是 声明性的 编程风格。在 合乎逻辑的 在编程语言中,程序由逻辑语句组成,程序通过搜索语句的证明来执行。 逻辑 编程语言如 序言 状态和查询关系。如何回答这些查询的细节取决于实现及其定理证明者,但通常采用某种统一的形式。 制作 构建规范语言, Puppet 的配置管理语言 , 常用表达 , 和一个子集 SQL (例如,SELECT 查询)。例如,当我们编写简单的 从某个表中选择 *, 我们没有告诉数据库 如何 为我们提供所需的数据,它应该做什么步骤,我们只 描述 数据库是什么 期待我们想要达到的结果 .和 HTML 我们只是描述了我们希望我们的网页看起来如何,但执行特定步骤的是浏览器(有时,不同的浏览器会给你不同的结果……这就是 标准化 发生…)。

笔记: 在本书中,我将只考虑 Python 的实现,使用 C,经典实现(称为 CPython 或简称 Python)。您应该知道 IronPython 的其他实现——编译为 CLR 代码,即“.NET”,Jython——(编译为 JVM 代码),PyPy(它是用 Python 本身编写的)。

另一个区别是 ** 编译语言与解释语言** .

让我们定义一下,什么是 纯解释语言 , 和 纯编译语言 然后,我们将把 Python 融入其中。纯解释型语言就像 Python——我一直在描述你——我们逐行运行程序并 解释或执行 它。

C是 纯编译语言。 您不能像使用 Python 一样编写源代码并执行(或运行)它。计算机不直接理解 C(它也不直接理解 Python,它是 Python' s 解释器工作将其“翻译”到计算机),C 程序的工作方式,它们有附加步骤 - ** 汇编** 步。

首先,你应该运行一个特殊的程序,叫做 编译器 , 生成“机器代码”,然后与其他 C 文件和启动代码链接以创建独立的可执行文件。生成可执行文件后,它会直接在机器上运行——您无需将用于生成程序的 C 编译器交付给用户。

相比之下,像 Python 这样的解释型语言要求您有解释器来运行程序,因为它不是由机器直接运行的。相反,它由解释器运行,解释器通常将程序翻译成中间的东西,称为字节码。令人困惑的地方在于,解释性语言还将将源文件转换为字节码的内置或独立工具称为“编译器”。在标准 Python (CPython) 中,单个可执行文件既可以作为源代码“编译器”,也可以作为编译字节码的解释器(有时可以以“pyc”文件的形式缓存到磁盘)。

在其他语言中,例如 Java,编译器和解释器是独立的程序。 Java 程序首先使用“javac”可执行文件编译为 Java 虚拟机字节码,然后使用“java”可执行文件运行编译后的 java 字节码。

因此,即使在某些情况下(例如,导入的包)将 Python 编译为字节码,编译后的字节码仍然不能由机器直接运行——它需要一个解释器。

https://codesolid.com/what-are-those-pyc-files-in-a-python-project/

引用 Python 的文档:

解释的

Python 是一种解释型语言,而不是编译型语言,尽管区别可以是 模糊的 因为字节码编译器的存在。这意味着可以直接运行源文件,而无需显式创建随后运行的可执行文件。解释型语言通常比编译型语言具有更短的开发/调试周期,尽管它们的程序通常也运行得更慢。

交互的

Python 有一个交互式解释器,这意味着您可以在解释器提示符处输入语句和表达式,立即执行它们并查看它们的结果。刚启动 Python 没有参数(可能通过从计算机的主菜单中选择它)。这是测试新想法或检查模块和包的一种非常有效的方法(请记住 帮助(x) )。

字节码

Python 源代码被编译成字节码,即 CPython 解释器中 Python 程序的内部表示。字节码也缓存在 .pyc 文件,以便第二次执行相同的文件更快(可以避免从源代码重新编译到字节码)。据说这种“中间语言”运行在虚拟机上,该虚拟机执行每个字节码对应的机器码。 请注意,字节码不能在不同的 Python 虚拟机之间工作,也不能在 Python 版本之间保持稳定。

虚拟机

完全用软件定义的计算机。 Python 的虚拟机执行字节码编译器发出的字节码。

https://docs.python.org/3/glossary.html#term-interpreted

Python 将源文件编译为特定于 Python 的低级形式(称为“字节码”),在需要时自动编译(当没有对应于源文件的字节码文件,或者字节码文件比源文件旧时或由不同的 Python 版本编译),通常将字节码文件保存到磁盘(以避免将来重新编译它们)。 OTOH IronPython 通常会编译为 CLR 代码(是否将它们保存到磁盘,具体取决于)和 Jython 到 JVM 代码(是否将它们保存到磁盘 - 如果确实保存它们,它将使用 .class 扩展名)。

然后,这些较低级别的形式由适当的“虚拟机”(也称为“解释器”)执行——CPython VM、.Net 运行时、Java VM(也称为 JVM),视情况而定。

CPython 旨在尽可能快地编译,尽可能轻量级,尽可能少的仪式—— 编译器 很少做错误检查和优化,所以它可以 跑得快,数量少 内存,这反过来让它可以在需要时自动和透明地运行,而用户甚至不需要知道大部分时间正在编译。 Java 和 C# 通常在编译期间接受更多工作(因此不执行自动编译),以便更彻底地检查错误并执行更多优化。 ** 这是一个连续的灰度,** 不是非黑即白的情况,将阈值设置在某个给定级别并说仅在该级别之上您称之为“编译”是完全武断的。

因为,Python 的字节码不稳定,见上文,你不应该将它们保存为源代码的一部分。如果您要签入代码,请忽略所有 .pyc 文件或 __pycache__ 目录。如果你发现你的 Python 代码有一些奇怪的行为,那么清理所有代码可能是个好主意 .pyc 文件。也可以看看 https://docs.python.org/3/library/sys.html?highlight=pycache#sys.pycache_prefix (只需搜索 sys.pycache_prefix)了解更多详情。

同样,在 Java 中,它的字节码是稳定的,通常是 独立于平台, 一般来说 前进独立, 一般来说 后向独立 .传播代码的方式,你“编译”它使用 爪哇 。班级 而不是使用 ZIP 格式创建单个文件。

笔记 : 我想再次强调一下“字节码”在 Python 中是非常不稳定的,而在 JVM 中是非常稳定的。

在 Python 中,引用:

Wheel 是一个 ZIP 格式的存档文件,具有特殊格式的文件名和 .whl 扩展名。它包含一个发行版,几乎就像根据 PEP 376 使用特定的安装方案进行安装一样。尽管建议使用专门的安装程序,但可以通过使用标准的“解压缩”工具简单地解压到站点包中来安装轮文件,同时保留足够的信息以在以后将其内容传播到最终路径上…… 车轮 ,是一种旨在跨多个 Python 版本工作的安装格式, 通常不包括 .pyc 文件。

https://peps.python.org/pep-0427/

在 Python 中,通常只有源代码( .py 文件)被传播,然后它们“编译”(到 .pyc 文件)。

笔记 : 我想再次强调,Python 再次是用 C 和 Python 本身编写的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/10964/54220208

posted @ 2022-09-02 08:55  哈哈哈来了啊啊啊  阅读(87)  评论(0编辑  收藏  举报