当前位置: 首页 > news >正文

一些想法:关于学习一门新的编程语言

很多人可能长期使用一种编程语言,并感到很有成就感和舒适感,发现学习一种新的编程语言的想法令人生畏而痛苦。或者可能知道并使用多种编程语言,但有一段时间没有学习新的语言。更或者可能只是好奇别人是如何潜心学习新的编程语言并迅速取得成效的。无论学习新的编程语言有多容易或多困难,这篇文章解释了我如何学习新的编程语言及一些思考。虽然人们学习的方式不同,但发现我自己的过程很有趣,特此记录下来。

背景介绍

  • 编程语言N+1

这篇文章并不是针对学习编程的。学习第一门编程语言要比学习另外一门语言难得多。原因是计算机编程中涉及许多抽象的概念。当第一次接触编程时,大多数语言都要求理解迭代、作用域、(不)可变性、数组、模块、函数等概念。好消息是,当学习一种额外的语言时,可能已经熟悉了常见的概念,因此可以采取更精简的方法,以便快速上手。

  • 课程、视频、练习

网上有很多教授各种编程语言的材料,但我觉得结构化的课程、视频或练习并不高效。如果已经知道常见的编程概念,并且对想在新的编程语言中建立的东西有一个想法,那么制定自己的课程会更有效率。跳来跳去的材料会专注于新颖的、真正需要的信息。通过别人设计的一系列练习,可能会把时间花在练习错误的事情上,因为通常自己才是最了解应该练习什么的人。课程、视频和练习往往是一种“按部就班 ”的体验,这会以一种线性的方式接触到信息,无论它在此时是否有用。

1. 了解计算模型

计算模型描述了程序如何被计算机执行和运行。计算模型包括一组计算规则、数据类型、语法和语义约束,以及算法和数据结构。这些计算模型可以有不同的实现方式,例如,一些编程语言使用堆栈模型来实现计算,而另一些编程语言使用寄存器模型。计算模型的选择和设计关系到程序的执行效率和可靠性。

一种新的编程语言的第一个问题应该是 "它的计算模型是什么?"。可悲的是,许多语言手册和网站除了描述支持哪些编程范式(面向对象、串联、函数式、逻辑编程等)之外,并没有描述计算模型。实际的计算模型可能只有在后来才会完全显现出来。或者它可能在语言标准文件中表达得太详细了,以至于在早期就没有用处了。在任何情况下,都值得阅读编程语言的网站,了解有关计算模型的信息,以把握大局。

为了编写程序,需要了解的是计算模型。在学习一门新的语言时,我们往往过多地考虑语法和语言特征。计算模型告诉我们如何将需求分解成程序。在如何组织数据和代码方面,我们对待逻辑编程的方式与面向对象编程不同。语法,甚至在某种程度上,语言的特点都不重要。了解计算模型还可以帮助我们将新的编程语言与其他语言相对比,特别是已经知道的编程语言。它呈现出一些新的概念,让我们知道编程语言之间会有多大的不同,以及在哪些方面需要重新学习。

2. 语言教程

在熟悉了编程语言的计算模型后,下一步就是学习基本的语法和概念。大多数现代编程语言在网上都有一个官方教程。该教程介绍了语言元素,通常有简短的例子,其目录概述了该语言的内容。该教程可以在几小时或几天内完成。与完整的课程不同,官方编程语言教程往往适合非线性阅读,当一门语言的某些知识已经很熟悉或无足轻重时,这很有帮助。

我记得几年前在一个下午就读完了Python教程,但要注意:这时可能会写出有效的语法,但还不会写出成文法的代码。我们可以说:我可以用任何语言写 Hello World。但为了写出表达自然、有效利用语言优势的程序,需要付出更多的努力。

3. 编写练习程序

在意识到语言元素之后,下一步是探索语言的工作方式。这可以通过编写小程序来完成。通常这些练习程序是已经用其他语言解决过的熟悉的任务。如果想写游戏,也许是 Ping Pong。如果写网络应用,它可能是一个TODO List。有很多不同的知名程序可以写。在编写练习程序的过程中,会遇到一些语法错误或问题。学会解释常见的错误信息是很重要的,因为它们会在以后更复杂的场景中出现,如果以前没有见过它们,就会更难解决它们。

还会遇到需要在标准库或语言参考手册中寻找解决方案的常见任务。无论是解析命令行选项、正则表达式匹配、HTTP请求,还是错误处理,语言可能都有办法做到。练习程序提供了一个简单的环境,可以探索编程语言的基本用法。

4. 获得对语言的更深的理解

一旦写了一些练习程序,就可以开始写自己的程序来解决新问题。在这个阶段,开始有了成效,但仍有更多的东西需要学习。特别是,为了写出自然的代码,必须研究该语言的习惯和模式。一旦我对一种语言的基础知识有了经验,我喜欢阅读标准库、流行库和流行应用程序的源代码。一开始这很难,因为它们使用了不熟悉的语言特性或库的依赖关系,但在跟进一个程序的未知部分后,会发现阅读其他程序会变得更容易,因为语言知识已经扩大。

在这一点上,也值得寻找风格指南、语言习惯手册、以及关于常见故障的文档。这些将提供关于用新的编程语言进行原生思考的信息。这也是熟练掌握该语言并有能力自信地阅读和编写真实程序所需要的。虽然我以线性顺序介绍了一些步骤,但学习复杂的科目往往是一个反复的过程。有时我发现自己随着理解的发展在各个步骤之间来回跳动。

总结

学习一门新的编程语言,无论怎么做,都是很耗时的。然而,这并不需要全部在前期进行,经过几天的阅读文档和实验练习程序,就可以完成基本任务。通过研究流行的程序和阅读指南来学习如何有效地使用一种语言,是我发现的达到流利程度的最快方法。最后,它只是需要实践、实践、再实践!

相关文章:

一些想法:关于学习一门新的编程语言

很多人可能长期使用一种编程语言,并感到很有成就感和舒适感,发现学习一种新的编程语言的想法令人生畏而痛苦。或者可能知道并使用多种编程语言,但有一段时间没有学习新的语言。更或者可能只是好奇别人是如何潜心学习新的编程语言并迅速取得成…...

线性代数——矩阵

文章目录 版权声明基础概念矩阵的运算矩阵的加法数与矩阵相乘矩阵的乘法矩阵的转置 矩阵和方程组方阵和行列式伴随矩阵可逆矩阵分块矩阵矩阵的初等变换初等矩阵等价矩阵行阶梯矩阵行最简矩阵初等变换在矩阵求解中的应用 矩阵的秩 版权声明 本文大部分内容皆来自李永乐老师考研…...

taro之小程序持续集成

小程序持续集成 Taro 小程序端构建后支持 CI(持续集成)的插件 tarojs/plugin-mini-ci。 目前已支持(企业)微信、京东、字节、支付宝、钉钉、百度小程序 功能包括: 构建完毕后自动唤起小程序开发者工具并打开项目上传…...

Ceph入门到精通-Ceph 编排器简介

第 1 章 Ceph 编排器简介 作为存储管理员,您可以将 Ceph 编排器与 Cephadm 实用程序搭配使用,能够发现设备并在 Red Hat Ceph Storage 集群中创建服务。 1.1. 使用 Ceph Orchestrator Red Hat Ceph Storage Orchestrators 是经理模块,主要…...

【Feign扩展】OpenFeign日志打印Http请求参数和响应数据

SpringBoot使用log4j2 在Spring Boot中所有的starter 都是基于spring-boot-starter-logging的&#xff0c;默认使用Logback。使用Log4j2的话&#xff0c;你需要排除 spring-boot-starter-logging 的依赖&#xff0c;并添加 spring-boot-starter-log4j2的依赖。 配置依赖 <…...

MongoDB (零) 安装和简单使用

1.安装(Ubuntu) 1.1.安装gnupg sudo apt-get install gnupg1.2.获取GPG Key curl -fsSL https://pgp.mongodb.com/server-6.0.asc | \sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg \--dearmor1.3.创建本地文件 echo "deb [ archamd64,arm64 signed-by/usr…...

Java中的异常是什么?

Java中的异常是指在程序运行时发生的错误或异常情况。这些异常可能会导致程序崩溃或无法正确执行&#xff0c;因此需要在代码中进行处理。Java中的异常机制可以帮助程序员捕获并处理异常&#xff0c;从而保证程序的稳定性和可靠性。 Java中的异常分为两种类型&#xff1a;受检…...

微短剧“小阳春”,“爱优腾芒”抢滩登陆?

降本增效一整年&#xff0c;长视频平台们似乎扭转了市场对于它们“烧钱”的印象。 爱奇艺宣布2022全年盈利&#xff0c;腾讯视频宣布从去年10月起开始盈利&#xff0c;视频平台们结束了一场“无限战争”。 与此同时&#xff0c;随着短视频平台的崛起&#xff0c;视频内容的形…...

C++菱形继承(再剖析)

当子类对象给父类对象的时候&#xff0c;怎么找公共的虚基类&#xff08;A&#xff09; 就得通过偏移量来算虚基类的位置 ---------------------------------------------------------------------------------------------------------------------------- 我们来分析一下B…...

java获取星期几

如果你要问 java什么时候学习比较好&#xff0c;那么答案肯定是 java的星期几。 在 Java中&#xff0c;你可以使用 public static void main &#xff08;&#xff09;方法来获取一个类的所有成员变量&#xff0c;然后在所有类中调用这个方法来获取对象的所有成员变量。它能以对…...

【TypeScript】03-TypeScript基本类型

TypeScript基本类型 在TypeScript中&#xff0c;基本类型是非常重要的一部分&#xff0c;下面我们将详细介绍TypeScript中的基本类型。 基本类型约束 在TypeScript中&#xff0c;可以使用基本类型来约束变量的类型。常见的基本类型有&#xff1a; number&#xff1a;表示数…...

什么是跨域?

什么是跨域 什么是跨域&#xff1f; 什么是同源策略及其限制内容&#xff1f; 同源策略是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;浏览器很容易受到XSS、CSRF等攻击。所谓同源是指"协议域名端口"三者相…...

Gradle理论与实践—Gradle构建脚本基础

Gradle构建脚本基础 Project: 根据业务抽取出来的一个个独立的模块Task&#xff1a;一个操作&#xff0c;一个原子性操作。比如上传一个jar到maven中心库等Setting.gradle文件&#xff1a;初始化及整个工程的配置入口build.gradle文件: 每个Project都会有个build.gradle的文件…...

【Vue 基础】vue-cli初始化项目及相关说明

目录 1. 创建项目 2. 项目文件介绍 3. 项目的其它配置 3.1 项目运行时&#xff0c;让浏览器自动打开 3.2 关闭eslint校验功能 3.3 src文件夹简写方法 1. 创建项目 vue create 项目名 2. 项目文件介绍 创建好的项目中包含如下文件&#xff1a; &#xff08;1&#xff09…...

【c语言】详解c语言#预处理期过程 | 宏定义前言

c语言系列专栏&#xff1a; c语言之路重点知识整合 创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持…...

内网远程控制软件哪个好用

市面上远程控制软件很多&#xff0c;但是支持纯内网环境&#xff08;无外网&#xff09;的很少。大部分远程控制软件可以在局域网用&#xff0c;但是它的数据流量还是要走软件公司服务器&#xff0c;也就是要走外网&#xff0c;所以在纯内网环境没法使用。那么什么软件支持纯内…...

【计算机基本原理-数据结构】数据结构中树的详解

【计算机基本原理-数据结构】数据结构中树的详解 1&#xff09;总览2&#xff09;树的相关概念3&#xff09;二叉树、满二叉树、完全二叉树4&#xff09;二叉查找树 - BST5&#xff09;平衡二叉树 - AVL6&#xff09;红黑树7&#xff09;哈弗曼树8&#xff09;B 树9&#xff09…...

数字设计小思 - D触发器与死缠烂打的亚稳态

前言 本系列整理数字系统设计的相关知识体系架构&#xff0c;为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中&#xff0c;D触发器是最常用的器件&#xff0c;也可以说是时序逻辑的核心&#xff0c;本文根据个人的思考历程结合相关书籍内容和网上文章&#xff0c;聊一聊D…...

Notes/Domino 11.0.1FP7以及在NAS上安装Domino等

大家好&#xff0c;才是真的好。 目前HCL在还是支持更新的Notes/Domino主要是三个版本&#xff0c;V10、11和12&#xff0c;这不,上周HCL Notes/Domino 11.0.1居然推出了FP7补丁包程序。 从V10.0.1开始&#xff0c;Domino的FP补丁包程序主要是用来修复对应主要版本中的一些问…...

【VM服务管家】VM4.x算子SDK开发_3.3 模块工具类

目录 3.3.1 位置修正&#xff1a;位置修正算子工具的使用方法3.3.2 模板保存&#xff1a;实现模板自动加载的方法3.3.3 模板匹配&#xff1a; 获取模板匹配框和轮廓点的方法3.3.4 模板训练&#xff1a;模板训练执行完成的判断方法3.3.5 图像相减&#xff1a;算子SDK开发图像相减…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...