ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

02 你好世界

2022-09-02 09:00:13  阅读:265  来源: 互联网

标签:02 文件 解释器 字节 Python 世界 编译 源代码 你好


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

标签:02,文件,解释器,字节,Python,世界,编译,源代码,你好
来源: https://www.cnblogs.com/amboke/p/16648568.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有