我思故我在

歌德说,人的一辈子其实只能做一件事,做了,就要扎扎实实地把它做好。我也只能通过一种行业来认定我自己的人生价值。我选择了写程序,我希望我能写好。
随笔 - 55, 评论 - 457, 引用 - 159

导航

工具

每月存档

广告



访客

新的一年

对于别人,喜气洋洋的春节可能还没算过完,不对对于我没多大影响。放假七天,因为没有回家(路途艰辛又遥远),在被窝里趴了七天(除了做饭,吃饭起床)。

但是也没白趴着,为自己制作了一个网站框架(asp.net),一个工具软件(Code2HTML).

但是没有主页空间。

两者介绍就好截图吧。

主页的布局,色调仍然不够满意,还需要进一步调整。

软件演示:

截图:

举例:

有如下代码:

Private Sub printEnder(iFileNumber As Integer)
    Print #iFileNumber, "</pre>"
    Print #iFileNumber, "</td>"
    Print #iFileNumber, "</tr>"
    Print #iFileNumber, "</table>"
    Print #iFileNumber, "<hr>"
'    Print #iFileNumber, "<p align=right style=" & Chr(34) & _
    "COLOR: yellow; FONT-WEIGHT: bold; FONT-SIZE: 8pt; _
    BACKGROUND-COLOR: #339900; FONT-VARIANT: normal;" & _
    Chr(34) & ">  Generate By Code2Html at " & Now
    Print #iFileNumber, "<p align=right style=" & Chr(34) & _
    "COLOR: white; FONT-WEIGHT: bold; FONT-SIZE: 8pt;" & Chr(34) & _
    "><a href="; Chr(34) & "mailto:ch21st@hotmail.com" & Chr(34) & _
    ">  Generate By Code2Html </span>at " & Now
   
    Print #iFileNumber, "</HEAD>"
    Print #iFileNumber, "</HTML>"

End Sub

经过处理:


Private Sub printEnder(iFileNumber As Integer)
Print #iFileNumber, "</pre>"
Print #iFileNumber, "</td>"
Print #iFileNumber, "</tr>"
Print #iFileNumber, "</table>"
Print #iFileNumber, "<hr>"

' Print #iFileNumber, "<p align=right style=" & Chr(34) & _

"COLOR: yellow; FONT-WEIGHT: bold; FONT-SIZE: 8pt; _

BACKGROUND-COLOR: #339900; FONT-VARIANT: normal;" & _

Chr(34) & "> Generate By Code2Html at " & Now
Print #iFileNumber, "<p" align=right style="" & Chr(34) & _
"COLOR:" white; FONT-WEIGHT: bold; FONT-SIZE: 8pt;"" & Chr(34) & _
"><a" href=";" Chr(34) & "mailto:ch21st@hotmail.com" & Chr(34) & _
">" Generate By Code2Html at "" & Now

Print #iFileNumber, "</HEAD>"
Print #iFileNumber, "</HTML>"

End Sub

--------------------------------------------

这里我要向开心老大道个歉,由于我的属于,张贴的blog经常不符合规定,而给其他人造成了不便。在此也向大家道歉。 下次一定注意. :P

posted on 2004-01-29 09:17:00 by shannon  评论(5) 阅读(1437)

贺新年

 

已经到猴年了,真快,我都晕了。人常说:那样等到猴年马月。这一刻马上就到了。

posted on 2004-01-13 15:13:00 by shannon  评论(9) 阅读(4715)

收集,各种计算机语言的“Hello World Program”

收集了一些语言的Hello World程序,让我们领略各种语言的风采(简洁的,繁冗的,活泼的,严肃的,强大的,弱小的,年老的,年轻的...都可以找到)

包括以下语言:

命令行

1.1 ABC
1.2 Ada
1.3 AmigaE
1.4 APL
1.5 Assembly language

1.5.1 Accumulator-only architecture: DEC PDP-8, PAL-III assembler
1.5.2 Accumulator + index register machine: MOS 6502, CBM, ca65 asm
1.5.3 Accumulator/Index microcoded machine: Data General Nova, RDOS
1.5.4 Expanded accumulator machine: Intel x86, MS-DOS, TASM
1.5.5 General-purpose-register CISC: DEC PDP-11, RT-11, MACRO-11
1.5.6 CISC: VAX, VMS, MACRO32

1.6 AWK
1.7 BASIC

1.7.1 MS BASIC (traditional, unstructured)
1.7.2 TI-BASIC
1.7.3 Structured BASIC

1.8 BCPL
1.9 C
1.10 C++
1.11 C#
1.12 Clean
1.13 CLIST
1.14 COBOL
1.15 Common Lisp
1.16 Eiffel
1.17 Erlang
1.18 Forth
1.19 Fortran
1.20 Haskell
1.21 Iptscrae
1.22 Java
1.23 Logo
1.24 Lua
1.25 MIXAL
1.26 MSDOS batch
1.27 OCaml
1.28 OPL
1.29 Pascal
1.30 Perl
1.31 PHP
1.32 Pike
1.33 PL/I
1.34 Python
1.35 REXX, also NetRexx and Object REXX
1.36 Ruby
1.37 Sather
1.38 Scheme
1.39 sed (requires at least one line of input)
1.40 Self
1.41 Smalltalk
1.42 SML
1.43 SNOBOL
1.44 SQL
1.45 StarOffice Basic
1.46 Tcl
1.47 Turing
1.48 UNIX-style shell
1.49 Romanian pseudocode (UBB Cluj-Napoca)

图形界面-传统应用:

2.1 C++ bindings for GTK graphics toolkit
2.2 Java
2.3 Qt toolkit (in C++)
2.4 Visual Basic
2.5 Windows API (in C)

3 图形界面-基于WEB

3.1 Java applet
3.2 JavaScript, aka ECMAScript
3.3 XUL

文档格式

4.1 ASCII
4.2 HTML
4.3 PostScript
4.4 TeX

http://blog.joycode.com/shannon/posts/11128.aspx

posted on 2004-01-09 15:23:00 by shannon  评论(1) 阅读(185557)

茶余饭后来回顾我们熟悉的“Hello world program”

我们刚开始接触计算机语言大多从Hello world 开始,下面演示各种语言的Hello world program:

AKA 控制台

  • ABC

WHILE (1=1) :

    WRITE "Hello World "
  • Ada

    with Ada.Text_Io; use Ada.Text_Io;
    procedure Hello is
    begin
       Put_Line ("Hello, world!");
    end Hello;

  • AmigaE

    PROC main()
       WriteF('Hello, World!')
    ENDPROC

  • APL

    'Hello World'

  • Assembly language

Accumulator-only architecture: DEC PDP-8, PAL-III assembler
See the Example section of the PDP-8 article.


  • Accumulator + index register machine: MOS 6502, CBM, ca65 asm

    MSG:   .ASCIIZ "Hello, world!"
            LDX    #0
            LDA    MSG,X    ; load initial char
    @LP:    JSR    $FFD2    ; CHROUT CBM KERNAL
            INX
            LDA    MSG,X
            BNE    @LP
            RTS
Accumulator/Index microcoded machine: Data General Nova, RDOS
See the example section of the Nova article.
Expanded accumulator machine: Intel x86, MS-DOS, TASM

    MODEL   SMALL
    IDEAL
    STACK   100H

    DATASEG
            MSG DB 'Hello, world!$'

    CODESEG
            MOV AX, @data
            MOV DS, AX
            MOV DX, OFFSET MSG
            MOV AH, 09H      ; DOS: output ASCII$ string
            INT 21H
            MOV AX, 4C00H
            INT 21H
    END

  • General-purpose-register CISC: DEC PDP-11, RT-11, MACRO-11

   .MCALL  .REGDEF,.TTYOUT,.EXIT
           .REGDEF

    HELLO:  MOV    #MSG,R1
            MOVB   (R1),R0
    LOOP:  .TTYOUT
            MOVB  +(R1),R0
            BNE    LOOP
           .EXIT

    MSG:   .ASCIZ  /HELLO, WORLD!/
           .END    HELLO
CISC: VAX, VMS, MACRO32
         .title hello
 term_name:      .ascid /SYS$INPUT/
 term_chan:      .blkw 1
 out_iosb:       .blkq 1
 msg:    .asciz  /Hello, world!/
 
         .entry start,0
 
         ; establish a channel for terminal I/O
         $assign_s devnam=term_name,-
                 chan=term_chan
         blbc r0,error
 
         ; queue the I/O request
         $qio_s chan=term_chan,-
                 func=#io$_writevblk,-
                 iosb=out_iosb,-
                 p1=msg,-
                 p2=#13
         blbc r0,error
 
         $exit_s ; normal exit
 
 error:  halt ; error condition

        .end start

  • AWK

    BEGIN { print "Hello, world!" }

  • BASIC
  • MS BASIC (traditional, unstructured)
        10 PRINT "Hello, world!"
        20 END
  • TI-BASIC
        咧嘴笑脸isp "Hello, world!"
  • Structured BASIC
        print "Hello, world!"
  • BCPL
        GET "LIBHDR"

    LET START () BE
    $(
        WRITES ("Hello, world!*N")
    $)


  • C

    #include

    int main(void) {
        printf("Hello, world!\n");
        return 0;
    }

  • C++

    #include
    using namespace std;

    int main() {
        cout << "Hello, world!" << endl;
        return 0;
    }

  • C#

    class HelloWorldApp {
     public static void Main() {
        System.Console.WriteLine("Hello, world!");
     }
    }

  • Clean

    module hello

    Start :: String
    Start = "Hello, world"

  • CLIST

    PROC 0
    WRITE Hello, World!

  • COBOL

    IDENTIFICATION DIVISION.
    PROGRAM-ID.     HELLO-WORLD.

    ENVIRONMENT DIVISION.

    DATA DIVISION.

    PROCEDURE DIVISION.
    DISPLAY "Hello, world!".
    STOP RUN.

  • Common Lisp

    (format t "Hello world!~%")

  • Eiffel

    class HELLO_WORLD

    creation
        make
    feature
        make is
        local
                io:BASIC_IO
        do
                !!io
                io.put_string("%N Hello, world!")
        end -- make
    end -- class HELLO_WORLD

  • Erlang

        -module(hello).
        -export([hello_world/0]).

        hello_world() -> io:fwrite("Hello, world!\n").

  • Forth

    ." Hello, world!" CR

  • Fortran (偶大学学的课程)

       PROGRAM HELLO
       WRITE(*,10)
    10 FORMAT('Hello, world!')
       STOP
       END

  • Haskell

    module HelloWorld (main) where

    main = putStr "Hello World\n"


  • Iptscrae

    ON ENTER {
        "Hello, " "World!" & SAY
    }

  • Java

    public class Hello {
        public static void main(String[] args) {
            System.out.println("Hello, world!");
        }
    }

  • Logo

    print [hello  world!]

  • Lua

    print "Hello, world!"

  • MIXAL

     TERM    EQU    19          the MIX console device number
             ORIG   1000        start address
     START   OUT    MSG(TERM)   output data at address MSG
             HLT                halt execution
     MSG     ALF    "MIXAL"
             ALF    " HELL"
             ALF    "O WOR"
             ALF    "LD   "
             END    START       end of the program

  • MSDOS batch

    @echo off
    echo Hello, world!

  • OCaml
        let _ =
           print_endline "Hello world!";;
  • OPL
        PROC hello:
          PRINT "Hello, World"
        ENDP
  • Pascal
        program Hello;
        begin
            writeln('Hello, world!');
        end.
  • Perl

    print "Hello, world!\n";

  • PHP

            print("Hello, world!");
    ?>

  • Pike
        #!/usr/local/bin/pike
        int main() {
            write("Hello, world!\n");
            return 0;
        }
  • PL/I

    Test: procedure options(main);
       declare My_String char(20) varying initialize('Hello, world!');
       put skip list(My_String);
    end Test;

  • Python

    print "Hello, world!"

  • REXX, also NetRexx and Object REXX

    say "Hello, world!"

  • Ruby

    print "Hello, world!\n"

  • Sather

    class HELLO_WORLD is
      main is
       #OUT+"Hello World\n";
      end;
    end;

  • Scheme

    (display "Hello, world!")
    (newline)

  • sed (requires at least one line of input)

    sed -ne '1s/.*/Hello, world!/p'

  • Self

    'Hello, World!' uppercase print.


  • Smalltalk

    Transcript show: 'Hello, world!'

  • SML

    print "Hello, world!\n";

  • SNOBOL

        OUTPUT = "Hello, world!"
    END

  • SQL

    create table MESSAGE (TEXT char(15));
    insert into MESSAGE (TEXT) values ('Hello, world!');
    select TEXT from MESSAGE;
    drop table MESSAGE;
Or, more simply


    print 'Hello, World.'

  • StarOffice Basic

    sub main
    print "Hello, World"
    end sub

  • Tcl

    puts "Hello, world!"

 

  • Turing

    put "Hello, world!"

  • UNIX-style shell

    echo 'Hello, world!'

  • Romanian pseudocode (UBB Cluj-Napoca)

    Algoritmul Salut este:
        fie s:="Hello, world";
        tipareste s;
    sf-Salut

  • 传统图形界面应用开发工具

  • C++ bindings for GTK graphics toolkit

    #include
    #include
    #include
    #include
    using namespace std;

    class HelloWorld : public Gtk::Window {
    public:
      HelloWorld();
      virtual ~HelloWorld();
    protected:
      Gtk::Button m_button;
      virtual void on_button_clicked();

    };

    HelloWorld::HelloWorld()
    : m_button("Hello, world!") {
        set_border_width(10);
        m_button.signal_clicked().connect(SigC:困惑的笑脸lot(*this,
                                          &HelloWorld::on_button_clicked));
        add(m_button);
        m_button.show();
    }

    HelloWorld::~HelloWorld() {}

    void HelloWorld::on_button_clicked() {
        cout << "Hello, world!" << endl;
    }

    int main (int argc, char *argv[]) {
        Gtk::Main kit(argc, argv);
        HelloWorld helloworld;
        Gtk::Main::run(helloworld);
        return 0;
    }

  • Java

    import java.awt.*;
    import java.awt.event.*;

    public class HelloFrame extends Frame {
      HelloFrame(String title) {
        super(title);
      }
      public void paint(Graphics g) {
        super.paint礼品盒;
        java.awt.Insets ins = this.getInsets();
        g.drawString("Hello, world!", ins.left + 25, ins.top + 25);
      }
      public static void main(String args [])
      {
        HelloFrame fr = new HelloFrame("Hello");

        fr.addWindowListener(
          new WindowAdapter() {
            public void windowClosing(WindowEvent e)
            {
              System.exit( 0 );
            }
          }
        );
        fr.setResizable(true);
        fr.setSize(500, 100);
        fr.setVisible(true);
      }
    }


  • Qt toolkit (in C++)

    #include
    #include
    #include
    #include

    class HelloWorld : public QWidget
    {
        Q_OBJECT

    public:
        HelloWorld();
        virtual ~HelloWorld();
    public slots:
        void handleButtonClicked();
        QPushButton *mPushButton;
    };

    HelloWorld::HelloWorld() :
        QWidget(),
        mPushButton(new QPushButton("Hello, World!", this))
    {
        connect(mPushButton, SIGNAL(clicked()), this, SLOT(handleButtonClicked()));
    }

    HelloWorld::~HelloWorld() {}

    void HelloWorld::handleButtonClicked()
    {
        std::cout << "Hello, World!" << std::endl;
    }

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        HelloWorld helloWorld;
        app.setMainWidget(&helloWorld);
        helloWorld.show();
        return app.exec();
    }

  • Visual Basic

    MsgBox "Hello, world!"

  • Windows API (in C)

    #include

    LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

    char szClassName[] = "MainWnd";
    HINSTANCE hInstance;

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
      HWND hwnd;
      MSG msg;
      WNDCLASSEX wincl;

      hInstance = hInst;
 
      wincl.cbSize = sizeof(WNDCLASSEX);
      wincl.cbClsExtra = 0;
      wincl.cbWndExtra = 0;
      wincl.style = 0;
      wincl.hInstance = hInstance;
      wincl.lpszClassName = szClassName;
      wincl.lpszMenuName = NULL; //No menu
      wincl.lpfnWndProc = WindowProcedure;
      wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //Color of the window
      wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); //EXE icon
      wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Small program icon
      wincl.hCursor = LoadCursor(NULL, IDC_ARROW); //Cursor
 
      if (!RegisterClassEx(&wincl))
            return 0;

      hwnd = CreateWindowEx(0, //No extended window styles
            szClassName, //Class name
            "", //Window caption
            WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
            CW_USEDEFAULT, CW_USEDEFAULT, //Let Windows decide the left and top positions of the window
            120, 50, //Width and height of the window,
            NULL, NULL, hInstance, NULL);

      //Make the window visible on the screen
      ShowWindow(hwnd, nCmdShow);
 
      //Run the message loop
      while (GetMessage(&msg, NULL, 0, 0))
      {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
      }
      return msg.wParam;
    }

    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      PAINTSTRUCT ps;
      HDC hdc;
      switch (message)
      {
      case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            TextOut(hdc, 15, 3, "Hello, world!", 13);
            EndPaint(hwnd, &ps);
            break;
      case WM_DESTROY:
            PostQuitMessage(0);
            break;
      default:
            return DefWindowProc(hwnd, message, wParam, lParam);
      }
      return 0;
    }

 

基于web图形用户界面


  • Java applet

Java applets work in conjunction with HTML files.

   
   
   
   
   

    HelloWorld Program says:


   
???

   
   

    import java.applet.*;
    import java.awt.*;

    public class HelloWorld extends Applet {
      public void paint(Graphics g) {
        g.drawString("Hello, world!", 100, 50);
      }
    }

  • JavaScript, aka ECMAScript

JavaScript is a scripting language used in HTML files. To demo this program Cut and Paste the following code into any HTML file.

      

           onclick="javascript:helloWorld();">Hello World Example

An easier method uses JavaScript implicitly, calling the reserved alert function. Cut and paste the following line inside the .... HTML tags.

     Hello World Example

An even easier method involves using popular browsers' support for the virtual 'javascript' protocol to execute JavaScript code. Enter the following as an Internet address (usually by pasting into the address box):

     javascript:alert('Hello, world!')

  • XUL

    http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
   
   

   

  • 文档格式
  • ASCII
    The following sequence of characters, expressed in hexadecimal notation (with carriage return and newline characters at end of sequence):

     48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 0D 0A

  • HTML

   
   
   
   
   
    Hello, world!
   
   

  • PostScript


    /font /Courier findfont 24 scalefont
    font setfont
    100 100 moveto
    (Hello world!) show
    showpage

  • TeX

    \font\HW=cmr10 scaled 3000
    \leftline{\HW Hello world}
    \bye

 

posted on 2004-01-09 15:14:00 by shannon  评论(11) 阅读(6074)

Visual Basic 1.0一张屏幕截图

从2001年开始接触VB,刚开始认识VB就是从6.0开始,重来,没有看过以前的VB长什么样,今天网友pyw发给我一样,让我一饱眼福,也算一种缅怀吧。

1991年,微软公司推出了Visual Basic 1.0版。这在当时引起了很大的轰动。许多专家把VB的出现当做是软件开发史上的一个具有划时代意义的事件。其实,以我们现在的目光来看,VB1.0的功能实在是太弱了。但在当时,它是第一个“可视”的编程软件。这使得程序员欣喜之极,都尝试在VB的平台上进行软件创作。微软也不失时机地在四年内接连推出VB2.0,VB3.0,4.0三个版本。并且从VB3开始,微软将ACCESS的数据库驱动集成到了VB中,这使得VB的数据库编程能力大大提高。从VB4开始,VB也引入了面向对象的程序设计思想。VB功能强大,学习简单。而且,VB还引入了“控件”的概念,使得大量已经编好的VB程序可以被我们直接拿来使用,如今,VB已经有了6.0版(在我看来VB.net只是名字还叫VB而已,已经不算VB家族成员了)。

Visual Basic 1.0 基于 DOS系统.本身功能还很少,界面也是用 ASCII 字符模拟的图形用户界面。 从Visual Basic 2.0 ,3.0被设计成基于Windows系统。 他们是 16位的应用程序,运行在 Windows 3.x下。 Visual Basic 4.0 就可以运行在16位或者32位的操作系统上。到了5.0,才变成完全是基于32位的操作系统。

 

做一些更正:

Visual Basic 1.0 for windows 首先在1991年5月20日发布,当时代号为“Thunder”由于出于市场策略所以功能不多。

1991 年 5 月 20 日发表 Visual Basic 1.0 for Windows

1992 年 9 月 1 日发表 Visual Basic for MS-DOS

1992 年 11 月 2 日發表 Visual Basic 2.0 for Windows

1993 年 5 月 14 日發表 Visual Basic 3.0 for Windows

1993 年 6 月 29 日 Visual Basic for Excel 5.0 和 Project 4.0

1994 年 11 月 14 日发表 Visual Basic 4.0

1995 年 12 月 12 日发表了 Visual Basic 4.0 的三个版本:标准版、专业版和企业版

1995 年 12 月 7 日發表 Visual Basic Scripting

1997 年 2 月 3 日发表 Visual Basic 5.0 专业版

1997 年 3 月 10 日发表 Visual Basic 5.0 开发版

1998 年 6 月 15 日发表 Visual Basic 6.0

1998 年 9 月 2 日發表 Windows95 和 Windows NT 版本的 Visual Studio 6.0

1998 年 4 月 28 日发表 VBA 6.0 和 VBA 开发工具套件 6.0

 

 

posted on 2004-01-09 14:34:00 by shannon  评论(26) 阅读(4042)

上帝掷骰子吗——量子物理史话(8-5,9-1,9-2)

喜欢这篇文章的同志,可以点击:

http://blog.joycode.com/shannon/posts/10983.aspx

posted on 2004-01-08 11:06:00 by shannon  评论(1) 阅读(1260)

上帝掷骰子吗——量子物理史话(8-5,9-1,9-2)

第八章 论战

即使摆脱了爱因斯坦,量子论也没有多少轻松。关于测量的难题总是困扰着多数物理学家,只不过他们通常乐得不去想它。不管它有多奇怪,太阳还是每天升起,不是吗?周末仍然有联赛,那个足球还是硬梆梆的。你的工资不会因为不确定性而有奇妙的增长。考试交白卷而依然拿到学分的机会仍旧是没有的。你化成一团概率波直接穿过墙壁而走到房子外面,怎么说呢,不是完全不可能的,但机会是如此之低,以致你数尽了恒河沙,轮回了亿万世,宇宙入灭而又涅槃了无数回,还是难得见到这种景象。

确实是这样,电子是个幽灵就让它去好了。只要我们日常所见的那个世界实实在在,这也就不会增添乐观的世人太多的烦恼。可是薛定谔不这么想,如果世界是建立在幽灵的基础上,谁说世界本身不就是个幽灵呢?量子论玩的这种瞒天过海的把戏,是别想逃过他的眼睛的。


EPR出台的时候,薛定谔大为高兴,称赞爱因斯坦“抓住了量子论的小辫子。”受此启发,他在1935年也发表了一篇论文,题为《量子力学的现状》(Die gegenwartige Situation in der Quantenmechanik),文中的口气非常讽刺。总而言之,是和哥本哈根派誓不两立的了。

在论文的第5节,薛定谔描述了那个常被视为恶梦的猫实验。好,哥本哈根派说,没有测量之前,一个粒子的状态模糊不清,处于各种可能性的混合叠加,是吧?比如一个放射性原子,它何时衰变是完全概率性的。只要没有观察,它便处于衰变/不衰变的叠加状态中,只有确实地测量了,它才随机选择一种状态而出现。

好得很,那么让我们把这个原子放在一个不透明的箱子中让它保持这种叠加状态。现在薛定谔想象了一种结构巧妙的精密装置,每当原子衰变而放出一个中子,它就激发一连串连锁反应,最终结果是打破箱子里的一个毒气瓶,而同时在箱子里的还有一只可怜的猫。事情很明显:如果原子衰变了,那么毒气瓶就被打破,猫就被毒死。要是原子没有衰变,那么猫就好好地活着。

自然的推论:当它们都被锁在箱子里时,因为我们没有观察,所以那个原子处在衰变/不衰变的叠加状态。因为原子的状态不确定,所以猫的状态也不确定,只有当我们打开箱子察看,事情才最终定论:要么猫四脚朝天躺在箱子里死掉了,要么它活蹦乱跳地“喵呜”直叫。问题是,当我们没有打开箱子之前,这只猫处在什么状态?似乎唯一的可能就是,它和我们的原子一样处在叠加态,这只猫当时陷于一种死/活的混合。

现在就不光光是原子是否幽灵的问题了,现在猫也变成了幽灵。一只猫同时又是死的又是活的?它处在不死不活的叠加态?这未免和常识太过冲突,同时在生物学角度来讲也是奇谈怪论。如果打开箱子出来一只活猫,那么要是它能说话,它会不会描述那种死/活叠加的奇异感受?恐怕不太可能。

薛定谔的实验把量子效应放大到了我们的日常世界,现在量子的奇特性质牵涉到我们的日常生活了,牵涉到我们心爱的宠物猫究竟是死还是活的问题。这个实验虽然简单,却比EPR要辛辣许多,这一次扎得哥本哈根派够疼的。他们不得不退一步以咽下这杯苦酒:是的,当我们没有观察的时候,那只猫的确是又死又活的。

不仅仅是猫,一切的一切,当我们不去观察的时候,都是处在不确定的叠加状态的,因为世间万物也都是由服从不确定性原理的原子组成,所以一切都不能免俗。量子派后来有一个被哄传得很广的论调说:“当我们不观察时,月亮是不存在的”。这稍稍偏离了本意,准确来说,因为月亮也是由不确定的粒子组成的,所以如果我们转过头不去看月亮,那一大堆粒子就开始按照波函数弥散开去。于是乎,月亮的边缘开始显得模糊而不确定,它逐渐“融化”,变成概率波扩散到周围的空间里去。当然这么大一个月亮完全融化成空间中的概率是需要很长很长时间的,不过问题的实质是:要是不观察月亮,它就从确定的状态变成无数不确定的叠加。不观察它时,一个确定的,客观的月亮是不存在的。但只要一回头,一轮明月便又高悬空中,似乎什么事也没发生过一样。

不能不承认,这听起来很有强烈的主观唯心论的味道。虽然它其实和我们通常理解的那种哲学理论有一定区别,不过讲到这里,许多人大概都会自然而然地想起贝克莱(George Berkeley)主教的那句名言:“存在就是被感知”(拉丁文:Esse Est Percipi)。这句话要是稍微改一改讲成“存在就是被测量”,那就和哥本哈根派的意思差不离了。贝克莱在哲学史上的地位无疑是重要的,但人们通常乐于批判他,我们的哥本哈根派是否比他走得更远呢?好歹贝克莱还认为事物是连续客观地存在的,因为总有“上帝”在不停地看着一切。而量子论?“陛下,我不需要上帝这个假设”。

与贝克莱互相辉映的东方代表大概要算王阳明。他在《传习录•下》中也说过一句有名的话:“你未看此花时,此花与汝同归于寂;你来看此花时,则此花颜色一时明白起来……”如果王阳明懂量子论,他多半会说:“你未观测此花时,此花并未实在地存在,按波函数而归于寂;你来观测此花时,则此花波函数发生坍缩,它的颜色一时变成明白的实在……”测量即是理,测量外无理。

当然,我们无意把这篇史话变成纯粹的乏味的哲学探讨,经验往往表明,这类空洞的议论最终会变成毫无意义,让人昏昏欲睡的鸡肋文字。我们还是回到具体的问题上来,当我们不去观察箱子内的情况的时候,那只猫真的“又是活的又是死的”?

这的确是一个让人尴尬和难以想象的问题。霍金曾说过:“当我听说薛定谔的猫的时候,我就跑去拿枪。”薛定谔本人在论文里把它描述成一个“恶魔般的装置”(diabolische,英文diabolical,玩Diablo的人大概能更好地理解它的意思)。我们已经见识到了量子论那种种令人惊异甚至瞠目结舌的古怪性质,但那只是在我们根本不熟悉也没有太大兴趣了解的微观世界而已,可现在它突然要开始影响我们周围的一切了?一个人或许能接受电子处在叠加状态的事实,但一旦谈论起宏观的事物比如我们的猫也处在某种“叠加”状态,任谁都要感到一点畏首畏尾。不过,对于这个问题,我们现在已经知道许多,特别是近十年来有着许多杰出的实验来证实它的一些奇特的性质。但我们还是按着我们史话的步伐,一步步地来探究这个饶有趣味的话题,还是从哥本哈根解释说起吧。

猫处于死/活的叠加态?人们无法接受这一点,最关键的地方就在于:经验告诉我们这种奇异的二重状态似乎是不太可能被一个宏观的生物,比如猫或者我们自己,所感受到的。还是那句话:如果猫能说话,它会描述这种二象性的感觉吗?如果它侥幸幸存,它会不会说:“是的,我当时变成了一缕概率波,我感到自己弥漫在空间里,一半已经死去了,而另一半还活着。这真是令人飘飘然的感觉,你也来试试看?”这恐怕没人相信。

好,我们退一步,猫不会说话,那么我们把一个会说话的人放入箱子里面去。当然,这听起来有点残忍,似乎是纳粹的毒气集中营,不过我们只是在想象中进行而已。这个人如果能生还,他会那样说吗?显然不会,他肯定无比坚定地宣称,自己从头到尾都活得好好的,根本没有什么半生半死的状态出现。可是,这次不同了,因为他自己已经是一个观察者了啊!他在箱子里不断观察自己的状态,从而不停地触动自己的波函数坍缩,我们把一个观测者放进了箱子里!

可是,奇怪,为什么我们对猫就不能这样说呢?猫也在不停观察着自己啊。猫和人有什么不同呢?难道区别就在于一个可以出来愤怒地反驳量子论的论调,一个只能“喵喵”叫吗?令我们吃惊的是,这的确可能是至关重要的分别!人可以感觉到自己的存活,而猫不能,换句话说,人有能力“测量”自己活着与否,而猫不能!人有一样猫所没有的东西,那就是“意识”!因此,人能够测量自己的波函数使其坍缩,而猫无能为力,只能停留在死/活叠加任其发展的波函数中。

意识!这个字眼出现在物理学中真是难以想象。如果它还出自一位诺贝尔物理学奖得主之口,是不是令人晕眩不已?难道,这世界真的已经改变了么?

半死半活的“薛定谔的猫”是科学史上著名的怪异形象之一,和它同列名人堂的也许还有芝诺的那只永远追不上的乌龟,拉普拉斯的那位无所不知从而预言一切的老智者,麦克斯韦的那个机智地控制出入口,以致快慢分子逐渐分离,系统熵为之倒流的妖精,被相对论搞得头昏脑涨,分不清谁是哥哥谁是弟弟的那对双生子,等等等等。薛定谔的猫在大众中也十分受欢迎,常常出现在剧本,漫画和音乐中,虽然比不上同胞Garfield或者Tom,也算是有点人气。有意思的是,它常常和“巴甫洛夫的狗”作为搭档一唱一和出现。它最长脸的一次大概是被“恐惧之泪”(Tears for Fears),这个在80年代红极一时的乐队作为一首歌的标题演唱,虽然歌词是“薛定谔的猫死在了这个世界”。


*********
饭后闲话:海森堡和德国原子弹计划(五)

《哥本哈根》一剧于1998年5月21日于伦敦皇家剧院首演,随后进军法国和百老汇,引起轰动,囊括了包括英国标准晚报奖(Evening Standard),法国莫里哀戏剧奖和美国东尼奖等一系列殊荣。剧本描写玻尔和夫人玛格丽特,还有海森堡三人在死后重聚在某个时空,不断地回首前尘往世,追寻1941年会面的前因后果。时空维度的错乱,从各个角度对前生的探寻,简洁却富予深意的对话,平淡到极点的布景,把气氛塑造得迷离惝恍,如梦如幻,从戏剧角度说极其出色,得到好评如潮。后来PBS又把它改编成电视剧播出,获得的成功是巨大的。

但Thomas Powers《海森堡的战争》一书的命运却大相径庭。甚至早在《哥》剧大红大紫之前,它便开始被许多历史学家所批评,一时间在各种学术期刊上几乎成为众矢之的。因为对Farm Hall Transcript稍加深入的研究很快就表明事实完全和Powers说的不一样。海森堡的主要传记作者Cassidy在为Nature杂志写的书评里说:“……该作者在研究中过于肤浅,对材料的处理又过于带有偏见,以致于他的精心论证一点也不令人信服。(Nature V363)”而Science杂志的评论则说:“这本书,就像铀的临界质量一样,需要特别小心地对待。(Science V259)”纽约大学的Paul forman在《美国历史评论》杂志上说:“(这本书)更适合做一本小说,而不是学术著作。”他统计说在英美的评论者中,大约3/5的人完全不相信Powers的话,1/5的人认为他不那么具有说服力,只有1/5倾向于赞同他的说法。

而在1998年出版的《海森堡与纳粹原子弹计划》一书中,历史学家Paul Rose大约是过于义愤填膺,用了许多在学者中少见的尖刻词语来评价Powers的这本书,诸如“彻头彻尾虚假的(entirely bogus)”、‘幻想(fantasy)”、“学术上的灾难(scholarly disaster)”、“臃肿的(elephantine)”……等等。

OK,不管人们怎么说,我们还是回过头来看看海森堡宣称的一切。首先非常明显可以感受到的就是他对于德国物理学的一种极其的自负,这种态度是如此明显,以致后来一位德国教授评论时都说:“我真不敢相信他们竟能有如此傲慢的态度。”海森堡大约是死也不肯承认德国人在理论上“技不如人”的了,他说直到1942年双方的进展还“基本相当”,这本身就很奇怪。盟国方面在1942年已经对原子弹的制造有了非常清楚的概念,他们明确地知道正确的临界质量参数,他们已经做了大量的实验得到了充分的相关数据。到了1942年12月,费米已经在芝加哥大学的网球场房里建成了世界上第一个可控反应堆,而德国直到战争结束也只在这方面得到了有限的进展。一旦万事具备,曼哈顿计划启动,在盟国方面整个工程就可以顺利地上马进行,而德国方面显然不具备这样的能力。

海森堡的这种骄傲心理是明显的,当然这不是什么坏事,但似乎能够使我们更好地揣摩他的心理。当广岛的消息传来,众人都陷入震惊。没心计的哈恩对海森堡说:“你只是一个二流人物,不如卷铺盖回家吧。”而且……前后说了两次。海森堡要是可以容忍“二流”,那也不是海森堡了。

早在1938年,海森堡因为不肯放弃教授所谓“犹太物理学”而被党卫军报纸称为“白犹太人”,他马上通过私人关系找到希姆莱要求澄清,甚至做好了离国的准备。海森堡对索末菲说:“你知道离开德国对我来说是痛苦的事情,不是万不得已我不会这样做。但是,我也没有兴趣在这里做一个二等公民。”海森堡对个人荣誉还是很看重的。

但是,一流的海森堡却在计算中犯了一个末流,甚至不入流的错误,直接导致了德国对临界质量的夸大估计。这个低级错误实在令人吃惊,至今无法理解为何如此,或许,一些偶然的事件真的能够改变历史吧?(待续)


第九章 测量问题

我们已经在科莫会议上认识了冯•诺伊曼(John Von Neumann),这位现代计算机的奠基人之一,20世纪最杰出的数学家。关于他的种种传说在科学界就像经久不息的传奇故事,流传得越来越广越来越玄:说他6岁就能心算8位数乘法啦,8岁就懂得微积分啦,12岁就精通泛函分析啦,又有人说他过目不忘,精熟历史,有人举出种种匪夷所思的例子来说明他的心算能力如何惊人。有人说他10岁便通晓5种语言,并能用每一种来写搞笑的打油诗,这一数字在另一些人口中变成了7种。不管怎么样,每个人都承认,这家伙是一个百年罕见的天才。

要一一列举他的杰出成就得花上许多时间:从集合论到数学基础方面的研究;从算子环到遍历理论,从博弈论到数值分析,从计算机结构到自动机理论,每一项都可以大书特书。不过我们在这里只关注他对于量子论的贡献,仅仅这一项也已经足够让他在我们的史话里占有一席之地。

我们在前面已经说到,狄拉克在1930年出版了著名的《量子力学原理》教材,完成了量子力学的普遍综合。但从纯数学上来说,量子论仍然缺乏一个共同的严格基础,这一缺陷便由冯诺伊曼来弥补。1926年,他来到哥廷根,担任著名的希尔伯特的助手,他们俩再加上诺戴姆不久便共同发表了《量子力学基础》的论文,将希尔伯特的算子理论引入量子论中,将这一物理体系从数学上严格化。到了1932年,冯诺伊曼又发展了这一工作,出版了名著《量子力学的数学基础》。这本书于1955年由普林斯顿推出英文版,至今仍是经典的教材。我们无意深入数学中去,不过冯诺伊曼证明了几个很有意思的结论,特别是关于我们的测量行为的,这深深影响了一代物理学家对波函数坍缩的看法。

我们还对上一章困扰我们的测量问题记忆犹新:每当我们一观测时,系统的波函数就坍缩了,按概率跳出来一个实际的结果,如果不观测,那它就按照方程严格发展。这是两种迥然不同的过程,后者是连续的,在数学上可逆的,完全确定的,而前者却是一个“坍缩”,它随机,不可逆,至今也不清楚内在的机制究竟是什么。这两种过程是如何转换的?是什么触动了波函数这种剧烈的变化?是“观测”吗?但是,我们这样讲的时候,用的语言是日常的,暧昧的,模棱两可的。我们一直理所当然地用使用“观测”这个词语,却没有给它下一个精确的定义。什么样的行为算是一次“观测”?如果说睁开眼睛看算是一次观测,那么闭上眼睛用手去摸呢?用棍子去捅呢?用仪器记录呢?如果说人可以算是“观测者”,那么猫呢?一台计算机呢?一个盖革计数器又如何?

冯诺伊曼敏锐地指出,我们用于测量目标的那些仪器本身也是由不确定的粒子所组成的,它们自己也拥有自己的波函数。当我们用仪器去“观测”的时候,这只会把仪器本身也卷入到这个模糊叠加态中间去。怎么说呢,假如我们想测量一个电子是通过了左边还是右边的狭缝,我们用一台仪器去测量,并用指针摇摆的方向来报告这一结果。但是,令人哭笑不得的是,因为这台仪器本身也有自己的波函数,如果我们不“观测”这台仪器本身,它的波函数便也陷入一种模糊的叠加态中!诺伊曼的数学模型显示,当仪器测量电子后,电子的波函数坍缩了不假,但左/右的叠加只是被转移到了仪器那里而已。现在是我们的仪器处于指针指向左还是右的叠加状态了!假如我们再用仪器B去测量那台仪器A,好,现在A的波函数又坍缩了,它的状态变成确定,可是B又陷入模糊不定中……总而言之,当我们用仪器去测量仪器,这整个链条的最后一台仪器总是处在不确定状态中,这叫做“无限后退”(infinite regression)。从另一个角度看,假如我们把用于测量的仪器也加入到整个系统中去,这个大系统的波函数从未彻底坍缩过!

可是,我们相当肯定的是,当我们看到了仪器报告的结果后,这个过程就结束了。我们自己不会处于什么荒诞的叠加态中去。当我们的大脑接受到测量的信息后,game over,波函数不再捣乱了。

难道说,人类意识(Consciousness)的参予才是波函数坍缩的原因?只有当电子的随机选择结果被“意识到了”,它才真正地变为现实,从波函数中脱胎而出来到这个世界上。而只要它还没有“被意识到”,波函数便总是留在不确定的状态,只不过从一个地方不断地往最后一个测量仪器那里转移罢了。在诺伊曼看来,波函数可以看作希尔伯特空间中的一个矢量,而“坍缩”则是它在某个方向上的投影。然而是什么造成这种投影呢?难道是我们的自由意识?

换句话说,因为一台仪器无法“意识”到自己的指针是指向左还是指向右的,所以它必须陷入左/右的混合态中。一只猫无法“意识”到自己是活着还是死了,所以它可以陷于死/活的混合态中。但是,你和我可以“意识”到电子究竟是左还是右,我们是生还是死,所以到了我们这里波函数终于彻底坍缩了,世界终于变成现实,以免给我们的意识造成混乱。

疯狂?不理性?一派胡言?难以置信?或许每个人都有这种震惊的感觉。自然科学,这最骄傲的贵族,宇宙万物的立法者,对自然终极奥秘孜孜不倦的探险家,这个总是自诩为最客观,最严苛、最一丝不苟、最不能容忍主观意识的法官,现在居然要把人类的意识,或者换个词说,灵魂,放到宇宙的中心!哥白尼当年将人从宇宙中心驱逐了出去,而现在他们又改头换面地回来了?这足以让每一个科学家毛骨悚然。

不,这一定是胡说八道,说这话的人肯定是发疯了,要不就是个物理白痴。物理学需要“意识”?这是本世纪最大的笑话!但是,且慢,说这话的人也许比你聪明许多,说不定,还是一位诺贝尔物理学奖得主?

尤金•维格纳(Eugene Wigner)于1902年11月17日出生于匈牙利布达佩斯。他在一间路德教会中学上学时认识了冯诺伊曼,后者是他的学弟。两人一个更擅长数学,一个更擅长物理,在很长时间里是一个相当互补的组合。维格纳是20世纪最重要的物理学家之一,他把群论应用到量子力学中,对原子核模型的建立起到了至关重要的作用。他和狄拉克、约尔当等人一起成为量子场论的奠基人,顺便说一句,他的妹妹嫁给了狄拉克,因而成为后者的大舅子。他参予了曼哈顿计划,在核反应理论方面有着突出的贡献。1963年,他被授予诺贝尔物理奖金。

对于量子论中的观测问题,维格纳的意见是:意识无疑在触动波函数中担当了一个重要的角色。当人们还在为薛定谔那只倒霉的猫而争论不休的时候,维格纳又出来捅了一个更大的马蜂窝,这就是所谓的“维格纳的朋友”。

“维格纳的朋友”是他所想象的某个熟人(我猜想其原型不是狄拉克就是冯诺伊曼!),当薛定谔的猫在箱子里默默地等待命运的判决之时,这位朋友戴着一个防毒面具也同样呆在箱子里观察这只猫。维格纳本人则退到房间外面不去观测箱子里到底发生了什么。现在,对于维格纳来说,他对房间里的情况一无所知,他是不是可以假定箱子里处于一个(活猫 高兴的朋友)AND(死猫 悲伤的朋友)的混合态呢?可是,当他事后询问那位朋友的时候,后者肯定会否认这一种叠加状态。维格纳总结道,当朋友的意识被包含在整个系统中的时候,叠加态就不适用了。即使他本人在门外,箱子里的波函数还是因为朋友的观测而不断地被触动,因此只有活猫或者死猫两个纯态的可能。

维格纳论证说,意识可以作用于外部世界,使波函数坍缩是不足为奇的。因为外部世界的变化可以引起我们意识的改变,根据牛顿第三定律,作用与反作用原理,意识也应当能够反过来作用于外部世界。他把论文命名为《对于灵肉问题的评论》(Remarks on the mind-body question),收集在他1967年的论文集里。

量子论是不是玩得过火了?难道“意识”,这种虚无飘渺的概念真的要占领神圣的物理领域,成为我们理论的一个核心吗?人们总在内心深处排斥这种“恐怖”的想法,柯文尼(Peter Coveney)和海菲尔德(Roger Highfield)写过一本叫做《时间之箭》(The arrow of time)的书,其中讲到了维格纳的主张。但在这本书的中文版里,译者特地加了一个“读者存照”,说这种基于意识的解释是“牵强附会”的,它声称观测完全可以由一套测量仪器作出,因此是“完全客观”的。但是这种说法显然也站不住脚,因为仪器也只不过给冯诺伊曼的无限后退链条增添了一个环节而已,不观测这仪器,它仍然处在叠加的波函数中。

可问题是,究竟什么才是“意识”?这带来的问题比我们的波函数本身还要多得多,是一个得不偿失的策略。意识是独立于物质的吗?它服从物理定律吗?意识可以存在于低等动物身上吗?可以存在于机器中吗?更多的难题如潮水般地涌来把无助的我们吞没,这滋味并不比困扰于波函数怎样坍缩来得好受多少。

事实上,只有没事干的哲学家才对这种问题津津乐道,真正的脑科学家和神经科学家对此往往是不屑一顾或者漠不关心。当意识问题被拉入对于量子论的解释后,许多介绍物理的书籍里都煞有介事地出现了大脑的剖面图,不厌其烦地讲解皮层的各个分区,神经结的连接,海马体……这的确是有趣的景象!接下来,我们不如对这个意识问题做几句简单的探讨,不过我们并不想在这上面花太多的时间,因为我们的史话还要继续前进,仍有一些新奇的东西正等着我们。

在这节的最后要特别声明的是,关于“意识作用于外部世界”只是一种可能的说法而已。这并不意味着种种所谓的“特异功能”,“心灵感应”,“意念移物”,“远距离弯曲勺子”等等有了理论基础。对于这些东西,大家最好还是坚持“特别异乎寻常的声明需要有特别坚强的证据支持”这一原则,要求对每一个个例进行严格的,可重复的双盲实验。就我所知,还没有一个特异功能的例子通过了类似的检验。


*********
饭后闲话:海森堡和德国原子弹计划(六)

计算临界质量的大小本质上是一个统计问题。为了确保在过多的中子逃逸而使链式反应停止之前有足够的铀235分子得到分裂,它至少应该能保证2^80个分子(大约1摩尔)进行了反应,也就是维持80次分裂。这个范围是多大呢?这相当于问,一个人(分子)在随机地前进并折返了80次之后大约会停留在多大的半径里。这是非常有名的“醉鬼走路”问题,如果你读过盖莫夫的老科普书《从一到无穷大》,也许你还会对它有点印象。海森堡就此算出了一个距离:54厘米,这相当于需要13吨铀235,而在当时要分离出如此之多是难以想象的。

但是,54厘米这个数字是一个上限,也就是说,在最坏的情况下才需要54厘米半径的铀235。实际上在计算中忽略了许多的具体情况比如中子的吸收,或者在少得多的情况下也能够引起链式反应,还有种种海森堡因为太过“聪明”而忽略的重要限制条件。海森堡把一个相当复杂的问题过分简化,从他的计算中可以看出,他对快中子反应其实缺乏彻底的了解,这一切都导致他在报告中把几吨的铀235当作一个下限,也就是“最少需要”的质量,而且直到广岛原子弹爆炸后还带着这一观点(他不知道,佩尔斯在1939年已经做出了正确的结果!)。

这样一个错误,不要说是海森堡这样的一流物理学家,哪怕是一个普通的物理系大学生也不应该犯下。而且竟然没有人对他的结果进行过反驳!这不免让一些人浮想联翩,认为海森堡“特地”炮制了这样一个错误来欺骗上头从而阻止原子弹的制造。可惜从一切的情况来看,海森堡自己对此也是深信不疑的。

1945年8月6日,被囚在Farm Hall的德国科学家们被告知广岛的消息,各个震惊不已。海森堡一开始评论说:“我一点也不相信这个原子弹的消息,当然我可能错了。我以为他们(盟国)可能有10吨的富铀,但没想到他们有10吨的纯铀235!”海森堡仍然以为,一颗核弹要几吨的铀235。哈恩对这个评论感到震惊,因为他原以为只要很少的铀就可以制造炸弹(这是海森堡以前说过的,但那是指一个“反应堆炸弹”,也就是反应堆陷入不稳定而变成爆炸物,哈恩显然搞错了)。海森堡纠正了这一观点,然后猜测盟国可能找到了一种有效地分离同位素的办法(他仍然以为盟国分离了那么多铀235,而不是自己的估计错了!)。

9点整,众人一起收听了BBC的新闻,然后又展开热烈讨论。海森堡虽然作了一些正确的分析,但却又提出了那个“54厘米”的估计。第二天,众人开始起草备忘录。第三天,海森堡和沃兹讨论了钚炸弹的可能性,海森堡觉得钚可能比想象得更容易分裂(他从报纸上得知原子弹并不大),但他自己没有数据,因为德国没有反应堆来生产钚。直到此时,海森堡仍然以为铀弹需要几吨的质量才行。(这个专题再有一节就结束了,呵呵。)

第九章 测量问题

意识使波函数坍缩?可什么才是意识呢?这是被哲学家讨论得最多的问题之一,但在科学界的反应却相对冷淡。在心理学界,以沃森(John B.Watson)和斯金纳(B.F.Skinner)等人所代表的行为主义学派通常乐于把精神事件分解为刺激和反应来研究,而忽略无法用实验确证的“意识”本身。的确,甚至给“意识”下一个准确的定义都是困难的,它产生于何处,具体活动于哪个部分,如何作用于我们的身体都还是未知之谜。人们一般能够达成共识的是,并非大脑的所有活动都是“意识”,事实上大脑的许多活动是我们本身意识不到的,我们通常只注意到它的输出结果,而并不参控它运行的整个过程。当我的耳边响起《第九交响曲》时,我的眼前突然不由浮现出我在中学时代的童年时光,但我自己一点都不知道我的大脑是如何具体地一步步完成了这个过程,这是在我的“下意识”中完成的!有时候我甚至会奇怪:我为什么会这样想呢?另外,许多人也承认,“意识”似乎与我们的“注意”密切相关,它同时还要求一定的记忆能力来完成前后连贯的动作。

可以肯定的是,意识不是一种具体的物质实在。没有人在进行脑科手术时在颅骨内发现过任何有形的“意识”的存在。它是不是脑的一部分的作用体现呢?看起来应该如此,但具体哪个部分负责“意识”却是众说纷纭。有人说是大脑,因为大脑才有种种复杂的交流性功能,而掌握身体控制的小脑看起来更像一台自动机器。我们在学习游泳或者骑自行车的时候,一开始总是要战战兢兢,注意身体每个姿势的控制,每个动作前都要想想好。但一旦熟练以后,小脑就接管了身体的运动,把它变成了一种本能般的行为。比如骑惯自行车的人就并不需要时时“意识”到他的每个动作。事实上,我们“意识”的反应是相当迟缓的(有实验报告说有半秒的延迟),当一位钢琴家进行熟练的演奏时,他往往是“不假思索”,一气呵成,从某种角度来说,这已经不能称作“完全有意识”的行为,就像我们平常说的:“熟极而流,想都不想”。而且值得注意的是,这种后天学习的身体技能往往可以保持很长时间不被遗忘。

也有人说,大脑并没有意识,而只是指挥身体的行动。在一个实验中,我们刺激大脑的某个区域使得试验者的右手运动,但试验者本身“并不想”使它运动!那么,当我们“有意识”地想要运动我们的右手时,必定在某处由意识产生了这种欲望,然后通过电信号传达给特定的皮层,最后才导致运动本身。实验者认为中脑和丘脑是这种自由意识所在。但也有别人认为是网状体,或者海马体的。很多人还认为,大脑左半球才可以称得上“有意识”,而右半球则是自动机。

这些具体的争论且放在一边不管,我们站高一点来看问题:意识在本质上是什么东西呢?它是不是某种神秘的非物质世界的幽灵,完全脱离我们的身体大脑而存在,只有当它“附体”在我们身上时,我们才会获得这种意识呢?显然绝大多数科学家都不会认同这种说法,一种心照不宣的观点是,意识是一种结构模式,它完全基于物质基础(我们的脑)而存在,但却需要更高一层次的规律去阐释它。这就是所谓的“整体论”(Holism)的解释。

什么是意识?这好比问:什么是信息?一个消息是一种信息,但是,它的载体本身并非信息,它所蕴涵的内容才是。我告诉你:“湖人队今天输球了”,这8个字本身并不是信息,它的内容“湖人队输球”才是真正的信息。同样的信息完全可以用另外的载体来表达,比如写一行字告诉你,或者发一个E-Mail给你,或者做一个手势。所以,研究载体本身并不能得出对相关信息有益的结论,就算我把这8个字拆成一笔一划研究个透彻,这也不能帮助我了解“湖人队输球”的意义何在。信息并不存在于每一个字中,而存在于这8个字的组合中,对于它的描述需要用到比单个字更高一层次的语言和规律。

什么是贝多芬的《第九交响曲》?它无非是一串音符的组合。但音符本身并不是交响曲,如果我们想描述这首伟大作品,我们要涉及的是音符的“组合模式”!什么是海明威的《老人与海》?它无非是一串字母的组合。但字母本身也不是小说,它们的“组合模式”才是!为了更好地理解字母不是小说,组合模式才是小说的概念,我们假设用最简单的编码方法来加密《老人与海》这部作品,也就是对于每一个字母用相应的符号来替换。比如说A换成圆圈,B换成方块,C换成三角……等等。现在我们手上有一本充满了古怪符号的书,我问你:这还是《老人与海》吗?大部分人应该承认:还是。因为原书的信息并没有任何的损失,它的“组合模式”仍然原封不动地保留在那里,只不过在基础层面上换了一种表达方式罢了,它完全可以再反编译回来。这本密码版《老人与海》完全等价于原本《老人与海》!

回到我们的问题上来:什么是意识?意识是组成脑的原子群的一种“组合模式”!我们脑的物质基础和一块石头没什么不同,是由同样的碳原子、氢原子、氧原子……组成的。构成我们脑的电子和构成一块石头的电子完全相同,就算把它们相互调换,也不会造成我们的脑袋变成一块石头的奇观。我们的意识,完全建筑在我们脑袋的结构模式之上!只要一堆原子按照特定的方式排列起来,它就可以构成我们的意识,就像只要一堆字母按照特定的方式排列起来,就可以构成《老人与海》一样。这里并不需要某个非物质的“灵魂”来附体,就如你不会相信,只有当“海明威之魂”附在一堆字母上才会使它变成《老人与海》一样。单个脑细胞显然不能意识到任何东西,但是许多脑细胞按照特定的模式组合起来,“意识”就在组合中产生了。

好,到此为止,大部分人还是应该对这种相当唯物的说法感到满意的。但只要再往下合理地推论几步,许多人可能就要觉得背上出冷汗了。如果“意识”完全取决于原子的“组合模式”的话,第一个推论就是:它可以被复制。出版社印刷成千上万本的《老人与海》,为什么原子不能被复制呢?假如我们的技术发达到一定程度,可以扫描你身体里每一个原子的位置和状态,并在另一个地方把它们重新组合起来的话,这个新的“人”是不是你呢?他会不会拥有和你一样的“意识”?或者干脆说,他和你是不是同一个人?假如我们承认意识完全基于原子排列模式,我们的回答无疑就是YES!这和“克隆人”是两个概念,克隆人只不过继承了你的基因,而这个“复制人”却拥有你的意识,你的记忆,你的感情,你的一切,他就是你本人!

近几年来,在量子通信方面我们有了极大的突破。把一个未知的量子态原封不动地传输到第二者那里已经成为可能,而且事实上已经有许多具体协议的提出。虽然令人欣慰的是,有一个叫做“不可复制定理”(no cloning theorem,1982年Wootters,Zurek和Dieks提出)的原则规定在传输量子态的同时一定会毁掉原来那个原本。换句话说,量子态只能cut paste,不能copy paste,这阻止了两个“你”的出现。但问题是,如果把你“毁掉”,然后在另一个地方“重建”起来,你是否认为这还是“原来的你”?

另一个推论就是:“组合模式”本身并非要特定的物质基础才能呈现。我们已经看到,我们完全可以用另一套符号系统去重写《老人与海》,这并不造成实质的差别。一套电影,我可以用胶片记录,也可以用录像带,VCD,LD或者DVD记录。当然有人会提出异议,说压缩实际上造成了信息的损失,VCD版的Matrix已经不是电影版的Matrix,其实这无所谓,我们换个比喻说,一张彩色数字照片可以用RGB来表示色彩,也可以用另一些表达系统比如说CMY,HSI,YUV或者YIQ来表示。再比如,任何序列都可以用一些可逆的压缩手法例如Huffman编码来压缩,字母也可以用摩尔斯电码来替换,歌曲可以用简谱或者五线谱记录,虽然它们看上去很不同,但其中包含的信息却是相同的!假如你有兴趣,用围棋中的白子代表0,黑子代表1,你无疑也可以用铺满整个天安门广场的围棋来拷贝一张VCD,这是完全等价的!

那么,只要有某种复杂的系统可以包含我们“意识模式”的主要信息或者与其等价,显然我们应该认为,意识并不一定要依赖于我们这个生物有机体的肉身而存在!假设我们大脑的所有信息都被扫描而存入一台计算机中,这台计算机严格地按照物理定律来计算这些分子对于各种刺激的反应而最终求出相应结果以作出回应,那么从理论上说,这台计算机的行为完全等同于我们自身!我们是不是可以说,这台计算机实际上拥有了我们的“意识”?

对于许多实证主义者来说,判定“拥有意识”或者“能思考”的标准便严格地按照这个“模式结构理论”的方法。意识只不过是某种复杂的模式结构,或者说,是在输入和输出之间进行的某种复杂算法。任何系统只要能够模拟这种算法,它就可以被合理地认为拥有意识。和冯•诺伊曼同为现代计算机奠基人的阿兰•图灵(Alan Turin)在1950年提出了判定计算机能否像人那般实际“思考”的标准,也就是著名的“图灵检验”。他设想一台超级计算机和一个人躲藏在幕后回答提问者的问题,而提问者则试图分辨哪个是人哪个是计算机。图灵争辩说,假如计算机伪装得如此巧妙,以致没有人可以在实际上把它和一个真人分辨开来的话,那么我们就可以声称,这台计算机和人一样具备了思考能力,或者说,意识(他的原词是“智慧”)。现代计算机已经可以击败国际象棋大师(可怜的卡斯帕罗夫!),真正骗倒一个测试者的日子不知还有多久才能来到,大家自己估计一下好了。

计算机在复杂到了一定程度之后便可以实际拥有意识,持这种看法的人通常被称为“强人工智能派”。在他们看来,人的大脑本质上也不过是一台异常复杂的计算机,只是它不由晶体管或者集成电路构成,而是生物细胞而已。但细胞也得靠细微的电流工作,就算我们尚不完全清楚其中的机制,也没有理由认为有某种超自然的东西在里面。就像薛定谔在他那本名扬四海的小册子《生命是什么》中所做的比喻一样,一个蒸汽机师在第一次看到电动机时会惊讶地发现这机器和他所了解的热力学机器十分不同,但他会合理地假定这是按照某些他所不了解的原理所运行的,而不会大惊小怪地认为是幽灵驱动了一切。

你可能要问,算法复杂到了何种程度才有资格被称为“意识”呢?这的确对我们理解波函数何时坍缩有实际好处!但这很可能又是一个难题,像那个著名的悖论:一粒沙落地不算一个沙堆,两粒沙落地不算一个沙堆,但10万粒沙落地肯定是一个沙堆了。那么,具体到哪一粒沙落地时才形成一个沙堆呢?对这种模糊性的问题科学家通常不屑解答,正如争论猫或者大肠杆菌有没有意识一样,我们对波函数还是一头雾水!

当然,也有一些更为极端的看法认为,任何执行了某种算法的系统都可以看成具有某种程度的“意识”!比如指南针,人们会论证说,它“喜欢”指着南方,当把它拨乱后,它就出于“厌恶”而竭力避免这种状态,而回到它所“喜欢”的状态里去。以这种带相当泛神论色彩的观点来看,万事万物都有着“意识”,只是程度的不同罢了。意识,简单来说,就是一个系统的算法,它“喜欢”那些大概率的输出,“讨厌”那些小概率的输出。一个有着趋光性的变形虫也有意识,只不过它“意识”的复杂程度比我们人类要低级好多好多倍罢了。

你也许不相信这种说法,但你只要承认“意识”只是在物质基础上的一种排列模式,你便很难否认我们说到的一些奇特性质。甚至连“意识是否可能在死后继续存在”这样的可怕问题,我们的答案也应该是在原则上肯定的!这就好比问,《第九交响曲》在音乐会结束后是不是还继续存在?显然我们只要保留了这个排列信息的资料,我们随时可以用不同的方法把它具体重现出来(任何时候都不缺碳原子、氢原子……)。当然,在我们的技术能力还达不到能够获得全部组合信息并保留它们之前(可能我们永远也没有这个技术),人死后自然就没有意识了,就像音乐会后烧毁了所有的乐谱一样,这个乐曲自然就此“失传”了。

你可能已经看得瞠目结舌,不过我们的说法把意识建立在完全客观和唯物的基础上,它实在已经是最不故作神秘的一种!意识不是一个独立的存在,而是系统复杂到了一定程度后表现出来的客观性质。它虽然是一种组合机制,但脱离了具体的物质(暂时肉体是唯一可能)它也无法表现出来。就像软件脱离了硬件无法具体运行一样,意识的体现不可能脱离物质而进行。假如我们被迫去寻找一种独立于物质的“意识”的话,那未免走得太远了。

当然,对于习惯了二元论的公众来说,试图使他们相信灵魂或者意识只是大量神经原的排列和集体行为是教他们吃惊的。对于彻底的唯物论者,试图使他们相信意识作为一种特定的排列信息可能长期保存并在不同平台上重现也是艰难的任务。心理学家和神经科学家克里克(Francis Crick)不得不把这一论断称为“惊人的假说”(见《惊人的假说:灵魂的科学探索》)。但对于大多数科学家来说,这也许是一种理所当然的推论。当然也有某些人认为意识或者灵魂并非复杂性造就的一个客观的副产品,它并不一定能够用算法来模拟,并的确具有某种主动效应!这里面包括牛津大学的罗杰•彭罗斯(Roger Penrose),诸位如果有兴趣了解他的观点,可以阅读其著作《皇帝新脑》(The Emperor’s New Mind)。


*********
这一节已经太长了,我把海森堡的那个闲话的最后一部分放到下一节里去。许多人说这个闲话专题有点罗嗦,我是很赞同的。其实这是我很久以来一直想写的一个内容,只不过借了史话的因头趁兴完成而已,所以有点不厌其烦,风格和正文有些出入。在以后修订的时候我会把它独立出来,作为外一篇处理吧。

posted on 2004-01-08 11:05:00 by shannon  评论(5) 阅读(4296)

追赶时间的脚步

新年的一年到来了,突然之间发现时间过的好快啊!不知不觉就过了一年,但是现在已经失去孩童时代对新年的盼望与喜悦。也许是“时过境迁”也许是“”

而“时间”对于现代的我们每个人身上都有很多物品在时刻提醒着我们,手表,时钟,计算机,pda,手机,电视,收音机等等。但是这也造成我的一个困扰,不知道哪个才是标准的,比如我每天用来催我起床作为闹钟的手机,比正常时间要快半个小时以上,而且逐渐变快,害的我逐渐早起。因为我做的工作和生活并不需要精确的时间,有点误差没关系,但是有时候我们还是想知道现在“标准”的时间应该是多少,正好在CSDN上讨论了一下这个问题,以前看过winxp好像多了这个功能,同步本地计算机时间到互联网上时间服务器。

因此顺便也找了一下资料,原来原理很简单,时间服务器的13端口就是提供time服务,我们只要连上去就取回来了,当然如果要标准,就要取标准的服务器的,否则你取我的,可不能保证是对的。

如果是想知道我们中国的标准时间,那么就连我们国家授时中心网络服务器吧

Option Explicit



Private Sub Command1_Click()

    If Winsock1.State <> sckClosed Then Winsock1.Close

    Winsock1.RemoteHost = "www.time.ac.cn" ' "time.nist.gov"

    Winsock1.RemotePort = 13

    Winsock1.LocalPort = 0

    Winsock1.Connect

End Sub

Private Sub Winsock1_Close()

    If Winsock1.State <> 0 Then

        Winsock1.Close

    End If

End Sub



Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

   Dim Temp As String

    Dim sTimeArray() As String

    Dim currentDate As Date

    Dim currentTime As Date

    Dim lReturn As Long

   

    Temp = String(bytesTotal, " ")

    Winsock1.GetData Temp, vbString, bytesTotal

    Text1.Text = Split(Temp, Chr(10))(0)

End Sub



Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

MsgBox Description

End Sub

基本目的达到了,同步一下自己计算机,用一下api SetSystemTime就可以,因为这个“地球人都知道”,就不废话了。

其他相关服务器:

Name IP Address Location
time-a.nist.gov 129.6.15.28 NIST, Gaithersburg, Maryland
time-b.nist.gov 129.6.15.29 NIST, Gaithersburg, Maryland
time-a.timefreq.bldrdoc.gov 132.163.4.101 NIST, Boulder, Colorado
time-b.timefreq.bldrdoc.gov 132.163.4.102 NIST, Boulder, Colorado
time-c.timefreq.bldrdoc.gov 132.163.4.103 NIST, Boulder, Colorado
utcnist.colorado.edu 128.138.140.44 University of Colorado, Boulder
time.nist.gov 192.43.244.18 NCAR, Boulder, Colorado
time-nw.nist.gov 131.107.1.10 Microsoft, Redmond, Washington
nist1.datum.com 66.243.43.21 Datum, San Jose, California
nist1-dc.glassey.com 216.200.93.8 Abovenet, Virginia
nist1-ny.glassey.com 208.184.49.9 Abovenet, New York City
nist1-sj.glassey.com 207.126.98.204 Abovenet, San Jose, California
nist1.aol-ca.truetime.com 207.200.81.113 TrueTime, AOL facility, Sunnyvale, California
nist1.aol-va.truetime.com 205.188.185.33 TrueTime, AOL facility, Virginia

----------------------------------------------

Ginn 提到的确实是不能不考虑的问题,但是这种情况,授时服务一般会考虑,我上边例子的服务除外,我知道我国授时服务器两个,一个就是http://www.time.ac.cn/(国家授时中心,他声明会有误差),还有一个是来自中国科学院授时中心,他返回的时间编码是

< YYYY MM DD HH MM SS MMM L NTSC-UTC XXXXX

其中:

XXXXX如下方法算出:

用户向服务器要求时间编码时,可首先记下本机时间T1,向服务器发送ASCII码字符串“>XXX.XXX.XXX.XXX”,即标记码“>”加用户计算机IP地址,服务器收到后,得出此刻时间编码,发送给用户,用户收到服务器发来的时间标记码“<”后,记下时刻T2,随后解出服务器时间编码T3,忽略服务器耗时,服务器与用户计算机时差为T3-(T1+T2)/2,用户调整计算机时间,时间服务完成。

但是我无法连接这个地址。而如果你向time.nist.gov发出请求,会返回如下编码:

JJJJJ YR-MO-DA HH:MM:SS TT L H msADV UTC(NIST) OTM

其中msADV 的解释为不完全的修正网络延迟的误差(意思是它已经劲力而为了)以milliseconds 为单位

 

mapeng你好,能否将你的email地址告诉我,我们用email来讨论,这个地方不适和讨论。以上代码我仅仅为方便说明所以随便写的,并不严谨,但是我按照你说的测试没有再现问题,所以我也不大清楚问题所在。欢迎email联系(blanksoft@hotmail.com)。

posted on 2004-01-04 11:27:00 by shannon  评论(6) 阅读(2681)

Powered by: Joycode MVC Blogger System