在本文中,我们将讨论
“ Web编程语言”课程 ,该课程在“计算机系统和网络”(IU-6)MSTU系教授。 N.E. 鲍曼 在Ruby上提供了示例,该课程本身是
Technostream频道上免费提供的16个视频讲座。 在Baumanka,该课程的授课对象是已经熟悉Pascal,C ++或Java等高级编程语言的二年级学生。 主要重点是对Web编程中使用的技术的系统了解,而不是Ruby技术的开发深度。 因此,本课程对于对任何语言的网络技术都有粗略了解的学生也将非常有用。
目录内容
- 关于“ Web编程语言”课程
- 讲座内容
- 如何为大学开设课程
- 为什么是Ruby?
- 为什么Ruby不受欢迎?
- 总结
网络编程语言
为什么将课程称为Web编程语言? 答案很简单。 就像30年前的Internet刚刚兴起一样,现在没有办法使用一种编程语言。
- 标记语言是HTML和CSS。
- 配置和数据交换的语言-JSON,XML,YAML。
- 浏览器编程-Javascript(Typescript,Coffeescript ...)。
- 服务器编程-Ruby,PHP,Perl,Java,Javascript ...
要了解Web编程(即使是最少的内容),您需要了解4-5标记和编程语言(尽管它们之间的界限现在变得模糊)。
课程目的
本课程的主要目的是对Web开发所需的技术有所了解,因为大多数现代项目都以某种方式与Web开发相关。 本课程的安排方式旨在为学生提供简洁的基础知识,这些基础知识可以用作深入学习的框架。
在培训期间,学生可以独立地学习特定的技能,而开发的程度取决于您将来是否打算沉浸于Web开发中。
课程作者
该课程的主要开发者是技术科学的候选人,MSTU的“计算机系统和网络”主席的副教授。 N.E.鲍曼·萨马列夫·罗马·斯坦尼斯拉维奇。 拥有20多年经验的程序员(C ++,C,Java,Perl,PHP,Ruby和其他Windows,Linux,嵌入式Linux,MacOS的经验),软件开发负责人,DBMS,数据处理和大数据领域的研究人员在俄罗斯,德国和美国。
持续时间和格式
整个课程包括192个学时,其中16个讲座为时2小时,8个研讨会为时2小时,48个小时为12个实验室工作。 其余时间分配给自学。 视频材料仅包括演讲部分。 那些希望深入学习本课程主题的人,实验室工作和研讨会的材料将必须独立学习。 可以向老师提出所有问题:
samarev@acm.org 。
结果
作为培训课程的一部分,我们不仅使用Ruby编程作为一个很好的例子,还使学生不仅了解以Ruby编程语言实现的特定Web技术,而且还全面了解创建Web应用程序时出现的问题以及与之相关的所有问题。 Ruby语言本身是对学生有用的补充,可以在课程之外广泛使用。
课程内容
第1-2课。 引言- 基本架构方面的Web编程介绍。
- 有关标记语言和样式表的最少信息。
- 最少介绍Javascript。
也许Java脚本应该分配更多的时间,但是由于基于浏览器的Web编程不是课程的主要目标,并且尚未建立Java脚本中的服务器端编程技术,因此可用的材料足以构成初步的了解。
讲座3-5。 红宝石接下来的三节讲座专门针对Ruby,因为这是使用Ruby语言开发的技术。 讲座包括:
- Ruby语言的基础。
- 有关类型结构和对象模型的必需信息。
- 功能风格。
讲座6.构建Web应用程序的原理有人会说此标准不相关,但它是所有现代Web编程的基础。 因此,任何Web程序员都只是必须知道它是什么,并且必须了解最简单的Web应用程序只是放在“ Hello World”上。
讲座7.机架- Rack是大多数Ruby Web框架的中间层。
- Sinatra是用于创建简单应用程序的通用框架。
- 创建应用程序的示例。
讲座8. Rails简介Ruby on Rails是使Ruby出名并几乎成为其代名词的框架。 这是一个具有Model-View-Controller概念的深度开发框架的示例,该框架可作为创建许多其他Web框架(包括Grails和Django)的原型。 请注意,Rails概念是使用自动生成器生成尽可能多的代码,并减少手工编写的次数。
讲座9.异步交互大多数现代的Web应用程序都使用异步方法,即服务器请求在用户后台消失。 答案可以在浏览器深处找到。 您在这里需要知道什么?
- 交换格式-XML和JSON。
- 运行来自Javascript的异步请求。
- 适用于Rails的简洁Javascript概念。
讲座10.测试任何现代程序都应包括自动测试。 Ruby涉及单元测试的使用。 而且,当然,Rails建议任何动作都应包含在测试中。 讲座包括以下主题:
- 测试Web应用程序的各个方面。
- 领域语言简介(因为RSpec和Cucumber就是测试中“人性化”的例子:测试程序不仅应为“量身定制”所用语言的程序员,而且也应为普通人可以理解)。 请注意,RSpec和Cucumber中使用的方法现已在许多其他编程语言的测试工具中广泛复制。
- 诸如SikuliX和Selenium之类的工具可分别用于通过图形界面和浏览器测试程序。
讲座11. XML技术- 查询语言,例如Xpath,Xquery。
- XSL和XSLT。
看来,这与网络编程有什么关系? 但是XML是Web技术的核心。 我们现在不使用XML作为交换格式的事实并不能保证5年后我们不会再次开始使用XML。 仍然没有统一的方法来验证JSON格式的数据。 对于XML,标记方案由语言本身制定。
实际上,Xpath查询语言是一种通用的航点查询语言,可用于搜索树状数据结构(包括JSON)的任何元素。
XSLT转换也是转换XML文档的另一种方式,该知识的知识将使学生将来在遇到ETL时也不必重蹈覆辙。
讲座12. ORM(对象关系映射)几乎所有现代Web编程框架都提供了用于对象关系转换的任何方法。 学生需要了解:
- 为什么需要这种机制;
- 他的局限性是什么?
- 如何在实践中使用它。
在这种情况下,所有事情都在Ruby on Rails的上下文中考虑。
讲座13.会议,安全性以及与此有关的一切。- 基于cookie的状态存储方法。
- 典型的身份验证方法。
- 在Rails中添加授权的示例。
- Web应用程序本身的安全性注意事项。
讲座14.服务- 历史方面。
- 有关开发和部署自己的Web服务的具体建议。
讲座15. CMS(内容管理系统)在Web编程中,不仅能够编写应用程序,而且了解是否需要编写应用程序也很重要。 本讲座演示了已创建的Web应用程序的主要类型,可以根据特定客户的要求对其进行自定义,并在必要时进行最终确定。
讲座16.在Internet上托管Ruby Web应用程序考虑了Web服务的一般思想。 解释了这种具有交换XML格式的体系结构的起源,以及它在Web-API中使用JSON和REST或GraphQL进行的进一步修改。
- 网络服务器
- 虚拟化方法。
- 在Internet上托管应用程序的方法。
如何为大学开设课程
创建与编程相关的主题的培训课程很困难,因为技术每5-10年会发生变化。 在为大学创建课程时,必须在特定编程语言的实践技能的形成与理解此类技术所必需的理论基础之间取得平衡。 此外,大学教育和培训课程之间的区别在于材料的系统表示,这也限制了某些材料的提交时间和数量。
近年来,有一种记录大学视频讲座并创建视频课程的趋势。
“ Web编程语言”课程是我们大学首次进行此类正式尝试。 根据反馈,我们将决定如何以及以何种格式进行新输入。
10年前,有必要从根本上更新课程,其中包括引入Web编程。 传统上,在“计算机系统和网络”部门中,与电子和计算机设计相关的课程分配的培训时间与编程大致相同。 此外,编程课程包括高级语言Pascal,C,C ++ / Qt的算法培训,各种汇编程序的培训以及编程语言和编译器的理论。 甚至是用于FPGA和特定硬件的编程语言。 也就是说,该部门准备了通用专家,他们将来会选择自己的专业。
我们需要确定可以在一个学期中掌握的有前途的Web技术,并且希望可以将这些技术投影到其他编程语言中。
为什么是Ruby?
为什么选择Ruby? Web编程语言的选择非常丰富。 除Ruby外,它们还有PHP,Perl,Javascript,Java,Go等。 如果我们从高负载的Web应用程序的角度进行处理,然后发送对
Web Framework表示怀疑的
Benchmarks ,我们将在最前沿的C ++,Java,Rust,Ur,Go等中看到。Ruby既不是Web开发中最受欢迎的,也不是最快的Web开发。高负荷的解决方案。 但是,Ruby具有许多其他优点,使其成为一种编程语言,任何受过良好教育的程序员都应该意识到这一点。
Ruby最近庆祝成立25周年,这意味着它是一种相当成熟的语言。 尽管事实上大多数提到的语言也已经超越或接近这个时代(与之相比,Rust,Dart,Go仍然是“绿色”),但Ruby是多年来保持向后兼容性的少数语言之一。
在Ruby的世界中,我们可以说没有革命,也没有任何根本的变化。 它指的是最初设计良好的语言,其基本概念至今仍未改变。 性能声明与1.8.7之前的旧版本有关,但10年前已终止。 每年的现代版本都显示出生产率的成倍增长。 声称这种语言不是很流行,仅对我们国家适用。 不幸的是,在我们国家,大公司确实不受欢迎地绕过了他。
为什么Ruby对大学教育有好处? 这是一种纯对象语言。 而且由于它是动态的,因此几乎所有内容都可以重新定义。 他的模型中没有简单的类型(在这里我们不会考虑系统实现,我们只在讨论模型)。 任何数据都是对象。 代码是一个对象。 也就是说,Ruby使学习面向对象编程的原理变得容易。 此外,该语言的语法非常简单,几乎没有例外。 编写在程序中的任何代码都必须执行一次,并且无论在何处编写该代码-在类声明中还是在外部。 无论写什么,它都会实现。 Ruby语法非常灵活,这使得编写特定于域的语言(DSL / DSEL)非常方便。 另外,基本的Ruby概念-块-是一个匿名函数。 掌握这些原理可使学生轻松地掌握纯函数式编程语言的函数式编程。
而且,更确切地说,它是Ruby的装饰优点-无需浪费时间解释带有缩进的强制性代码格式。 无论如何,该程序都已明确标记出来。 格式化将自动提供rubocop,随着时间的推移,学生将学习正确书写。
为什么Ruby不受欢迎?
为什么Ruby仍具有这种优势,但仍然不流行,并指的是具有较高入门门槛的语言?
首先要了解的是:Ruby不仅是另一种命令式编程语言,您可以在晚上开始编程,而在一周内就可以完全理解。 这是具有不同哲学的另一种语言。
Ruby的第一个原则:程序的文本应被视为自然语言中的文本。 就是说,Ruby是面向个人的程序员的语言,而不是您需要为其找到合适的程序员的语言。 不幸的是,大多数现代编程语言都遵循“程序员会忍受”的原则,而退却已经很难。
Ruby通常被批评以多种方式执行相同的操作。 但是在自然语言中,我们有大量的同义词,而正确的同义词的选择使我们的言论更加丰富。 Ruby中也是如此。 除了可以以不同方式执行相同操作的事实外,还有与同一种方法相关联的许多同义词,它们与特殊方法
alias
和
alias_method
相关联。
多数其他编程语言的局限性的简单示例。 假设有一组产品,您想确定它不是空的。 在大多数语言中,我们将编写类似
if (products.size() > 0
)...的内容。 但是,来到商店后,我们不问卖方:“如果您购买的此类产品不超过零?” 我们问一个简单的问题:“您有这样的产品吗?”。 在Ruby中,您需要使用表达操作含义的方法。 是的,我们可以使用“大于零”检查,但是自然的方法是询问
if products.any
吗? 字面上就是:有产品吗? 请注意,Ruby与Unicode配合良好,因此,根据需要,您可以根据该语言创建具有区域适应性的专用语言。 例如,如果要用俄语重新定义所有类和方法的名称。
一个有趣的但并非完全直接的示例:
Bato:菲律宾语的Ruby端口 。
关于语言的客观性:Ruby清楚地区分了变量/常量和对象。 由于语言的动态性质,数据将其作为对象“生存”下来。 任何标识符都是仅引用对象的常量或变量。 对这个原理的误解会导致意外:
str1 = "Test" str2 = str1 str1.sub! "Te", "La" puts str2
在这里,我们只使用了对象的修改方法,对它们的引用由两个变量存储。 我注意到这不是Ruby更改的传统方式。 通常,对象保持不变,并且更改会产生新的对象。 还有,
sub!
这里使用的方法 有一个后缀-感叹号-这是Ruby接受的用于修改对象本身的方法的命名方案。 没有此符号,该方法仅产生一个新对象。
Ruby的另一个功能(经常使来自其他编程语言的开发人员感到困惑)是“块”的概念。 从语法上讲,该块看起来与其他编程语言相同,并且有两个版本:
{…}
和
do..end
(请不要忘记Ruby是为人类创建的,因此如果表达式为单行且单词是如果有很多行)。 Ruby中块的本质是将代码存储为对象,并且可以通过调用
yield
来激活代码。 C和C ++中的直接对应项是回调函数。 在Javascript中,是匿名函数,如
some_func('on_element_click', function(event) {…}
)。
由于这个概念,Ruby是最简洁,最具表现力的编程语言之一。 例如,根据平方函数转换数组的元素将如下所示:
(1..5).map { |x| x * x }
其中
{ |x| x * x }
{ |x| x * x }
-具有声明的局部变量
x
的块,即用于转换数组元素的函数。 并将其传输到的方法简称为map(即“ map”)。 而且您不需要写
return
字,尽管这是可能的,因为一切都已经很清楚了(在Ruby中,最后一个操作的结果始终是return值)。 此外,块代码是针对数组的每个元素自动调用的代码。 这就是为什么试图在块内启动变量并希望在处理下一个元素期间保留其值没有意义的原因。 块是存储的处理功能,仅此而已。
如果我们想用从键盘输入的数字来解析一个字符串,只需编写:
gets.chomp.split.map(&:to_i)
即,读取行(获取),丢弃任何垃圾,例如
chomp
(
chomp
),将其拆分为单词(
split
),使用
to_i
函数调用转换(严格来说,是“字符串”类型的对象的方法)。 仅此而已。 斯普利特(Split)知道,在普通人类语言中,“换行”意味着将其用单词分隔,其中的分隔符是空格和标点符号。 可以以简短的形式使用Map,并使用要从对象获取的方法的名称。 尽管有可能编写完整的表单
map { |x| x.to_i }
map { |x| x.to_i }
,甚至
{ |x| return x.to_i }
{ |x| return x.to_i }
。 但这不会提高可读性,因此您可以只保留
map(&:to_i)
。
我注意到,该块的概念坦率地渗透到了Ruby中。 甚至查看代码
class HelloWorld (1..3).each { puts 'Hi from class declaration!' } def hi puts 'Hello World!' end end HelloWorld.new.hi
在屏幕上显示:
Hi from class declaration!
Hi from class declaration!
Hi from class declaration!
Hello World!
在这里似乎有什么意外? 类声明中的循环显示消息。 然后,我们从此类的实例方法中收到一条消息。 这个秘密很简单。 Ruby是一种具有常规编程模型的语言。 用块调用任何方法的典型方法:
method_with_block(args) do ... end
示例中的
class
和
def
实质上是参数
HelloWorld
,
hi
传递给的方法的名称。 对我们来说,
HelloWorld
参数将成为该类的常量名称,而
hi
将成为该方法的名称。 单词
end
的其余部分是一个块。 然后,通过调用yield激活块代码,然后依次执行所有操作。 也就是说,即使在这里,调用常规方法与声明方法,类,模块之间实际上也没有区别。
还请注意激活构造
HelloWorld.new.hi
。
HelloWorld
-constant-指向
Class
类型的对象。 该对象具有
new
方法。 调用
new
的结果是创建一个
HelloWorld
类型的对象,从中我们调用
hi
方法。 甚至在这里,Ruby的规律性也得到了体现。 我们不编写
something = new HelloWorld
,而只是调用特定对象(
HelloWorld
引用的
Class
)的方法,该方法生成类型为
HelloWorld
的对象。
长时间的通话会导致对语言的理解不足:

如果您知道JavaScript或jQuery,那么这里看不到任何可怕的东西。 那些来自C和C ++的人可能对点数感到困惑。 Ruby使用功能对象转换。 也就是说,整个链是转换字符串的过程,该过程包括选择单词,将单词转换为数字,仅选择偶数,平方并加结果。
Ruby中的任何方法都会生成一个value对象。 没有例外。 甚至nil都是对象。 由于Ruby是具有自动垃圾收集器的动态语言,因此无需创建新变量。 中间对象将被删除。 也就是说,很容易将长表达式解析为将值分配给局部变量的序列,该序列会依次调用相应的方法。 但是为什么,如果一切都已经清楚了呢?
在Ruby程序中,很少见到像
for
,
while
,
loop
。 它们以语法提供,但几乎从未使用过。 怎么了 是的,因为它们没有语义负载。
例如:在一系列商品中,您需要找到“含罂粟种子的小圆面包”。 对于传统的编程语言,我们可以大致使用以下Ruby代码:
products…
在这种情况下,普通的Ruby代码如下所示:
products…
也就是说,我们按字面写成一行:按名称查找产品。 就是这样。 因为实际上我们只对商品的选择感兴趣,而不对商品的所有指数和数量感兴趣。
举个例子:您来到商店,以两种方式问不幸的卖家:第一种-“
对于从0到15143的所有商品,如果商品名称等于带有罂粟种子的小圆面包,然后把它给我 ”; 第二个-“
给我一个含罂粟种子的面包 。” 两种选择在语法上似乎都是正确的,但是第二种是自然的。 由于某些原因,大多数程序员认为第一种选择是正常的。 Ruby程序员是第二位。 而这里的
find
方法只是循环替换之一。 我提请注意这一点,并预计其他语言也可以使用带有选择功能的数组搜索。
因此,尽管Ruby具有
for
,
while
和
loop
语法构造,
while
几乎没有人使用它们,因为它们有特定的方法:
each
,
each_index
,
each_with_index
,
select
,
map
,
reduce
,
find
,
detect
和许多其他表达特定含义的方法-对于每个索引,对于每个元素及其索引,选择,转换,折叠,查找等。如果需要获取索引,则将使用
array.each_index
。 如果需要选择元素,请使用
select
。 强调自然性。 我们仅询问真正需要做的事情。 无需索引-无需索取。 有关更多详细信息,请参见
Enumerable模块的
文档 。
总结
Ruby是一种语法简单但灵活的语言,具有开发的对象模型,其主要重点是简洁但易于理解的代码,重点关注在世人员。 默认情况下,Ruby出现在任何现代操作系统的捆绑软件中(或可以安装在Windows上)。 已经用这种语言编写了大量程序,有稳定的社区随时准备提供建议或行动。 Ruby程序是Linux和MacOS(分别为OpenSuSE / SuSE和brew.io)的基本管理脚本,这是
数学和机器学习 ,这是测试(Rspec,Cucumber,Capybara ...),这是应用程序部署(木偶,厨师)还有更多。
如果学生了解Ruby,这将极大地拓宽他们的视野,并使他们对熟悉的事物有完全不同的看法。 另外,在Ruby之后学习其他脚本编程语言非常容易,但是问题是您是否要使用它们。