“无类型”是否与“动态类型”相同?

时间:2016-04-24 02:23:31

标签: bash programming-languages

根据Advanced Bash-Scripting Guide

  1. bash变量是无类型的:

      

    与许多其他编程语言不同,Bash不会将其变量按“类型”隔离。从本质上讲,Bash变量是字符   字符串,但是,根据上下文,Bash允许算术   操作和变量比较。决定因素是   变量的值是否只包含数字。

    该链接还提供了示例。

    “无类型”是否与“动态打字”的概念相同 在编程语言?如果没有,那么关系是什么 两者之间的差异?

  2.   

    为了减轻在脚本中跟踪变量类型的负担,Bash确实允许declaring个变量。

    例如,通过declare -i myvariable将变量声明为整数类型。

    这被称为“打字”变量吗? “打字”是什么意思 与“静态打字”的概念相同?

2 个答案:

答案 0 :(得分:3)

这里的大部分都得到了很好的解答......

Does "untyped" also mean "dynamically typed" in the academic CS world?

至少有两个人非常熟悉此事。对于我们大多数尚未研究类型系统等的人而言,“无类型”意味着动态打字,但这在学术界是个用词不当,见上文。 untyped实际上意味着没有类型,即思考程序集,键入Bash,它在运行时计算出它的类型。让我们从Advanced Bash Scripting Guide中采用以下句子,强调我的......

http://tldp.org/LDP/abs/html/untyped.html

  

与许多其他编程语言不同,Bash不会将其隔离   变量按“类型”。从本质上讲,Bash变量是字符   字符串,但是,根据上下文,Bash允许算术运算   并对变量进行比较。 决定因素是否是   变量的值只包含数字

Bash发现某些东西在运行时是一个数字,即它是动态类型的。 在64位机器上的汇编程序中,我可以将任意8个字节存储在寄存器中并递减它,它不检查事物是否为字符等,没有context关于它将要减少它的事情递减64位,它不会检查或计算出它正在递减的东西的类型。

Perl不是一种无类型语言,但以下代码可能会使它看起来像是将整数视为整数,即

#!/usr/bin/perl
use strict;
use warnings;
my $foo = "1";
my $bar = $foo + 1;
print("$bar\n");

$ foo被分配了一个字符串但是增加了?这是否意味着Perl是无类型的,因为基于上下文它可以做你想做的事情?我不这么认为。

这与Python不同,如果您尝试相同的事情,Python实际上会给您以下错误...

Traceback (most recent call last):
  File "py.py", line 2, in <module>
  bar = foo + 1

如果Python是动态类型的,并且Perl是动态类型的,为什么我们会看到不同的行为。是因为他们的类型系统不同或者他们的类型转换语义不同。在汇编中我们有类型转换指令,将字符串更改为整数,反之亦然?

Bash有不同的类型转换规则

#!/bin/bash
set -e
MYVAR=WTF
let "MYVAR+=1"
echo "MYVAR == $MYVAR";

这会将1分配给MYVAR而不是递增它,即如果你增加一个字符串bash将字符串设置为整数零,然后执行增量。它正在执行类型转换,这意味着它是键入的。

对于仍然认为Bash是无类型的人,试试这个......

#!/bin/bash
declare -i var1=1
var1=2367.1

你应该得到这样的东西......

foo.sh: line 3: 2367.1: syntax error: invalid arithmetic operator (error token is ".1")

但以下显示没有此类错误

#!/bin/bash
var1=2367.1

以下

的输出
#!/bin/bash
var1=2367.1
echo "$var1"
let "var1+=1"
echo "$var1"

是相同的警告而没有声明类型......

2367.1
foo.sh: line 4: let: 2367.1: syntax error: invalid arithmetic operator (error token is ".1")
2367.1

更好的例子就是这个

#!/bin/bash
arg1=1234
arg2=abc

if [ $arg1 -eq $arg2 ]; then
  echo "wtf";
fi

为什么我会这样......

foo.sh: line 5: [: abc: integer expression expected

Bash正在问我一个整数表达式。

答案 1 :(得分:-1)

Bash是动态类型或更正确的,它是动态检查的语言。我已经添加了一个很长的答案,这是一个很短的答案。

#!/bin/bash
arg1=1234
arg2=abc

if [ $arg1 -eq $arg2 ]; then
  echo "wtf";
fi

给出了此错误消息....

foo.sh: line 5: [: abc: integer expression expected

我有一个错误告诉我,我在某种程度上犯了关于类型的错误意味着某些东西是检查类型。